commit b085356c9921335ea6ff49eea57990b1eba7f71e Author: dev-chiefworks Date: Sun Sep 25 15:25:10 2022 -0400 first commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..32b3f17 --- /dev/null +++ b/.gitignore @@ -0,0 +1,130 @@ +#------------------------- +# Operating Specific Junk Files +#------------------------- + +# OS X +.DS_Store +.AppleDouble +.LSOverride + +# OS X Thumbnails +._* + +# Windows image file caches +Thumbs.db +ehthumbs.db +Desktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Windows Installer files +*.cab +*.msi +*.msm +*.msp + +*apache_log +.apache_log + +# Windows shortcuts +*.lnk + +# Linux +*~ + +# KDE directory preferences +.directory + +# Linux trash folder which might appear on any partition or disk +.Trash-* + +#------------------------- +# Environment Files +#------------------------- +# These should never be under version control, +# as it poses a security risk. +.env +.vagrant +Vagrantfile + +#------------------------- +# Temporary Files +#------------------------- +writable/cache/* +!writable/cache/index.html + +writable/logs/* +!writable/logs/index.html + +writable/session/* +!writable/session/index.html + +writable/uploads/* +!writable/uploads/index.html + +writable/debugbar/* + +php_errors.log + +#------------------------- +# User Guide Temp Files +#------------------------- +user_guide_src/build/* +user_guide_src/cilexer/build/* +user_guide_src/cilexer/dist/* +user_guide_src/cilexer/pycilexer.egg-info/* + +#------------------------- +# Test Files +#------------------------- +tests/coverage* + +# Don't save phpunit under version control. +phpunit + +#------------------------- +# Composer +#------------------------- +vendor/ + +#------------------------- +# IDE / Development Files +#------------------------- + +# Modules Testing +_modules/* + +# phpenv local config +.php-version + +# Jetbrains editors (PHPStorm, etc) +.idea/ +*.iml + +# Netbeans +nbproject/ +build/ +nbbuild/ +dist/ +nbdist/ +nbactions.xml +nb-configuration.xml +.nb-gradle/ + +# Sublime Text +*.tmlanguage.cache +*.tmPreferences.cache +*.stTheme.cache +*.sublime-workspace +*.sublime-project +.phpintel +/api/ + +# Visual Studio Code +.vscode/ + +/results/ +/phpunit*.xml +/.phpunit.*.cache + diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..3142503 --- /dev/null +++ b/LICENSE @@ -0,0 +1,22 @@ +The MIT License (MIT) + +Copyright (c) 2014-2019 British Columbia Institute of Technology +Copyright (c) 2019-2022 CodeIgniter Foundation + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..6b7c667 --- /dev/null +++ b/README.md @@ -0,0 +1,56 @@ +# CodeIgniter 4 Framework + +## What is CodeIgniter? + +CodeIgniter is a PHP full-stack web framework that is light, fast, flexible and secure. +More information can be found at the [official site](http://codeigniter.com). + +This repository holds the distributable version of the framework, +including the user guide. It has been built from the +[development repository](https://github.com/codeigniter4/CodeIgniter4). + +More information about the plans for version 4 can be found in [the announcement](http://forum.codeigniter.com/thread-62615.html) on the forums. + +The user guide corresponding to this version of the framework can be found +[here](https://codeigniter4.github.io/userguide/). + + +## Important Change with index.php + +`index.php` is no longer in the root of the project! It has been moved inside the *public* folder, +for better security and separation of components. + +This means that you should configure your web server to "point" to your project's *public* folder, and +not to the project root. A better practice would be to configure a virtual host to point there. A poor practice would be to point your web server to the project root and expect to enter *public/...*, as the rest of your logic and the +framework are exposed. + +**Please** read the user guide for a better explanation of how CI4 works! + +## Repository Management + +We use GitHub issues, in our main repository, to track **BUGS** and to track approved **DEVELOPMENT** work packages. +We use our [forum](http://forum.codeigniter.com) to provide SUPPORT and to discuss +FEATURE REQUESTS. + +This repository is a "distribution" one, built by our release preparation script. +Problems with it can be raised on our forum, or as issues in the main repository. + +## Contributing + +We welcome contributions from the community. + +Please read the [*Contributing to CodeIgniter*](https://github.com/codeigniter4/CodeIgniter4/blob/develop/CONTRIBUTING.md) section in the development repository. + +## Server Requirements + +PHP version 7.3 or higher is required, with the following extensions installed: + +- [intl](http://php.net/manual/en/intl.requirements.php) +- [libcurl](http://php.net/manual/en/curl.requirements.php) if you plan to use the HTTP\CURLRequest library + +Additionally, make sure that the following extensions are enabled in your PHP: + +- json (enabled by default - don't turn it off) +- [mbstring](http://php.net/manual/en/mbstring.installation.php) +- [mysqlnd](http://php.net/manual/en/mysqlnd.install.php) +- xml (enabled by default - don't turn it off) diff --git a/app/.htaccess b/app/.htaccess new file mode 100644 index 0000000..f24db0a --- /dev/null +++ b/app/.htaccess @@ -0,0 +1,6 @@ + + Require all denied + + + Deny from all + diff --git a/app/Common.php b/app/Common.php new file mode 100644 index 0000000..a74d46d --- /dev/null +++ b/app/Common.php @@ -0,0 +1,15 @@ + SYSTEMPATH, + * 'App' => APPPATH + * ]; + *``` + * + * @var array + */ + public $psr4 = [ + APP_NAMESPACE => APPPATH, // For custom app namespace + 'Config' => APPPATH . 'Config', + ]; + + /** + * ------------------------------------------------------------------- + * Class Map + * ------------------------------------------------------------------- + * The class map provides a map of class names and their exact + * location on the drive. Classes loaded in this manner will have + * slightly faster performance because they will not have to be + * searched for within one or more directories as they would if they + * were being autoloaded through a namespace. + * + * Prototype: + *``` + * $classmap = [ + * 'MyClass' => '/path/to/class/file.php' + * ]; + *``` + * + * @var array + */ + public $classmap = []; + + /** + * ------------------------------------------------------------------- + * Files + * ------------------------------------------------------------------- + * The files array provides a list of paths to __non-class__ files + * that will be autoloaded. This can be useful for bootstrap operations + * or for loading functions. + * + * Prototype: + * ``` + * $files = [ + * '/path/to/my/file.php', + * ]; + * ``` + * + * @var array + */ + public $files = []; +} diff --git a/app/Config/Boot/development.php b/app/Config/Boot/development.php new file mode 100644 index 0000000..05a8612 --- /dev/null +++ b/app/Config/Boot/development.php @@ -0,0 +1,32 @@ + + */ + public $file = [ + 'storePath' => WRITEPATH . 'cache/', + 'mode' => 0640, + ]; + + /** + * ------------------------------------------------------------------------- + * Memcached settings + * ------------------------------------------------------------------------- + * Your Memcached servers can be specified below, if you are using + * the Memcached drivers. + * + * @see https://codeigniter.com/user_guide/libraries/caching.html#memcached + * + * @var array + */ + public $memcached = [ + 'host' => '127.0.0.1', + 'port' => 11211, + 'weight' => 1, + 'raw' => false, + ]; + + /** + * ------------------------------------------------------------------------- + * Redis settings + * ------------------------------------------------------------------------- + * Your Redis server can be specified below, if you are using + * the Redis or Predis drivers. + * + * @var array + */ + public $redis = [ + 'host' => '127.0.0.1', + 'password' => null, + 'port' => 6379, + 'timeout' => 0, + 'database' => 0, + ]; + + /** + * -------------------------------------------------------------------------- + * Available Cache Handlers + * -------------------------------------------------------------------------- + * + * This is an array of cache engine alias' and class names. Only engines + * that are listed here are allowed to be used. + * + * @var array + */ + public $validHandlers = [ + 'dummy' => DummyHandler::class, + 'file' => FileHandler::class, + 'memcached' => MemcachedHandler::class, + 'predis' => PredisHandler::class, + 'redis' => RedisHandler::class, + 'wincache' => WincacheHandler::class, + ]; +} diff --git a/app/Config/Constants.php b/app/Config/Constants.php new file mode 100644 index 0000000..8f8498a --- /dev/null +++ b/app/Config/Constants.php @@ -0,0 +1,79 @@ +` element. + * + * Will default to self if not overridden + * + * @var string|string[]|null + */ + public $baseURI; + + /** + * Lists the URLs for workers and embedded frame contents + * + * @var string|string[] + */ + public $childSrc = 'self'; + + /** + * Limits the origins that you can connect to (via XHR, + * WebSockets, and EventSource). + * + * @var string|string[] + */ + public $connectSrc = 'self'; + + /** + * Specifies the origins that can serve web fonts. + * + * @var string|string[] + */ + public $fontSrc; + + /** + * Lists valid endpoints for submission from `
` tags. + * + * @var string|string[] + */ + public $formAction = 'self'; + + /** + * Specifies the sources that can embed the current page. + * This directive applies to ``, ` + + + + +
+
+
+
+
+
+
+
Address
+
Moonshine St. 14/05 Light City,
London, United Kingdom
+
+
+ +
+
+
+
+
+
Phone
+

00 (123) 456 78 90
00 (987) 654 32 10

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

Drop Us a Line

+

Reach out to us from our contact form and we will get back to you shortly.

+ +
+
+
+
+ + +
Looks good!
+
Please enter your first name.
+
+
+ +
+
+ + +
Looks good!
+
Please enter your last name.
+
+
+ +
+
+ + +
Looks good!
+
Please provide a valid email address.
+
+
+ +
+
+ +
Looks good!
+
Please select a department.
+
+
+ +
+
+ + +
Looks good!
+
Please enter your messsage.
+
+
+ +
+ +

* These fields are required.

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

We are trusted by over 5000+ clients. Join them now and grow your business.

+
+ +
+ +
+
+
+
+

7518

+

Completed Projects

+
+ +
+

5472

+

Satisfied Customers

+
+ +
+

2184

+

Expert Employees

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

Ā© 2021 Sandbox.
All rights reserved.

+ + +
+ +
+ +
+
+

Get in Touch

+
Moonshine St. 14/05 Light City, London, United Kingdom
+ info@email.com
00 (123) 456 78 90 +
+ +
+ +
+
+

Learn More

+ +
+ +
+ +
+
+

Our Newsletter

+

Subscribe to our newsletter to get our news & deals delivered to you.

+ + +
+ +
+ +
+ +
+ +
+
+ + + +
+ + + + + \ No newline at end of file diff --git a/sandbox310/dev/contact2.html b/sandbox310/dev/contact2.html new file mode 100644 index 0000000..954ffde --- /dev/null +++ b/sandbox310/dev/contact2.html @@ -0,0 +1,683 @@ + + + + + + + + + + Sandbox - Modern & Multipurpose Bootstrap 5 Template + + + + + + +
+
+ + +
+ +
+
+
+
+

Get in Touch

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

5000+

+

Satisfied Customers

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

Convinced yet? Let's make something great together.

+
+
+
+
+
+
Address
+
Moonshine St. 14/05 Light City,
London, United Kingdom
+
+
+
+
+
+
+
+
Phone
+

00 (123) 456 78 90

+
+
+
+
+
+
+
+
E-mail
+

sandbox@email.com

+
+
+
+ +
+ +
+
+

Drop Us a Line

+

Reach out to us from our contact form and we will get back to you shortly.

+
+
+
+
+
+ + +
Looks good!
+
Please enter your first name.
+
+
+ +
+
+ + +
Looks good!
+
Please enter your last name.
+
+
+ +
+
+ + +
Looks good!
+
Please provide a valid email address.
+
+
+ +
+
+ +
Looks good!
+
Please select a department.
+
+
+ +
+
+ + +
Looks good!
+
Please enter your messsage.
+
+
+ +
+ +

* These fields are required.

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

Ā© 2021 Sandbox.
All rights reserved.

+ + +
+ +
+ +
+
+

Get in Touch

+
Moonshine St. 14/05 Light City, London, United Kingdom
+ info@email.com
00 (123) 456 78 90 +
+ +
+ +
+
+

Learn More

+ +
+ +
+ +
+
+

Our Newsletter

+

Subscribe to our newsletter to get our news & deals delivered to you.

+ + +
+ +
+ +
+ +
+ +
+
+ + + +
+ + + + + \ No newline at end of file diff --git a/sandbox310/dev/contact3.html b/sandbox310/dev/contact3.html new file mode 100644 index 0000000..fbb149a --- /dev/null +++ b/sandbox310/dev/contact3.html @@ -0,0 +1,687 @@ + + + + + + + + + + Sandbox - Modern & Multipurpose Bootstrap 5 Template + + + + + + +
+
+ + +
+ +
+
+
+
+

Get in Touch

+

Have any questions? Reach out to us from our contact form and we will get back to you shortly.

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

Let’s Talk

+

Let's make something great together. We are trusted by over 5000+ clients. Join them by using our services and grow your business.

+

Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Maecenas faucibus mollis interdum. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus.

+ Join Us +
+ +
+ +
+ +
+ +
+ +
+ +
+
+
+
+
+
+
+
+
+ + +
Looks good!
+
Please enter your first name.
+
+
+ +
+
+ + +
Looks good!
+
Please enter your last name.
+
+
+ +
+
+ + +
Looks good!
+
Please provide a valid email address.
+
+
+ +
+
+ +
Looks good!
+
Please select a department.
+
+
+ +
+
+ + +
Looks good!
+
Please enter your messsage.
+
+
+ +
+
+ + +
You must agree before submitting.
+
+
+ +
+ +

* These fields are required.

+
+ +
+ +
+ +
+ +
+
+
+
+
+
+
Address
+
Moonshine St. 14/05 Light City, London, United Kingdom
+
+
+
+
+
+
+
+
Phone
+

00 (123) 456 78 90
00 (987) 654 32 10

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

Ā© 2021 Sandbox.
All rights reserved.

+ + +
+ +
+ +
+
+

Get in Touch

+
Moonshine St. 14/05 Light City, London, United Kingdom
+ info@email.com
00 (123) 456 78 90 +
+ +
+ +
+
+

Learn More

+ +
+ +
+ +
+
+

Our Newsletter

+

Subscribe to our newsletter to get our news & deals delivered to you.

+ + +
+ +
+ +
+ +
+ +
+
+ + + +
+ + + + + \ No newline at end of file diff --git a/sandbox310/dev/demo1.html b/sandbox310/dev/demo1.html new file mode 100644 index 0000000..4e13738 --- /dev/null +++ b/sandbox310/dev/demo1.html @@ -0,0 +1,1170 @@ + + + + + + + + + + Sandbox - Modern & Multipurpose Bootstrap 5 Template + + + + + + + + +
+
+ + +
+
+

Sandbox

+ +
+
+
+

Sandbox is a multipurpose HTML5 template with various layouts which will be a great solution for your business.

+
+ +
+

Contact Info

+
Moonshine St. 14/05
Light City, London
+ info@email.com
00 (123) 456 78 90 +
+ +
+

Learn More

+ +
+ +
+

Follow Us

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

Grow Your Business with Our Solutions.

+

We help our clients to increase their website traffic, rankings and visibility in search results.

+ Try It For Free +
+ +
+ +
+ +
+ +
+
+
+
+

What We Do?

+

The service we offer is specifically designed to meet your needs.

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

SEO Services

+

Nulla vitae elit libero, a pharetra augue. Donec id elit non mi porta gravida at eget metus cras justo.

+ Learn More +
+ +
+ +
+ +
+
+
+ +

Web Design

+

Nulla vitae elit libero, a pharetra augue. Donec id elit non mi porta gravida at eget metus cras justo.

+ Learn More +
+ +
+ +
+ +
+
+
+ +

Social Engagement

+

Nulla vitae elit libero, a pharetra augue. Donec id elit non mi porta gravida at eget metus cras justo.

+ Learn More +
+ +
+ +
+ +
+
+
+ +

Content Marketing

+

Nulla vitae elit libero, a pharetra augue. Donec id elit non mi porta gravida at eget metus cras justo.

+ Learn More +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+
+
+
+
+
+ +
+

Analyze Now

+

Wonder how much faster your website can go? Easily check your SEO Score now.

+

Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Praesent commodo cursus magna, vel scelerisque nisl consectetur et.

+
+
+
+
+ + + +
+
+
+ +
+ +
+ +
+ +
+ +
+ +
+
+
+
+
+
+
+
+ 01 +
+
+

Collect Ideas

+

Nulla vitae elit libero pharetra augue dapibus.

+
+
+
+ +
+ +
+
+
+
+ 02 +
+
+

Data Analysis

+

Vivamus sagittis lacus vel augue laoreet.

+
+
+
+ +
+ +
+
+
+
+ 03 +
+
+

Finalize Product

+

Cras mattis consectetur purus sit amet.

+
+
+
+ +
+ +
+ +
+

Our Strategy

+

Here are 3 working steps to organize our business projects.

+

Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Etiam porta sem malesuada magna mollis euismod. Nullam id dolor id nibh ultricies vehicula ut id elit. Nullam quis risus eget urna mollis.

+

Nullam id dolor id nibh ultricies vehicula ut id elit. Vestibulum id ligula porta felis euismod semper. Aenean lacinia bibendum nulla sed consectetur.

+ Learn More +
+ +
+ +
+
+
+
+ +
+

Why Choose Us?

+

We bring solutions to make life easier for our clients.

+
+
+
+ +
+ +
+
+

Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Praesent commodo cursus magna, vel.

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

Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Praesent commodo cursus magna, vel.

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

Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Praesent commodo cursus magna, vel.

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

Our Team

+

Think unique and be innovative. Make a difference with Sandbox.

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

Coriss Ambady

+
Financial Analyst
+

Fermentum massa justo sit amet risus morbi leo.

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

Cory Zamora

+
Marketing Specialist
+

Fermentum massa justo sit amet risus morbi leo.

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

Nikolas Brooten

+
Sales Manager
+

Fermentum massa justo sit amet risus morbi leo.

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

Jackie Sanders

+
Investment Planner
+

Fermentum massa justo sit amet risus morbi leo.

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

Our Solutions

+

We make your spending stress-free for you to have the perfect control.

+

Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Praesent commodo cursus.

+
+
+
    +
  • Aenean quam ornare. Curabitur blandit.
  • +
  • Nullam quis risus eget urna mollis ornare.
  • +
+
+ +
+
    +
  • Etiam porta euismod malesuada mollis.
  • +
  • Vivamus sagittis lacus vel augue rutrum.
  • +
+
+ +
+ +
+ +
+ +
+ +
+ +
+
+
+
+
+
+
+
+
+

ā€œCum sociis natoque penatibus et magnis dis parturient montes.ā€

+
+
+
Coriss Ambady
+

Financial Analyst

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

ā€œVivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Vestibulum id ligula porta felis euismod.ā€

+
+
+
Cory Zamora
+

Marketing Specialist

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

ā€œDonec id elit non porta gravida at eget metus. Duis mollis est luctus commodo nisi erat.ā€

+
+
+
Barclay Widerski
+

Sales Specialist

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

ā€œNisi erat porttitor ligula, eget lacinia odio sem nec elit. Aenean eu leo pellentesque.ā€

+
+
+
Jackie Sanders
+

Investment Planner

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

Our Community

+

Don't take our word for it. See what customers are saying about us.

+

Aenean lacinia bibendum nulla sed consectetur. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Nulla vitae elit libero, a pharetra augue. Maecenas faucibus mollis interdum. Vestibulum id ligula porta felis euismod.

+ All Testimonials +
+ +
+ +
+ +
+ +
+
+
+
+

Our Pricing

+

We offer great and premium prices.

+

Enjoy a free 30-day trial and experience the full service. No credit card required!

+ See All Prices +
+ +
+
+

Monthly

+
+
+
+
+
+

Yearly (Save 30%)

+
+
+
+
+
+
+
+
$19 month
+
$199 year
+
+ +

Premium Plan

+
    +
  • 5 Projects
  • +
  • 100K API Access
  • +
  • 200MB Storage
  • +
  • Weekly Reports
  • +
  • 7/24 Support
  • +
+ Choose Plan +
+ +
+ +
+ + + +
+ +
+ +
+ +
+
+
+
+ +
+

Let’s Talk

+

Let's make something great together. We are trusted by over 5000+ clients.

+

Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Maecenas faucibus mollis interdum. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus.

+ Join Us +
+ +
+ +
+
+
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+ +
+ +
+ +
+ +
+ +
+
+
+

Join our community by using our services and grow your business.

+ Try It For Free +
+ +
+
+
+
+ +

Ā© 2021 Sandbox.
All rights reserved.

+ + +
+ +
+ +
+
+

Get in Touch

+
Moonshine St. 14/05 Light City, London, United Kingdom
+ info@email.com
00 (123) 456 78 90 +
+ +
+ +
+
+

Learn More

+ +
+ +
+ +
+
+

Our Newsletter

+

Subscribe to our newsletter to get our news & deals delivered to you.

+ + +
+ +
+ +
+ +
+ +
+
+ + + +
+ + + + + \ No newline at end of file diff --git a/sandbox310/dev/demo10.html b/sandbox310/dev/demo10.html new file mode 100644 index 0000000..510073e --- /dev/null +++ b/sandbox310/dev/demo10.html @@ -0,0 +1,947 @@ + + + + + + + + + + Sandbox - Modern & Multipurpose Bootstrap 5 Template + + + + + + + + +
+
+
+
+
+
+
Moonshine St. 14/05 Light City
+
+
+
+

00 (123) 456 78 90

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

We bring solutions to make life easier

+

We are a creative company that focuses on long term relationships with customers.

+
+ Read More +
+
+ +
+ +
+ +
+ +
+
+
+
+
+

The service we offer is specifically designed to meet your needs.

+
+ +
+ +
+
+
+

24/7 Support

+

Etiam porta sem malesuada magna mollis euismod. Donec ullamcorper nulla non metus auctor fringilla.

+
+ +
+
+

Secure Payments

+

Etiam porta sem malesuada magna mollis euismod. Donec ullamcorper nulla non metus auctor fringilla.

+
+ +
+
+

Daily Updates

+

Etiam porta sem malesuada magna mollis euismod. Donec ullamcorper nulla non metus auctor fringilla.

+
+ +
+
+

Market Research

+

Etiam porta sem malesuada magna mollis euismod. Donec ullamcorper nulla non metus auctor fringilla.

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

We make spending stress free so you have the perfect control.

+

Etiam porta sem malesuada magna mollis euismod. Donec ullamcorper nulla non metus auctor fringilla. Morbi leo risus, porta ac consectetur ac, vestibulum at eros. Fusce dapibus, tellus ac cursus commodo.

+
+
+
    +
  • Aenean quam ornare curabitur blandit consectetur.
  • +
  • Nullam quis risus eget urna mollis ornare aenean leo.
  • +
+
+ +
+
    +
  • Etiam porta euismod malesuada mollis nisl ornare.
  • +
  • Vivamus sagittis lacus augue rutrum maecenas odio.
  • +
+
+ +
+ +
+ +
+ +
+
+
+
+ +
+ +
+ + +
+ +
+ +
+ +
+

We bring solutions to manage your finance the way works best.

+

Etiam porta sem malesuada magna mollis euismod. Donec ullamcorper nulla non metus auctor fringilla. Morbi leo risus, porta ac consectetur ac, vestibulum at eros. Fusce dapibus, tellus ac cursus commodo.

+
+
+
    +
  • Aenean quam ornare curabitur blandit consectetur.
  • +
  • Nullam quis risus eget urna mollis ornare aenean leo.
  • +
+
+ +
+
    +
  • Etiam porta euismod malesuada mollis nisl ornare.
  • +
  • Vivamus sagittis lacus augue rutrum maecenas odio.
  • +
+
+ +
+ +
+ +
+ +
+ +
+ +
+
+
+
+

We are proud of our projects

+

We bring solutions to make life easier for our customers.

+
+ +
+
+
+

1000+

+

Completed Projects

+
+ +
+

500+

+

Happy Clients

+
+ +
+

150+

+

Awards Won

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

ā€œVivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Vestibulum ligula porta felis euismod semper. Cras justo odio.ā€

+
+
+
Coriss Ambady
+

Financial Analyst

+
+
+
+
+ +
+
+

ā€œVivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Vestibulum ligula porta felis euismod semper. Cras justo odio.ā€

+
+
+
Cory Zamora
+

Marketing Specialist

+
+
+
+
+ +
+
+

ā€œVivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Vestibulum ligula porta felis euismod semper. Cras justo odio.ā€

+
+
+
Nikolas Brooten
+

Sales Manager

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

Who Are We?

+

We are a digital and branding company that believes in the power of creative strategy and along with great design.

+

Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Praesent commodo cursus magna, vel scelerisque nisl consectetur et.

+
+
+
    +
  • Aenean eu leo quam ornare curabitur blandit tempus.
  • +
  • Nullam quis risus eget urna mollis ornare donec elit.
  • +
+
+ +
+
    +
  • Etiam porta sem malesuada magna mollis euismod.
  • +
  • Fermentum massa vivamus faucibus amet euismod.
  • +
+
+ +
+ +
+ +
+ +
+
+
+
+
1
+
+
+

Our Vision

+

Nulla vitae elit libero, a pharetra augue. Donec id elit non mi porta gravida at eget. Fusce dapibus tellus.

+
+
+
+ +
+
+
+
2
+
+
+

Our Mission

+

Maecenas faucibus mollis interdum. Vivamus sagittis lacus vel augue laoreet. Sed posuere consectetur.

+
+
+
+ +
+
+
+
3
+
+
+

Our Values

+

Cras justo odio, dapibus ac facilisis in, egestas eget quam. Praesent commodo cursus magna scelerisque.

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

5000+

+

Satisfied Customers

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

Let’s Talk

+

Let’s make something great together. We are trusted by over 5000+ clients. Join them by using our services and grow your business.

+

Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Maecenas faucibus mollis interdum. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus.

+ Join Us +
+ +
+ +
+
+
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+ +
+ +
+ +
+ +
+ +
+
+
+
+
+ +

Ā© 2021 Sandbox.
All rights reserved.

+ + +
+ +
+ +
+
+

Get in Touch

+
Moonshine St. 14/05 Light City, London, United Kingdom
+ info@email.com
00 (123) 456 78 90 +
+ +
+ +
+
+

Learn More

+ +
+ +
+ +
+
+

Our Newsletter

+

Subscribe to our newsletter to get our news & deals delivered to you.

+ + +
+ +
+ +
+ +
+ +
+
+ + + +
+ + + + + \ No newline at end of file diff --git a/sandbox310/dev/demo11.html b/sandbox310/dev/demo11.html new file mode 100644 index 0000000..9c4b416 --- /dev/null +++ b/sandbox310/dev/demo11.html @@ -0,0 +1,1258 @@ + + + + + + + + + + Sandbox - Modern & Multipurpose Bootstrap 5 Template + + + + + + + +
+
+ + +
+ +
+
+
+
+

Crafting project specific solutions with expertise.

+

We’re a creative company that focuses on establishing long-term relationships with customers.

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

What We Do?

+

The service we offer is specifically designed to meet your needs.

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

24/7 Support

+

Nulla vitae elit libero, a pharetra augue. Donec id elit non mi porta gravida at eget metus cras justo.

+ Learn More +
+ +
+ +
+ +
+
+
+
+

Secure Payments

+

Nulla vitae elit libero, a pharetra augue. Donec id elit non mi porta gravida at eget metus cras justo.

+ Learn More +
+ +
+ +
+ +
+
+
+
+

Daily Updates

+

Nulla vitae elit libero, a pharetra augue. Donec id elit non mi porta gravida at eget metus cras justo.

+ Learn More +
+ +
+ +
+ +
+
+
+
+

Market Research

+

Nulla vitae elit libero, a pharetra augue. Donec id elit non mi porta gravida at eget metus cras justo.

+ Learn More +
+ +
+ +
+ +
+ +
+ +
+
+
+
+ +
+

Why Choose Us?

+

We bring solutions to make life easier for our clients.

+
+
+
+ +
+ +
+
+

Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Praesent commodo cursus magna, vel.

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

Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Praesent commodo cursus magna, vel.

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

Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Praesent commodo cursus magna, vel.

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

Our Solutions

+

We make your spending stress-free for you to have the perfect control.

+

Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Praesent commodo cursus.

+
+
+
    +
  • Aenean quam ornare. Curabitur blandit.
  • +
  • Nullam quis risus eget urna mollis ornare.
  • +
+
+ +
+
    +
  • Etiam porta euismod malesuada mollis.
  • +
  • Vivamus sagittis lacus vel augue rutrum.
  • +
+
+ +
+ +
+ +
+ +
+ +
+ +
+
+
+
+
+
+
+
+

7518

+

Completed Projects

+
+ +
+

3472

+

Happy Customers

+
+ +
+

2184

+

Expert Employees

+
+ +
+

4523

+

Awards Won

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

Case Studies

+

Check out some of our awesome projects with creative ideas and great design.

+
+ +
+ +
+
+
+
+
+
+
+
+
+
+
+
Read More
+
+
+
+
+

Ligula tristique quis risus

+
+ +
+

Mauris convallis non ligula non interdum. Gravida vulputate convallis tempus vestibulum cras imperdiet nun eu dolor.

+
+ +
+ + + +
+ +
+ +
+ +
+ +
+
+
+
+
+
+
Read More
+
+
+
+
+

Nullam id dolor elit id nibh

+
+ +
+

Mauris convallis non ligula non interdum. Gravida vulputate convallis tempus vestibulum cras imperdiet nun eu dolor.

+
+ +
+ + + +
+ +
+ +
+ +
+ +
+
+
+
+
+
+
Read More
+
+
+
+
+

Ultricies fusce porta elit

+
+ +
+

Mauris convallis non ligula non interdum. Gravida vulputate convallis tempus vestibulum cras imperdiet nun eu dolor.

+
+ +
+ + + +
+ +
+ +
+ +
+ +
+
+
+
+
+
+
Read More
+
+
+
+
+

Morbi leo risus porta eget

+
+ +
+

Mauris convallis non ligula non interdum. Gravida vulputate convallis tempus vestibulum cras imperdiet nun eu dolor.

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

Who Are We?

+

Company that believes in the power of creative strategy.

+

Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Praesent commodo cursus magna, vel scelerisque nisl consectetur et.

+
+
+
    +
  • Aenean eu leo quam ornare curabitur blandit tempus.
  • +
  • Nullam quis risus eget urna mollis ornare donec elit.
  • +
+
+ +
+
    +
  • Etiam porta sem malesuada magna mollis euismod.
  • +
  • Fermentum massa vivamus faucibus amet euismod.
  • +
+
+ +
+ +
+ +
+ +
+
+

Our Team

+

Think unique and be innovative. Make a difference with Sandbox.

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

Coriss Ambady

+

Financial Analyst

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

Cory Zamora

+

Marketing Specialist

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

Nikolas Brooten

+

Sales Manager

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

Jackie Sanders

+

Investment Planner

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

ā€œVivamus sagittis lacus augue laoreet rutrum faucibus auctor vestibulum ligula porta felis, euismod semper cras justo odio consectetur.ā€

+
+
+
Coriss Ambady
+

Financial Analyst

+
+
+
+
+ +
+ +
+

ā€œVivamus sagittis lacus augue laoreet rutrum faucibus auctor vestibulum ligula porta felis, euismod semper cras justo odio consectetur.ā€

+
+
+
Cory Zamora
+

Marketing Specialist

+
+
+
+
+ +
+ +
+

ā€œVivamus sagittis lacus augue laoreet rutrum faucibus auctor vestibulum ligula porta felis, euismod semper cras justo odio consectetur.ā€

+
+
+
Nikolas Brooten
+

Sales Manager

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

Our Pricing

+

We offer great prices, premium products and quality service for your business.

+
+ +
+ +
+
+
+
+
+
+

Monthly

+
+
+
+
+
+

Yearly

+
+
+
+
+
+
+
$9 month
+
$99 year
+
+ +

Basic Plan

+
    +
  • 1 Project
  • +
  • 100K API Access
  • +
  • 100MB Storage
  • +
  • Weekly Reports
  • +
  • 7/24 Support
  • +
+ Choose Plan +
+ +
+ +
+ + + +
+
+
+
+
$49 month
+
$499 year
+
+ +

Corporate Plan

+
    +
  • 20 Projects
  • +
  • 300K API Access
  • +
  • 500MB Storage
  • +
  • Weekly Reports
  • +
  • 7/24 Support
  • +
+ Choose Plan +
+ +
+ +
+ +
+ +
+ +
+
+
+
+ +
+
+

Can I cancel my subscription?

+

Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Etiam porta sem malesuada magna mollis euismod maecenas.

+
+
+
+ +
+
+
+ +
+
+

Which payment methods do you accept?

+

Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Etiam porta sem malesuada magna mollis euismod maecenas.

+
+
+
+ +
+
+
+ +
+
+

How can I manage my Account?

+

Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Etiam porta sem malesuada magna mollis euismod maecenas.

+
+
+
+ +
+
+
+ +
+
+

Is my credit card information secure?

+

Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Etiam porta sem malesuada magna mollis euismod maecenas.

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

Join our community by using our services and grow your business.

+ Try It For Free +
+ +
+
+
+
+ +

Ā© 2021 Sandbox.
All rights reserved.

+ + +
+ +
+ +
+
+

Get in Touch

+
Moonshine St. 14/05 Light City, London, United Kingdom
+ info@email.com
00 (123) 456 78 90 +
+ +
+ +
+
+

Learn More

+ +
+ +
+ +
+
+

Our Newsletter

+

Subscribe to our newsletter to get our news & deals delivered to you.

+ + +
+ +
+ +
+ +
+ +
+
+ + + +
+ + + + + \ No newline at end of file diff --git a/sandbox310/dev/demo12.html b/sandbox310/dev/demo12.html new file mode 100644 index 0000000..c672b35 --- /dev/null +++ b/sandbox310/dev/demo12.html @@ -0,0 +1,1009 @@ + + + + + + + + + + Sandbox - Modern & Multipurpose Bootstrap 5 Template + + + + + + + +
+
+ + +
+
+

Sandbox

+ +
+
+
+

Sandbox is a multipurpose HTML5 template with various layouts which will be a great solution for your business.

+
+ +
+

Contact Info

+
Moonshine St. 14/05
Light City, London
+ info@email.com
00 (123) 456 78 90 +
+ +
+

Learn More

+ +
+ +
+

Follow Us

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

Creative. Smart. Awesome.

+

We specialize in web, mobile and identity design. We love to turn ideas into beautiful things.

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

Content Marketing

+

Nulla vitae elit libero, a pharetra augue. Donec id elit non mi porta gravida at eget metus cras justo.

+ Learn More +
+ +
+ +
+ +
+
+
+ +

Social Engagement

+

Nulla vitae elit libero, a pharetra augue. Donec id elit non mi porta gravida at eget metus cras justo.

+ Learn More +
+ +
+ +
+ +
+
+
+ +

Identity & Branding

+

Nulla vitae elit libero, a pharetra augue. Donec id elit non mi porta gravida at eget metus cras justo.

+ Learn More +
+ +
+ +
+ +
+
+
+ +

Product Design

+

Nulla vitae elit libero, a pharetra augue. Donec id elit non mi porta gravida at eget metus cras justo.

+ Learn More +
+ +
+ +
+ +
+ +
+
+
+
+ +
+

Our three process steps on creating awesome projects.

+
+
+ 1 +
+
+

Collect Ideas

+

Nulla vitae elit libero pharetra augue dapibus. Praesent commodo cursus. Donec ullamcorper nulla non metus.

+
+
+
+
+ 2 +
+
+

Data Analysis

+

Vivamus sagittis lacus vel augue laoreet. Etiam porta sem malesuada magna auctor fringilla augue.

+
+
+
+
+ 3 +
+
+

Finalize Product

+

Cras mattis consectetur purus sit amet. Aenean lacinia bibendum nulla sed. Nulla vitae elit libero pharetra.

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

Few reasons why our valued customers choose us.

+
+
+
+ +
+ +
+
+

Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Praesent commodo cursus magna, vel.

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

Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Praesent commodo cursus magna, vel.

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

Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Praesent commodo cursus magna, vel.

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

We are proud of our works

+

We bring solutions to make life easier for our customers.

+
+ +
+
+
+ +

7518

+

Completed Projects

+
+ +
+ +

3472

+

Happy Customers

+
+ +
+ +

2184

+

Expert Employees

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

ā€œVivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Vestibulum id ligula porta. Cras mattis consectetur.ā€

+
+
+
Coriss Ambady
+

Financial Analyst

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

ā€œFusce dapibus, tellus ac cursus tortor mauris condimentum fermentum massa justo sit amet purus sit amet fermentum.ā€

+
+
+
Cory Zamora
+

Marketing Specialist

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

ā€œCurabitur blandit tempus porttitor. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor eu rutrum. Nulla vitae libero.ā€

+
+
+
Nikolas Brooten
+

Sales Manager

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

ā€œEtiam adipiscing tincidunt elit convallis felis suscipit ut. Phasellus rhoncus eu tincidunt auctor nullam rutrum, pharetra augue.ā€

+
+
+
Coriss Ambady
+

Financial Analyst

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

Check out some of our recent projects below.

+

We love to turn ideas into beautiful things.

+
+ +
+ +
+ +
+
+ +

Ipsum Ultricies Cursus

+
+ +
+
+ +

Mollis Ipsum Mattis

+
+ +
+
+ +

Magna Tristique Inceptos

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

Got any questions? Don't hesitate to get in touch.

+
+
+
+
+
+
Address
+
Moonshine St. 14/05 Light City, London
+
+
+
+
+
+
+
+
Phone
+

00 (123) 456 78 90

+
+
+
+
+
+
+
+
E-mail
+

sandbox@email.com

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

Ā© 2021 Sandbox.
All rights reserved.

+ + +
+ +
+ +
+
+

Get in Touch

+
Moonshine St. 14/05 Light City, London, United Kingdom
+ info@email.com
00 (123) 456 78 90 +
+ +
+ +
+
+

Learn More

+ +
+ +
+ +
+
+

Our Newsletter

+

Subscribe to our newsletter to get our news & deals delivered to you.

+ + +
+ +
+ +
+ +
+ +
+
+ + + +
+ + + + + \ No newline at end of file diff --git a/sandbox310/dev/demo13.html b/sandbox310/dev/demo13.html new file mode 100644 index 0000000..8f25fd5 --- /dev/null +++ b/sandbox310/dev/demo13.html @@ -0,0 +1,966 @@ + + + + + + + + + + Sandbox - Modern & Multipurpose Bootstrap 5 Template + + + + + + + +
+
+ + +
+ +
+
+
+
+

Hello! This is Sandbox

+

We bring rapid solutions for your business

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

7518

+

Completed Projects

+
+ +
+

3472

+

Satisfied Customers

+
+ +
+

2184

+

Expert Employees

+
+ +
+

4523

+

Awards Won

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

What We Do?

+

The full service we are offering is specifically designed to meet your business needs and projects.

+
+
+
+
+
+
+
+

24/7 Support

+

Nulla vitae elit libero pharetra augue dapibus.

+
+
+
+ +
+
+
+
+
+
+

Secure Payments

+

Vivamus sagittis lacus augue laoreet vel.

+
+
+
+ +
+
+
+
+
+
+

Daily Updates

+

Cras mattis consectetur purus sit amet.

+
+
+
+ +
+
+
+
+
+
+

Market Research

+

Aenean lacinia bibendum nulla sed consectetur.

+
+
+
+ +
+ +
+ +
+ +

How We Do It?

+

We make your spending stress-free for you to have the perfect control.

+
+
01 +

Concept

+

Nulla vitae elit libero elit non porta gravida eget metus cras. Aenean eu leo quam. Pellentesque ornare.

+
+ +
02 +

Prepare

+

Vestibulum id ligula porta felis euismod semper. Sed posuere consectetur est at lobortis.

+
+ +
03 +

Retouch

+

Integer posuere erat a ante venenatis dapibus posuere velit aliquet. Nulla vitae elit libero.

+
+ +
04 +

Finalize

+

Integer posuere erat, consectetur adipiscing elit. Fusce dapibus, tellus ac cursus commodo.

+
+ +
+ +
+ +
+ +
+
+

Happy Customers

+
+
+
+
+
+
+
+

ā€œVivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Vestibulum ligula porta felis euismod semper. Cras justo odio consectetur adipiscing dapibus.ā€

+
+ +
+
Coriss Ambady
+

Financial Analyst

+
+
+
+
+ +
+
+

ā€œVivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Vestibulum ligula porta felis euismod semper. Cras justo odio consectetur adipiscing dapibus.ā€

+
+ +
+
Cory Zamora
+

Marketing Specialist

+
+
+
+
+ +
+
+

ā€œVivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Vestibulum ligula porta felis euismod semper. Cras justo odio consectetur adipiscing dapibus.ā€

+
+ +
+
Nikolas Brooten
+

Sales Manager

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

Recent Projects

+

We love to turn ideas into beautiful things.

+
+ +
+ +
+
+
+
+
+ +

Ipsum Ultricies Cursus

+
+ +
+
+ +

Mollis Ipsum Mattis

+
+ +
+
+ +

Magna Tristique Inceptos

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

Trusted by over 300+ clients

+

We bring solutions to make life easier for our customers.

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

Our Pricing

+

We offer great prices, premium and quality products for your business.

+

Enjoy a free 30-day trial and experience the full service. No credit card required!

+ See All Prices +
+ +
+
+

Monthly

+
+
+
+
+
+

Yearly (Save 30%)

+
+
+
+
+
+
+
$19 month
+
$199 year
+
+ +

Premium Plan

+
    +
  • 5 Projects
  • +
  • 100K API Access
  • +
  • 200MB Storage
  • +
  • Weekly Reports
  • +
  • 7/24 Support
  • +
+ Choose Plan +
+ +
+ +
+ + + +
+ +
+ +
+ +
+
+
+
+
+
+ +
+
+
+
+
+ +
+
+
+

5000+

+

Satisfied Customers

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

Let’s Talk

+

Let’s make something great together. We are trusted by over 5000+ clients. Join them by using our services and grow your business.

+

Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Maecenas faucibus mollis interdum. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus.

+ Join Us +
+ +
+ +
+ +
+ +
+ +
+
+
+
+
+
+ +

Ā© 2021 Sandbox.
All rights reserved.

+ + +
+ +
+ +
+
+

Get in Touch

+
Moonshine St. 14/05 Light City, London, United Kingdom
+ info@email.com
00 (123) 456 78 90 +
+ +
+ +
+
+

Learn More

+ +
+ +
+ +
+
+

Our Newsletter

+

Subscribe to our newsletter to get our news & deals delivered to you.

+ + +
+ +
+ +
+ +
+ +
+
+ + + +
+ + + + + \ No newline at end of file diff --git a/sandbox310/dev/demo14.html b/sandbox310/dev/demo14.html new file mode 100644 index 0000000..6e641da --- /dev/null +++ b/sandbox310/dev/demo14.html @@ -0,0 +1,936 @@ + + + + + + + + + + Sandbox - Modern & Multipurpose Bootstrap 5 Template + + + + + + + + +
+
+ + +
+ +
+
+
+
+

We bring rapid solutions for your business.

+
+ +
+

We are an award winning branding design agency that strongly believes in the power of creative ideas.

+ Learn More +
+ +
+ +
+
+
+
+
+ +
+ +
+
+
+
+

What We Do

+

We make your spending stress-free for you to have the perfect control.

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

Package Design

+

Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Maecenas faucibus mollis interdum. Maecenas sed diam eget risus varius.

+
+
+
    +
  • Aenean quam ornare curabitur blandit consectetur.
  • +
  • Nullam quis risus eget urna mollis ornare aenean leo.
  • +
+
+ +
+
    +
  • Etiam porta euismod malesuada mollis nisl ornare sem.
  • +
  • Vivamus sagittis lacus augue rutrum maecenas.
  • +
+
+ +
+ + More Details +
+ +
+ +
+
+
+
+
+ +
+

Corporate Design

+

Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Praesent commodo cursus magna, vel scelerisque nisl consectetur et.

+
+
+
    +
  • Aenean quam ornare curabitur blandit consectetur.
  • +
  • Nullam quis risus eget urna mollis ornare aenean leo.
  • +
+
+ +
+
    +
  • Etiam porta euismod malesuada mollis nisl ornare sem.
  • +
  • Vivamus sagittis lacus augue rutrum maecenas.
  • +
+
+ +
+ + More Details +
+ +
+ +
+ +
+ +
+
+
+
+

Join Our Community

+

We are trusted by over 5000+ clients. Join them by using our services and grow your business.

+ Join Us +
+ +
+ +
+ +
+ +
+
+
+
+

Our Projects

+

Check out some of our awesome projects with creative ideas and great design.

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

Cras Fermentum Sem

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

Mollis Ipsum Mattis

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

Ipsum Ultricies Cursus

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

Inceptos Euismod Egestas

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

Sollicitudin Ornare Porta

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

Ipsum Mollis Vulputate

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

Company Facts

+

We are proud of our projects

+
+ +
+
+
+

1000+

+

Completed Projects

+
+ +
+

500+

+

Happy Clients

+
+ +
+

150+

+

Awards Won

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

ā€œVivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Vestibulum id ligula porta. Cras mattis consectetur.ā€

+
+
+
Coriss Ambady
+

Financial Analyst

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

ā€œFusce dapibus, tellus ac cursus tortor mauris condimentum fermentum massa justo sit amet purus fermentum.ā€

+
+
+
Cory Zamora
+

Marketing Specialist

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

ā€œCurabitur blandit tempus porttitor. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor eu rutrum. Nulla vitae libero.ā€

+
+
+
Nikolas Brooten
+

Sales Manager

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

ā€œEtiam adipiscing tincidunt elit convallis felis suscipit ut. Phasellus rhoncus eu tincidunt auctor nullam rutrum.ā€

+
+
+
Coriss Ambady
+

Financial Analyst

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

Company Strategy

+

Just sit and relax while we take care of your business needs.

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

Our Working Process

+
+
+ 1 +
+
+

Collect Ideas

+

Nulla vitae elit libero pharetra augue dapibus. Praesent commodo cursus. Sed posuere consectetur.

+
+
+
+
+ 2 +
+
+

Data Analysis

+

Vivamus sagittis lacus vel augue laoreet. Etiam porta sem malesuada magna est at lobortis nulla auctor.

+
+
+
+
+ 3 +
+
+

Finalize Product

+

Cras mattis consectetur purus sit amet. Aenean lacinia bibendum nulla sed. Donec ullamcorper metus.

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

Why Choose Us?

+

Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Maecenas faucibus mollis interdum. Maecenas sed diam eget risus varius.

+
+
+
    +
  • Aenean quam ornare curabitur blandit consectetur.
  • +
  • Nullam quis risus eget urna mollis ornare aenean leo.
  • +
+
+ +
+
    +
  • Etiam porta euismod malesuada mollis nisl ornare sem.
  • +
  • Vivamus sagittis lacus augue rutrum maecenas.
  • +
+
+ +
+ + More Details +
+ +
+ +
+ +
+ +
+ +
+
+
+

Join our community by using our services and grow your business.

+ Try It For Free +
+ +
+
+
+
+ +

Ā© 2021 Sandbox.
All rights reserved.

+ + +
+ +
+ +
+
+

Get in Touch

+
Moonshine St. 14/05 Light City, London, United Kingdom
+ info@email.com
00 (123) 456 78 90 +
+ +
+ +
+
+

Learn More

+ +
+ +
+ +
+
+

Our Newsletter

+

Subscribe to our newsletter to get our news & deals delivered to you.

+ + +
+ +
+ +
+ +
+ +
+
+ + + +
+ + + + + \ No newline at end of file diff --git a/sandbox310/dev/demo15.html b/sandbox310/dev/demo15.html new file mode 100644 index 0000000..95be218 --- /dev/null +++ b/sandbox310/dev/demo15.html @@ -0,0 +1,1068 @@ + + + + + + + + + + Sandbox - Modern & Multipurpose Bootstrap 5 Template + + + + + + +
+
+ + +
+
+

Sandbox

+ +
+
+
+

Sandbox is a multipurpose HTML5 template with various layouts which will be a great solution for your business.

+
+ +
+

Contact Info

+
Moonshine St. 14/05
Light City, London
+ info@email.com
00 (123) 456 78 90 +
+ +
+

Learn More

+ +
+ +
+

Follow Us

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

We bring solutions to make life easier.

+

We are a creative company that focuses on long term relationships with customers.

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

We are trusted by over a million customers.

+

Here a few reasons why our customers choose us.

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

Just sit and relax.

+

We make sure your spending is stress free so that you can have the perfect control.

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

Who Are We?

+

We are a digital and branding company that believes in the power of creative strategy and along with great design.

+

Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Praesent commodo cursus magna, vel scelerisque nisl consectetur et.

+
+
+
    +
  • Aenean eu leo quam ornare curabitur blandit tempus.
  • +
  • Nullam quis risus eget urna mollis ornare donec elit.
  • +
+
+ +
+
    +
  • Etiam porta sem malesuada magna mollis euismod.
  • +
  • Fermentum massa vivamus faucibus amet euismod.
  • +
+
+ +
+ +
+ +
+ +
+
+ +

Here are 3 working steps to organize our business projects.

+
+ +
+ +
+
+
+
+
+
+ 01 +
+
+

Collect Ideas

+

Nulla vitae elit libero pharetra augue dapibus.

+
+
+
+ +
+ +
+
+
+
+ 02 +
+
+

Data Analysis

+

Vivamus sagittis lacus vel augue laoreet.

+
+
+
+ +
+ +
+
+
+
+ 03 +
+
+

Finalize Product

+

Cras mattis consectetur purus sit amet.

+
+
+
+ +
+ +
+ +
+

How It Works?

+

Find out everything you need to know and more about how we create our business process models.

+

Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Etiam porta sem malesuada magna mollis euismod. Nullam id dolor id nibh ultricies vehicula ut id elit. Nullam quis risus eget urna mollis ornare.

+

Nullam id dolor id nibh ultricies vehicula ut id elit. Vestibulum id ligula porta felis euismod semper. Aenean lacinia bibendum nulla sed consectetur. Sed posuere consectetur est at lobortis. Vestibulum id ligula porta felis.

+ Learn More +
+ +
+ +
+ +
+ +
+
+
+
+
+
+
+ +
+
+
+
+
+
+

ā€œVivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Vestibulum ligula porta felis euismod semper. Cras justo odio consectetur nulla dapibus curabitur blandit faucibus.ā€

+
+
+
Coriss Ambady
+

Financial Analyst

+
+
+
+
+ +
+
+

ā€œVivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Vestibulum ligula porta felis euismod semper. Cras justo odio consectetur adipiscing dapibus curabitur blandit.ā€

+
+
+
Cory Zamora
+

Marketing Specialist

+
+
+
+
+ +
+
+

ā€œVivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Vestibulum ligula porta felis euismod semper. Cras justo odio consectetur adipiscing dapibus curabitur blandit.ā€

+
+
+
Nikolas Brooten
+

Sales Manager

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

Save your time and money by choosing our professional team.

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

Coriss Ambady

+
Financial Analyst
+

Fermentum massa justo sit amet risus morbi leo.

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

Cory Zamora

+
Marketing Specialist
+

Fermentum massa justo sit amet risus morbi leo.

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

Nikolas Brooten

+
Sales Manager
+

Fermentum massa justo sit amet risus morbi leo.

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

Jackie Sanders

+
Investment Planner
+

Fermentum massa justo sit amet risus morbi leo.

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

Laura Widerski

+
Sales Specialist
+

Fermentum massa justo sit amet risus morbi leo.

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

Tina Geller

+
Financial Analyst
+

Fermentum massa justo sit amet risus morbi leo.

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

7518

+

Completed Projects

+
+ +
+ +

3472

+

Satisfied Customers

+
+ +
+ +

2184

+

Expert Employees

+
+ +
+ +

4523

+

Awards Won

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

Convinced yet? Let's make something great together.

+
+
+
+
+
+
Address
+
Moonshine St. 14/05 Light City,
London, United Kingdom
+
+
+
+
+
+
+
+
Phone
+

00 (123) 456 78 90

+
+
+
+
+
+
+
+
E-mail
+

sandbox@email.com

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

Join Our Community

+

We are trusted by over 5000+ clients. Join them by using our services and grow your business.

+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+ +
+ + +
+ + + +
+ + + + + \ No newline at end of file diff --git a/sandbox310/dev/demo16.html b/sandbox310/dev/demo16.html new file mode 100644 index 0000000..6368dd0 --- /dev/null +++ b/sandbox310/dev/demo16.html @@ -0,0 +1,708 @@ + + + + + + + + + + Sandbox - Modern & Multipurpose Bootstrap 5 Template + + + + + + + +
+
+ + +
+ +
+
+
+
+
+
+
+
+
+ +
+
+

250+

+

Projects Done

+
+
+
+ +
+ +
+ +
+

I'm User Interface Designer & Developer.

+

Hello! I'm Julia, a freelance user interface designer & developer based in London. I’m very passionate about the work that I do.

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

    Web Design

    +
    +
  • +
  • +

    Mobile Design

    +
    +
  • +
  • +

    Development

    +
    +
  • +
  • +

    SEO

    +
    +
  • +
+ +
+ +
+

What I Do?

+

Duis mollis est commodo luctus nisi erat porttitor ligula, eget lacinia odio sem nec elit. Nullam quis risus eget urna mollis ornare vel. Nulla vitae elit libero, a pharetra augue. Praesent commodo cursus magna, vel scelerisque nisl.

+
+ +
+ +
+
+ +

Web Design

+

Nulla vitae elit libero, a pharetra augue. Donec id elit non mi porta gravida at eget metus. Cras justo cum sociis natoque magnis.

+
+ +
+ +

Mobile Design

+

Nulla vitae elit libero, a pharetra augue. Donec id elit non mi porta gravida at eget metus. Cras justo cum sociis natoque magnis.

+
+ +
+ +

Development

+

Nulla vitae elit libero, a pharetra augue. Donec id elit non mi porta gravida at eget metus. Cras justo cum sociis natoque magnis.

+
+ +
+ +

SEO

+

Nulla vitae elit libero, a pharetra augue. Donec id elit non mi porta gravida at eget metus. Cras justo cum sociis natoque magnis.

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

Latest Projects

+

Check out some of my latest projects with creative ideas.

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

Snowlake Theme

+

Maecenas faucibus mollis interdum sed posuere consectetur est at lobortis. Scelerisque id ligula porta felis euismod semper. Fusce dapibus tellus cursus.

+ See Project +
+ +
+
+
+ +
+ +
+ +
+ +
+
+
+
+ +

Budget App

+

Maecenas faucibus mollis interdum sed posuere consectetur est at lobortis. Scelerisque id ligula porta felis euismod semper. Fusce dapibus tellus cursus.

+ See Project +
+ +
+
+
+ +
+ +
+ +
+ +
+
+
+
+ +

Missio Theme

+

Maecenas faucibus mollis interdum sed posuere porta consectetur cursus porta lobortis. Scelerisque id ligula felis.

+ See Project +
+ + +
+ +
+ +
+
+
+ +

Storage App

+

Maecenas faucibus mollis interdum sed posuere consectetur est at lobortis. Scelerisque id ligula porta felis euismod semper.

+ See Project +
+ + +
+ +
+ +
+ +
+ +
+ +
+ +
+
+
+
+
+
+ +

If you like what you see, let's work together.

+

I bring rapid solutions to make the life of my clients easier. Have any questions? Reach out to me from this contact form and I will get back to you shortly.

+
+ +
+
+
+
+
+
+ + +
Looks good!
+
Please enter your name.
+
+
+ +
+
+ + +
Looks good!
+
Please provide a valid email address.
+
+
+ +
+
+ + +
Looks good!
+
Please enter your messsage.
+
+
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+

Ā© 2021 Sandbox. All rights reserved.

+ + +
+
+ +
+
+ + + +
+ + + + + \ No newline at end of file diff --git a/sandbox310/dev/demo17.html b/sandbox310/dev/demo17.html new file mode 100644 index 0000000..004ed62 --- /dev/null +++ b/sandbox310/dev/demo17.html @@ -0,0 +1,919 @@ + + + + + + + + + + Sandbox - Modern & Multipurpose Bootstrap 5 Template + + + + + + + +
+
+ + +
+ +
+
+
+
+

Hello! This is Sandbox

+

We bring rapid solutions for your business.

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

What We Do?

+

The service we offer is specifically designed to meet your needs.

+
+ +
+ +
+
+
+

24/7 Support

+

Fusce dapibus tellus cursus porta tortor condimentum euismod massa justo vehicula sit amet et risus cras.

+ Learn More +
+ +
+
+

Secure Payments

+

Fusce dapibus tellus cursus porta tortor condimentum euismod massa justo vehicula sit amet et risus cras.

+ Learn More +
+ +
+
+

Daily Updates

+

Fusce dapibus tellus cursus porta tortor condimentum euismod massa justo vehicula sit amet et risus cras.

+ Learn More +
+ +
+ +
+
+

Our Strategy

+

3 working steps to organize our business projects.

+

Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Etiam porta sem malesuada magna mollis euismod eget. Nullam id dolor id nibh ultricies vehicula ut id elit. Nullam quis risus.

+

Nullam id dolor id nibh ultricies vehicula ut id elit. Vestibulum id ligula porta felis euismod semper. Aenean lacinia bibendum consectetur.

+ Learn More +
+ +
+
+
+ 01 +
+
+

Collect Ideas

+

Nulla vitae elit libero pharetra augue dapibus. Fusce dapibus, tellus ac cursus commodo.

+
+
+
+
+ 02 +
+
+

Data Analysis

+

Vivamus sagittis lacus vel augue laoreet tortor mauris condimentum fermentum.

+
+
+
+
+ 03 +
+
+

Finalize Product

+

Cras mattis consectetur purus sit amet massa justo sit amet risus consectetur magna elit.

+
+
+
+ +
+ +
+
+
+

Company Facts

+

We are proud of our works

+
+ +
+
+
+

1000+

+

Completed Projects

+
+ +
+

500+

+

Happy Clients

+
+ +
+

150+

+

Awards Won

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

ā€œVivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Vestibulum ligula porta felis euismod semper.ā€

+
+
+
Coriss Ambady
+

Financial Analyst

+
+
+
+
+ +
+
+

ā€œVivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Vestibulum ligula porta felis euismod semper.ā€

+
+
+
Cory Zamora
+

Marketing Specialist

+
+
+
+
+ +
+
+

ā€œVivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Vestibulum ligula porta felis euismod semper.ā€

+
+
+
Nikolas Brooten
+

Sales Manager

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

Case Studies

+

Check out some of our awesome projects with creative ideas and great design.

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

Our Team

+

Save your time by choosing our professional team.

+

Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Praesent commodo cursus magna, vel scelerisque nisl consectetur et.

+
+
+
    +
  • Aenean eu leo quam ornare curabitur blandit tempus.
  • +
  • Nullam quis risus eget urna mollis ornare donec elit.
  • +
+
+ +
+
    +
  • Etiam porta sem malesuada magna mollis euismod.
  • +
  • Fermentum massa vivamus faucibus amet euismod.
  • +
+
+ +
+ +
+ +
+ +
+
+
+
+ +
+

Why Choose Us?

+

A few reasons why our valued customers choose us.

+
+
+
+ +
+ +
+
+

Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Praesent commodo cursus magna, vel.

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

Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Praesent commodo cursus magna, vel.

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

Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Praesent commodo cursus magna, vel.

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

We are trusted by over 5000+ clients. Join them now and grow your business.

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

Join the Community

+

Let's make something great together. We are trusted by over 5000+ clients. Join them by using our services and grow your business.

+ Join Us +
+ +
+ +
+
+

Need Help?

+ +
+ +
+ +
+
+

Learn More

+ +
+ +
+ +
+
+

Get in Touch

+
Moonshine St. 14/05 Light City, London, United Kingdom
+ info@email.com
00 (123) 456 78 90 +
+ +
+ +
+ +
+
+

Ā© 2021 Sandbox. All rights reserved.

+ + +
+ +
+ +
+
+ + + +
+ + + + + \ No newline at end of file diff --git a/sandbox310/dev/demo18.html b/sandbox310/dev/demo18.html new file mode 100644 index 0000000..97d4228 --- /dev/null +++ b/sandbox310/dev/demo18.html @@ -0,0 +1,1090 @@ + + + + + + + + + + Sandbox - Modern & Multipurpose Bootstrap 5 Template + + + + + + + + +
+
+ + +
+ +
+
+
+
+
+
+
+

Networking solutions for worldwide communication

+

We're a company that focuses on establishing long-term relationships with customers.

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

Our Features

+

The service we offer is specifically designed to meet your needs.

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

Software & Integration

+

Duis mollis gravida commodo id luctus erat porttitor ligula, eget lacinia odio sem aget elit nullam quis risus eget.

+
+
+
+ +
+
+
+ +
+
+

Network Security

+

Duis mollis gravida commodo id luctus erat porttitor ligula, eget lacinia odio sem aget elit nullam quis risus eget.

+
+
+
+ +
+
+
+ +
+
+

Cloud Services

+

Duis mollis gravida commodo id luctus erat porttitor ligula, eget lacinia odio sem aget elit nullam quis risus eget.

+
+
+
+ +
+
+
+ +
+
+

Wireless Networking

+

Duis mollis gravida commodo id luctus erat porttitor ligula, eget lacinia odio sem aget elit nullam quis risus eget.

+
+
+
+ +
+
+
+ +
+
+

IT Solutions

+

Duis mollis gravida commodo id luctus erat porttitor ligula, eget lacinia odio sem aget elit nullam quis risus eget.

+
+
+
+ +
+
+
+ +
+
+

Server Configuration

+

Duis mollis gravida commodo id luctus erat porttitor ligula, eget lacinia odio sem aget elit nullam quis risus eget.

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

Have Perfect Control

+

We bring solutions to make life easier for our customers.

+

Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Vivamus sagittis lacus vel augue rutrum.

+
+
+
    +
  • Aenean quam ornare. Curabitur blandit.
  • +
  • Nullam quis risus eget urna mollis ornare.
  • +
+
+ +
+
    +
  • Etiam porta euismod malesuada mollis.
  • +
  • Vivamus sagittis lacus vel augue rutrum.
  • +
+
+ +
+ +
+ +
+ +
+
+
+
+
+
+
+ +
+
+

25000+

+

Happy Clients

+
+
+
+ +
+ +
+
+
+

Time Saved

+
+ +
+ +
+ +
+

What Makes Us Different?

+

We make spending stress free so you have the perfect control.

+

Etiam porta sem malesuada magna mollis euismod. Donec ullamcorper nulla non metus auctor fringilla. Morbi leo risus, porta ac consectetur ac, vestibulum at eros. Fusce dapibus, tellus ac cursus. Integer posuere erat a ante venenatis dapibus posuere velit.

+
    +
  • Aenean eu leo quam. Pellentesque ornare.
  • +
  • Nullam quis risus eget urna mollis ornare.
  • +
  • Donec id elit non mi porta gravida at eget.
  • +
+
+ +
+ +
+ +
+ +
+
+
+
+
+
+
+

We are proud of our works

+

We bring solutions to make life easier for our customers.

+
+ +
+
+
+ +

1000+

+

Completed Projects

+
+ +
+ +

4x

+

Revenue Growth

+
+ +
+ +

99.7%

+

Customer Satisfaction

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

ā€œVivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Vestibulum id ligula porta. Cras mattis consectetur.ā€

+
+
+
Coriss Ambady
+

Financial Analyst

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

ā€œFusce dapibus, tellus ac cursus tortor mauris condimentum fermentum massa justo sit amet purus sit amet fermentum.ā€

+
+
+
Cory Zamora
+

Marketing Specialist

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

ā€œCurabitur blandit tempus porttitor. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor eu rutrum. Nulla vitae libero.ā€

+
+
+
Nikolas Brooten
+

Sales Manager

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

ā€œEtiam adipiscing tincidunt elit convallis felis suscipit ut. Phasellus rhoncus eu tincidunt auctor nullam rutrum, pharetra augue.ā€

+
+
+
Coriss Ambady
+

Financial Analyst

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

Case Studies

+

Check out some of our awesome projects with creative ideas and great design.

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

Who Are We?

+

Company that believes in the power of creative strategy.

+

Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Aenean lacinia bibendum nulla sed.

+
+
+
    +
  • Aenean eu leo quam ornare curabitur blandit tempus.
  • +
  • Nullam quis risus eget urna mollis ornare donec elit.
  • +
+
+ +
+
    +
  • Etiam porta sem malesuada magna mollis euismod.
  • +
  • Fermentum massa vivamus faucibus amet euismod.
  • +
+
+ +
+ +
+ +
+ +
+
+
+
+
1
+
+
+

Our Vision

+

Nulla vitae elit libero, a pharetra augue. Donec id elit non mi porta gravida at eget. Fusce dapibus tellus.

+
+
+
+ +
+
+
+
2
+
+
+

Our Mission

+

Maecenas faucibus mollis interdum. Vivamus sagittis lacus vel augue laoreet. Sed posuere consectetur.

+
+
+
+ +
+
+
+
3
+
+
+

Our Values

+

Cras justo odio, dapibus ac facilisis in, egestas eget quam. Praesent commodo cursus magna scelerisque.

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

Contact Us

+

Got any questions? Don't hesitate to get in touch.

+
+
+ +
+
+
Address
+
Moonshine St. 14/05 Light City, London
+
+
+
+
+ +
+
+
Phone
+

00 (123) 456 78 90

+
+
+
+
+ +
+
+
E-mail
+

sandbox@email.com

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

Join Our Community

+

We are trusted by over 5000+ clients. Join them now and grow your business.

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

Ā© 2021 Sandbox.
All rights reserved.

+ + +
+ +
+ +
+
+

Get in Touch

+
Moonshine St. 14/05 Light City, London, United Kingdom
+ info@email.com
00 (123) 456 78 90 +
+ +
+ +
+
+

Learn More

+ +
+ +
+ +
+
+

Our Newsletter

+

Subscribe to our newsletter to get our news & deals delivered to you.

+ + +
+ +
+ +
+ +
+
+
+ + + +
+ + + + + \ No newline at end of file diff --git a/sandbox310/dev/demo19.html b/sandbox310/dev/demo19.html new file mode 100644 index 0000000..0fc4f91 --- /dev/null +++ b/sandbox310/dev/demo19.html @@ -0,0 +1,990 @@ + + + + + + + + + + Sandbox - Modern & Multipurpose Bootstrap 5 Template + + + + + + + + +
+
+ + +
+ +
+
+
+
+

We bring solutions to make life easier

+

We are a creative company that focuses on long term relationships with customers.

+
+ Read More +
+
+ +
+ +
+ +
+
+ + + +
+
+
+ +
+
+
+
+
+
+ +

Content Marketing

+

Nulla vitae elit libero, a pharetra augue. Donec id elit non mi porta gravida at eget metus cras justo.

+ Learn More +
+ +
+ +
+ +
+
+
+ +

Social Engagement

+

Nulla vitae elit libero, a pharetra augue. Donec id elit non mi porta gravida at eget metus cras justo.

+ Learn More +
+ +
+ +
+ +
+
+
+ +

Identity & Branding

+

Nulla vitae elit libero, a pharetra augue. Donec id elit non mi porta gravida at eget metus cras justo.

+ Learn More +
+ +
+ +
+ +
+
+
+ +

Product Design

+

Nulla vitae elit libero, a pharetra augue. Donec id elit non mi porta gravida at eget metus cras justo.

+ Learn More +
+ +
+ +
+ +
+ +
+
+

Why Choose Sandbox?

+

Here are a few reasons why our customers choose Sandbox.

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

Collect Ideas

+

Etiam porta sem malesuada magna mollis euismod. Donec ullamcorper nulla non metus auctor fringilla. Morbi leo risus, porta ac consectetur ac, vestibulum at eros. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam quis risus eget urna.

+
    +
  • Aenean eu leo quam. Pellentesque ornare.
  • +
  • Nullam quis risus eget urna mollis ornare.
  • +
  • Donec id elit non mi porta gravida at eget.
  • +
+ Learn More +
+ +
+ +
+ +
+
+
+
+
+ +
+

Data Analysis

+

Etiam porta sem malesuada magna mollis euismod. Donec ullamcorper nulla non metus auctor fringilla. Morbi leo risus, porta ac consectetur ac, vestibulum at eros. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam quis risus eget urna.

+
    +
  • Aenean eu leo quam. Pellentesque ornare.
  • +
  • Nullam quis risus eget urna mollis ornare.
  • +
  • Donec id elit non mi porta gravida at eget.
  • +
+ Learn More +
+ +
+ +
+ +
+
+
+
+
+ +
+

Finalize Product

+

Etiam porta sem malesuada magna mollis euismod. Donec ullamcorper nulla non metus auctor fringilla. Morbi leo risus, porta ac consectetur ac, vestibulum at eros. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam quis risus eget urna.

+
    +
  • Aenean eu leo quam. Pellentesque ornare.
  • +
  • Nullam quis risus eget urna mollis ornare.
  • +
  • Donec id elit non mi porta gravida at eget.
  • +
+ Learn More +
+ +
+ +
+ +
+ +
+ +
+ +
+
+
+
+

Save Time and Money

+

Save your time and money by choosing our professional team.

+
+ +
+
+
+
+

Customer Satisfaction

+
+ +
+
+

Increased Revenue

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

ā€œVivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Vestibulum ligula porta felis euismod semper. Cras justo odio.ā€

+
+
+
Coriss Ambady
+

Financial Analyst

+
+
+
+
+ +
+ +
+

ā€œVivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Vestibulum ligula porta felis euismod semper. Cras justo odio.ā€

+
+
+
Cory Zamora
+

Marketing Specialist

+
+
+
+
+ +
+ +
+

ā€œVivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Vestibulum ligula porta felis euismod semper. Cras justo odio.ā€

+
+
+
Nikolas Brooten
+

Sales Manager

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

Latest Projects

+

Check out some of our awesome projects with creative ideas and great design.

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

Cras Fermentum Sem

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

Mollis Ipsum Mattis

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

Ipsum Ultricies Cursus

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

Inceptos Euismod Egestas

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

Ipsum Mollis Vulputate

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

Porta Ornare Cras

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

What Makes Us Different?

+

We bring solutions to make life easier for our customers.

+
+
+
+
+ +
+
+

Creativity

+

Curabitur blandit lacus porttitor ridiculus mus.

+
+
+
+ +
+
+
+ +
+
+

Innovative Thinking

+

Curabitur blandit lacus porttitor ridiculus mus.

+
+
+
+ +
+
+
+ +
+
+

Rapid Solutions

+

Curabitur blandit lacus porttitor ridiculus mus.

+
+
+
+ +
+
+
+ +
+
+

Top-Notch Support

+

Curabitur blandit lacus porttitor ridiculus mus.

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

Join Our Community

+

We are trusted by over 5000+ clients. Join them now and grow your business.

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

Ā© 2021 Sandbox.
All rights reserved.

+ + +
+ +
+ +
+
+

Get in Touch

+
Moonshine St. 14/05 Light City, London, United Kingdom
+ info@email.com
00 (123) 456 78 90 +
+ +
+ +
+
+

Learn More

+ +
+ +
+ +
+
+

Our Newsletter

+

Subscribe to our newsletter to get our news & deals delivered to you.

+ + +
+ +
+ +
+ +
+ +
+
+ + + +
+ + + + + \ No newline at end of file diff --git a/sandbox310/dev/demo2.html b/sandbox310/dev/demo2.html new file mode 100644 index 0000000..4b3b7a6 --- /dev/null +++ b/sandbox310/dev/demo2.html @@ -0,0 +1,869 @@ + + + + + + + + + + Sandbox - Modern & Multipurpose Bootstrap 5 Template + + + + + + + +
+
+
+
+
+
+
Moonshine St. 14/05 Light City
+
+
+
+

00 (123) 456 78 90

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

We bring solutions to make life easier for our customers.

+

We have considered our solutions to support every stage of your growth.

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

What We Do?

+

The service we offer is specifically designed to meet your needs.

+
+ +
+ +
+
+
+

24/7 Support

+

Etiam porta sem malesuada magna mollis euismod. Donec ullamcorper nulla non metus auctor fringilla.

+ Learn More +
+ +
+
+

Secure Payments

+

Etiam porta sem malesuada magna mollis euismod. Donec ullamcorper nulla non metus auctor fringilla.

+ Learn More +
+ +
+
+

Daily Updates

+

Etiam porta sem malesuada magna mollis euismod. Donec ullamcorper nulla non metus auctor fringilla.

+ Learn More +
+ +
+
+

Market Research

+

Etiam porta sem malesuada magna mollis euismod. Donec ullamcorper nulla non metus auctor fringilla.

+ Learn More +
+ +
+ +
+
+
+
+
+
+ +
+

How It Works?

+

So here are three working steps why our valued customers choose us.

+
+
+ 1 +
+
+

Collect Ideas

+

Nulla vitae elit libero pharetra augue dapibus. Praesent commodo cursus.

+
+
+
+
+ 2 +
+
+

Data Analysis

+

Vivamus sagittis lacus vel augue laoreet. Etiam porta sem malesuada magna.

+
+
+
+
+ 3 +
+
+

Finalize Product

+

Cras mattis consectetur purus sit amet. Aenean lacinia bibendum nulla sed.

+
+
+
+ +
+ +
+
+

Latest Projects

+

Check out some of our awesome projects with creative ideas and great design.

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

Who Are We?

+

Company that believes in the power of creative strategy.

+

Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Praesent commodo cursus magna, vel scelerisque nisl consectetur et.

+
+
+
    +
  • Aenean eu leo quam ornare curabitur blandit tempus.
  • +
  • Nullam quis risus eget urna mollis ornare donec elit.
  • +
+
+ +
+
    +
  • Etiam porta sem malesuada magna mollis euismod.
  • +
  • Fermentum massa vivamus faucibus amet euismod.
  • +
+
+ +
+ +
+ +
+ +
+
+

Meet the Team

+

Save your time and money by choosing our professional team.

+

Donec id elit non mi porta gravida at eget metus. Morbi leo risus, porta ac consectetur ac, vestibulum at eros tempus porttitor.

+ See All Members +
+ +
+
+
+
+
+ +

Cory Zamora

+
Marketing Specialist
+

Etiam porta sem magna malesuada mollis.

+ + +
+ +
+ +

Coriss Ambady

+
Financial Analyst
+

Aenean eu leo quam. Pellentesque ornare lacinia.

+ + +
+ +
+ +

Nikolas Brooten

+
Sales Manager
+

Donec ornare elit quam porta gravida at eget.

+ + +
+ +
+ +

Jackie Sanders

+
Investment Planner
+

Nullam risus eget urna mollis ornare vel eu leo.

+ + +
+ +
+ +

Tina Geller

+
Assistant Buyer
+

Vivamus sagittis lacus vel augue laoreet rutrum.

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

ā€œFusce dapibus tellus ac cursus commodo, tortor mauris condimentum nibh ut fermentum massa, justo sit amet vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Cras mattis consectetur purus sit amet fermentum. Aenean lacinia bibendum nulla sedā€

+
+
+
Coriss Ambady
+
Financial Analyst
+
+
+
+
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+
+
+
+
+ +

Ā© 2021 Sandbox.
All rights reserved.

+ + +
+ +
+ +
+
+

Get in Touch

+
Moonshine St. 14/05 Light City, London, United Kingdom
+ info@email.com
00 (123) 456 78 90 +
+ +
+ +
+
+

Learn More

+ +
+ +
+ +
+
+

Our Newsletter

+

Subscribe to our newsletter to get our news & deals delivered to you.

+ + +
+ +
+ +
+ +
+ +
+
+ + + +
+ + + + + \ No newline at end of file diff --git a/sandbox310/dev/demo20.html b/sandbox310/dev/demo20.html new file mode 100644 index 0000000..598f18d --- /dev/null +++ b/sandbox310/dev/demo20.html @@ -0,0 +1,954 @@ + + + + + + + + + + Sandbox - Modern & Multipurpose Bootstrap 5 Template + + + + + + + + +
+
+
+ + +
+
+

Sandbox

+ +
+
+
+

Sandbox is a multipurpose HTML5 template with various layouts which will be a great solution for your business.

+
+ +
+

Contact Info

+
Moonshine St. 14/05
Light City, London
+ info@email.com
00 (123) 456 78 90 +
+ +
+

Learn More

+ +
+ +
+

Follow Us

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

Rapid Solutions,Innovative Thinking,Top-Notch Support

+

We are a digital agency specializing in web design, mobile development and seo optimization.

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

What We Do?

+

The service we offer is specifically designed to meet your needs.

+
+ +
+ +
+
+
+
+ +
+

Web Design

+

Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Praesent commodo cursus magna risus varius.

+
    +
  • Aenean quam ornare curabitur blandit.
  • +
  • Nullam quis risus eget urna mollis ornare leo.
  • +
  • Etiam porta euismod mollis natoque ornare.
  • +
+ More Details +
+ +
+ +
+
+
+
+ +
+

Mobile Development

+

Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Praesent commodo cursus magna risus varius.

+
    +
  • Aenean quam ornare curabitur blandit.
  • +
  • Nullam quis risus eget urna mollis ornare leo.
  • +
  • Etiam porta euismod mollis natoque ornare.
  • +
+ More Details +
+ +
+ +
+
+
+
+ +
+

SEO Optimization

+

Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Praesent commodo cursus magna risus varius.

+
    +
  • Aenean quam ornare curabitur blandit.
  • +
  • Nullam quis risus eget urna mollis ornare leo.
  • +
  • Etiam porta euismod mollis natoque ornare.
  • +
+ More Details +
+ +
+ +
+ +
+ +
+
+
+
+
+
+ +
+
+ +
+ +
+
+ +
+ +
+
+

Our Working Process

+

Find out everything you need to know about creating a business process model

+
+
+

1. Collect Ideas

+

Etiam porta malesuada magna mollis euismod consectetur leo elit.

+
+ +
+

2. Data Analysis

+

Etiam porta malesuada magna mollis euismod consectetur leo elit.

+
+ +
+

3. Finalize Product

+

Etiam porta malesuada magna mollis euismod consectetur leo elit.

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

Our Projects

+

Check out some of our awesome projects with creative ideas and great design.

+
+ +
+ +
+
+
+
+
+
+

Cras Fermentum Sem

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

Mollis Ipsum Mattis

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

Ipsum Ultricies Cursus

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

Inceptos Euismod Egestas

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

Ipsum Mollis Vulputate

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

Porta Ornare Cras

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

Our Clients

+

Trusted by over 300+ clients

+

We bring solutions to make life easier for our customers.

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

What Makes Us Different?

+

We make spending stress free so you have the perfect control.

+
+
+
+
+ +
+
+

Creativity

+

Curabitur blandit lacus porttitor ridiculus mus.

+
+
+
+ +
+
+
+ +
+
+

Innovative Thinking

+

Curabitur blandit lacus porttitor ridiculus mus.

+
+
+
+ +
+
+
+ +
+
+

Rapid Solutions

+

Curabitur blandit lacus porttitor ridiculus mus.

+
+
+
+ +
+
+
+ +
+
+

Top-Notch Support

+

Curabitur blandit lacus porttitor ridiculus mus.

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

Join Our Community

+

We are trusted by over 5000+ clients. Join them now and grow your business.

+
+ +
+ +
+
+
+
+

1000+

+

Completed Projects

+
+ +
+

50K+

+

Happy Customers

+
+ +
+

4x

+

Revenue Growth

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

Ā© 2021 Sandbox.
All rights reserved.

+ + +
+ +
+ +
+
+

Get in Touch

+
Moonshine St. 14/05 Light City, London, United Kingdom
+ info@email.com
00 (123) 456 78 90 +
+ +
+ +
+
+

Learn More

+ +
+ +
+ +
+
+

Our Newsletter

+

Subscribe to our newsletter to get our news & deals delivered to you.

+ + +
+ +
+ +
+ +
+ +
+
+ +
+ + + +
+ + + + + \ No newline at end of file diff --git a/sandbox310/dev/demo21.html b/sandbox310/dev/demo21.html new file mode 100644 index 0000000..8eff559 --- /dev/null +++ b/sandbox310/dev/demo21.html @@ -0,0 +1,1187 @@ + + + + + + + + + + Sandbox - Modern & Multipurpose Bootstrap 5 Template + + + + + + + + +
+
+ + +
+ +
+
+
+
+
+
+ +
+

A digital agency
specializing on
mobile design,web design,3D animation

+

We are an award winning design agency that strongly believes in the power of creative ideas.

+ Get Started +
+ +
+ +

Trusted by over 2K+ clients across the world

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

What We Do?

+

The service we offer is specifically designed to meet your needs.

+
+ +
+ +
+
+
+
+

Web Design

+

Nulla vitae elit libero, a pharetra augue. Donec id elit non mi porta gravida at eget. Fusce dapibus tellus.

+ Learn More +
+ +
+ +
+
+
+

Graphic Design

+

Maecenas faucibus mollis interdum. Vivamus sagittis lacus vel augue laoreet. Sed posuere consectetur.

+ Learn More +
+ +
+ +
+
+
+

3D Animation

+

Cras justo odio, dapibus ac facilisis in, egestas eget quam. Praesent commodo cursus magna scelerisque.

+ Learn More +
+ +
+ +
+ +
+ +
+ +
+
+
+
+
+
+
+
+ 01 +
+
+

Collect Ideas

+

Nulla vitae elit libero pharetra augue dapibus.

+
+
+
+ +
+ +
+
+
+
+ 02 +
+
+

Data Analysis

+

Vivamus sagittis lacus vel augue laoreet.

+
+
+
+ +
+ +
+
+
+
+ 03 +
+
+

Finalize Product

+

Cras mattis consectetur purus sit amet.

+
+
+
+ +
+ +
+ +
+

Our Strategy

+

Here are 3 working steps to organize our projects.

+

Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Etiam porta sem malesuada magna mollis euismod. Nullam id dolor id nibh ultricies vehicula ut id elit. Nullam quis risus eget urna mollis.

+

Nullam id dolor id nibh ultricies vehicula ut id elit. Vestibulum id ligula porta felis euismod semper. Aenean lacinia bibendum nulla sed consectetur.

+ Learn More +
+ +
+ +
+ +
+ +
+
+
+
+
+
+ +
+

Why Choose Us?

+

We bring solutions to make life easier.

+
+
+
+ +
+ +
+
+

Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Praesent commodo cursus magna, vel.

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

Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Praesent commodo cursus magna, vel.

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

Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Praesent commodo cursus magna, vel.

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

Company Facts

+

We are proud of our design team

+

Just sit back and relax while we take care of your business needs for you.

+
+ +
+
+
+
+

1000+

+

Completed Projects

+
+ +
+
+

50K+

+

Happy Customers

+
+ +
+
+

20+

+

Awards Won

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

Coriss Ambady

+
Financial Analyst
+

Fermentum massa justo sit amet risus morbi leo.

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

Cory Zamora

+
Marketing Specialist
+

Fermentum massa justo sit amet risus morbi leo.

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

Nikolas Brooten

+
Sales Manager
+

Fermentum massa justo sit amet risus morbi leo.

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

Jackie Sanders

+
Investment Planner
+

Fermentum massa justo sit amet risus morbi leo.

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

Latest Projects

+

Check out some of our awesome projects with creative ideas and great design.

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

Happy Customers

+

Don't take our word for it. See what customers are saying about us.

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

ā€œVivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Vestibulum id ligula porta felis euismod semper. Cras justo odio dapibus facilisis sociis natoque penatibus.ā€

+
+ +
+
Coriss Ambady
+

Financial Analyst

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

ā€œFusce dapibus, tellus ac cursus tortor mauris condimentum fermentum massa justo sit amet. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Cras mattis consectetur purus sit amet fermentum. Aenean lacinia bibendum nulla sed.ā€

+
+ +
+
Cory Zamora
+

Marketing Specialist

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

ā€œCurabitur blandit tempus porttitor. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Nullam quis risus eget porta ac consectetur vestibulum. Donec sed odio dui consectetur adipiscing elit.ā€

+
+ +
+
Nikolas Brooten
+

Sales Manager

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

ā€œEtiam adipiscing tincidunt elit convallis felis suscipit ut. Phasellus rhoncus tincidunt auctor. Nullam eu sagittis mauris. Donec non dolor ac elit aliquam tincidunt at at sapien. Aenean tortor libero condimentum ac laoreet vitae.ā€

+
+ +
+
Coriss Ambady
+

Financial Analyst

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

ā€œMaecenas sed diam eget risus varius blandit sit amet non magna. Cum sociis natoque penatibus magnis dis montes, nascetur ridiculus mus. Donec sed odio dui. Nulla vitae elit libero.ā€

+
+ +
+
Jackie Sanders
+

Investment Planner

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

ā€œDonec id elit non mi porta gravida at eget metus. Nulla vitae elit libero, a pharetra augue. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.ā€

+
+ +
+
Laura Widerski
+

Sales Specialist

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

FAQ

+

If you don't see an answer to your question, you can send us an email from our contact form.

+

Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit. Nullam quis risus eget urna mollis ornare.

+ All FAQ +
+ +
+
+
+
+ +
+ +
+
+

Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec sed odio dui. Cras justo odio, dapibus ac facilisis.

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

Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec sed odio dui. Cras justo odio, dapibus ac facilisis.

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

Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec sed odio dui. Cras justo odio, dapibus ac facilisis.

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

Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec sed odio dui. Cras justo odio, dapibus ac facilisis.

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

Join our community by using our services and grow your business.

+ Try It For Free +
+ +
+
+
+
+ +

Ā© 2021 Sandbox.
All rights reserved.

+ + +
+ +
+ +
+
+

Get in Touch

+
Moonshine St. 14/05 Light City, London, United Kingdom
+ info@email.com
00 (123) 456 78 90 +
+ +
+ +
+
+

Learn More

+ +
+ +
+ +
+
+

Our Newsletter

+

Subscribe to our newsletter to get our news & deals delivered to you.

+ + +
+ +
+ +
+ +
+ +
+
+ + + +
+ + + + + \ No newline at end of file diff --git a/sandbox310/dev/demo3.html b/sandbox310/dev/demo3.html new file mode 100644 index 0000000..5fe0a1e --- /dev/null +++ b/sandbox310/dev/demo3.html @@ -0,0 +1,1048 @@ + + + + + + + + + + Sandbox - Modern & Multipurpose Bootstrap 5 Template + + + + + + + + +
+
+ + + + +
+ +
+
+
+
+

Sandbox focuses on

+

We carefully consider our solutions to support each and every stage of your growth.

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

What We Do?

+

The service we offer is specifically designed to meet your needs.

+
+ +
+ +
+
+
+

24/7 Support

+

Nulla vitae elit libero, a pharetra augue. Donec id elit non mi porta gravida at eget metus. Cras justo.

+ Learn More +
+ +
+
+

Secure Payments

+

Nulla vitae elit libero, a pharetra augue. Donec id elit non mi porta gravida at eget metus. Cras justo.

+ Learn More +
+ +
+
+

Daily Updates

+

Nulla vitae elit libero, a pharetra augue. Donec id elit non mi porta gravida at eget metus. Cras justo.

+ Learn More +
+ +
+
+

Market Research

+

Nulla vitae elit libero, a pharetra augue. Donec id elit non mi porta gravida at eget metus. Cras justo.

+ Learn More +
+ +
+ +
+
+
+
+
+
+ +
+

How It Works?

+

Here are the 3 working steps on success.

+
+
+ 1 +
+
+

Collect Ideas

+

Nulla vitae elit libero pharetra augue dapibus. Praesent commodo cursus.

+
+
+
+
+ 2 +
+
+

Data Analysis

+

Vivamus sagittis lacus vel augue laoreet. Etiam porta sem malesuada magna.

+
+
+
+
+ 3 +
+
+

Finalize Product

+

Cras mattis consectetur purus sit amet. Aenean lacinia bibendum nulla sed.

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

Why Choose Us?

+

A few reasons why our valued customers choose us.

+
+
+
+ +
+ +
+
+

Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Praesent commodo cursus magna, vel.

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

Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Praesent commodo cursus magna, vel.

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

Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Praesent commodo cursus magna, vel.

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

Join Our Community

+

We are trusted by over 5000+ clients. Join them by using our services and grow your business.

+ Join Us +
+ +
+ +
+ +
+ +
+
+
+
+

Case Studies

+

Check out some of our awesome projects with creative ideas and great design.

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

Company Facts

+

We are proud of our works

+
+ +
+
+
+

1000+

+

Completed Projects

+
+ +
+

500+

+

Happy Clients

+
+ +
+

150+

+

Awards Won

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

ā€œVivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Vestibulum ligula porta felis euismod semper. Cras justo odio.ā€

+
+
+
Coriss Ambady
+

Financial Analyst

+
+
+
+
+ +
+
+

ā€œVivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Vestibulum ligula porta felis euismod semper. Cras justo odio.ā€

+
+
+
Cory Zamora
+

Marketing Specialist

+
+
+
+
+ +
+
+

ā€œVivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Vestibulum ligula porta felis euismod semper. Cras justo odio.ā€

+
+
+
Nikolas Brooten
+

Sales Manager

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

Our Pricing

+

We offer great and premium prices.

+

Enjoy a free 30-day trial and experience the full service. No credit card required!

+ See All Prices +
+ +
+
+

Monthly

+
+
+
+
+
+

Yearly (Save 30%)

+
+
+
+
+
+
+
+
+
$19 month
+
$199 year
+
+ +

Premium Plan

+
    +
  • 5 Projects
  • +
  • 100K API Access
  • +
  • 200MB Storage
  • +
  • Weekly Reports
  • +
  • 7/24 Support
  • +
+ Choose Plan +
+ +
+ +
+ + + +
+ +
+ +
+ +
+
+
+
+
+
+ +
+

Get In Touch

+

Convinced yet? Let's make something great together.

+
+
+
+
+
+
Address
+
Moonshine St. 14/05 Light City,
London, United Kingdom
+
+
+
+
+
+
+
+
Phone
+

00 (123) 456 78 90

+
+
+
+
+
+
+
+
E-mail
+

sandbox@email.com

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

Ā© 2021 Sandbox.
All rights reserved.

+ + +
+ +
+ +
+
+

Get in Touch

+
Moonshine St. 14/05 Light City, London, United Kingdom
+ info@email.com
00 (123) 456 78 90 +
+ +
+ +
+
+

Learn More

+ +
+ +
+ +
+
+

Our Newsletter

+

Subscribe to our newsletter to get our news & deals delivered to you.

+ + +
+ +
+ +
+ +
+ +
+
+ + + +
+ + + + + \ No newline at end of file diff --git a/sandbox310/dev/demo4.html b/sandbox310/dev/demo4.html new file mode 100644 index 0000000..d015d44 --- /dev/null +++ b/sandbox310/dev/demo4.html @@ -0,0 +1,993 @@ + + + + + + + + + + Sandbox - Modern & Multipurpose Bootstrap 5 Template + + + + + + + + +
+
+ + +
+ +
+
+
+ +
+
+
+
+

Just sit & relax while we take care of your business needs.

+

We make your spending stress-free for you to have the perfect control.

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

20+

+

Year Experience

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

We bring solutions to make life easier for our customers.

+

Nulla vitae elit libero, a pharetra augue. Aenean lacinia bibendum nulla sed consectetur. Integer posuere erat a ante venenatis dapibus posuere velit aliquet. Vestibulum id ligula porta felis euismod semper. Vestibulum id ligula.

+
+
+
    +
  • Aenean quam ornare curabitur blandit consectetur.
  • +
  • Nullam quis risus eget urna mollis ornare aenean leo.
  • +
+
+ +
+
    +
  • Etiam porta euismod malesuada mollis nisl ornare sem.
  • +
  • Vivamus sagittis lacus augue rutrum maecenas.
  • +
+
+ +
+ +
+ +
+ +
+
+
+
+ +
+
+

24/7 Support

+

Duis mollis gravida commodo id luctus erat porttitor ligula, eget lacinia odio sem aget elit nullam quis risus eget.

+
+
+
+ +
+
+
+ +
+
+

Secure Payments

+

Duis mollis gravida commodo id luctus erat porttitor ligula, eget lacinia odio sem aget elit nullam quis risus eget.

+
+
+
+ +
+
+
+ +
+
+

Daily Updates

+

Duis mollis gravida commodo id luctus erat porttitor ligula, eget lacinia odio sem aget elit nullam quis risus eget.

+
+
+
+ +
+
+
+ +
+
+

Market Research

+

Duis mollis gravida commodo id luctus erat porttitor ligula, eget lacinia odio sem aget elit nullam quis risus eget.

+
+
+
+ +
+
+
+ +
+
+

System Integration

+

Duis mollis gravida commodo id luctus erat porttitor ligula, eget lacinia odio sem aget elit nullam quis risus eget.

+
+
+
+ +
+
+
+ +
+
+

SEO Services

+

Duis mollis gravida commodo id luctus erat porttitor ligula, eget lacinia odio sem aget elit nullam quis risus eget.

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

A few reasons why our valued customers choose us.

+
+
+
+ +
+ +
+
+

Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Cum sociis natoque penatibus et magnis dis parturient montes.

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

Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Cum sociis natoque penatibus et magnis dis parturient montes.

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

Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Cum sociis natoque penatibus et magnis dis parturient montes.

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

Find out everything you need to know about creating a business process model.

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

We are proud of our creative team

+

Just sit back and relax while we take care of your business needs.

+
+ +
+
+
+ +

7518

+

Completed Projects

+
+ +
+ +

3472

+

Happy Customers

+
+ +
+ +

2184

+

Expert Employees

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

Coriss Ambady

+
Financial Analyst
+

Fermentum massa justo sit amet risus morbi leo.

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

Cory Zamora

+
Marketing Specialist
+

Fermentum massa justo sit amet risus morbi leo.

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

Nikolas Brooten

+
Sales Manager
+

Fermentum massa justo sit amet risus morbi leo.

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

Jackie Sanders

+
Investment Planner
+

Fermentum massa justo sit amet risus morbi leo.

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

What People Say About Us

+

Don't take our word for it. See what customers are saying about us.

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

5000+

+

Satisfied Customers

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

ā€œVivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Vestibulum ligula porta felis euismod semper. Cras justo consectetur.ā€

+
+
+
Coriss Ambady
+

Financial Analyst

+
+
+
+
+ +
+
+

ā€œVivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Vestibulum ligula porta felis euismod semper. Cras justo odio consectetur.ā€

+
+
+
Cory Zamora
+

Marketing Specialist

+
+
+
+
+ +
+
+

ā€œVivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Vestibulum ligula porta felis euismod semper. Cras justo odio consectetur.ā€

+
+
+
Nikolas Brooten
+

Sales Manager

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

Let’s Talk

+

Let's make something great together. We are trusted by over 5000+ clients. Join them by using our services and grow your business.

+

Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Maecenas faucibus mollis interdum. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus.

+ Join Us +
+ +
+ +
+ +
+ +
+ +
+
+
+
+
+
+

Address

+
Moonshine St. 14/05
Light City, London, UK
+
+ +
+ +
+
+

Phone

+

00 (123) 456 78 90
00 (987) 654 32 10

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

Ā© 2021 Sandbox. All rights reserved.

+ + +
+ +
+ +
+ +
+
+ + + +
+ + + + + \ No newline at end of file diff --git a/sandbox310/dev/demo5.html b/sandbox310/dev/demo5.html new file mode 100644 index 0000000..7836ed6 --- /dev/null +++ b/sandbox310/dev/demo5.html @@ -0,0 +1,1047 @@ + + + + + + + + + + Sandbox - Modern & Multipurpose Bootstrap 5 Template + + + + + + +
+
+ + + + + + +
+ +
+
+
+
+

Staying on top of your bills never been this easy

+

Easily achieve your saving goals. Have all your recurring and one time expenses and incomes in one place.

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

We have considered our solutions to support every stage of growth.

+

Etiam porta sem malesuada magna mollis euismod. Donec ullamcorper nulla non metus auctor fringilla. Morbi leo risus, porta ac consectetur ac, vestibulum at eros. Fusce dapibus, tellus ac cursus commodo.

+
+
+
    +
  • Aenean quam ornare curabitur blandit consectetur.
  • +
  • Nullam quis risus eget urna mollis ornare aenean leo.
  • +
+
+ +
+
    +
  • Etiam porta euismod malesuada mollis nisl ornare.
  • +
  • Vivamus sagittis lacus augue rutrum maecenas odio.
  • +
+
+ +
+ +
+ +
+ +
+
+
+
+
+ + +
+ +
+ + +
+ +
+ +
+ +
+

We make spending stress free so you have the perfect control.

+

Etiam porta sem malesuada magna mollis euismod. Donec ullamcorper nulla non metus auctor fringilla. Morbi leo risus, porta ac consectetur ac, vestibulum at eros. Fusce dapibus, tellus ac cursus commodo.

+
+
+
    +
  • Aenean quam ornare curabitur blandit consectetur.
  • +
  • Nullam quis risus eget urna mollis ornare aenean leo.
  • +
+
+ +
+
    +
  • Etiam porta euismod malesuada mollis nisl ornare.
  • +
  • Vivamus sagittis lacus augue rutrum maecenas odio.
  • +
+
+ +
+ +
+ +
+ +
+
+
+
+
+ +
+ +
+ + +
+ +
+ +
+ +
+

We bring solutions to manage your finance the way works best.

+

Etiam porta sem malesuada magna mollis euismod. Donec ullamcorper nulla non metus auctor fringilla. Morbi leo risus, porta ac consectetur ac, vestibulum at eros. Fusce dapibus, tellus ac cursus commodo.

+
+
+
    +
  • Aenean quam ornare curabitur blandit consectetur.
  • +
  • Nullam quis risus eget urna mollis ornare aenean leo.
  • +
+
+ +
+
    +
  • Etiam porta euismod malesuada mollis nisl ornare.
  • +
  • Vivamus sagittis lacus augue rutrum maecenas odio.
  • +
+
+ +
+ +
+ +
+ +
+ +
+ +
+
+
+
+
+
+
+ +
+
+ +
+ +
+
+

Find out everything you need to know about creating a business process model

+
+
+

1. Secured Transactions

+

Etiam porta malesuada magna mollis euismod sem.

+
+ +
+

2. Budget Planning

+

Etiam porta malesuada magna mollis euismod sem.

+
+ +
+

3. Up to Date

+

Etiam porta malesuada magna mollis euismod sem.

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

5000+

+

Satisfied Customers

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

ā€œVivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Vestibulum ligula porta felis euismod semper. Cras justo odio consectetur.ā€

+
+
+
Coriss Ambady
+

Financial Analyst

+
+
+
+
+ +
+
+

ā€œVivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Vestibulum ligula porta felis euismod semper. Cras justo odio consectetur.ā€

+
+
+
Cory Zamora
+

Marketing Specialist

+
+
+
+
+ +
+
+

ā€œVivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Vestibulum ligula porta felis euismod semper. Cras justo odio consectetur.ā€

+
+
+
Nikolas Brooten
+

Sales Manager

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

We offer great prices, premium products and quality service for your business.

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

Monthly

+
+
+
+
+
+

Yearly

+
+
+
+
+
+ +

Basic Plan

+
+
$9 month
+
$99 year
+
+ +
    +
  • 1 Project
  • +
  • 100K API Access
  • +
  • 100MB Storage
  • +
  • Weekly Reports
  • +
  • 7/24 Support
  • +
+ Choose Plan +
+ +
+ +
+ + + +
+
+
+ +

Corporate Plan

+
+
$49 month
+
$499 year
+
+ +
    +
  • 20 Projects
  • +
  • 300K API Access
  • +
  • 500MB Storage
  • +
  • Weekly Reports
  • +
  • 7/24 Support
  • +
+ Choose Plan +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+
+
+
+

We are trusted by over 5000+ clients. Join them now and grow your business.

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

Ā© 2021 Sandbox.
All rights reserved.

+ + +
+ +
+ +
+
+

Get in Touch

+
Moonshine St. 14/05 Light City, London, United Kingdom
+ info@email.com
00 (123) 456 78 90 +
+ +
+ +
+
+

Learn More

+ +
+ +
+ +
+
+

Our Newsletter

+

Subscribe to our newsletter to get our news & deals delivered to you.

+ + +
+ +
+ +
+ +
+ +
+
+ + + +
+ + + + + \ No newline at end of file diff --git a/sandbox310/dev/demo6.html b/sandbox310/dev/demo6.html new file mode 100644 index 0000000..2450529 --- /dev/null +++ b/sandbox310/dev/demo6.html @@ -0,0 +1,966 @@ + + + + + + + + + + Sandbox - Modern & Multipurpose Bootstrap 5 Template + + + + + + + + +
+
+ + + + +
+ +
+
+ +
+
+

Get all of your steps, exercise, sleep and meds in one place.

+

Sandbox is now available to download from both the App Store and Google Play Store.

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

App Features

+

Sandbox is the only app you need to track your goals for better health.

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

Fitness Goal

+

Duis mollis gravida commodo id luctus erat porttitor ligula, eget lacinia odio sem aget elit nullam quis risus eget.

+
+
+
+ +
+
+
+ +
+
+

Activity Tracking

+

Duis mollis gravida commodo id luctus erat porttitor ligula, eget lacinia odio sem aget elit nullam quis risus eget.

+
+
+
+ +
+
+
+ +
+
+

Sleep Analysis

+

Duis mollis gravida commodo id luctus erat porttitor ligula, eget lacinia odio sem aget elit nullam quis risus eget.

+
+
+
+ +
+
+
+ +
+
+

Workout Report

+

Duis mollis gravida commodo id luctus erat porttitor ligula, eget lacinia odio sem aget elit nullam quis risus eget.

+
+
+
+ +
+
+
+ +
+
+

Nutritional Analysis

+

Duis mollis gravida commodo id luctus erat porttitor ligula, eget lacinia odio sem aget elit nullam quis risus eget.

+
+
+
+ +
+
+
+ +
+
+

Activity Sharing

+

Duis mollis gravida commodo id luctus erat porttitor ligula, eget lacinia odio sem aget elit nullam quis risus eget.

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

How It Works

+

Download the app, create your profile and voilĆ , you're all set!

+

Donec ullamcorper nulla non metus auctor fringilla. Cras mattis consectetur purus sit amet fermentum. Integer posuere erat a ante venenatis dapibus posuere velit aliquet. Nulla vitae elit libero. Etiam porta sem malesuada magna mollis euismod. Fusce dapibus, tellus ac cursus commodo.

+
+
+

1. Download

+

Nulla vitae elit libero elit non porta eget.

+
+ +
+

2. Set Profile

+

Nulla vitae elit libero elit non porta eget.

+
+ +
+

3. Start

+

Nulla vitae elit libero elit non porta eget.

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

FAQ

+

If you don't see an answer to your question, you can send us an email from our contact form.

+
+
+
+
+
+ +
+ +
+
+

Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec sed odio dui. Cras justo odio, dapibus ac facilisis.

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

Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec sed odio dui. Cras justo odio, dapibus ac facilisis.

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

Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec sed odio dui. Cras justo odio, dapibus ac facilisis.

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

Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec sed odio dui. Cras justo odio, dapibus ac facilisis.

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

Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec sed odio dui. Cras justo odio, dapibus ac facilisis.

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

Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec sed odio dui. Cras justo odio, dapibus ac facilisis.

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

Happy Customers

+

Don't take our word for it. See what customers are saying about us.

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

ā€œVivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Vestibulum id ligula porta felis euismod semper. Cras justo odio dapibus facilisis sociis natoque.ā€

+
+ +
+
Coriss Ambady
+

Financial Analyst

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

ā€œVivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Vestibulum id ligula porta felis euismod semper. Cras justo odio dapibus facilisis sociis natoque.ā€

+
+ +
+
Cory Zamora
+

Marketing Specialist

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

ā€œVivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Vestibulum id ligula porta felis euismod semper. Cras justo odio dapibus facilisis sociis natoque.ā€

+
+ +
+
Nikolas Brooten
+

Sales Manager

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

ā€œVivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Vestibulum id ligula porta felis euismod semper. Cras justo odio dapibus facilisis sociis natoque.ā€

+
+ +
+
Coriss Ambady
+

Financial Analyst

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

ā€œVivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Vestibulum id ligula porta felis euismod semper. Cras justo odio dapibus facilisis sociis natoque.ā€

+
+ +
+
Jackie Sanders
+

Investment Planner

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

ā€œVivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Vestibulum id ligula porta felis euismod semper. Cras justo odio dapibus facilisis sociis natoque.ā€

+
+ +
+
Laura Widerski
+

Sales Specialist

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

Get all of your steps, exercise, sleep and meds in one place.

+

Sandbox is now available to download from both the App Store and Google Play Store.

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

Ā© 2021 Sandbox.
All rights reserved.

+ + +
+ +
+ +
+
+

Get in Touch

+
Moonshine St. 14/05 Light City, London, United Kingdom
+ info@email.com
00 (123) 456 78 90 +
+ +
+ +
+
+

Learn More

+ +
+ +
+ +
+
+

Our Newsletter

+

Subscribe to our newsletter to get our news & deals delivered to you.

+ + +
+ +
+ +
+ +
+ +
+
+ + + +
+ + + + + \ No newline at end of file diff --git a/sandbox310/dev/demo7.html b/sandbox310/dev/demo7.html new file mode 100644 index 0000000..c676048 --- /dev/null +++ b/sandbox310/dev/demo7.html @@ -0,0 +1,1000 @@ + + + + + + + + + + Sandbox - Modern & Multipurpose Bootstrap 5 Template + + + + + + + + +
+
+ + +
+ +
+
+
+
+

Creative. Smart. Awesome.

+

We are an award winning web & mobile design agency that strongly believes in the power of creative ideas.

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

Web Design

+

Nulla vitae elit libero, a pharetra augue. Donec id elit non mi porta gravida.

+ Learn More +
+ +
+ +
+ +
+ +
+ +
+
+
+
+
+ +
+
+
+
+

Mobile Design

+

Nulla vitae elit libero, a pharetra augue. Donec id elit non mi porta gravida.

+ Learn More +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+

What We Do?

+

The full service we are offering is specifically designed to meet your business needs.

+

Donec ullamcorper nulla non metus auctor fringilla. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam quis risus eget urna mollis ornare vel eu leo. Nullam quis risus eget urna mollis ornare vel eu leo. Maecenas faucibus mollis elit interdum. Duis mollis, est non commodo luctus, nisi erat ligula.

+ More Details +
+ +
+ +
+
+
+
+
+
+
+
+
+
+
+

7518

+

Projects Done

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

3472

+

Happy Customers

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

4537

+

Expert Employees

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

2184

+

Awards Won

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

Join Our Community

+

We have considered our business solutions to support you on every stage of your growth.

+

Integer posuere erat a ante venenatis dapibus posuere velit aliquet. Morbi leo risus, porta ac consectetur ac, vestibulum at eros. Praesent commodo cursus magna, vel scelerisque nisl consectetur.

+
+ +
+ +
+ +
+
+
+
+

Our Recent Projects

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

Have Perfect Control

+

We are focused on establishing long-term relationships with customers.

+

Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Praesent commodo cursus magna, vel scelerisque nisl consectetur et.

+
+
+
    +
  • Aenean quam ornare. Curabitur blandit.
  • +
  • Nullam quis risus eget urna mollis ornare.
  • +
+
+ +
+
    +
  • Etiam porta euismod malesuada mollis.
  • +
  • Vivamus sagittis lacus vel augue rutrum.
  • +
+
+ +
+ +
+ +
+ +
+
+
+
+ +
+

Why Choose Us?

+

Find out everything you need to know about creating a business process model.

+
+
+
+ +
+ +
+
+

Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Praesent commodo cursus magna, vel.

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

Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Praesent commodo cursus magna, vel.

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

Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Praesent commodo cursus magna, vel.

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

Happy Customers

+
+
+
+
+
+ +
+

ā€œVivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Vestibulum id ligula porta felis euismod semper. Cras justo odio dapibus facilisis sociis natoque penatibus.ā€

+
+ +
+
Coriss Ambady
+

Financial Analyst

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

ā€œFusce dapibus, tellus ac cursus tortor mauris condimentum fermentum massa justo sit amet. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Cras mattis consectetur purus sit amet fermentum. Aenean lacinia bibendum nulla sed.ā€

+
+ +
+
Cory Zamora
+

Marketing Specialist

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

ā€œCurabitur blandit tempus porttitor. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Nullam quis risus eget porta ac consectetur vestibulum. Donec sed odio dui consectetur adipiscing elit.ā€

+
+ +
+
Nikolas Brooten
+

Sales Manager

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

ā€œEtiam adipiscing tincidunt elit convallis felis suscipit ut. Phasellus rhoncus tincidunt auctor. Nullam eu sagittis mauris. Donec non dolor ac elit aliquam tincidunt at at sapien. Aenean tortor libero condimentum ac laoreet vitae.ā€

+
+ +
+
Coriss Ambady
+

Financial Analyst

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

ā€œMaecenas sed diam eget risus varius blandit sit amet non magna. Cum sociis natoque penatibus magnis dis montes, nascetur ridiculus mus. Donec sed odio dui. Nulla vitae elit libero.ā€

+
+ +
+
Jackie Sanders
+

Investment Planner

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

ā€œDonec id elit non mi porta gravida at eget metus. Nulla vitae elit libero, a pharetra augue. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.ā€

+
+ +
+
Laura Widerski
+

Sales Specialist

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

Subscribe to our newsletter

+

Subscribe to our newsletter to get our news & deals delivered to you. Don't worry, we hate spam and we respect your privacy.

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

Join the Community

+

Let's make something great together. We are trusted by over 5000+ clients. Join them by using our services and grow your business.

+ Join Us +
+ +
+ +
+
+

Need Help?

+ +
+ +
+ +
+
+

Learn More

+ +
+ +
+ +
+
+

Get in Touch

+
Moonshine St. 14/05 Light City, London, United Kingdom
+ info@email.com
00 (123) 456 78 90 +
+ +
+ +
+ +
+
+

Ā© 2021 Sandbox. All rights reserved.

+ + +
+ +
+ +
+
+ + + +
+ + + + + \ No newline at end of file diff --git a/sandbox310/dev/demo8.html b/sandbox310/dev/demo8.html new file mode 100644 index 0000000..a6a9b26 --- /dev/null +++ b/sandbox310/dev/demo8.html @@ -0,0 +1,1096 @@ + + + + + + + + + + Sandbox - Modern & Multipurpose Bootstrap 5 Template + + + + + + + + +
+
+ + + + + + + + +
+ +
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+

25000+

+

Happy Clients

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

Crafting project specific solutions with expertise.

+

We're a company that focuses on establishing long-term relationships with customers.

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

Trusted by over 25000+ clients

+

We bring solutions to make life easier for our customers.

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

Who Are We?

+

We are a digital and branding company that believes in the power of creative strategy and along with great design.

+

Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Praesent commodo cursus magna, vel scelerisque nisl consectetur et.

+
+
+
+
+ +
+
+

Our Mission

+

Dapibus eu leo quam ornare curabitur blandit tempus.

+
+
+
+ +
+
+
+ +
+
+

Our Values

+

Aenean lacinia bibendum nulla sed consectetur.

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

What We Do?

+

The full service we are offering is specifically designed to meet your business needs and projects.

+
+
+
+
+ +
+
+

Marketing

+

Nulla vitae elit libero pharetra augue dapibus.

+
+
+
+ +
+
+
+ +
+
+

Strategy

+

Vivamus sagittis lacus augue laoreet vel.

+
+
+
+ +
+
+
+ +
+
+

Development

+

Cras mattis consectetur purus sit amet.

+
+
+
+ +
+
+
+ +
+
+

Data Analysis

+

Aenean lacinia bibendum nulla sed consectetur.

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

ā€œFusce dapibus tellus ac cursus commodo, tortor mauris condimentum nibh ut fermentum massa, justo sit amet vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Cras mattis consectetur purus sit amet fermentum. Aenean lacinia bibendum nulla sedā€

+
+
+
Coriss Ambady
+
Financial Analyst
+
+
+
+
+ +
+ +
+ +
+ +
+
+

We are proud of our creative team

+

Just sit back and relax while we take care of your business needs.

+
+ +
+
+
+ +

7518

+

Completed Projects

+
+ +
+ +

3472

+

Happy Customers

+
+ +
+ +

2184

+

Expert Employees

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

Coriss Ambady

+

Financial Analyst

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

Cory Zamora

+

Marketing Specialist

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

Nikolas Brooten

+

Sales Manager

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

Jackie Sanders

+

Investment Planner

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

Sandbox Brings Awesomeness

+

We have considered our solutions to support every stage of your growth.

+
    +
  • +

    Marketing

    +
    +
  • +
  • +

    Strategy

    +
    +
  • +
  • +

    Development

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

We offer great and premium prices.

+

Enjoy a free 30-day trial and experience the full service. No credit card required!

+ See All Prices +
+ +
+
+

Monthly

+
+
+
+
+
+

Yearly (Save 30%)

+
+
+
+
+
+
+
$19 month
+
$199 year
+
+ +

Premium Plan

+
    +
  • 5 Projects
  • +
  • 100K API Access
  • +
  • 200MB Storage
  • +
  • Weekly Reports
  • +
  • 7/24 Support
  • +
+ Choose Plan +
+ +
+ +
+ + + +
+ +
+ +
+ +
+
+
+
+

Frequently Asked Questions

+

If you don't see an answer to your question, you can send us an email from our contact form.

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

Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus.

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

Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus.

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

Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus.

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

Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus.

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

Join the Community

+

Let's make something great together. We are trusted by over 5000+ clients. Join them by using our services and grow your business.

+ Join Us +
+ +
+ +
+
+

Need Help?

+ +
+ +
+ +
+
+

Learn More

+ +
+ +
+ +
+
+

Get in Touch

+
Moonshine St. 14/05 Light City, London, United Kingdom
+ info@email.com
00 (123) 456 78 90 +
+ +
+ +
+ +
+
+

Ā© 2021 Sandbox. All rights reserved.

+ + +
+ +
+ +
+
+ + + +
+ + + + + \ No newline at end of file diff --git a/sandbox310/dev/demo9.html b/sandbox310/dev/demo9.html new file mode 100644 index 0000000..42c6996 --- /dev/null +++ b/sandbox310/dev/demo9.html @@ -0,0 +1,1186 @@ + + + + + + + + + + Sandbox - Modern & Multipurpose Bootstrap 5 Template + + + + + + + +
+
+ + + + + + +
+
+

Sandbox

+ +
+
+
+

Sandbox is a multipurpose HTML5 template with various layouts which will be a great solution for your business.

+
+ +
+

Contact Info

+
Moonshine St. 14/05
Light City, London
+ info@email.com
00 (123) 456 78 90 +
+ +
+

Learn More

+ +
+ +
+

Follow Us

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

Sandbox is effortless and powerful with

+

Achieve your saving goals. Have all your recurring and one time expenses and incomes in one place.

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

Trusted by Over 5000 Clients

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

Why Choose Sandbox?

+

Here are a few reasons why our customers choose Sandbox.

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

Easy Usage

+

Etiam porta sem malesuada magna mollis euismod. Donec ullamcorper nulla non metus auctor fringilla. Morbi leo risus, porta ac consectetur ac, vestibulum at eros. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam quis risus eget urna.

+
    +
  • Aenean eu leo quam. Pellentesque ornare.
  • +
  • Nullam quis risus eget urna mollis ornare.
  • +
  • Donec id elit non mi porta gravida at eget.
  • +
+ Learn More +
+ +
+ +
+ +
+
+
+
+
+ + +
+ +
+ + +
+ +
+ +
+ +
+

Fast Transactions

+

Etiam porta sem malesuada magna mollis euismod. Donec ullamcorper nulla non metus auctor fringilla. Morbi leo risus, porta ac consectetur ac, vestibulum at eros. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam quis risus eget urna.

+
    +
  • Aenean eu leo quam. Pellentesque ornare.
  • +
  • Nullam quis risus eget urna mollis ornare.
  • +
  • Donec id elit non mi porta gravida at eget.
  • +
+ Learn More +
+ +
+ +
+ +
+
+
+
+
+ + +
+ +
+ + +
+ +
+ +
+ +
+

Secure Payments

+

Etiam porta sem malesuada magna mollis euismod. Donec ullamcorper nulla non metus auctor fringilla. Morbi leo risus, porta ac consectetur ac, vestibulum at eros. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam quis risus eget urna.

+
    +
  • Aenean eu leo quam. Pellentesque ornare.
  • +
  • Nullam quis risus eget urna mollis ornare.
  • +
  • Donec id elit non mi porta gravida at eget.
  • +
+ Learn More +
+ +
+ +
+ +
+ +
+ +
+ +
+
+
+
+

Happy Customers

+

Don't take our word for it. See what customers are saying about us.

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

ā€œVivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Vestibulum id ligula porta felis euismod semper. Cras justo odio dapibus facilisis sociis natoque penatibus.ā€

+
+ +
+
Coriss Ambady
+

Financial Analyst

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

ā€œFusce dapibus, tellus ac cursus tortor mauris condimentum fermentum massa justo sit amet. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Cras mattis consectetur purus sit amet fermentum. Aenean lacinia bibendum nulla sed consectetur.ā€

+
+ +
+
Cory Zamora
+

Marketing Specialist

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

ā€œCurabitur blandit tempus porttitor. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Nullam quis risus eget porta ac consectetur vestibulum. Donec sed odio dui consectetur adipiscing elit.ā€

+
+ +
+
Nikolas Brooten
+

Sales Manager

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

ā€œEtiam adipiscing tincidunt elit convallis felis suscipit ut. Phasellus rhoncus tincidunt auctor. Nullam eu sagittis mauris. Donec non dolor ac elit aliquam tincidunt at at sapien. Aenean tortor libero condimentum ac laoreet vitae.ā€

+
+ +
+
Coriss Ambady
+

Financial Analyst

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

ā€œMaecenas sed diam eget risus varius blandit sit amet non magna. Cum sociis natoque penatibus magnis dis montes, nascetur ridiculus mus. Donec sed odio dui. Nulla vitae elit libero a pharetra.ā€

+
+ +
+
Jackie Sanders
+

Investment Planner

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

ā€œDonec id elit non mi porta gravida at eget metus. Nulla vitae elit libero, a pharetra augue. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.ā€

+
+ +
+
Laura Widerski
+

Sales Specialist

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

How It Works?

+

Here are the 3 working steps on success.

+
+
+ +
+
+

Secured Transactions

+

Nulla vitae elit libero pharetra augue dapibus. Praesent commodo cursus.

+
+
+
+
+ +
+
+

Bills Planning

+

Vivamus sagittis lacus vel augue laoreet. Etiam porta sem malesuada magna.

+
+
+
+
+ +
+
+

Always up to date

+

Cras mattis consectetur purus sit amet. Aenean lacinia bibendum nulla sed.

+
+
+
+ +
+ +
+
+

Our Pricing

+

We offer great and premium prices.

+

Enjoy a free 30-day trial and experience the full service. No credit card required!

+ See All Prices +
+ +
+
+

Monthly

+
+
+
+
+
+

Yearly (Save 30%)

+
+
+
+
+
+
+
$19 month
+
$199 year
+
+ +

Premium Plan

+
    +
  • 5 Projects
  • +
  • 100K API Access
  • +
  • 200MB Storage
  • +
  • Weekly Reports
  • +
  • 7/24 Support
  • +
+ Choose Plan +
+ +
+ +
+ + + +
+ +
+ +
+ +
+ +
+ +
+
+
+
+

FAQ

+

If you don't see an answer to your question, you can send us an email from our contact form.

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

Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec sed odio dui. Cras justo odio, dapibus ac facilisis.

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

Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec sed odio dui. Cras justo odio, dapibus ac facilisis.

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

Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec sed odio dui. Cras justo odio, dapibus ac facilisis.

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

Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec sed odio dui. Cras justo odio, dapibus ac facilisis.

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

Ā© 2021 Sandbox.
All rights reserved.

+ + +
+ +
+ +
+
+

Get in Touch

+
Moonshine St. 14/05 Light City, London, United Kingdom
+ info@email.com
00 (123) 456 78 90 +
+ +
+ +
+
+

Learn More

+ +
+ +
+ +
+
+

Our Newsletter

+

Subscribe to our newsletter to get our news & deals delivered to you.

+ + +
+ +
+ +
+ +
+ +
+
+ + + +
+ + + + + \ No newline at end of file diff --git a/sandbox310/dev/docs/blocks/about.html b/sandbox310/dev/docs/blocks/about.html new file mode 100644 index 0000000..cb58ac1 --- /dev/null +++ b/sandbox310/dev/docs/blocks/about.html @@ -0,0 +1,1593 @@ + + + + + + + + + + Sandbox - Modern & Multipurpose Bootstrap 5 Template + + + + + + +
+
+ + +
+ +
+
+
+
+

Blocks - About

+

Copy any custom block snippet below and paste it on your page to build your website easily.

+
+ +
+ +
+ +
+ +
+
+

Filter Blocks:

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

Who Are We?

+

We are a digital and branding company that believes in the power of creative strategy and along with great design.

+

Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Praesent commodo cursus magna, vel scelerisque nisl consectetur et.

+
+
+
+
+ +
+
+

Our Mission

+

Dapibus eu leo quam ornare curabitur blandit tempus.

+
+
+
+ +
+
+
+ +
+
+

Our Values

+

Aenean lacinia bibendum nulla sed consectetur.

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

20+

+

Year Experience

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

We are a creative company that focuses on establishing long-term relationships with customers.

+

Nulla vitae elit libero, a pharetra augue. Aenean lacinia bibendum nulla sed consectetur. Integer posuere erat a ante venenatis dapibus posuere velit aliquet. Vestibulum id ligula porta felis euismod semper. Vestibulum id ligula.

+
+
+

7518

+

Completed Projects

+
+ +
+

3472

+

Satisfied Customers

+
+ +
+

2184

+

Expert Employees

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

7518

+

Completed Projects

+
+ +
+

3472

+

Satisfied Customers

+
+ +
+

2184

+

Expert Employees

+
+ +
+

4523

+

Awards Won

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

Who Are We?

+

We are a digital and branding company that believes in the power of creative strategy and along with great design.

+

Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Praesent commodo cursus magna, vel scelerisque nisl consectetur et.

+
+
+
    +
  • Aenean eu leo quam ornare curabitur blandit tempus.
  • +
  • Nullam quis risus eget urna mollis ornare donec elit.
  • +
+
+ +
+
    +
  • Etiam porta sem malesuada magna mollis euismod.
  • +
  • Fermentum massa vivamus faucibus amet euismod.
  • +
+
+ +
+ +
+ +
+ +
+ +
+
+ + + + +
+ +
+ +
+ +
+
+
+
+
+
+ +
+

Why Choose Us?

+

A few reasons why our valued customers choose us.

+
+
+
+ +
+ +
+
+

Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Praesent commodo cursus magna, vel.

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

Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Praesent commodo cursus magna, vel.

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

Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Praesent commodo cursus magna, vel.

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

We bring rapid solutions to make the life of our customers easier.

+
    +
  • +

    Marketing

    +
    +
  • +
  • +

    Strategy

    +
    +
  • +
  • +

    Development

    +
    +
  • +
  • +

    Data Analysis

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

Sandbox Brings Awesomeness

+

We have considered our solutions to support every stage of your growth.

+
    +
  • +

    Marketing

    +
    +
  • +
  • +

    Strategy

    +
    +
  • +
  • +

    Development

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

What Makes Us Different?

+

We bring solutions to make life easier for our customers.

+
+
+
+
+ +
+
+

Creativity

+

Curabitur blandit lacus porttitor ridiculus mus.

+
+
+
+ +
+
+
+ +
+
+

Innovative Thinking

+

Curabitur blandit lacus porttitor ridiculus mus.

+
+
+
+ +
+
+
+ +
+
+

Rapid Solutions

+

Curabitur blandit lacus porttitor ridiculus mus.

+
+
+
+ +
+
+
+ +
+
+

Top-Notch Support

+

Curabitur blandit lacus porttitor ridiculus mus.

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

25000+

+

Happy Clients

+
+
+
+ +
+ +
+
+
+

Time Saved

+
+ +
+ +
+ +
+

What Makes Us Different?

+

We make spending stress free so you have the perfect control.

+

Etiam porta sem malesuada magna mollis euismod. Donec ullamcorper nulla non metus auctor fringilla. Morbi leo risus, porta ac consectetur ac, vestibulum at eros. Fusce dapibus, tellus ac cursus. Integer posuere erat a ante venenatis dapibus posuere velit.

+
    +
  • Aenean eu leo quam. Pellentesque ornare.
  • +
  • Nullam quis risus eget urna mollis ornare.
  • +
  • Donec id elit non mi porta gravida at eget.
  • +
+
+ +
+ +
+ +
+
+ + + + +
+ +
+ +
+ +
+ +
+
+
+
+

Think unique and be creative. Make a difference with Sandbox.

+

Everything you need to create your next unique and professional website, including impressive and ready-made blocks and pages.

+ Buy Sandbox +
+ +
+ + +
+ +
+ +
+ + + +
+ + + + + \ No newline at end of file diff --git a/sandbox310/dev/docs/blocks/blog.html b/sandbox310/dev/docs/blocks/blog.html new file mode 100644 index 0000000..e16fcb2 --- /dev/null +++ b/sandbox310/dev/docs/blocks/blog.html @@ -0,0 +1,1711 @@ + + + + + + + + + + Sandbox - Modern & Multipurpose Bootstrap 5 Template + + + + + + +
+
+ + +
+ +
+
+
+
+

Blocks - Blog

+

Copy any custom block snippet below and paste it on your page to build your website easily.

+
+ +
+ +
+ +
+ +
+
+

Filter Blocks:

+ +
+ +
+ +
+
+

Our Journal

+

Here are the latest company news from our blog that got the most attention.

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

Our Journal

+

Here are the latest news from our blog that got the most attention.

+ View All News +
+ +
+
+
+
+
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+
+ + + + +
+ +
+ +
+ +
+
+
+
+

Our News

+

Here are the latest company news from our blog that got the most attention.

+
+ +
+ +
+
+
+
+
+
+
+
+
+
+
+
Read More
+
+
+
+
+ + +

Ligula tristique quis risus

+
+ +
+

Mauris convallis non ligula non interdum. Gravida vulputate convallis tempus vestibulum cras imperdiet nun eu dolor.

+
+ +
+ + + +
+ +
+ +
+ +
+ +
+
+
+
+
+
+
Read More
+
+
+
+
+ + +

Nullam id dolor elit id nibh

+
+ +
+

Mauris convallis non ligula non interdum. Gravida vulputate convallis tempus vestibulum cras imperdiet nun eu dolor.

+
+ +
+ + + +
+ +
+ +
+ +
+ +
+
+
+
+
+
+
Read More
+
+
+
+
+ + +

Ultricies fusce porta elit

+
+ +
+

Mauris convallis non ligula non interdum. Gravida vulputate convallis tempus vestibulum cras imperdiet nun eu dolor.

+
+ +
+ + + +
+ +
+ +
+ +
+ +
+
+
+
+
+
+
Read More
+
+
+
+
+ + +

Morbi leo risus porta eget

+
+ +
+

Mauris convallis non ligula non interdum. Gravida vulputate convallis tempus vestibulum cras imperdiet nun eu dolor.

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

Company news from our blog that got the most attention.

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

Fringilla Ligula Pharetra Amet

+ + +
+ +
+

Maecenas sed diam eget risus varius blandit sit amet non magna. Curabitur blandit tempus porttitor. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Maecenas sed diam eget risus varius blandit sit amet non magna. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor.

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

Think unique and be creative. Make a difference with Sandbox.

+

Everything you need to create your next unique and professional website, including impressive and ready-made blocks and pages.

+ Buy Sandbox +
+ +
+ + +
+ +
+ +
+ + + +
+ + + + + \ No newline at end of file diff --git a/sandbox310/dev/docs/blocks/call-to-action.html b/sandbox310/dev/docs/blocks/call-to-action.html new file mode 100644 index 0000000..0e4bee7 --- /dev/null +++ b/sandbox310/dev/docs/blocks/call-to-action.html @@ -0,0 +1,728 @@ + + + + + + + + + + Sandbox - Modern & Multipurpose Bootstrap 5 Template + + + + + + +
+
+ + +
+ +
+
+
+
+

Blocks - Call to Action

+

Copy any custom block snippet below and paste it on your page to build your website easily.

+
+ +
+ +
+ +
+ +
+
+

Filter Blocks:

+ +
+ +
+ +
+
+
+
+

Join Our Community

+

We are trusted by over 5000+ clients. Join them by using our services and grow your business.

+ Join Us +
+ +
+ +
+ +
+ +
+
+
+ + + + +
+ +
+ +
+ +
+
+
+
+
+
+

We are trusted by over 5000+ clients. Join them by using our services and grow your business.

+ Join Us +
+ +
+ +
+ +
+ +
+ +
+
+ + + + +
+ +
+ +
+ +
+
+
+
+ +

Join Our Community

+

We are trusted by over 5000+ clients. Join them by using our services and grow your business.

+ Join Us +
+ +
+ +
+ +
+
+ + + + +
+ +
+ +
+ +
+
+
+
+
+
+

Join Our Community

+

We are trusted by over 5000+ clients. Join them now and grow your business.

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

Think unique and be creative. Make a difference with Sandbox.

+

Everything you need to create your next unique and professional website, including impressive and ready-made blocks and pages.

+ Buy Sandbox +
+ +
+ + +
+ +
+ +
+ + + +
+ + + + + \ No newline at end of file diff --git a/sandbox310/dev/docs/blocks/clients.html b/sandbox310/dev/docs/blocks/clients.html new file mode 100644 index 0000000..eac038c --- /dev/null +++ b/sandbox310/dev/docs/blocks/clients.html @@ -0,0 +1,860 @@ + + + + + + + + + + Sandbox - Modern & Multipurpose Bootstrap 5 Template + + + + + + +
+
+ + +
+ +
+
+
+
+

Blocks - Clients

+

Copy any custom block snippet below and paste it on your page to build your website easily.

+
+ +
+ +
+ +
+ +
+
+

Filter Blocks:

+ +
+ +
+ +
+
+

Trusted by Over 5000 Clients

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

Our Clients

+

Trusted by over 300+ clients

+

We bring solutions to make life easier for our customers.

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

Our Clients

+
+
+

We are trusted by over 300+ clients. Join them by using our services and grow your business.

+
+ +
+

Donec ullamcorper nulla non metus auctor fringilla. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer posuere erat a ante. Maecenas faucibus mollis interdum. Cras justo odio mollis.

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

Think unique and be creative. Make a difference with Sandbox.

+

Everything you need to create your next unique and professional website, including impressive and ready-made blocks and pages.

+ Buy Sandbox +
+ +
+ + +
+ +
+ +
+ + + +
+ + + + + \ No newline at end of file diff --git a/sandbox310/dev/docs/blocks/contact.html b/sandbox310/dev/docs/blocks/contact.html new file mode 100644 index 0000000..f04d064 --- /dev/null +++ b/sandbox310/dev/docs/blocks/contact.html @@ -0,0 +1,1759 @@ + + + + + + + + + + Sandbox - Modern & Multipurpose Bootstrap 5 Template + + + + + + +
+
+ + +
+ +
+
+
+
+

Blocks - Contact

+

Copy any custom block snippet below and paste it on your page to build your website easily.

+
+ +
+ +
+ +
+ +
+
+

Filter Blocks:

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

Let’s Talk

+

Let's make something great together. We are trusted by over 5000+ clients. Join them by using our services and grow your business.

+

Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Maecenas faucibus mollis interdum. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus.

+ Join Us +
+ +
+ +
+ +
+
+ + + + +
+ +
+ +
+ +
+
+
+
+
+
+
+ +
+ +

Convinced yet? Let's make something great together.

+
+
+
+
+
+
Address
+
Moonshine St. 14/05 Light City,
London, United Kingdom
+
+
+
+
+
+
+
+
Phone
+

00 (123) 456 78 90

+
+
+
+
+
+
+
+
E-mail
+

sandbox@email.com

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

5000+

+

Satisfied Customers

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

Let’s Talk

+

Let's make something great together. We are trusted by over 5000+ clients. Join them by using our services and grow your business.

+

Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Maecenas faucibus mollis interdum. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus.

+ Join Us +
+ +
+ +
+ +
+
+ + + + +
+ +
+ +
+ +
+
+
+
+
+
+ +
+

Get In Touch

+

Got any questions? Don't hesitate to get in touch.

+
+
+
+
+
+
Address
+
Moonshine St. 14/05 Light City, London
+
+
+
+
+
+
+
+
Phone
+

00 (123) 456 78 90

+
+
+
+
+
+
+
+
E-mail
+

sandbox@email.com

+
+
+
+ +
+ +
+ +
+
+ + + + +
+ +
+ +
+ +
+
+
+
+
+
+
+
+
+
+
+ + +
Looks good!
+
Please enter your first name.
+
+
+ +
+
+ + +
Looks good!
+
Please enter your last name.
+
+
+ +
+
+ + +
Looks good!
+
Please provide a valid email address.
+
+
+ +
+
+ +
Looks good!
+
Please select a department.
+
+
+ +
+
+ + +
Looks good!
+
Please enter your messsage.
+
+
+ +
+
+ + +
You must agree before submitting.
+
+
+ +
+ +

* These fields are required.

+
+ +
+ +
+ +
+ +
+
+
+
+
+
+
Address
+
Moonshine St. 14/05 Light City, London, United Kingdom
+
+
+
+
+
+
+
+
Phone
+

00 (123) 456 78 90
00 (987) 654 32 10

+
+
+
+
+
+
+ +
+
+ +
+ +
+ +
+ +
+ +
+
+ + + + +
+ +
+ +
+ +
+
+
+
+
+
+
+
+ +
+ +
+ +
+
+
+
+
+
+
+
Address
+
Moonshine St. 14/05 Light City, London, United Kingdom
+
+
+ +
+
+
+
+
+
Phone
+

00 (123) 456 78 90
00 (987) 654 32 10

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

Join Our Community

+

We are trusted by over 5000+ clients. Join them by using our services and grow your business.

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

Let’s Talk

+

Let's make something great together. We are trusted by over 5000+ clients. Join them by using our services and grow your business.

+

Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Maecenas faucibus mollis interdum. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus.

+ Join Us +
+ +
+ +
+ +
+ +
+ +
+
+ + + + +
+ +
+ +
+ +
+
+
+
+
+
+ +

If you like what you see, let's work together.

+

I bring rapid solutions to make the life of my clients easier. Have any questions? Reach out to me from this contact form and I will get back to you shortly.

+
+ +
+
+
+
+
+
+ + +
Please enter your name.
+
+
+ +
+
+ + +
Looks good!
+
Please provide a valid email address.
+
+
+ +
+
+ + +
Looks good!
+
Please enter your messsage.
+
+
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+
+ + + + +
+ +
+ +
+ +
+
+
+
+
+
+
+ +
+

Get in Touch

+

Have any questions? Reach out to us from our contact form and we will get back to you shortly.

+
+
+
+ + +
Looks good!
+
Please enter your name.
+
+
+ + +
Looks good!
+
Please provide a valid email address.
+
+
+ + +
Looks good!
+
Please enter your messsage.
+
+ +

* These fields are required.

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

Think unique and be creative. Make a difference with Sandbox.

+

Everything you need to create your next unique and professional website, including impressive and ready-made blocks and pages.

+ Buy Sandbox +
+ +
+ + +
+ +
+ +
+ + + +
+ + + + + \ No newline at end of file diff --git a/sandbox310/dev/docs/blocks/facts.html b/sandbox310/dev/docs/blocks/facts.html new file mode 100644 index 0000000..93d25cb --- /dev/null +++ b/sandbox310/dev/docs/blocks/facts.html @@ -0,0 +1,1333 @@ + + + + + + + + + + Sandbox - Modern & Multipurpose Bootstrap 5 Template + + + + + + +
+
+ + +
+ +
+
+
+
+

Blocks - Facts

+

Copy any custom block snippet below and paste it on your page to build your website easily.

+
+ +
+ +
+ +
+ +
+
+

Filter Blocks:

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

7518

+

Projects Done

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

3472

+

Happy Customers

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

4537

+

Expert Employees

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

2184

+

Awards Won

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

Join Our Community

+

We have considered our business solutions to support you on every stage of your growth.

+

Integer posuere erat a ante venenatis dapibus posuere velit aliquet. Morbi leo risus, porta ac consectetur ac, vestibulum at eros. Praesent commodo cursus magna, vel scelerisque nisl consectetur.

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

Company Facts

+

We are proud of our works

+
+ +
+
+
+ +

7518

+

Completed Projects

+
+ +
+ +

3472

+

Happy Customers

+
+ +
+ +

2184

+

Expert Employees

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

7518

+

Completed Projects

+
+ +
+

3472

+

Happy Customers

+
+ +
+

2184

+

Expert Employees

+
+ +
+

4523

+

Awards Won

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

Join Our Community

+

We are trusted by over 5000+ clients. Join them now and grow your business.

+
+ +
+ +
+
+
+
+

7518

+

Completed Projects

+
+ +
+

5472

+

Happy Customers

+
+ +
+

2184

+

Expert Employees

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

3472

+

Happy Customers

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

4537

+

Expert Employees

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

2654

+

Awards Won

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

7518

+

Completed Projects

+
+ +
+ +

3472

+

Happy Customers

+
+ +
+ +

2184

+

Expert Employees

+
+ +
+ +

4523

+

Awards Won

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

Save Time and Money

+

Save your time and money by choosing our professional team.

+
+ +
+
+
+
+

Customer Satisfaction

+
+ +
+
+

Increased Revenue

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

Think unique and be creative. Make a difference with Sandbox.

+

Everything you need to create your next unique and professional website, including impressive and ready-made blocks and pages.

+ Buy Sandbox +
+ +
+ + +
+ +
+ +
+ + + +
+ + + + + \ No newline at end of file diff --git a/sandbox310/dev/docs/blocks/faq.html b/sandbox310/dev/docs/blocks/faq.html new file mode 100644 index 0000000..667b206 --- /dev/null +++ b/sandbox310/dev/docs/blocks/faq.html @@ -0,0 +1,1426 @@ + + + + + + + + + + Sandbox - Modern & Multipurpose Bootstrap 5 Template + + + + + + +
+
+ + +
+ +
+
+
+
+

Blocks - FAQ

+

Copy any custom block snippet below and paste it on your page to build your website easily.

+
+ +
+ +
+ +
+ +
+
+

Filter Blocks:

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

Common Questions

+

If you don't see an answer to your question, you can send us an email from our contact form.

+
+
+
+ +
+ +
+
+

Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Praesent commodo cursus magna, vel.

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

Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Praesent commodo cursus magna, vel.

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

Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Praesent commodo cursus magna, vel.

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

FAQ

+

If you don't see an answer to your question, you can send us an email from our contact form.

+

Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit. Nullam quis risus eget urna mollis ornare.

+ All FAQ +
+ +
+
+
+
+ +
+ +
+
+

Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec sed odio dui. Cras justo odio, dapibus ac facilisis.

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

Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec sed odio dui. Cras justo odio, dapibus ac facilisis.

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

Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec sed odio dui. Cras justo odio, dapibus ac facilisis.

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

Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec sed odio dui. Cras justo odio, dapibus ac facilisis.

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

Pricing FAQ

+

If you don't see an answer to your question, you can send us an email from our contact form.

+
+
+
+
+
+ +
+ +
+
+

Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec sed odio dui. Cras justo odio, dapibus ac facilisis.

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

Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec sed odio dui. Cras justo odio, dapibus ac facilisis.

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

Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec sed odio dui. Cras justo odio, dapibus ac facilisis.

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

Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec sed odio dui. Cras justo odio, dapibus ac facilisis.

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

Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec sed odio dui. Cras justo odio, dapibus ac facilisis.

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

Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec sed odio dui. Cras justo odio, dapibus ac facilisis.

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

Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec sed odio dui. Cras justo odio, dapibus ac facilisis.

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

Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec sed odio dui. Cras justo odio, dapibus ac facilisis.

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

Frequently Asked Questions

+

If you don't see an answer to your question, you can send us an email from our contact form.

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

Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus.

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

Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus.

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

Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus.

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

Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus.

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

Can I cancel my subscription?

+

Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Etiam porta sem malesuada magna mollis euismod maecenas.

+
+
+
+ +
+
+
+ +
+
+

Which payment methods do you accept?

+

Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Etiam porta sem malesuada magna mollis euismod maecenas.

+
+
+
+ +
+
+
+ +
+
+

How can I manage my Account?

+

Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Etiam porta sem malesuada magna mollis euismod maecenas.

+
+
+
+ +
+
+
+ +
+
+

Is my credit card information secure?

+

Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Etiam porta sem malesuada magna mollis euismod maecenas.

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

Think unique and be creative. Make a difference with Sandbox.

+

Everything you need to create your next unique and professional website, including impressive and ready-made blocks and pages.

+ Buy Sandbox +
+ +
+ + +
+ +
+ +
+ + + +
+ + + + + \ No newline at end of file diff --git a/sandbox310/dev/docs/blocks/features.html b/sandbox310/dev/docs/blocks/features.html new file mode 100644 index 0000000..8c2eb3b --- /dev/null +++ b/sandbox310/dev/docs/blocks/features.html @@ -0,0 +1,2514 @@ + + + + + + + + + + Sandbox - Modern & Multipurpose Bootstrap 5 Template + + + + + + +
+
+ + +
+ +
+
+
+
+

Blocks - Features

+

Copy any custom block snippet below and paste it on your page to build your website easily.

+
+ +
+ +
+ +
+ +
+
+

Filter Blocks:

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

Package Design

+

Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Maecenas faucibus mollis interdum. Maecenas sed diam eget risus varius.

+
+
+
    +
  • Aenean quam ornare curabitur blandit consectetur.
  • +
  • Nullam quis risus eget urna mollis ornare aenean leo.
  • +
+
+ +
+
    +
  • Etiam porta euismod malesuada mollis nisl ornare sem.
  • +
  • Vivamus sagittis lacus augue rutrum maecenas.
  • +
+
+ +
+ + More Details +
+ +
+ +
+
+
+
+
+
+ +
+

Corporate Design

+

Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Praesent commodo cursus magna, vel scelerisque nisl consectetur et.

+
+
+
    +
  • Aenean quam ornare curabitur blandit consectetur.
  • +
  • Nullam quis risus eget urna mollis ornare aenean leo.
  • +
+
+ +
+
    +
  • Etiam porta euismod malesuada mollis nisl ornare sem.
  • +
  • Vivamus sagittis lacus augue rutrum maecenas.
  • +
+
+ +
+ + More Details +
+ +
+ +
+ +
+
+ + + + +
+ +
+ +
+ +
+
+
+
+

What We Do?

+

The service we offer is specifically designed to meet your needs.

+
+ +
+ +
+
+
+

24/7 Support

+

Nulla vitae elit libero, a pharetra augue. Donec id elit non mi porta gravida at eget metus. Cras justo.

+ Learn More +
+ +
+
+

Secure Payments

+

Nulla vitae elit libero, a pharetra augue. Donec id elit non mi porta gravida at eget metus. Cras justo.

+ Learn More +
+ +
+
+

Daily Updates

+

Nulla vitae elit libero, a pharetra augue. Donec id elit non mi porta gravida at eget metus. Cras justo.

+ Learn More +
+ +
+
+

Market Research

+

Nulla vitae elit libero, a pharetra augue. Donec id elit non mi porta gravida at eget metus. Cras justo.

+ Learn More +
+ +
+ +
+ +
+
+ + + + +
+ +
+ +
+ +
+
+
+
+

What We Do?

+

The service we offer is specifically designed to meet your needs.

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

SEO Services

+

Nulla vitae elit libero, a pharetra augue. Donec id elit non mi porta gravida at eget metus cras justo.

+ Learn More +
+ +
+ +
+ +
+
+
+ +

Web Design

+

Nulla vitae elit libero, a pharetra augue. Donec id elit non mi porta gravida at eget metus cras justo.

+ Learn More +
+ +
+ +
+ +
+
+
+ +

Social Engagement

+

Nulla vitae elit libero, a pharetra augue. Donec id elit non mi porta gravida at eget metus cras justo.

+ Learn More +
+ +
+ +
+ +
+
+
+ +

Content Marketing

+

Nulla vitae elit libero, a pharetra augue. Donec id elit non mi porta gravida at eget metus cras justo.

+ Learn More +
+ +
+ +
+ +
+ +
+ +
+ +
+
+ + + + +
+ +
+ +
+ +
+
+
+
+
+
+
+
+ +

24/7 Support

+

Nulla vitae elit libero, a pharetra augue. Donec id elit non mi porta.

+
+ +
+ +
+ +
+
+
+ +

Secure Payments

+

Nulla vitae elit libero, a pharetra augue. Donec id elit non mi porta.

+
+ +
+ +
+ +
+
+
+ +

Daily Updates

+

Nulla vitae elit libero, a pharetra augue.

+
+ +
+ +
+ +
+
+
+ +

Market Research

+

Nulla vitae elit libero, a pharetra augue. Donec id elit non mi porta gravida at eget.

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

What We Do?

+

The service we offer is specifically designed to meet your needs.

+

Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Maecenas sed diam eget risus varius blandit sit amet non magna. Maecenas faucibus mollis interdum. Praesent commodo cursus magna, vel scelerisque nisl consectetur et.

+ More Details +
+ +
+ +
+ +
+
+ + + + +
+ +
+ +
+ +
+
+
+
+
+
+
+ + +
+ +
+ + +
+ +
+ +
+ +
+

We have considered our solutions to support every stage of growth.

+

Etiam porta sem malesuada magna mollis euismod. Donec ullamcorper nulla non metus auctor fringilla. Morbi leo risus, porta ac consectetur ac, vestibulum at eros. Fusce dapibus, tellus ac cursus commodo.

+
+
+
    +
  • Aenean quam ornare curabitur blandit consectetur.
  • +
  • Nullam quis risus eget urna mollis ornare aenean leo.
  • +
+
+ +
+
    +
  • Etiam porta euismod malesuada mollis nisl ornare.
  • +
  • Vivamus sagittis lacus augue rutrum maecenas odio.
  • +
+
+ +
+ +
+ +
+ +
+ +
+
+ + + + +
+ +
+ +
+ +
+
+
+
+
+
+ +
+

We make your spending stress-free for you to have the perfect control.

+

Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Praesent commodo cursus magna, vel scelerisque nisl consectetur et.

+
+
+
    +
  • Aenean quam ornare. Curabitur blandit.
  • +
  • Nullam quis risus eget urna mollis ornare.
  • +
+
+ +
+
    +
  • Etiam porta euismod malesuada mollis.
  • +
  • Vivamus sagittis lacus vel augue rutrum.
  • +
+
+ +
+ +
+ +
+ +
+ +
+
+ + + + +
+ +
+ +
+ +
+
+
+
+
    +
  • +

    Web Design

    +
    +
  • +
  • +

    Mobile Design

    +
    +
  • +
  • +

    Development

    +
    +
  • +
  • +

    SEO

    +
    +
  • +
+ +
+ +
+

What I Do?

+

Duis mollis est commodo luctus nisi erat porttitor ligula, eget lacinia odio sem nec elit. Nullam quis risus eget urna mollis ornare vel. Nulla vitae elit libero, a pharetra augue. Praesent commodo cursus magna, vel scelerisque nisl.

+
+ +
+ +
+
+ +

Web Design

+

Nulla vitae elit libero, a pharetra augue. Donec id elit non mi porta gravida at eget metus. Cras justo cum sociis natoque magnis.

+
+ +
+ +

Mobile Design

+

Nulla vitae elit libero, a pharetra augue. Donec id elit non mi porta gravida at eget metus. Cras justo cum sociis natoque magnis.

+
+ +
+ +

Development

+

Nulla vitae elit libero, a pharetra augue. Donec id elit non mi porta gravida at eget metus. Cras justo cum sociis natoque magnis.

+
+ +
+ +

SEO

+

Nulla vitae elit libero, a pharetra augue. Donec id elit non mi porta gravida at eget metus. Cras justo cum sociis natoque magnis.

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

App Features

+

Sandbox is the only app you need to track your goals for better health.

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

Fitness Goal

+

Duis mollis gravida commodo id luctus erat porttitor ligula, eget lacinia odio sem aget elit nullam quis risus eget.

+
+
+
+ +
+
+
+ +
+
+

Activity Tracking

+

Duis mollis gravida commodo id luctus erat porttitor ligula, eget lacinia odio sem aget elit nullam quis risus eget.

+
+
+
+ +
+
+
+ +
+
+

Sleep Analysis

+

Duis mollis gravida commodo id luctus erat porttitor ligula, eget lacinia odio sem aget elit nullam quis risus eget.

+
+
+
+ +
+
+
+ +
+
+

Workout Report

+

Duis mollis gravida commodo id luctus erat porttitor ligula, eget lacinia odio sem aget elit nullam quis risus eget.

+
+
+
+ +
+
+
+ +
+
+

Nutritional Analysis

+

Duis mollis gravida commodo id luctus erat porttitor ligula, eget lacinia odio sem aget elit nullam quis risus eget.

+
+
+
+ +
+
+
+ +
+
+

Activity Sharing

+

Duis mollis gravida commodo id luctus erat porttitor ligula, eget lacinia odio sem aget elit nullam quis risus eget.

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

Web Design

+

Nulla vitae elit libero, a pharetra augue. Donec id elit non mi porta gravida.

+ Learn More +
+ +
+ +
+ +
+ +
+ +
+
+
+
+
+ +
+
+
+
+

Mobile Design

+

Nulla vitae elit libero, a pharetra augue. Donec id elit non mi porta gravida.

+ Learn More +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+

What We Do?

+

The full service we are offering is specifically designed to meet your business needs.

+

Donec ullamcorper nulla non metus auctor fringilla. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam quis risus eget urna mollis ornare vel eu leo. Nullam quis risus eget urna mollis ornare vel eu leo. Maecenas faucibus mollis elit interdum. Duis mollis, est non commodo luctus, nisi erat ligula.

+ More Details +
+ +
+ +
+ +
+
+ + + + +
+ +
+ +
+ +
+
+
+
+
+
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+ +
+ +
+

What We Do?

+

The full service we are offering is specifically designed to meet your business needs and projects.

+
+
+
+
+
+
+
+

24/7 Support

+

Nulla vitae elit libero pharetra augue dapibus.

+
+
+
+ +
+
+
+
+
+
+

Secure Payments

+

Vivamus sagittis lacus augue laoreet vel.

+
+
+
+ +
+
+
+
+
+
+

Daily Updates

+

Cras mattis consectetur purus sit amet.

+
+
+
+ +
+
+
+
+
+
+

Market Research

+

Aenean lacinia bibendum nulla sed consectetur.

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

Why Choose Sandbox?

+

Here are a few reasons why our customers choose Sandbox.

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

Easy Usage

+

Etiam porta sem malesuada magna mollis euismod. Donec ullamcorper nulla non metus auctor fringilla. Morbi leo risus, porta ac consectetur ac, vestibulum at eros. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam quis risus eget urna.

+
    +
  • Aenean eu leo quam. Pellentesque ornare.
  • +
  • Nullam quis risus eget urna mollis ornare.
  • +
  • Donec id elit non mi porta gravida at eget.
  • +
+ Learn More +
+ +
+ +
+ +
+
+
+
+
+ + +
+ +
+ + +
+ +
+ +
+ +
+

Fast Transactions

+

Etiam porta sem malesuada magna mollis euismod. Donec ullamcorper nulla non metus auctor fringilla. Morbi leo risus, porta ac consectetur ac, vestibulum at eros. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam quis risus eget urna.

+
    +
  • Aenean eu leo quam. Pellentesque ornare.
  • +
  • Nullam quis risus eget urna mollis ornare.
  • +
  • Donec id elit non mi porta gravida at eget.
  • +
+ Learn More +
+ +
+ +
+ +
+
+
+
+
+ + +
+ +
+ + +
+ +
+ +
+ +
+

Secure Payments

+

Etiam porta sem malesuada magna mollis euismod. Donec ullamcorper nulla non metus auctor fringilla. Morbi leo risus, porta ac consectetur ac, vestibulum at eros. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam quis risus eget urna.

+
    +
  • Aenean eu leo quam. Pellentesque ornare.
  • +
  • Nullam quis risus eget urna mollis ornare.
  • +
  • Donec id elit non mi porta gravida at eget.
  • +
+ Learn More +
+ +
+ +
+ +
+ +
+ +
+
+ + + + +
+ +
+ +
+ +
+
+
+
+
+
+
+
+
+

24/7 Support

+

Nulla vitae elit libero, a pharetra augue. Donec id elit non mi porta gravida at eget. Fusce dapibus tellus.

+ Learn More +
+
+
+ +
+
+
+
+
+
+

Daily Updates

+

Maecenas faucibus mollis interdum. Vivamus sagittis lacus vel augue laoreet. Sed posuere consectetur.

+ Learn More +
+
+
+ +
+
+
+
+
+
+

Market Research

+

Cras justo odio, dapibus ac facilisis in, egestas eget quam. Praesent commodo cursus magna scelerisque.

+ Learn More +
+
+
+ +
+ +
+ +
+
+ + + + +
+ +
+ +
+ +
+
+
+
+

What We Do?

+

The service we offer is specifically designed to meet your needs.

+
+ +
+ +
+
+
+
+

Web Design

+

Nulla vitae elit libero, a pharetra augue. Donec id elit non mi porta gravida at eget. Fusce dapibus tellus.

+ Learn More +
+ +
+ +
+
+
+

Graphic Design

+

Maecenas faucibus mollis interdum. Vivamus sagittis lacus vel augue laoreet. Sed posuere consectetur.

+ Learn More +
+ +
+ +
+
+
+

3D Animation

+

Cras justo odio, dapibus ac facilisis in, egestas eget quam. Praesent commodo cursus magna scelerisque.

+ Learn More +
+ +
+ +
+ +
+ +
+
+ + + + +
+ +
+ +
+ +
+ +
+
+
+
+

Think unique and be creative. Make a difference with Sandbox.

+

Everything you need to create your next unique and professional website, including impressive and ready-made blocks and pages.

+ Buy Sandbox +
+ +
+ + +
+ +
+ +
+ + + +
+ + + + + \ No newline at end of file diff --git a/sandbox310/dev/docs/blocks/footer.html b/sandbox310/dev/docs/blocks/footer.html new file mode 100644 index 0000000..ae99ab0 --- /dev/null +++ b/sandbox310/dev/docs/blocks/footer.html @@ -0,0 +1,1521 @@ + + + + + + + + + + Sandbox - Modern & Multipurpose Bootstrap 5 Template + + + + + + +
+
+ + +
+ +
+
+
+
+

Blocks - Footer

+

Copy any custom block snippet below and paste it on your page to build your website easily.

+
+ +
+ +
+ +
+ +
+
+

Filter Blocks:

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

Ā© 2021 Sandbox.
All rights reserved.

+ + +
+ +
+ +
+
+

Get in Touch

+
Moonshine St. 14/05 Light City, London, United Kingdom
+ info@email.com
00 (123) 456 78 90 +
+ +
+ +
+
+

Learn More

+ +
+ +
+ +
+
+

Our Newsletter

+

Subscribe to our newsletter to get our news & deals delivered to you.

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

We are trusted by over 5000+ clients. Join them by using our services and grow your business.

+ Join Us +
+ +
+ +
+ +
+ +
+
+
+
+
+
+
+

Address

+
Moonshine St. 14/05
Light City, London, UK
+
+ +
+ +
+
+

Phone

+

00 (123) 456 78 90
00 (987) 654 32 10

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

Ā© 2021 Sandbox. All rights reserved.

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

Join the Community

+

Let's make something great together. We are trusted by over 5000+ clients. Join them by using our services and grow your business.

+ Join Us +
+ +
+ +
+
+

Need Help?

+ +
+ +
+ +
+
+

Learn More

+ +
+ +
+ +
+
+

Get in Touch

+
Moonshine St. 14/05 Light City, London, United Kingdom
+ info@email.com
00 (123) 456 78 90 +
+ +
+ +
+ +
+
+

Ā© 2021 Sandbox. All rights reserved.

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

We are trusted by over 5000+ clients. Join them by using our services and grow your business.

+
+ +
+ +
+
+
+
+
+
+
+
Phone
+

00 (123) 456 78 90
00 (987) 654 32 10

+
+
+ +
+ +
+ +
+
+
+
+
+
+
+
Address
+
Moonshine St. 14/05 Light City, London, United Kingdom
+
+
+ +
+ +
+ +
+ +
+
+

Ā© 2021 Sandbox. All rights reserved.

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

Join our community by using our services and grow your business.

+ Try It For Free +
+ +
+
+
+
+ +

Ā© 2021 Sandbox.
All rights reserved.

+ + +
+ +
+ +
+
+

Get in Touch

+
Moonshine St. 14/05 Light City, London, United Kingdom
+ info@email.com
00 (123) 456 78 90 +
+ +
+ +
+
+

Learn More

+ +
+ +
+ +
+
+

Our Newsletter

+

Subscribe to our newsletter to get our news & deals delivered to you.

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

Ā© 2021 Sandbox. All rights reserved.

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

Think unique and be creative. Make a difference with Sandbox.

+

Everything you need to create your next unique and professional website, including impressive and ready-made blocks and pages.

+ Buy Sandbox +
+ +
+ + +
+ +
+ +
+ + + +
+ + + + + \ No newline at end of file diff --git a/sandbox310/dev/docs/blocks/hero.html b/sandbox310/dev/docs/blocks/hero.html new file mode 100644 index 0000000..69d2b78 --- /dev/null +++ b/sandbox310/dev/docs/blocks/hero.html @@ -0,0 +1,2021 @@ + + + + + + + + + + Sandbox - Modern & Multipurpose Bootstrap 5 Template + + + + + + +
+
+ + +
+ +
+
+
+
+

Blocks - Hero

+

Copy any custom block snippet below and paste it on your page to build your website easily.

+
+ +
+ +
+ +
+ +
+
+

Filter Blocks:

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

Think unique and be creative. Make a difference with Sandbox.

+

Everything you need to create your next unique and professional website, including impressive and ready-made blocks and pages.

+ Buy Sandbox +
+ +
+ + +
+ +
+ +
+ + + +
+ + + + + \ No newline at end of file diff --git a/sandbox310/dev/docs/blocks/misc.html b/sandbox310/dev/docs/blocks/misc.html new file mode 100644 index 0000000..e5dc3d5 --- /dev/null +++ b/sandbox310/dev/docs/blocks/misc.html @@ -0,0 +1,1117 @@ + + + + + + + + + + Sandbox - Modern & Multipurpose Bootstrap 5 Template + + + + + + +
+
+ + +
+ +
+
+
+
+

Blocks - Misc

+

Copy any custom block snippet below and paste it on your page to build your website easily.

+
+ +
+ +
+ +
+ +
+
+

Filter Blocks:

+ +
+ +
+ +
+
+
+
+

Job Positions

+

We’re always searching for amazing people to join our team. Take a look at our current openings.

+
+ +
+ + + +
+
+

Can't find the right position?

+

Cras justo odio, dapibus ac facilisis in, egestas eget quam. Morbi leo risus, porta ac consectetur.

+ Get in Touch +
+ +
+ +
+ +
+
+ + + + +
+ +
+ +
+ +
+
+
+
+

Job Positions

+

We’re always searching for amazing people to join our team. Take a look at our current openings.

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

Think unique and be creative. Make a difference with Sandbox.

+

Everything you need to create your next unique and professional website, including impressive and ready-made blocks and pages.

+ Buy Sandbox +
+ +
+ + +
+ +
+ +
+ + + +
+ + + + + \ No newline at end of file diff --git a/sandbox310/dev/docs/blocks/navbar.html b/sandbox310/dev/docs/blocks/navbar.html new file mode 100644 index 0000000..18a340c --- /dev/null +++ b/sandbox310/dev/docs/blocks/navbar.html @@ -0,0 +1,7443 @@ + + + + + + + + + + Sandbox - Modern & Multipurpose Bootstrap 5 Template + + + + + + + +
+
+ + +
+ +
+
+
+
+

Blocks - Navbar

+

Copy any custom block snippet below and paste it on your page to build your website easily.

+
+ +
+ +
+ +
+ +
+
+

Filter Blocks:

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

Center Nav - Transparent Background

+

Check out some of the live examples: Demo 1 or Demo 4.

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

Center Nav - Transparent Background - Light Text

+

Check out some of the live examples: Demo 3 or Demo 15.

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

Center Nav - Light Background

+

Check out some of the live examples: Shop or Product Page.

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

Center Nav - Dark Background

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

Center Nav - Fancy

+

Check out some of the live examples: Demo 7.

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

Classic - Transparent Background

+

Check out some of the live examples: Demo 6 or Demo 8.

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

Sandbox

+ +
+
+
+

Sandbox is a multipurpose HTML5 template with various layouts which will be a great solution for your business.

+
+ +
+

Contact Info

+
Moonshine St. 14/05
Light City, London
+ info@email.com
00 (123) 456 78 90 +
+ +
+

Learn More

+ +
+ +
+

Follow Us

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

Classic - Transparent Background - Light Text

+

Check out some of the live examples: Demo 11.

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

Sandbox

+ +
+
+
+

Sandbox is a multipurpose HTML5 template with various layouts which will be a great solution for your business.

+
+ +
+

Contact Info

+
Moonshine St. 14/05
Light City, London
+ info@email.com
00 (123) 456 78 90 +
+ +
+

Learn More

+ +
+ +
+

Follow Us

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

Classic - Light Background

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

Sandbox

+ +
+
+
+

Sandbox is a multipurpose HTML5 template with various layouts which will be a great solution for your business.

+
+ +
+

Contact Info

+
Moonshine St. 14/05
Light City, London
+ info@email.com
00 (123) 456 78 90 +
+ +
+

Learn More

+ +
+ +
+

Follow Us

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

Classic - Dark Background

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

Sandbox

+ +
+
+
+

Sandbox is a multipurpose HTML5 template with various layouts which will be a great solution for your business.

+
+ +
+

Contact Info

+
Moonshine St. 14/05
Light City, London
+ info@email.com
00 (123) 456 78 90 +
+ +
+

Learn More

+ +
+ +
+

Follow Us

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

Classic - Fancy

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

Sandbox

+ +
+
+
+

Sandbox is a multipurpose HTML5 template with various layouts which will be a great solution for your business.

+
+ +
+

Contact Info

+
Moonshine St. 14/05
Light City, London
+ info@email.com
00 (123) 456 78 90 +
+ +
+

Learn More

+ +
+ +
+

Follow Us

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

Center Logo - Transparent Background

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

Center Logo - Transparent Background - Light Text

+

Check out some of the live examples: Demo 13.

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

Center Logo - Light Background

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

Center Logo - Dark Background

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

Center Logo - Fancy

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

Extended

+

Check out some of the live examples: Demo 12.

+
+ +
+
+ + +
+
+

Sandbox

+ +
+
+
+

Sandbox is a multipurpose HTML5 template with various layouts which will be a great solution for your business.

+
+ +
+

Contact Info

+
Moonshine St. 14/05
Light City, London
+ info@email.com
00 (123) 456 78 90 +
+ +
+

Learn More

+ +
+ +
+

Follow Us

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

Think unique and be creative. Make a difference with Sandbox.

+

Everything you need to create your next unique and professional website, including impressive and ready-made blocks and pages.

+ Buy Sandbox +
+ +
+ + +
+ +
+ +
+ + + +
+ + + + + \ No newline at end of file diff --git a/sandbox310/dev/docs/blocks/portfolio.html b/sandbox310/dev/docs/blocks/portfolio.html new file mode 100644 index 0000000..ae8480f --- /dev/null +++ b/sandbox310/dev/docs/blocks/portfolio.html @@ -0,0 +1,1869 @@ + + + + + + + + + + Sandbox - Modern & Multipurpose Bootstrap 5 Template + + + + + + +
+
+ + +
+ +
+
+
+
+

Blocks - Portfolio

+

Copy any custom block snippet below and paste it on your page to build your website easily.

+
+ +
+ +
+ +
+ +
+
+

Filter Blocks:

+ +
+ +
+ +
+
+
+
+

Recent Projects

+

We love to turn ideas into beautiful things.

+
+ +
+ +
+
+
+
+
+ +

Ipsum Ultricies Cursus

+
+ +
+
+ +

Mollis Ipsum Mattis

+
+ +
+
+ +

Magna Tristique Inceptos

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

Latest Projects

+

Check out some of our awesome projects with creative ideas and great design.

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

Cras Fermentum Sem

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

Mollis Ipsum Mattis

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

Ipsum Ultricies Cursus

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

Inceptos Euismod Egestas

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

Ipsum Mollis Vulputate

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

Porta Ornare Cras

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

Check out some of our recent projects below.

+

We love to turn ideas into beautiful things.

+
+ +
+ +
+ +
+
+ +

Ipsum Ultricies Cursus

+
+ +
+
+ +

Mollis Ipsum Mattis

+
+ +
+
+ +

Magna Tristique Inceptos

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

Latest Projects

+

Check out some of our awesome projects with creative ideas and great design.

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

Our Projects

+

Check out some of our awesome projects with creative ideas and great design.

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

Cras Fermentum Sem

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

Mollis Ipsum Mattis

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

Ipsum Ultricies Cursus

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

Inceptos Euismod Egestas

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

Sollicitudin Ornare Porta

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

Ipsum Mollis Vulputate

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

Latest Projects

+

Check out some of my latest projects with creative ideas.

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

Snowlake Theme

+

Maecenas faucibus mollis interdum sed posuere consectetur est at lobortis. Scelerisque id ligula porta felis euismod semper. Fusce dapibus tellus cursus.

+ See Project +
+ +
+
+
+ +
+ +
+ +
+ +
+
+
+
+ +

Budget App

+

Maecenas faucibus mollis interdum sed posuere consectetur est at lobortis. Scelerisque id ligula porta felis euismod semper. Fusce dapibus tellus cursus.

+ See Project +
+ +
+
+
+ +
+ +
+ +
+ +
+
+
+
+ +

Missio Theme

+

Maecenas faucibus mollis interdum sed posuere porta consectetur cursus porta lobortis. Scelerisque id ligula felis.

+ See Project +
+ + +
+ +
+ +
+
+
+ +

Storage App

+

Maecenas faucibus mollis interdum sed posuere consectetur est at lobortis. Scelerisque id ligula porta felis euismod semper.

+ See Project +
+ + +
+ +
+ +
+ +
+ +
+
+ + + + +
+ +
+ +
+ +
+
+
+
+
+

Latest Projects

+

Check out some of our awesome projects with creative ideas and great design.

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

Our Projects

+

Check out some of our awesome projects with creative ideas and great design.

+
+ +
+ +
+
+
+
+
+
+

Cras Fermentum Sem

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

Mollis Ipsum Mattis

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

Ipsum Ultricies Cursus

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

Inceptos Euismod Egestas

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

Ipsum Mollis Vulputate

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

Porta Ornare Cras

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

Think unique and be creative. Make a difference with Sandbox.

+

Everything you need to create your next unique and professional website, including impressive and ready-made blocks and pages.

+ Buy Sandbox +
+ +
+ + +
+ +
+ +
+ + + +
+ + + + + \ No newline at end of file diff --git a/sandbox310/dev/docs/blocks/pricing.html b/sandbox310/dev/docs/blocks/pricing.html new file mode 100644 index 0000000..355b2b1 --- /dev/null +++ b/sandbox310/dev/docs/blocks/pricing.html @@ -0,0 +1,1351 @@ + + + + + + + + + + Sandbox - Modern & Multipurpose Bootstrap 5 Template + + + + + + +
+
+ + +
+ +
+
+
+
+

Blocks - Pricing

+

Copy any custom block snippet below and paste it on your page to build your website easily.

+
+ +
+ +
+ +
+ +
+
+

Filter Blocks:

+ +
+ +
+ +
+
+
+
+

Our Pricing

+

We offer great prices, premium and quality products for your business.

+

Enjoy a free 30-day trial and experience the full service. No credit card required!

+ See All Prices +
+ +
+
+

Monthly

+
+
+
+
+
+

Yearly (Save 30%)

+
+
+
+
+
+
+
+
+
$19 month
+
$199 year
+
+ +

Premium Plan

+
    +
  • 5 Projects
  • +
  • 100K API Access
  • +
  • 200MB Storage
  • +
  • Weekly Reports
  • +
  • 7/24 Support
  • +
+ Choose Plan +
+ +
+ +
+ + + +
+ +
+ +
+ +
+ +
+
+ + + + +
+ +
+ +
+ +
+
+
+
+

Our Pricing

+

We offer great prices, premium products and quality service for your business.

+
+ +
+ +
+
+
+
+

Monthly

+
+
+
+
+
+

Yearly

+
+
+
+
+
+ +

Basic Plan

+
+
$9 month
+
$99 year
+
+ +
    +
  • 1 Project
  • +
  • 100K API Access
  • +
  • 100MB Storage
  • +
  • Weekly Reports
  • +
  • 7/24 Support
  • +
+ Choose Plan +
+ +
+ +
+ + + +
+
+
+ +

Corporate Plan

+
+
$49 month
+
$499 year
+
+ +
    +
  • 20 Projects
  • +
  • 300K API Access
  • +
  • 500MB Storage
  • +
  • Weekly Reports
  • +
  • 7/24 Support
  • +
+ Choose Plan +
+ +
+ +
+ +
+ +
+ +
+ +
+
+ + + + +
+ +
+ +
+ +
+
+

Our Pricing

+
+
+

Monthly

+
+
+
+
+
+

Yearly (Save 30%)

+
+
+
+
+
+
+

Basic Plan

+
+
$9 month
+
$99 year
+
+ +
    +
  • 1 Project
  • +
  • 100K API Access
  • +
  • 100MB Storage
  • +
  • Weekly Reports
  • +
  • 7/24 Support
  • +
+ Choose Plan +
+ +
+ +
+ +
+
+
+
+

Premium Plan

+
+
$19 month
+
$199 year
+
+ +
    +
  • 5 Projects
  • +
  • 100K API Access
  • +
  • 200MB Storage
  • +
  • Weekly Reports
  • +
  • 7/24 Support
  • +
+ Choose Plan +
+ +
+ +
+ +
+
+
+
+

Corporate Plan

+
+
$29 month
+
$299 year
+
+ +
    +
  • 20 Projects
  • +
  • 300K API Access
  • +
  • 500MB Storage
  • +
  • Weekly Reports
  • +
  • 7/24 Support
  • +
+ Choose Plan +
+ +
+ +
+ +
+
+
+
+

Community Plan

+
+
$49 month
+
$499 year
+
+ +
    +
  • 90 Projects
  • +
  • 900K API Access
  • +
  • 900MB Storage
  • +
  • Weekly Reports
  • +
  • 7/24 Support
  • +
+ Choose Plan +
+ +
+ +
+
+ +
+ +
+ +
+
+ + + + +
+ +
+ +
+ +
+
+

Our Pricing

+

We offer great prices, premium and quality products for your business.

+
+
+

Enjoy a free 30-day trial and experience the full service. No credit card required!

+
+ +
+ + See All Prices +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
Basic Plan
+
$9 / Monthly
+
+
Premium Plan
+
$19 / Monthly
+
+
Corporate Plan
+
$29 / Monthly
+
+
Business Plan
+
$49 / Monthly
+
Project152090
API Access100K200K300K900K
Storage100MB200MB500MB900MB
Weekly Reports-
24/7 Support--
Choose PlanChoose PlanChoose PlanChoose Plan
+
+ +
+ +
+
+ + + + +
+ +
+ +
+ +
+ +
+
+
+
+

Think unique and be creative. Make a difference with Sandbox.

+

Everything you need to create your next unique and professional website, including impressive and ready-made blocks and pages.

+ Buy Sandbox +
+ +
+ + +
+ +
+ +
+ + + +
+ + + + + \ No newline at end of file diff --git a/sandbox310/dev/docs/blocks/process.html b/sandbox310/dev/docs/blocks/process.html new file mode 100644 index 0000000..2daaf3f --- /dev/null +++ b/sandbox310/dev/docs/blocks/process.html @@ -0,0 +1,1173 @@ + + + + + + + + + + Sandbox - Modern & Multipurpose Bootstrap 5 Template + + + + + + +
+
+ + +
+ +
+
+
+
+

Blocks - Process

+

Copy any custom block snippet below and paste it on your page to build your website easily.

+
+ +
+ +
+ +
+ +
+
+

Filter Blocks:

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

How It Works?

+

So here are three working steps why our valued customers choose us.

+
+
+ 1 +
+
+

Collect Ideas

+

Nulla vitae elit libero pharetra augue dapibus. Praesent commodo cursus.

+
+
+
+
+ 2 +
+
+

Data Analysis

+

Vivamus sagittis lacus vel augue laoreet. Etiam porta sem malesuada magna.

+
+
+
+
+ 3 +
+
+

Finalize Product

+

Cras mattis consectetur purus sit amet. Aenean lacinia bibendum nulla sed.

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

How We Do It?

+

We make your spending stress-free for you to have the perfect control.

+
+
01 +

Concept

+

Nulla vitae elit libero elit non porta gravida eget metus cras. Aenean eu leo quam. Pellentesque ornare.

+
+ +
02 +

Prepare

+

Vestibulum id ligula porta felis euismod semper. Sed posuere consectetur est at lobortis.

+
+ +
03 +

Retouch

+

Integer posuere erat a ante venenatis dapibus posuere velit aliquet. Nulla vitae elit libero.

+
+ +
04 +

Finalize

+

Integer posuere erat, consectetur adipiscing elit. Fusce dapibus, tellus ac cursus commodo.

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

How It Works

+

Download the app, create your profile and voilĆ , you're all set!

+

Donec ullamcorper nulla non metus auctor fringilla. Cras mattis consectetur purus sit amet fermentum. Integer posuere erat a ante venenatis dapibus posuere velit aliquet. Nulla vitae elit libero. Etiam porta sem malesuada magna mollis euismod. Fusce dapibus, tellus ac cursus commodo.

+
+
+

1. Download

+

Nulla vitae elit libero elit non porta eget.

+
+ +
+

2. Set Profile

+

Nulla vitae elit libero elit non porta eget.

+
+ +
+

3. Start

+

Nulla vitae elit libero elit non porta eget.

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

Our Process

+

Find out everything you need to know about creating a business process model

+
+
+

1. Concept

+

Nulla vitae elit libero elit non porta gravida eget metus cras.

+
+ +
+

2. Prepare

+

Nulla vitae elit libero elit non porta gravida eget metus cras.

+
+ +
+

3. Retouch

+

Nulla vitae elit libero elit non porta gravida eget metus cras.

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

Here are 3 working steps to organize our business projects.

+
+ +
+ +
+
+
+
+
+
+ 01 +
+
+

Collect Ideas

+

Nulla vitae elit libero pharetra augue dapibus.

+
+
+
+ +
+ +
+
+
+
+ 02 +
+
+

Data Analysis

+

Vivamus sagittis lacus vel augue laoreet.

+
+
+
+ +
+ +
+
+
+
+ 03 +
+
+

Finalize Product

+

Cras mattis consectetur purus sit amet.

+
+
+
+ +
+ +
+ +
+

How It Works?

+

Find out everything you need to know and more about how we create our business process models.

+

Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Etiam porta sem malesuada magna mollis euismod. Nullam id dolor id nibh ultricies vehicula ut id elit. Nullam quis risus eget urna mollis ornare.

+

Nullam id dolor id nibh ultricies vehicula ut id elit. Vestibulum id ligula porta felis euismod semper. Aenean lacinia bibendum nulla sed consectetur. Sed posuere consectetur est at lobortis. Vestibulum id ligula porta felis.

+ Learn More +
+ +
+ +
+ +
+
+ + + + +
+ +
+ +
+ +
+
+
+
+
+
+ +
+

How It Works?

+

Everything you need on creating a business process.

+
+
+ +
+
+

Collect Ideas

+

Nulla vitae elit libero pharetra augue dapibus.

+
+
+
+
+ +
+
+

Data Analysis

+

Vivamus sagittis lacus augue laoreet vel.

+
+
+
+
+ +
+
+

Magic Touch

+

Cras mattis consectetur purus sit amet.

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

Think unique and be creative. Make a difference with Sandbox.

+

Everything you need to create your next unique and professional website, including impressive and ready-made blocks and pages.

+ Buy Sandbox +
+ +
+ + +
+ +
+ +
+ + + +
+ + + + + \ No newline at end of file diff --git a/sandbox310/dev/docs/blocks/team.html b/sandbox310/dev/docs/blocks/team.html new file mode 100644 index 0000000..70f220f --- /dev/null +++ b/sandbox310/dev/docs/blocks/team.html @@ -0,0 +1,1226 @@ + + + + + + + + + + Sandbox - Modern & Multipurpose Bootstrap 5 Template + + + + + + +
+
+ + +
+ +
+
+
+
+

Blocks - Team

+

Copy any custom block snippet below and paste it on your page to build your website easily.

+
+ +
+ +
+ +
+ +
+
+

Filter Blocks:

+ +
+ +
+ +
+
+
+
+

Our Team

+

Think unique and be innovative. Make a difference with Sandbox.

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

Coriss Ambady

+

Financial Analyst

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

Cory Zamora

+

Marketing Specialist

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

Nikolas Brooten

+

Sales Manager

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

Jackie Sanders

+

Investment Planner

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

Save your time and money by choosing our professional team.

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

Coriss Ambady

+
Financial Analyst
+

Fermentum massa justo sit amet risus morbi leo.

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

Cory Zamora

+
Marketing Specialist
+

Fermentum massa justo sit amet risus morbi leo.

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

Nikolas Brooten

+
Sales Manager
+

Fermentum massa justo sit amet risus morbi leo.

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

Jackie Sanders

+
Investment Planner
+

Fermentum massa justo sit amet risus morbi leo.

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

Laura Widerski

+
Sales Specialist
+

Fermentum massa justo sit amet risus morbi leo.

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

Tina Geller

+
Financial Analyst
+

Fermentum massa justo sit amet risus morbi leo.

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

Meet the Team

+

Save your time and money by choosing our professional team.

+

Donec id elit non mi porta gravida at eget metus. Morbi leo risus, porta ac consectetur ac, vestibulum at eros tempus porttitor.

+ See All Members +
+ +
+
+
+
+
+ +

Cory Zamora

+
Marketing Specialist
+

Etiam porta sem magna malesuada mollis.

+ + +
+ +
+ +

Coriss Ambady

+
Financial Analyst
+

Aenean eu leo quam. Pellentesque ornare lacinia.

+ + +
+ +
+ +

Nikolas Brooten

+
Sales Manager
+

Donec ornare elit quam porta gravida at eget.

+ + +
+ +
+ +

Jackie Sanders

+
Investment Planner
+

Nullam risus eget urna mollis ornare vel eu leo.

+ + +
+ +
+ +

Tina Geller

+
Assistant Buyer
+

Vivamus sagittis lacus vel augue laoreet rutrum.

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

Think unique and be creative. Make a difference with Sandbox.

+

Everything you need to create your next unique and professional website, including impressive and ready-made blocks and pages.

+ Buy Sandbox +
+ +
+ + +
+ +
+ +
+ + + +
+ + + + + \ No newline at end of file diff --git a/sandbox310/dev/docs/blocks/testimonials.html b/sandbox310/dev/docs/blocks/testimonials.html new file mode 100644 index 0000000..9f7aee4 --- /dev/null +++ b/sandbox310/dev/docs/blocks/testimonials.html @@ -0,0 +1,3070 @@ + + + + + + + + + + Sandbox - Modern & Multipurpose Bootstrap 5 Template + + + + + + +
+
+ + +
+ +
+
+
+
+

Blocks - Testimonials

+

Copy any custom block snippet below and paste it on your page to build your website easily.

+
+ +
+ +
+ +
+ +
+
+

Filter Blocks:

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

ā€œCum sociis natoque penatibus et magnis dis parturient montes.ā€

+
+
+
Coriss Ambady
+

Financial Analyst

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

ā€œVivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Vestibulum id ligula porta felis euismod semper.ā€

+
+
+
Cory Zamora
+

Marketing Specialist

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

ā€œDonec id elit non porta gravida at eget metus. Duis mollis est commodo luctus, nisi erat porttitor.ā€

+
+
+
Barclay Widerski
+

Sales Specialist

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

ā€œNisi erat porttitor ligula, eget lacinia odio sem nec elit. Aenean eu leo pellentesque ornare.ā€

+
+
+
Jackie Sanders
+

Investment Planner

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

Our Community

+

Customer satisfaction is our major goal. See what our customers are saying about us.

+

Aenean lacinia bibendum nulla sed consectetur. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Nulla vitae elit libero, a pharetra augue. Maecenas faucibus mollis interdum. Vestibulum id ligula porta felis euismod semper.

+ All Testimonials +
+ +
+ +
+ +
+
+ + + + +
+ +
+ +
+ +
+
+
+
+
+
+
+
+
+ +
+

ā€œDonec id elit non mi porta gravida at eget metus. Vivamus mollis est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit. Duis mollis porta est non commodo luctus.ā€

+
+
+
Coriss Ambady
+

Financial Analyst

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

Our Community

+

Customer satisfaction is our major goal. See what our clients are saying about our services.

+ All Testimonials +
+ +
+
+
+
+
+
+
+
+
+
+
+
+

ā€œVivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Vestibulum id ligula porta felis euismod semper. Cras justo odio, dapibus ac facilisis sed posuere.ā€

+
+ +
+
Coriss Ambady
+

Financial Analyst

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

ā€œDonec id elit non mi porta gravida at eget metus. Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit. Duis mollis, est non commodo luctus.ā€

+
+ +
+
Cory Zamora
+

Marketing Specialist

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

ā€œNisi erat porttitor ligula, eget lacinia odio sem nec elit. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Donec id elit non mi porta gravida.ā€

+
+ +
+
Nikolas Brooten
+

Sales Manager

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

ā€œEtiam porta sem malesuada magna mollis euismod. Etiam porta sem malesuada magna mollis euismod. Donec id elit non mi porta gravida at eget metus posuere consectetur.ā€

+
+ +
+
Coriss Ambady
+

Financial Analyst

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

ā€œMaecenas faucibus mollis interdum. Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit. Praesent commodo cursus magna, vel scelerisque.ā€

+
+ +
+
Jackie Sanders
+

Investment Planner

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

ā€œDonec id elit non mi porta gravida at eget metus. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Maecenas sed diam eget risus varius blandit sit amet non magna.ā€

+
+ +
+
Laura Widerski
+

Sales Specialist

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

ā€œVivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Vestibulum ligula porta felis euismod semper. Cras justo odio consectetur.ā€

+
+
+
Coriss Ambady
+

Financial Analyst

+
+
+
+
+ +
+
+

ā€œVivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Vestibulum ligula porta felis euismod semper. Cras justo odio consectetur.ā€

+
+
+
Cory Zamora
+

Marketing Specialist

+
+
+
+
+ +
+
+

ā€œVivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Vestibulum ligula porta felis euismod semper. Cras justo odio consectetur.ā€

+
+
+
Nikolas Brooten
+

Sales Manager

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

Happy Customers

+

Customer satisfaction is our major goal. See what our customers are saying about us.

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

ā€œVivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Vestibulum id ligula porta felis euismod semper. Cras justo odio dapibus facilisis sociis natoque penatibus.ā€

+
+ +
+
Coriss Ambady
+

Financial Analyst

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

ā€œVivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Vestibulum id ligula porta felis euismod semper. Cras justo odio dapibus facilisis sociis natoque penatibus.ā€

+
+ +
+
Cory Zamora
+

Marketing Specialist

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

ā€œVivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Vestibulum id ligula porta felis euismod semper. Cras justo odio dapibus facilisis sociis natoque penatibus.ā€

+
+ +
+
Nikolas Brooten
+

Sales Manager

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

ā€œVivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Vestibulum id ligula porta felis euismod semper. Cras justo odio dapibus facilisis sociis natoque penatibus.ā€

+
+ +
+
Coriss Ambady
+

Financial Analyst

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

ā€œVivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Vestibulum id ligula porta felis euismod semper. Cras justo odio dapibus facilisis sociis natoque penatibus.ā€

+
+ +
+
Jackie Sanders
+

Investment Planner

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

ā€œVivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Vestibulum id ligula porta felis euismod semper. Cras justo odio dapibus facilisis sociis natoque penatibus.ā€

+
+ +
+
Laura Widerski
+

Sales Specialist

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

5000+

+

Satisfied Customers

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

ā€œVivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Vestibulum ligula porta felis euismod semper. Cras justo odio consectetur.ā€

+
+
+
Coriss Ambady
+

Financial Analyst

+
+
+
+
+ +
+
+

ā€œVivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Vestibulum ligula porta felis euismod semper. Cras justo odio consectetur.ā€

+
+
+
Cory Zamora
+

Marketing Specialist

+
+
+
+
+ +
+
+

ā€œVivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Vestibulum ligula porta felis euismod semper. Cras justo odio consectetur.ā€

+
+
+
Nikolas Brooten
+

Sales Manager

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

Happy Customers

+

Don't take our word for it. See what customers are saying about us.

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

ā€œVivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Vestibulum id ligula porta felis euismod semper. Cras justo odio dapibus facilisis sociis natoque penatibus.ā€

+
+ +
+
Coriss Ambady
+

Financial Analyst

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

ā€œFusce dapibus, tellus ac cursus tortor mauris condimentum fermentum massa justo sit amet. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Cras mattis consectetur purus sit amet fermentum. Aenean lacinia bibendum nulla sed consectetur.ā€

+
+ +
+
Cory Zamora
+

Marketing Specialist

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

ā€œCurabitur blandit tempus porttitor. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Nullam quis risus eget porta ac consectetur vestibulum. Donec sed odio dui consectetur adipiscing elit.ā€

+
+ +
+
Nikolas Brooten
+

Sales Manager

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

ā€œEtiam adipiscing tincidunt elit convallis felis suscipit ut. Phasellus rhoncus tincidunt auctor. Nullam eu sagittis mauris. Donec non dolor ac elit aliquam tincidunt at at sapien. Aenean tortor libero condimentum ac laoreet vitae.ā€

+
+ +
+
Coriss Ambady
+

Financial Analyst

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

ā€œMaecenas sed diam eget risus varius blandit sit amet non magna. Cum sociis natoque penatibus magnis dis montes, nascetur ridiculus mus. Donec sed odio dui. Nulla vitae elit libero a pharetra.ā€

+
+ +
+
Jackie Sanders
+

Investment Planner

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

ā€œDonec id elit non mi porta gravida at eget metus. Nulla vitae elit libero, a pharetra augue. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.ā€

+
+ +
+
Laura Widerski
+

Sales Specialist

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

ā€œVivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Vestibulum ligula porta felis euismod semper. Cras justo odio consectetur nulla dapibus curabitur blandit faucibus.ā€

+
+
+
Coriss Ambady
+

Financial Analyst

+
+
+
+
+ +
+
+

ā€œVivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Vestibulum ligula porta felis euismod semper. Cras justo odio consectetur nulla dapibus curabitur blandit faucibus.ā€

+
+
+
Cory Zamora
+

Marketing Specialist

+
+
+
+
+ +
+
+

ā€œVivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Vestibulum ligula porta felis euismod semper. Cras justo odio consectetur nulla dapibus curabitur blandit faucibus.ā€

+
+
+
Nikolas Brooten
+

Sales Manager

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

ā€œFusce dapibus tellus ac cursus commodo, tortor mauris condimentum nibh ut fermentum massa, justo sit amet vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Cras mattis consectetur purus sit amet fermentum. Aenean lacinia bibendum nulla sedā€

+
+
+
Coriss Ambady
+
Financial Analyst
+
+
+
+
+ +
+ +
+ +
+ +
+ +
+
+ + + + +
+ +
+ +
+ +
+
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+

ā€œVivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Vestibulum ligula porta felis euismod semper. Cras justo odio.ā€

+
+
+
Coriss Ambady
+

Financial Analyst

+
+
+
+
+ +
+
+

ā€œVivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Vestibulum ligula porta felis euismod semper. Cras justo odio.ā€

+
+
+
Cory Zamora
+

Marketing Specialist

+
+
+
+
+ +
+
+

ā€œVivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Vestibulum ligula porta felis euismod semper. Cras justo odio.ā€

+
+
+
Nikolas Brooten
+

Sales Manager

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

ā€œVivamus sagittis lacus augue laoreet rutrum faucibus auctor vestibulum ligula porta felis, euismod semper cras justo odio consectetur.ā€

+
+
+
Coriss Ambady
+

Financial Analyst

+
+
+
+
+ +
+ +
+

ā€œVivamus sagittis lacus augue laoreet rutrum faucibus auctor vestibulum ligula porta felis, euismod semper cras justo odio consectetur.ā€

+
+
+
Cory Zamora
+

Marketing Specialist

+
+
+
+
+ +
+ +
+

ā€œVivamus sagittis lacus augue laoreet rutrum faucibus auctor vestibulum ligula porta felis, euismod semper cras justo odio consectetur.ā€

+
+
+
Nikolas Brooten
+

Sales Manager

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

ā€œVivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Vestibulum ligula porta felis euismod semper. Cras justo odio consectetur adipiscing dapibus.ā€

+
+ +
+
Coriss Ambady
+

Financial Analyst

+
+
+
+
+ +
+
+

ā€œVivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Vestibulum ligula porta felis euismod semper. Cras justo odio consectetur adipiscing dapibus.ā€

+
+ +
+
Cory Zamora
+

Marketing Specialist

+
+
+
+
+ +
+
+

ā€œVivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Vestibulum ligula porta felis euismod semper. Cras justo odio consectetur adipiscing dapibus.ā€

+
+ +
+
Nikolas Brooten
+

Sales Manager

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

We are proud of our works

+

We bring solutions to make life easier for our customers.

+
+ +
+
+
+ +

1000+

+

Completed Projects

+
+ +
+ +

4x

+

Revenue Growth

+
+ +
+ +

99.7%

+

Customer Satisfaction

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

ā€œVivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Vestibulum id ligula porta. Cras mattis consectetur.ā€

+
+
+
Coriss Ambady
+

Financial Analyst

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

ā€œFusce dapibus, tellus ac cursus tortor mauris condimentum fermentum massa justo sit amet purus sit amet fermentum.ā€

+
+
+
Cory Zamora
+

Marketing Specialist

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

ā€œCurabitur blandit tempus porttitor. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor eu rutrum. Nulla vitae libero.ā€

+
+
+
Nikolas Brooten
+

Sales Manager

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

ā€œEtiam adipiscing tincidunt elit convallis felis suscipit ut. Phasellus rhoncus eu tincidunt auctor nullam rutrum, pharetra augue.ā€

+
+
+
Coriss Ambady
+

Financial Analyst

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

Think unique and be creative. Make a difference with Sandbox.

+

Everything you need to create your next unique and professional website, including impressive and ready-made blocks and pages.

+ Buy Sandbox +
+ +
+ + +
+ +
+ +
+ + + +
+ + + + + \ No newline at end of file diff --git a/sandbox310/dev/docs/changelog.html b/sandbox310/dev/docs/changelog.html new file mode 100644 index 0000000..d31b8d7 --- /dev/null +++ b/sandbox310/dev/docs/changelog.html @@ -0,0 +1,1083 @@ + + + + + + + + + + Sandbox - Modern & Multipurpose Bootstrap 5 Template + + + + + + +
+
+ + +
+ +
+
+
+
+

Changelog

+

Find out what is newly added, changed, fixed, improved or updated in the latest Sandbox versions.

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

v3.1.0 - 22 March 22

+
+
+ + +
+
    +
  • src/assets/scss/_variables.scss
  • +
  • src/assets/scss/theme/_accordion.scss
  • +
  • src/assets/scss/theme/_alert.scss
  • +
  • src/assets/scss/theme/_animations.scss
  • +
  • src/assets/scss/theme/_buttons.scss
  • +
  • src/assets/scss/theme/_carousel.scss
  • +
  • src/assets/scss/theme/_close.scss
  • +
  • src/assets/scss/theme/_dropdown.scss
  • +
  • src/assets/scss/theme/_forms.scss
  • +
  • src/assets/scss/theme/_icons.scss
  • +
  • src/assets/scss/theme/_mixins.scss
  • +
  • src/assets/scss/theme/_nav.scss
  • +
  • src/assets/scss/theme/_offcanvas.scss
  • +
  • src/assets/scss/theme/_progress.scss
  • +
  • src/assets/scss/theme/_projects.scss
  • +
  • src/assets/scss/theme/_reboot.scss
  • +
  • src/assets/scss/theme/_theme.scss
  • +
  • src/assets/scss/theme/_tooltip.scss
  • +
  • src/assets/js/theme.js
  • +
  • src/assets/js/vendor/swiper-bundle.min.js
  • +
  • src/assets/css/vendor/swiper-bundle.min.css
  • +
  • src/partials/_menu-links.html
  • +
  • src/partials/_menu-offcanvas-footer.html
  • +
  • src/partials/_menu-others-cart.html
  • +
  • src/partials/_menu-others-offcanvas-info.html
  • +
  • src/partials/_menu-others-search.html
  • +
  • src/partials/_menu-others.html
  • +
  • src/partials/_navbar-center-logo.html
  • +
  • src/partials/_navbar-extended.html
  • +
  • src/partials/_navbar.html
  • +
  • src/partials/_sidebar-widgets.html
  • +
  • src/blog2.html
  • +
  • src/demo3.html
  • +
  • src/demo7.html
  • +
  • src/demo8.html
  • +
  • src/demo10.html
  • +
  • src/demo15.html
  • +
  • src/demo18.html
  • +
  • src/demo19.html
  • +
  • src/index.html
  • +
  • src/projects.html
  • +
  • src/page-loader.html
  • +
  • src/shop-cart.html
  • +
  • src/shop-checkout.html
  • +
  • src/shop-product.html
  • +
  • src/shop.html
  • +
  • src/shop2.html
  • +
  • +
  • dist/assets/css/plugins.css
  • +
  • dist/assets/css/style.css
  • +
  • dist/assets/js/plugins.js
  • +
  • dist/assets/js/theme.js
  • +
  • dist/page-loader.html
  • +
  • dist/shop-cart.html
  • +
  • dist/shop-checkout.html
  • +
  • dist/shop-product.html
  • +
  • dist/shop.html
  • +
  • dist/shop2.html
  • +
  • +
  • dev/assets/css/plugins.css
  • +
  • dev/assets/css/style.css
  • +
  • dev/assets/js/plugins.js
  • +
  • dev/assets/js/theme.js
  • +
  • dev/page-loader.html
  • +
  • dev/shop-cart.html
  • +
  • dev/shop-checkout.html
  • +
  • dev/shop-product.html
  • +
  • dev/shop.html
  • +
  • dev/shop2.html
  • +
+
+ +
+ +
+ +
+
+

v3.0.0 - 1 March 22

+
+
+
    +
  • Changed jQuery is dropped.
  • +
  • Changed +

    Replaced Owl carousels with Swiper.js.

    +
  • +
  • New +

    Utility pages are added: 404, Sign In, Sign Up, Terms.

    +
  • +
  • New +

    Career pages are added.

    +
  • +
  • New +

    Added 35 new solid SVG icons.

    +
  • +
  • Updated +

    PHP Mailer to latest version 6.5.3.

    +
  • +
  • Fixed +

    The issue of _user-variables.css not working properly.

    +
  • +
+ +
+
    +
  • src/assets/php
  • +
  • src/assets/scss/_bootstrap.scss
  • +
  • src/assets/scss/_user-variables.scss
  • +
  • src/assets/scss/_variables.scss
  • +
  • src/assets/scss/style.scss
  • +
  • src/assets/scss/theme/_accordion.scss
  • +
  • src/assets/scss/theme/_alert.scss
  • +
  • src/assets/scss/theme/_animations.scss
  • +
  • src/assets/scss/theme/_background.scss
  • +
  • src/assets/scss/theme/_breadcrumb.scss
  • +
  • src/assets/scss/theme/_buttons.scss
  • +
  • src/assets/scss/theme/_carousel.scss
  • +
  • src/assets/scss/theme/_colored-links.scss
  • +
  • src/assets/scss/theme/_colors.scss
  • +
  • src/assets/scss/theme/_dropdown.scss
  • +
  • src/assets/scss/theme/_forms.scss
  • +
  • src/assets/scss/theme/_functions.scss
  • +
  • src/assets/scss/theme/_icons.scss
  • +
  • src/assets/scss/theme/_lightbox.scss
  • +
  • src/assets/scss/theme/_mixins.scss
  • +
  • src/assets/scss/theme/_nav.scss
  • +
  • src/assets/scss/theme/_navbar.scss
  • +
  • src/assets/scss/theme/_overlay.scss
  • +
  • src/assets/scss/theme/_player.scss
  • +
  • src/assets/scss/theme/_process.scss
  • +
  • src/assets/scss/theme/_projects.scss
  • +
  • src/assets/scss/theme/_reboot.scss
  • +
  • src/assets/scss/theme/_root.scss
  • +
  • src/assets/scss/theme/_theme.scss
  • +
  • src/assets/scss/theme/_type.scss
  • +
  • src/assets/scss/theme/_wrappers.scss
  • +
  • src/assets/scss/colors
  • +
  • src/assets/js
  • +
  • +
  • dist/assets/css/colors
  • +
  • dist/assets/fonts
  • +
  • dist/assets/php
  • +
  • dist/assets/css/plugins.css
  • +
  • dist/assets/css/style.css
  • +
  • dist/assets/js/plugins.js
  • +
  • dist/assets/js/theme.js
  • +
  • +
  • dev/assets/css/colors
  • +
  • dev/assets/fonts
  • +
  • dev/assets/php
  • +
  • dev/assets/css/plugins.css
  • +
  • dev/assets/css/style.css
  • +
  • dev/assets/js/plugins.js
  • +
  • dev/assets/js/theme.js
  • +
  • +
  • gulpfile.js
  • +
  • package.json
  • +
+
+ +
+ +
+ +
+
+

v2.0.0 - 14 December 21

+
+
+
    +
  • Changed +

    Replaced existing lightbox plugin with GLightbox.js

    +
  • +
  • Changed +

    Angled edges documentation moved from Backgrounds to Dividers page.

    +
  • +
  • Changed +

    Media sources moved from Media to Credits page.

    +
  • +
  • Fixed +

    The missing department field in contact form emails.

    +
  • +
  • Updated +

    Bootstrap to latest version v5.1.3

    +
  • +
  • Updated +

    Unicons set to include newly added Font Icons

    +
  • +
  • Updated +

    Added some new Lineal SVG (FKA Duotone) icons.

    +
  • +
  • New +

    Added border option to Card edges.

    +
  • +
  • New +

    Added a new button style: .btn-expand

    +
  • +
  • New +

    Added new link hover styles.

    +
  • +
  • New +

    Added a new overlay style (gradient) for image hover: .overlay-3

    +
  • +
  • New +

    Added new image hover style: Cursor

    +
  • +
  • New +

    Added new text highlight styles.

    +
  • +
  • New +

    Added a new SVG icon set: Solid with Mono and Duo color schemes.

    +
  • +
  • New +

    Added new background images: Abstract and Gradient.

    +
  • +
  • New +

    Added new set of dividers: Waves

    +
  • +
  • New +

    Added a new font: Urbanist. Demo 19, Demo 20, Demo 21

    +
  • +
  • New +

    Added new colors: sky, fuchsia and grape. Colors page.

    +
  • +
  • New +

    Added new SVG shapes

    +
  • +
  • New +

    Added new 3 sets of illustrations

    +
  • +
  • New +

    Added meta tags for SEO.

    +
  • +
  • New +

    Added a new text animation: Rotator

    +
  • +
  • New +

    Added a new accordion style with icons.

    +
  • +
  • New +

    Added a new progressbar style: Semi Circle

    +
  • +
  • New +

    Added a new documentation page for the Tile grid snippets.

    +
  • +
  • New +

    Added a new blocks page: Misc

    +
  • +
  • New +

    Added 4 new demos: Demo 18, Demo 19, Demo 20, Demo 21

    +
  • +
+ +
+
    +
  • src/assets/fonts/custom
  • +
  • src/assets/fonts/unicons
  • +
  • src/assets/js/theme.js
  • +
  • src/assets/php/contact.php
  • +
  • src/assets/scss/_bootstrap.scss
  • +
  • src/assets/scss/_core.scss
  • +
  • src/assets/scss/_utilities.scss
  • +
  • src/assets/scss/_variables-colors.scss
  • +
  • src/assets/scss/_variables.scss
  • +
  • src/assets/scss/theme/_accordion.scss
  • +
  • src/assets/scss/theme/_animations.scss
  • +
  • src/assets/scss/theme/_background.scss
  • +
  • src/assets/scss/theme/_blog.scss
  • +
  • src/assets/scss/theme/_buttons.scss
  • +
  • src/assets/scss/theme/_card.scss
  • +
  • src/assets/scss/theme/_carousel.scss
  • +
  • src/assets/scss/theme/_colors.scss
  • +
  • src/assets/scss/theme/_dropdown.scss
  • +
  • src/assets/scss/theme/_footer.scss
  • +
  • src/assets/scss/theme/_functions.scss
  • +
  • src/assets/scss/theme/_icons.scss
  • +
  • src/assets/scss/theme/_lightbox.scss
  • +
  • src/assets/scss/theme/_navbar.scss
  • +
  • src/assets/scss/theme/_overlay.scss
  • +
  • src/assets/scss/theme/_process.scss
  • +
  • src/assets/scss/theme/_projects.scss
  • +
  • src/assets/scss/theme/_reboot.scss
  • +
  • src/assets/scss/theme/_shapes.scss
  • +
  • src/assets/scss/theme/_slider.scss
  • +
  • src/assets/scss/theme/_type.scss
  • +
  • src/assets/scss/theme/_wrappers.scss
  • +
  • src/assets/scss/colors/yellow.scss
  • +
  • src/assets/scss/fonts/dm.scss
  • +
  • src/assets/scss/fonts/thicccboi.scss
  • +
  • +
  • dist/assets/css/colors
  • +
  • dist/assets/fonts
  • +
  • dist/assets/css/plugins.css
  • +
  • dist/assets/css/style.css
  • +
  • dist/assets/js/plugins.js
  • +
  • dist/assets/js/theme.js
  • +
  • dist/assets/php/contact.php
  • +
  • +
  • dev/assets/css/colors
  • +
  • dev/assets/fonts
  • +
  • dev/assets/css/plugins.css
  • +
  • dev/assets/css/style.css
  • +
  • dev/assets/js/plugins.js
  • +
  • dev/assets/js/theme.js
  • +
  • dev/assets/php/contact.php
  • +
+
+ +
+ +
+ +
+
+

v1.2.1 - 1 October 21

+
+
+
    +
  • Updated +

    Custom caret icons to fix a font-size issue caused by East Asian language setting on browsers Chrome and Edge.

    +
  • +
+ +
+
    +
  • src/assets/fonts/custom
  • +
  • src/assets/scss/_variables.scss
  • +
  • src/assets/scss/theme/_accordion.scss
  • +
  • src/assets/scss/theme/_blog.scss
  • +
  • src/assets/scss/theme/_buttons.scss
  • +
  • src/assets/scss/theme/_dropdown.scss
  • +
  • src/assets/scss/theme/_reboot.scss
  • +
  • src/assets/scss/theme/_type.scss
  • +
  • src/assets/scss/fonts/thicccboi.scss
  • +
  • dist/assets/fonts/custom
  • +
  • dist/assets/css/fonts
  • +
  • dist/assets/css/style.css
  • +
  • dev/assets/fonts/custom
  • +
  • dev/assets/css/fonts
  • +
  • dev/assets/css/style.css
  • +
+
+ +
+ +
+ +
+
+

v1.2.0 - 10 September 21

+
+
+
    +
  • Improved +

    Documentation is now part of the template under docs folder and more thorough with code snippets and extended information on file structure, build tools, components, credits, license and FAQ.

    +
  • +
  • Improved +

    File structure is updated and improved.

    +
  • +
  • Updated +

    Blocks to add Navbar, Footer and Hero blocks.

    +
  • +
  • Updated +

    Floating labels with latest Bootstrap floating labels.

    +
  • +
  • Changed +

    Existing contact form validation with Bootstrap validation.

    +
  • +
  • New +

    Descriptions for functions in theme.js

    +
  • +
  • New +

    Gradient options to text, background, buttons etc.

    +
  • +
  • New +

    Image mask option.

    +
  • +
  • New +

    Text highlight options.

    +
  • +
  • New +

    A product comparison table example.

    +
  • +
+
+ +
+ +
+
+

v1.1.2 - 6 August 21

+
+
+
    +
  • Updated +

    gulpfile.js - Gulp Unicode plugin is added to fix icon content unicode after sass compiling.

    +
  • +
+
+ +
+ +
+
+

v1.1.1 - 20 July 21

+
+
+
    +
  • Updated +

    gulp-sass to latest version (which no longer depends on node-sass).

    +
  • +
  • Changed +

    How color css files are being generated.

    +
  • +
+
+ +
+ +
+
+

v1.1.0 - 13 July 21

+
+
+
    +
  • New +

    gulp.js with some minor tweaks in template files.

    +
  • +
+
+ +
+ +
+
+

v1.0.2 - 23 June 21

+
+
+
    +
  • Fixed +

    Text wrap issue on navigation items on desktop view.

    +
  • +
  • New +

    Autoplay option to the slider on index15.html.

    +
  • +
+
+ +
+ +
+
+

v1.0.1 - 21 June 21

+
+
+
    +
  • Fixed +

    Scroll animations on Safari not firing immediately.

    +
  • +
+
+ +
+ +
+
+

v1.0.0 - 8 June 21

+
+
+
    +
  • Initial release.
  • +
+
+ +
+ +
+
+ +
+ +
+ +
+ +
+
+
+
+

Think unique and be creative. Make a difference with Sandbox.

+

Everything you need to create your next unique and professional website, including impressive and ready-made blocks and pages.

+ Buy Sandbox +
+ +
+ + +
+ +
+ +
+ + + +
+ + + + + \ No newline at end of file diff --git a/sandbox310/dev/docs/credits.html b/sandbox310/dev/docs/credits.html new file mode 100644 index 0000000..d8aa0c3 --- /dev/null +++ b/sandbox310/dev/docs/credits.html @@ -0,0 +1,941 @@ + + + + + + + + + + Sandbox - Modern & Multipurpose Bootstrap 5 Template + + + + + + +
+
+ + +
+ +
+
+
+
+

Credits

+

List of source links of JS, images, icons and illustrations used in Sandbox.

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

JS

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Plugin NameDescription
BootstrapThe most popular HTML, CSS, and JS library in the world.
PicturefillA responsive image polyfill.
HeadhesiveAn on-demand sticky header.
scrollCue.jsShow elements by scrolling.
SwiperThe most modern mobile touch slider.
rellax.jsA buttery smooth, super lightweight, vanilla javascript parallax library.
iTooltipTransform native tooltip’s into customizable overlays.
PlyrA simple, accessible and customisable media player.
GLightboxA touchable pure Javascript lightbox with mobile and video support.
IsotopeFilter & sort magical layouts.
Counter-Up2Count up to a targeted number when the number becomes visible.
WaypointsThe easiest way to trigger a function when you scroll to an element.
Progressbar.jsResponsive and slick progress bars with animated SVG paths.
clipboard.jsA modern approach to copy text to clipboard.
prism.jsLightweight, extensible syntax highlighter.
SVGInjectReplaces an img element with an inline SVG.
Typer.jsThe typing effect with a pure HTML interface.
smoothscroll.jsSmooth Scroll behavior polyfill.
ReplaceMe.jsLightweight text rotator written in vanilla JS.
Contact FormTutorial that was used to build the contact forms on the template.
+
+ +
+ +
+
+

Images

+
+
+

Pexels

+

To reach the collection of all images/videos from Pexels used in Sandbox, click here.

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

Rawpixel

+

To reach the collection of all images from Rawpixel used in Sandbox, click here.

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

Unsplash

+

To reach the collection of all images from Unsplash used in Sandbox, click here.

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

Pixeden

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

+ se3.jpg + se4.jpg + pd1.jpg + pd2.jpg + pd3.jpg + pd4.jpg + pd5.jpg + pd6.jpg + pp1.jpg + pp7.jpg + pp8.jpg + pp9.jpg + se1.jpg + se2.jpg + rp1.jpg + rp2.jpg + rp3.jpg + pd7.jpg + pd8.jpg + pd9.jpg + pd10.jpg + pd11.jpg + pd12.jpg +

+
+

Icons8

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

+ cs1.jpg + cs2.jpg + cs3.jpg + cs4.jpg + cs5.jpg + cs6.jpg + cs7.jpg + cs8.jpg + cs9.jpg + cs10.jpg + cs11.jpg + cs12.jpg +

+
+

Mockups

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

UI Graphics

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

Icons

+

To reach the collections of icons used in Sandbox, go to pages SVG Icons and Font Icons

+
+
+ + + + + + + + + + + + + + + + + + + + + +
Source NameDescription
Font IconsWeb’s new favorite icon library, Unicons.
SVG LinealMonochrome icons from Freepik.
SVG SolidTritone icons from Freepik.
+
+ +
+ +
+
+

Illustrations

+

To reach the collections of illustrations used in Sandbox, click here

+
+
+ + + + + + + + + + + + + +
Source NameDescription
FreepikGraphic resources for everyone.
+
+ +
+ +
+
+

Fonts

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Source NameDescription
ManropeOpen-source modern font family, designed by Mikhail Sharanda.
ThicccboiA free and open source font by Wonder Unit.
DM SerifA high-contrast transitional face, designed by Frank Grießhammer.
UrbanistA low-contrast, geometric sans-serif inspired by Modernist typography.
+
+ +
+ +
+
+ +
+ +
+ +
+ +
+
+
+
+

Think unique and be creative. Make a difference with Sandbox.

+

Everything you need to create your next unique and professional website, including impressive and ready-made blocks and pages.

+ Buy Sandbox +
+ +
+ + +
+ +
+ +
+ + + +
+ + + + + \ No newline at end of file diff --git a/sandbox310/dev/docs/elements/accordion.html b/sandbox310/dev/docs/elements/accordion.html new file mode 100644 index 0000000..9744630 --- /dev/null +++ b/sandbox310/dev/docs/elements/accordion.html @@ -0,0 +1,909 @@ + + + + + + + + + + Sandbox - Modern & Multipurpose Bootstrap 5 Template + + + + + + +
+
+ + +
+ +
+
+
+
+

Accordion

+

Use our custom accordion element to build vertically collapsing accordions. Bootstrap docs

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

Simple Accordion

+

Omit the data-bs-parent attribute on each .accordion-collapse to make accordion items stay open when another item is opened.

+

Add caret-simple class to accordion-wrapper to use the other caret option.

+
+
+
+
+
+ +
+ +
+
+

Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Praesent commodo cursus magna, vel.

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

Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Praesent commodo cursus magna, vel.

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

Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Praesent commodo cursus magna, vel.

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

Accordion with Background

+

Omit the data-bs-parent attribute on each .accordion-collapse to make accordion items stay open when another item is opened.

+

Add caret-simple class to accordion-wrapper to use the other caret option.

+
+
+
+
+
+ +
+ +
+
+

Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Cum sociis natoque penatibus et magnis dis parturient montes.

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

Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Cum sociis natoque penatibus et magnis dis parturient montes.

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

Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Cum sociis natoque penatibus et magnis dis parturient montes.

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

Accordion with Icon

+

Omit the data-bs-parent attribute on each .accordion-collapse to make accordion items stay open when another item is opened.

+
+
+
+
+
+ +
+ +
+
+

Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Praesent commodo cursus magna, vel.

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

Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Praesent commodo cursus magna, vel.

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

Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Praesent commodo cursus magna, vel.

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

Think unique and be creative. Make a difference with Sandbox.

+

Everything you need to create your next unique and professional website, including impressive and ready-made blocks and pages.

+ Buy Sandbox +
+ +
+ + +
+ +
+ +
+ + + +
+ + + + + \ No newline at end of file diff --git a/sandbox310/dev/docs/elements/alerts.html b/sandbox310/dev/docs/elements/alerts.html new file mode 100644 index 0000000..efc1ba4 --- /dev/null +++ b/sandbox310/dev/docs/elements/alerts.html @@ -0,0 +1,705 @@ + + + + + + + + + + Sandbox - Modern & Multipurpose Bootstrap 5 Template + + + + + + +
+
+ + +
+ +
+
+
+
+

Alerts

+

Use our custom alert styles to provide contextual feedback messages for typical user actions. Bootstrap docs

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

Simple

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

Dismissing

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

Think unique and be creative. Make a difference with Sandbox.

+

Everything you need to create your next unique and professional website, including impressive and ready-made blocks and pages.

+ Buy Sandbox +
+ +
+ + +
+ +
+ +
+ + + +
+ + + + + \ No newline at end of file diff --git a/sandbox310/dev/docs/elements/animations.html b/sandbox310/dev/docs/elements/animations.html new file mode 100644 index 0000000..1cfa20f --- /dev/null +++ b/sandbox310/dev/docs/elements/animations.html @@ -0,0 +1,851 @@ + + + + + + + + + + Sandbox - Modern & Multipurpose Bootstrap 5 Template + + + + + + +
+
+ + +
+ +
+
+
+
+

Animations

+

Add animations to elements to show them by scrolling. For further plugin documentation please visit scrollCue.js docs

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

Standard Example

+

Set the data-cue attribute in the target element and specify the animation type.

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

Parent Wrap

+

You can wrap it in a parent element by setting the data-cues attribute.

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

Group Wrap

+

You can group target elements by setting the data-group attribute. With grouping, when the first element is triggered, the remaining elements are also triggered sequentially, regardless of the scroll amount.

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

[data-duration]

+

You can set the showing time of the element. (ms)

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

[data-interval]

+

You can set the showing interval time of the element. (ms)

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

[data-delay]

+

You can set the showing delay time of the element. (ms)

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

Think unique and be creative. Make a difference with Sandbox.

+

Everything you need to create your next unique and professional website, including impressive and ready-made blocks and pages.

+ Buy Sandbox +
+ +
+ + +
+ +
+ +
+ + + +
+ + + + + + \ No newline at end of file diff --git a/sandbox310/dev/docs/elements/avatars.html b/sandbox310/dev/docs/elements/avatars.html new file mode 100644 index 0000000..50667b1 --- /dev/null +++ b/sandbox310/dev/docs/elements/avatars.html @@ -0,0 +1,635 @@ + + + + + + + + + + Sandbox - Modern & Multipurpose Bootstrap 5 Template + + + + + + +
+
+ + +
+ +
+
+
+
+

Avatars

+

Use our custom avatar styles on your profile images or initials.

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

Letters

+

Use any size between .w-1 / .h-1 and .w-25 / .h-25 to change the avatar size.

+
+
+ TC + AH + CH +
+ + + + + +
+ +
+
+

Image

+

Use any size between .w-1 and .w-25 to change the image size. Image height will change automatically. Make sure to use images with 1:1 ratio to avoid stretching.

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

Think unique and be creative. Make a difference with Sandbox.

+

Everything you need to create your next unique and professional website, including impressive and ready-made blocks and pages.

+ Buy Sandbox +
+ +
+ + +
+ +
+ +
+ + + +
+ + + + + \ No newline at end of file diff --git a/sandbox310/dev/docs/elements/background.html b/sandbox310/dev/docs/elements/background.html new file mode 100644 index 0000000..f3c4461 --- /dev/null +++ b/sandbox310/dev/docs/elements/background.html @@ -0,0 +1,861 @@ + + + + + + + + + + Sandbox - Modern & Multipurpose Bootstrap 5 Template + + + + + + +
+
+ + +
+ +
+
+
+
+

Background

+

Use our custom background styles to add image, color, pattern or video backgrounds to your sections.

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

Image Background

+
+
+
+
+

Content goes here

+
+ +
+ +

.image-wrapper class enables background-attachment: fixed; to disable image from scrolling with the page; along with background-size: cover; which scales the image as large as possible to fill the container. You can use the following classes along with .image-wrapper to change these behaviors:

+
    +
  • .bg-auto Disables fixed background, changes background-size to auto.
  • +
  • .bg-full Disables fixed background, changes background-size to 100%.
  • +
  • .bg-cover Disables fixed background, but keeps background-size as cover.
  • +
+

To add overlay on the background images use .bg-overlay class:

+
    +
  • .bg-overlay Adds 50% overlay.
  • +
  • .bg-overlay.bg-overlay-300 Adds 30% overlay.
  • +
  • .bg-overlay.bg-overlay-400 Adds 40% overlay.
  • +
+
+ + + + + +
+ +
+
+

Dark Background

+
+
+
+
+

Content goes here

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

Gradient Background

+

Available options:

+

.gradient-1, .gradient-2, .gradient-3, .gradient-4, .gradient-5, .gradient-6, .gradient-7,

+

bg-gradient-primary, bg-gradient-aqua, bg-gradient-green, bg-gradient-leaf, bg-gradient-navy, bg-gradient-orange, bg-gradient-pink, bg-gradient-purple, bg-gradient-red, bg-gradient-violet, bg-gradient-yellow, bg-gradient-fuchsia, bg-gradient-sky, bg-gradient-grape, bg-gradient-reverse-primary, bg-gradient-reverse-aqua, bg-gradient-reverse-green, bg-gradient-reverse-leaf, bg-gradient-reverse-navy, bg-gradient-reverse-orange, bg-gradient-reverse-pink, bg-gradient-reverse-purple, bg-gradient-reverse-red, bg-gradient-reverse-violet, bg-gradient-reverse-yellow, bg-gradient-reverse-fuchsia, bg-gradient-reverse-sky, bg-gradient-reverse-grape.

+
+
+
+
+

Content goes here

+
+ +
+ +
+
+

Content goes here

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

Color Background

+

Available options:

+

bg-white, bg-primary, bg-aqua, bg-green, bg-leaf, bg-navy, bg-orange, bg-pink, bg-purple, bg-red, bg-violet, bg-yellow, bg-fuchsia, bg-sky, bg-grape.

+
+
+
+
+

Content goes here

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

Soft Background

+

Available options:

+

bg-soft-primary, bg-soft-aqua, bg-soft-green, bg-soft-leaf, bg-soft-navy, bg-soft-orange, bg-soft-pink, bg-soft-purple, bg-soft-red, bg-soft-violet, bg-soft-yellow, bg-soft-fuchsia, bg-soft-sky, bg-soft-grape.

+
+
+
+
+

Content goes here

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

Pale Background

+

Available options:

+

bg-pale-primary, bg-pale-aqua, bg-pale-green, bg-pale-leaf, bg-pale-navy, bg-pale-orange, bg-pale-pink, bg-pale-purple, bg-pale-red, bg-pale-violet, bg-pale-yellow, bg-pale-fuchsia, bg-pale-sky, bg-pale-grape.

+
+
+
+
+

Content goes here

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

Pattern Background

+
+
+
+
+

Content goes here

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

Video Background

+
+
+
+ +
+
+

Content goes here

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

Think unique and be creative. Make a difference with Sandbox.

+

Everything you need to create your next unique and professional website, including impressive and ready-made blocks and pages.

+ Buy Sandbox +
+ +
+ + +
+ +
+ +
+ + + +
+ + + + + \ No newline at end of file diff --git a/sandbox310/dev/docs/elements/badges.html b/sandbox310/dev/docs/elements/badges.html new file mode 100644 index 0000000..0ec1cab --- /dev/null +++ b/sandbox310/dev/docs/elements/badges.html @@ -0,0 +1,720 @@ + + + + + + + + + + Sandbox - Modern & Multipurpose Bootstrap 5 Template + + + + + + +
+
+ + +
+ +
+
+
+
+

Badges

+

Use our custom badge styles to add a label compontent on your website. Bootstrap docs

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

Colors

+
+
+ Badge + Badge + Badge + Badge + Badge + Badge + Badge + Badge + Badge + Badge + Badge + Badge + Badge + Badge + Badge +
+ Badge + Badge + Badge + Badge + Badge + Badge + Badge + Badge + Badge + Badge + Badge + Badge + Badge + Badge + Badge +
+ + + + + +
+ +
+
+

Gradients

+
+
+ Badge + Badge + Badge + Badge + Badge + Badge + Badge +
+ + + + + +
+ +
+
+

Shapes

+
+
+ Square + Rounded + Pill +
+ + + + + +
+ +
+
+ +
+ +
+ +
+ +
+
+
+
+

Think unique and be creative. Make a difference with Sandbox.

+

Everything you need to create your next unique and professional website, including impressive and ready-made blocks and pages.

+ Buy Sandbox +
+ +
+ + +
+ +
+ +
+ + + +
+ + + + + \ No newline at end of file diff --git a/sandbox310/dev/docs/elements/breadcrumb.html b/sandbox310/dev/docs/elements/breadcrumb.html new file mode 100644 index 0000000..1d907ee --- /dev/null +++ b/sandbox310/dev/docs/elements/breadcrumb.html @@ -0,0 +1,628 @@ + + + + + + + + + + Sandbox - Modern & Multipurpose Bootstrap 5 Template + + + + + + +
+
+ + +
+ +
+
+
+
+

Breadcrumb

+

Indicate the current page’s location within a navigational hierarchy that automatically adds separators via CSS. Bootstrap docs

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

Examples

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

Think unique and be creative. Make a difference with Sandbox.

+

Everything you need to create your next unique and professional website, including impressive and ready-made blocks and pages.

+ Buy Sandbox +
+ +
+ + +
+ +
+ +
+ + + +
+ + + + + \ No newline at end of file diff --git a/sandbox310/dev/docs/elements/buttons.html b/sandbox310/dev/docs/elements/buttons.html new file mode 100644 index 0000000..40f4e21 --- /dev/null +++ b/sandbox310/dev/docs/elements/buttons.html @@ -0,0 +1,1030 @@ + + + + + + + + + + Sandbox - Modern & Multipurpose Bootstrap 5 Template + + + + + + +
+
+ + +
+ +
+
+
+
+

Buttons

+

Use our custom button styles for actions in forms, dialogs, with support for multiple sizes, states, etc. Bootstrap docs

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

Colors

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

Gradients

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

Sizes

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

Shapes

+
+
+ Square + Rounded + Pill +
+ + + + + +
+ +
+ +
+

Style

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

Circle

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

Social

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

Icon

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

Expand

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

Play

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

Think unique and be creative. Make a difference with Sandbox.

+

Everything you need to create your next unique and professional website, including impressive and ready-made blocks and pages.

+ Buy Sandbox +
+ +
+ + +
+ +
+ +
+ + + +
+ + + + + \ No newline at end of file diff --git a/sandbox310/dev/docs/elements/card.html b/sandbox310/dev/docs/elements/card.html new file mode 100644 index 0000000..3402fbc --- /dev/null +++ b/sandbox310/dev/docs/elements/card.html @@ -0,0 +1,879 @@ + + + + + + + + + + Sandbox - Modern & Multipurpose Bootstrap 5 Template + + + + + + +
+
+ + +
+ +
+
+
+
+

Card

+

Cards provide a flexible and extensible content container with multiple variants and options. For further instructions on Bootstrap cards please visit Bootstrap docs

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

Basic

+
+
+
+
+
+
+
Default
+

Etiam porta sem malesuada magna mollis euismod. Maecenas sed diam eget risus varius blandit sit amet non magna. Vivamus sagittis lacus augue.

+
+ +
+ +
+ +
+
+
+
Shadow
+

Etiam porta sem malesuada magna mollis euismod. Maecenas sed diam eget risus varius blandit sit amet non magna. Vivamus sagittis lacus augue.

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

Color

+
+
+
+
+
+
+
Solid
+

Sed posuere consectetur est at lobortis. Duis mollis, commodo luctus.

+
+ +
+ +
+ +
+
+
+
Pale
+

Sed posuere consectetur est at lobortis. Duis mollis, commodo luctus.

+
+ +
+ +
+ +
+
+
+
Soft
+

Sed posuere consectetur est at lobortis. Duis mollis, commodo luctus.

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

Border

+

Available options:

+

border-primary, border-aqua, border-green, border-leaf, border-navy, border-orange, border-pink, border-purple, border-red, border-violet, border-yellow, border-fuchsia, border-sky, border-grape, border-soft-primary, border-soft-aqua, border-soft-green, border-soft-leaf, border-soft-navy, border-soft-orange, border-soft-pink, border-soft-purple, border-soft-red, border-soft-violet, border-soft-yellow, border-soft-fuchsia, border-soft-sky, border-soft-grape.

+
+
+
+
+
+
+
Start
+

Sed posuere consectetur est at lobortis. Duis mollis, commodo luctus, nisi erat porttitor ligula, eget lacinia.

+
+ +
+ +
+ +
+
+
+
Top
+

Sed posuere consectetur est at lobortis. Duis mollis, commodo luctus, nisi erat porttitor ligula, eget lacinia.

+
+ +
+ +
+ +
+
+
+
Bottom
+

Sed posuere consectetur est at lobortis. Duis mollis, commodo luctus, nisi erat porttitor ligula, eget lacinia.

+
+ +
+ +
+ +
+
+
+
End
+

Sed posuere consectetur est at lobortis. Duis mollis, commodo luctus, nisi erat porttitor ligula, eget lacinia.

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

Image

+
+
+
+
+
+ +
+
Image Cap Top
+

Etiam porta sem malesuada magna mollis euismod. Maecenas sed diam eget risus varius blandit sit amet non magna. Vivamus sagittis lacus augue.

+
+ +
+ +
+ +
+
+
+
Image Cap Bottom
+

Etiam porta sem malesuada magna mollis euismod. Maecenas sed diam eget risus varius blandit sit amet non magna. Vivamus sagittis lacus augue.

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

Think unique and be creative. Make a difference with Sandbox.

+

Everything you need to create your next unique and professional website, including impressive and ready-made blocks and pages.

+ Buy Sandbox +
+ +
+ + +
+ +
+ +
+ + + +
+ + + + + \ No newline at end of file diff --git a/sandbox310/dev/docs/elements/carousel.html b/sandbox310/dev/docs/elements/carousel.html new file mode 100644 index 0000000..4b0e4a3 --- /dev/null +++ b/sandbox310/dev/docs/elements/carousel.html @@ -0,0 +1,1251 @@ + + + + + + + + + + Sandbox - Modern & Multipurpose Bootstrap 5 Template + + + + + + +
+
+ + +
+ +
+
+
+
+

Carousel

+

Here you can find simple carousel examples and usage instructions. For further carousel documentation please visit Swiper docs

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

Simple Carousel

+
+
+
+
+
+
+
+
+
Read More
+
+
+
+ +
+
+
+
Read More
+
+
+
+ +
+
+
+
Read More
+
+
+
+ +
+
+
+
Read More
+
+
+
+ +
+
+
+
Read More
+
+
+
+ +
+ +
+ +
+ +
+ + + + + +
+ +
+
+

Card Carousel

+
+
+
+
+
+
+
+
+
+
+

Duis mollis est non commodo luctu, nisi erat porttitor ligula, eget lacinia odio sem nec elit. Nullam quis risus eget urna mollis ornare vel. Nulla vitae elit libero, a pharetra augue. Praesent commodo cursus magna vel scelerisque nisl consectetur et.

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

Duis mollis est non commodo luctu, nisi erat porttitor ligula, eget lacinia odio sem nec elit. Nullam quis risus eget urna mollis ornare vel. Nulla vitae elit libero, a pharetra augue. Praesent commodo cursus magna vel scelerisque nisl consectetur et.

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

Duis mollis est non commodo luctu, nisi erat porttitor ligula, eget lacinia odio sem nec elit. Nullam quis risus eget urna mollis ornare vel. Nulla vitae elit libero, a pharetra augue. Praesent commodo cursus magna vel scelerisque nisl consectetur et.

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

Duis mollis est non commodo luctu, nisi erat porttitor ligula, eget lacinia odio sem nec elit. Nullam quis risus eget urna mollis ornare vel. Nulla vitae elit libero, a pharetra augue. Praesent commodo cursus magna vel scelerisque nisl consectetur et.

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

Text Slider

+
+
+
+
+
+
+

Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Cras mattis consectetur purus sit amet fermentum. Maecenas faucibus mollis interdum.

+
+ +
+

Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Cras mattis consectetur purus sit amet fermentum. Maecenas faucibus mollis interdum.

+
+ +
+

Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Cras mattis consectetur purus sit amet fermentum. Maecenas faucibus mollis interdum.

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

Image Slider

+

Remove .dots-over class to move bullets below the images.

+

Use any available .m-*, .p-*, .bg-* and .text-* helper class to style and place the captions. You can change their placement with the help of flex classes as well.

+

Use animate.css animation and utility classes to add animations and delays to captions.

+

For hero slider (slider with fixed height and background cover images) with captions example check out Demo 15

+
+
+
+
+
+
+ +
+
+
Vivamus sagittis lacus augue
+
+ +
+ +
+ +
+ +
+
+
Vivamus sagittis lacus augue
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+ + + + + +
+ +
+
+

Thumbnail Slider

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

Instructions

+
+
+

Data Attributes

+

Specifically created for the template to be used on HTML. Apply any attribute to .swiper-container to set swiper options.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AttributeDefaultOptionsDescription
data-effectslideslide | fadeSlide transition effect.
data-items3numberNumber of items per view in all devices.
data-items-xs1numberNumber of items on screen width 0 - 575px
data-items-smitems-xsnumberNumber of items on screen width 576px - 767px
data-items-mditems-smnumberNumber of items on screen width 768px - 991px
data-items-lgitems-mdnumberNumber of items on screen width 992px - 1199px
data-items-xlitems-lgnumberNumber of items on screen width 1200px - 1400px
data-items-xxlitems-xlnumberNumber of items on screen width 1400px and above
data-speed500numberDuration of transition between slides (in ms).
data-autoplayfalsetrue | falseEnable/disable autoplay.
data-autoplaytime5000number +

Delay between transitions (in ms).

+

If you need to specify different delay for specific slides you can do it by using data-swiper-autoplay (in ms) attribute on slide.

+
data-autoheightfalsetrue | falseSet to true and slider wrapper will adapt its height to the height of the currently active slide.
data-margin30numberDistance between slides in px.
data-loopfalsetrue | falseSet to true to enable continuous loop mode.
data-navfalsetrue | falseEnable/disable navigation arrows.
data-dotsfalsetrue | falseEnable/disable pagination bullets.
+

Alternative styles for controls

+

Use the following classes with .swiper-container to change navigation styles.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ClassDescription
.swiper-heroEnables hero slider. Example: Demo 15
.nav-darkChanges arrow background to primary color.
.nav-bottomMoves arrows below the slider.
.nav-startMoves arrows from center to left. To be used with .nav-bottom.
.dots-lightChanges bullet colors to white.
.dots-startMoves bullets from center to left.
.dots-overMoves bullets on the slider.
.dots-closerMoves bullets closer below the slider.
+

Full examples

+ Blog Blocks, Testimonials Blocks, Portfolio Blocks, Client Blocks

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

Think unique and be creative. Make a difference with Sandbox.

+

Everything you need to create your next unique and professional website, including impressive and ready-made blocks and pages.

+ Buy Sandbox +
+ +
+ + +
+ +
+ +
+ + + +
+ + + + + \ No newline at end of file diff --git a/sandbox310/dev/docs/elements/dividers.html b/sandbox310/dev/docs/elements/dividers.html new file mode 100644 index 0000000..5473dab --- /dev/null +++ b/sandbox310/dev/docs/elements/dividers.html @@ -0,0 +1,771 @@ + + + + + + + + + + Sandbox - Modern & Multipurpose Bootstrap 5 Template + + + + + + +
+
+ + +
+ +
+
+
+
+

Dividers

+

Use our custom dividers to divide sections or elements.

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

Borders

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

Angles

+
+
+
Lower Start
+
Lower End
+
Upper Start
+
Upper End
+
Upper End & Lower Start
+
Upper Start & Lower End
+
Upper Start & Lower Start
+
Upper End & Lower End
+
+ + + + + +
+ +
+
+

Waves

+
+
+
+
+

Wave 1

+
+
+
+ +
+
+
+ +
+
+

Wave 2

+
+
+
+ +
+
+
+ +
+
+

Wave 3

+
+
+
+ +
+
+
+ +
+
+

Wave 4

+
+
+
+ +
+
+
+ +
+
+

Wave 5

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

Think unique and be creative. Make a difference with Sandbox.

+

Everything you need to create your next unique and professional website, including impressive and ready-made blocks and pages.

+ Buy Sandbox +
+ +
+ + +
+ +
+ +
+ + + +
+ + + + + \ No newline at end of file diff --git a/sandbox310/dev/docs/elements/form-elements.html b/sandbox310/dev/docs/elements/form-elements.html new file mode 100644 index 0000000..f29a5d7 --- /dev/null +++ b/sandbox310/dev/docs/elements/form-elements.html @@ -0,0 +1,787 @@ + + + + + + + + + + Sandbox - Modern & Multipurpose Bootstrap 5 Template + + + + + + +
+
+ + +
+ +
+
+
+
+

Form Elements

+

Some examples for form control styles. For more detailed examples and guidelines please visit Bootstrap docs

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

Input

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

Textarea

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

Checks

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

Radios

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

Disabled

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

Select

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

Think unique and be creative. Make a difference with Sandbox.

+

Everything you need to create your next unique and professional website, including impressive and ready-made blocks and pages.

+ Buy Sandbox +
+ +
+ + +
+ +
+ +
+ + + +
+ + + + + \ No newline at end of file diff --git a/sandbox310/dev/docs/elements/image-hover.html b/sandbox310/dev/docs/elements/image-hover.html new file mode 100644 index 0000000..73ed4b0 --- /dev/null +++ b/sandbox310/dev/docs/elements/image-hover.html @@ -0,0 +1,862 @@ + + + + + + + + + + Sandbox - Modern & Multipurpose Bootstrap 5 Template + + + + + + +
+
+ + +
+ +
+
+
+
+

Image Hover

+

Use our custom hover styles to add hover state to your images and elements.

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

Tooltip

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

Overlay

+
+
+
+
+
+
+
Some Title
+
+
+
+ +
+
+
+
Some Title
+

Some Description

+
+
+
+ +
+
+
+
Some Title
+

Some Description

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

Simple

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

Cursor

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

Think unique and be creative. Make a difference with Sandbox.

+

Everything you need to create your next unique and professional website, including impressive and ready-made blocks and pages.

+ Buy Sandbox +
+ +
+ + +
+ +
+ +
+ + + +
+ + + + + \ No newline at end of file diff --git a/sandbox310/dev/docs/elements/image-mask.html b/sandbox310/dev/docs/elements/image-mask.html new file mode 100644 index 0000000..21918c2 --- /dev/null +++ b/sandbox310/dev/docs/elements/image-mask.html @@ -0,0 +1,627 @@ + + + + + + + + + + Sandbox - Modern & Multipurpose Bootstrap 5 Template + + + + + + +
+
+ + +
+ +
+
+
+
+

Image Mask

+

Apply custom SVG shapes to your images.

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

Mask 1

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

Mask 2

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

Think unique and be creative. Make a difference with Sandbox.

+

Everything you need to create your next unique and professional website, including impressive and ready-made blocks and pages.

+ Buy Sandbox +
+ +
+ + +
+ +
+ +
+ + + +
+ + + + + \ No newline at end of file diff --git a/sandbox310/dev/docs/elements/lightbox.html b/sandbox310/dev/docs/elements/lightbox.html new file mode 100644 index 0000000..50ec36c --- /dev/null +++ b/sandbox310/dev/docs/elements/lightbox.html @@ -0,0 +1,705 @@ + + + + + + + + + + Sandbox - Modern & Multipurpose Bootstrap 5 Template + + + + + + +
+
+ + +
+ +
+
+
+
+

Lightbox

+

Examples and instructions on how to add lightbox functionality to your image or video links.

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

Instructions

+
+
+

Use data-glightbox attribute to enable lightbox functionality on your image and video links.

+

To group images together, use data-gallery="group-name" attribute. This will enable navigation between images that have the same attribute value.

+
+ +
+ +
+
+

Image & Caption

+
+
+
+
+
+ +
+
Image
+
+
+
+ +
+
+ +
+
Simple Caption
+
+
+
+ +
+
+ +
+
Advanced Caption
+
+
+
+

This div will be used as the image description. HTML is supported.

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

Video

+
+
+
+
+
+ +
+
Vimeo
+
+
+
+ +
+
+ +
+
YouTube
+
+
+
+ +
+
+ +
+
HTML5
+
+
+
+ +
+ +
+ + + + + +
+ +
+
+ +
+ +
+ +
+ +
+
+
+
+

Think unique and be creative. Make a difference with Sandbox.

+

Everything you need to create your next unique and professional website, including impressive and ready-made blocks and pages.

+ Buy Sandbox +
+ +
+ + +
+ +
+ +
+ + + +
+ + + + + \ No newline at end of file diff --git a/sandbox310/dev/docs/elements/modal.html b/sandbox310/dev/docs/elements/modal.html new file mode 100644 index 0000000..812fbff --- /dev/null +++ b/sandbox310/dev/docs/elements/modal.html @@ -0,0 +1,1007 @@ + + + + + + + + + + Sandbox - Modern & Multipurpose Bootstrap 5 Template + + + + + + +
+
+ + +
+ +
+
+
+
+

Modal

+

Use Bootstrap’s modal plugin with our custom styles to add dialogs to your site for notifications or completely custom content. Bootstrap docs

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

Cookie

+
+
+ Cookie + + +
+ + + + + +
+ +
+
+

Subscription

+
+
+ Subscription + + +
+ + + + + +
+ +
+
+

Sign In

+
+
+ Sign In + + + + +
+ + + + + +
+ +
+
+

Sign Up

+
+
+ Sign Up +
+ + + + + +
+ +
+
+

Popup

+

To display any modal as a popup on your page, add .modal-popup class to your .modal.

+

Check out a live example: Demo 12.

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

Think unique and be creative. Make a difference with Sandbox.

+

Everything you need to create your next unique and professional website, including impressive and ready-made blocks and pages.

+ Buy Sandbox +
+ +
+ + +
+ +
+ +
+ + + +
+ + + + + \ No newline at end of file diff --git a/sandbox310/dev/docs/elements/player.html b/sandbox310/dev/docs/elements/player.html new file mode 100644 index 0000000..cbc4411 --- /dev/null +++ b/sandbox310/dev/docs/elements/player.html @@ -0,0 +1,675 @@ + + + + + + + + + + Sandbox - Modern & Multipurpose Bootstrap 5 Template + + + + + + +
+
+ + +
+ +
+
+
+
+

Media Player

+

Examples on how to add videos with the included responsive media player. For further instructions on the plugin please visit Plyr docs

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

HTML5 Video - plyr

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

Vimeo - plyr

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

YouTube - plyr

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

Responsive Embed

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

Think unique and be creative. Make a difference with Sandbox.

+

Everything you need to create your next unique and professional website, including impressive and ready-made blocks and pages.

+ Buy Sandbox +
+ +
+ + +
+ +
+ +
+ + + +
+ + + + + \ No newline at end of file diff --git a/sandbox310/dev/docs/elements/progressbar.html b/sandbox310/dev/docs/elements/progressbar.html new file mode 100644 index 0000000..8eab3ea --- /dev/null +++ b/sandbox310/dev/docs/elements/progressbar.html @@ -0,0 +1,704 @@ + + + + + + + + + + Sandbox - Modern & Multipurpose Bootstrap 5 Template + + + + + + +
+
+ + +
+ +
+
+
+
+

Progressbar

+

Examples and instructions on how to add colorful progressbars on your website.

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

Line

+

Available color options:

+

primary, aqua, green, leaf, navy, orange, pink, purple, red, violet, yellow, fuchsia, sky, grape, soft-primary, soft-aqua, soft-green, soft-leaf, soft-navy, soft-orange, soft-pink, soft-purple, soft-red, soft-violet, soft-yellow, soft-fuchsia, soft-sky, soft-grape

+
+
+
+
+
    +
  • +

    Marketing

    +
    +
  • +
  • +

    Strategy

    +
    +
  • +
  • +

    Development

    +
    +
  • +
  • +

    Stabilization

    +
    +
  • +
+ +
    +
  • +

    Marketing

    +
    +
  • +
  • +

    Strategy

    +
    +
  • +
  • +

    Development

    +
    +
  • +
  • +

    Stabilization

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

Semi Circle

+

Available color options:

+

primary, aqua, green, leaf, navy, orange, pink, purple, red, violet, yellow, fuchsia, sky, grape, soft-primary, soft-aqua, soft-green, soft-leaf, soft-navy, soft-orange, soft-pink, soft-purple, soft-red, soft-violet, soft-yellow, soft-fuchsia, soft-sky, soft-grape

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

Think unique and be creative. Make a difference with Sandbox.

+

Everything you need to create your next unique and professional website, including impressive and ready-made blocks and pages.

+ Buy Sandbox +
+ +
+ + +
+ +
+ +
+ + + +
+ + + + + \ No newline at end of file diff --git a/sandbox310/dev/docs/elements/shadows.html b/sandbox310/dev/docs/elements/shadows.html new file mode 100644 index 0000000..cb07314 --- /dev/null +++ b/sandbox310/dev/docs/elements/shadows.html @@ -0,0 +1,584 @@ + + + + + + + + + + Sandbox - Modern & Multipurpose Bootstrap 5 Template + + + + + + +
+
+ + +
+ +
+
+
+
+

Shadows

+

Add or remove shadows to elements with box-shadow utilities. Bootstrap docs

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

Examples

+
+
+
No shadow
+
Small shadow
+
Regular shadow
+
Larger shadow
+
+ + + + + +
+ +
+
+ +
+ +
+ +
+ +
+
+
+
+

Think unique and be creative. Make a difference with Sandbox.

+

Everything you need to create your next unique and professional website, including impressive and ready-made blocks and pages.

+ Buy Sandbox +
+ +
+ + +
+ +
+ +
+ + + +
+ + + + + \ No newline at end of file diff --git a/sandbox310/dev/docs/elements/shapes.html b/sandbox310/dev/docs/elements/shapes.html new file mode 100644 index 0000000..ff36d60 --- /dev/null +++ b/sandbox310/dev/docs/elements/shapes.html @@ -0,0 +1,857 @@ + + + + + + + + + + Sandbox - Modern & Multipurpose Bootstrap 5 Template + + + + + + +
+
+ + +
+ +
+
+
+
+

Shapes

+

Use our custom shapes to add on your pages.

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

Dot

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

Line

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

Solid

+

All background color options (solid, soft, pale) are available to use.

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

SVG

+

Available color options:

+

primary, aqua, green, leaf, navy, orange, pink, purple, red, violet, yellow, fuchsia, sky, grape, pale-primary, pale-aqua, pale-green, pale-leaf, pale-navy, pale-orange, pale-pink, pale-purple, pale-red, pale-violet, pale-yellow, pale-fuchsia, pale-sky, pale-grape, soft-primary, soft-aqua, soft-green, soft-leaf, soft-navy, soft-orange, soft-pink, soft-purple, soft-red, soft-violet, soft-yellow, soft-fuchsia, soft-sky, soft-grape.

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

Think unique and be creative. Make a difference with Sandbox.

+

Everything you need to create your next unique and professional website, including impressive and ready-made blocks and pages.

+ Buy Sandbox +
+ +
+ + +
+ +
+ +
+ + + +
+ + + + + \ No newline at end of file diff --git a/sandbox310/dev/docs/elements/tables.html b/sandbox310/dev/docs/elements/tables.html new file mode 100644 index 0000000..99327b6 --- /dev/null +++ b/sandbox310/dev/docs/elements/tables.html @@ -0,0 +1,980 @@ + + + + + + + + + + Sandbox - Modern & Multipurpose Bootstrap 5 Template + + + + + + +
+
+ + +
+ +
+
+
+
+

Tables

+

Some examples for displaying tables. For more detailed examples and guidelines please visit Bootstrap docs

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

Simple

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
#FirstLastHandle
1MarkOtto@mdo
2JacobThornton@fat
3Larry the Bird@twitter
+
+ + + + + +
+ +
+
+

Simple Dark

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
#FirstLastHandle
1MarkOtto@mdo
2JacobThornton@fat
3Larry the Bird@twitter
+
+ + + + + +
+ +
+
+

Striped

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
#FirstLastHandle
1MarkOtto@mdo
2JacobThornton@fat
3Larry the Bird@twitter
+
+ + + + + +
+ +
+
+

Bordered

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
#FirstLastHandle
1MarkOtto@mdo
2JacobThornton@fat
3Larry the Bird@twitter
+
+ + + + + +
+ +
+
+

Borderless

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
#FirstLastHandle
1MarkOtto@mdo
2JacobThornton@fat
3Larry the Bird@twitter
+
+ + + + + +
+ +
+
+

Hoverable Rows

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
#FirstLastHandle
1MarkOtto@mdo
2JacobThornton@fat
3Larry the Bird@twitter
+
+ + + + + +
+ +
+
+

Responsive

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
#FirstLastHandle
1MarkOtto@mdo
2JacobThornton@fat
3Larry the Bird@twitter
+
+
+ + + + + +
+ +
+
+ +
+ +
+ +
+ +
+
+
+
+

Think unique and be creative. Make a difference with Sandbox.

+

Everything you need to create your next unique and professional website, including impressive and ready-made blocks and pages.

+ Buy Sandbox +
+ +
+ + +
+ +
+ +
+ + + +
+ + + + + \ No newline at end of file diff --git a/sandbox310/dev/docs/elements/tabs.html b/sandbox310/dev/docs/elements/tabs.html new file mode 100644 index 0000000..906ddf2 --- /dev/null +++ b/sandbox310/dev/docs/elements/tabs.html @@ -0,0 +1,815 @@ + + + + + + + + + + Sandbox - Modern & Multipurpose Bootstrap 5 Template + + + + + + +
+
+ + +
+ +
+
+
+
+

Tabs

+

Use our custom tabs to add tabbed interfaces on your website. Bootstrap docs

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

Basic

+
+
+ + +
+
+

Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Vestibulum id ligula porta felis euismod semper. Lorem ipsum dolor sit amet, consectetur adipiscing elit.

+

Donec sed odio dui. Donec sed odio dui. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Maecenas faucibus mollis interdum.

+
    +
  • Aenean eu leo quam. Pellentesque ornare.
  • +
  • Nullam quis risus eget urna mollis ornare.
  • +
  • Donec id elit non mi porta gravida at eget.
  • +
  • Fusce dapibus, tellus ac cursus commodo.
  • +
+
+ +
+

Sed posuere consectetur est at lobortis. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Maecenas faucibus mollis interdum. Maecenas faucibus mollis interdum. Sed posuere consectetur est at lobortis. Vestibulum id ligula porta felis euismod.

+

Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor vel scelerisque nisl.

+

Maecenas faucibus mollis interdum. Sed posuere consectetur est at lobortis. Maecenas sed diam eget risus varius blandit sit amet non magna. Donec id elit non mi porta gravida at eget metus. Curabitur blandit tempus porttitor. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus.

+
+ +
+

Vestibulum id ligula porta felis euismod semper. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus.

+

Morbi leo risus, porta ac consectetur ac, vestibulum at eros. Nullam id dolor id nibh ultricies vehicula ut id elit. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Maecenas sed diam eget risus varius blandit sit amet non magna.

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

Pills

+
+
+ + +
+
+

Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Vestibulum id ligula porta felis euismod semper. Lorem ipsum dolor sit amet, consectetur adipiscing elit.

+

Donec sed odio dui. Donec sed odio dui. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Maecenas faucibus mollis interdum.

+
    +
  • Aenean eu leo quam. Pellentesque ornare.
  • +
  • Nullam quis risus eget urna mollis ornare.
  • +
  • Donec id elit non mi porta gravida at eget.
  • +
  • Fusce dapibus, tellus ac cursus commodo.
  • +
+
+ +
+

Sed posuere consectetur est at lobortis. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Maecenas faucibus mollis interdum. Maecenas faucibus mollis interdum. Sed posuere consectetur est at lobortis. Vestibulum id ligula porta felis euismod.

+

Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor vel scelerisque nisl.

+

Maecenas faucibus mollis interdum. Sed posuere consectetur est at lobortis. Maecenas sed diam eget risus varius blandit sit amet non magna. Donec id elit non mi porta gravida at eget metus. Curabitur blandit tempus porttitor. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus.

+
+ +
+

Vestibulum id ligula porta felis euismod semper. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus.

+

Morbi leo risus, porta ac consectetur ac, vestibulum at eros. Nullam id dolor id nibh ultricies vehicula ut id elit. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Maecenas sed diam eget risus varius blandit sit amet non magna.

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

Justified

+

Check out a live example: Demo 9.

+
+
+ + +
+
+

Etiam porta sem malesuada magna mollis euismod. Donec ullamcorper nulla non metus auctor fringilla. Morbi leo risus, porta ac consectetur ac, vestibulum at eros. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam quis risus eget urna. Curabitur blandit tempus porttitor. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Maecenas faucibus mollis interdum. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum.

+
+ +
+

Etiam porta sem malesuada magna mollis euismod. Donec ullamcorper nulla non metus auctor fringilla. Morbi leo risus, porta ac consectetur ac, vestibulum at eros. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam quis risus eget urna. Curabitur blandit tempus porttitor. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Maecenas faucibus mollis interdum. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum.

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

Think unique and be creative. Make a difference with Sandbox.

+

Everything you need to create your next unique and professional website, including impressive and ready-made blocks and pages.

+ Buy Sandbox +
+ +
+ + +
+ +
+ +
+ + + +
+ + + + + \ No newline at end of file diff --git a/sandbox310/dev/docs/elements/text-animations.html b/sandbox310/dev/docs/elements/text-animations.html new file mode 100644 index 0000000..83f0101 --- /dev/null +++ b/sandbox310/dev/docs/elements/text-animations.html @@ -0,0 +1,668 @@ + + + + + + + + + + Sandbox - Modern & Multipurpose Bootstrap 5 Template + + + + + + +
+
+ + +
+ +
+
+
+
+

Text Animations

+

Add animations to text easily with pure HTML interface. For further plugin documentation please visit Typer.js docs or ReplaceMe.js docs

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

Typer

+
+
+
+
+

Sandbox is effortless and powerful with

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

Typer with Loop

+
+
+
+
+

Sandbox focuses on

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

Rotator

+
+
+
+
+

Sandbox is effortless and powerful with easy usage,fast transactions,secure payments

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

Think unique and be creative. Make a difference with Sandbox.

+

Everything you need to create your next unique and professional website, including impressive and ready-made blocks and pages.

+ Buy Sandbox +
+ +
+ + +
+ +
+ +
+ + + +
+ + + + + \ No newline at end of file diff --git a/sandbox310/dev/docs/elements/text-highlight.html b/sandbox310/dev/docs/elements/text-highlight.html new file mode 100644 index 0000000..671286d --- /dev/null +++ b/sandbox310/dev/docs/elements/text-highlight.html @@ -0,0 +1,753 @@ + + + + + + + + + + Sandbox - Modern & Multipurpose Bootstrap 5 Template + + + + + + +
+
+ + +
+ +
+
+
+
+

Text Highlight

+

Use our custom text highlight styles to mark important text on your website.

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

Underline

+
+
+

Build and manage an impressive website with Sandbox in no time.

+
+ + + + + +
+ +
+
+

Underline 2

+
+
+

Build and manage an impressive website with Sandbox in no time.

+

Build and manage an impressive website with Sandbox in no time.

+
+ + + + + +
+ +
+
+

Underline 3

+
+
+

Build and manage an impressive website with Sandbox in no time.

+

Build and manage an impressive website with Sandbox in no time.

+

Build and manage an impressive website with Sandbox in no time.

+
+ + + + + +
+ +
+
+

Mark

+
+
+

We bring rapid solutions for your business.

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

Think unique and be creative. Make a difference with Sandbox.

+

Everything you need to create your next unique and professional website, including impressive and ready-made blocks and pages.

+ Buy Sandbox +
+ +
+ + +
+ +
+ +
+ + + +
+ + + + + \ No newline at end of file diff --git a/sandbox310/dev/docs/elements/tiles.html b/sandbox310/dev/docs/elements/tiles.html new file mode 100644 index 0000000..5422767 --- /dev/null +++ b/sandbox310/dev/docs/elements/tiles.html @@ -0,0 +1,1163 @@ + + + + + + + + + + Sandbox - Modern & Multipurpose Bootstrap 5 Template + + + + + + +
+
+ + +
+ +
+
+
+
+

Tiles

+

Use our tile options to arrange images with appealing styles.

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

Tiles 1

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

Tiles 2

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

Tiles 3

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

Tiles 4

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

Tiles 5

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

Tiles 6

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

Tiles 7

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

Tiles 8

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

Tiles 9

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

Tiles 10

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

Think unique and be creative. Make a difference with Sandbox.

+

Everything you need to create your next unique and professional website, including impressive and ready-made blocks and pages.

+ Buy Sandbox +
+ +
+ + +
+ +
+ +
+ + + +
+ + + + + \ No newline at end of file diff --git a/sandbox310/dev/docs/elements/tooltips-popovers.html b/sandbox310/dev/docs/elements/tooltips-popovers.html new file mode 100644 index 0000000..fc68a9a --- /dev/null +++ b/sandbox310/dev/docs/elements/tooltips-popovers.html @@ -0,0 +1,663 @@ + + + + + + + + + + Sandbox - Modern & Multipurpose Bootstrap 5 Template + + + + + + +
+
+ + +
+ +
+
+
+
+

Tooltips & Popovers

+

Use Bootstrap Tooltips and Popovers with our custom styles to add tooltips and popovers to any element on your website.

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

Tooltips

+
+
+ Tooltip on top + Tooltip on right + Tooltip on bottom + Tooltip on left +
+ + + + +
+ + + + + +
+ +
+
+

Popovers

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

Think unique and be creative. Make a difference with Sandbox.

+

Everything you need to create your next unique and professional website, including impressive and ready-made blocks and pages.

+ Buy Sandbox +
+ +
+ + +
+ +
+ +
+ + + +
+ + + + + \ No newline at end of file diff --git a/sandbox310/dev/docs/elements/typography.html b/sandbox310/dev/docs/elements/typography.html new file mode 100644 index 0000000..0b1c58f --- /dev/null +++ b/sandbox310/dev/docs/elements/typography.html @@ -0,0 +1,955 @@ + + + + + + + + + + Sandbox - Modern & Multipurpose Bootstrap 5 Template + + + + + + +
+
+ + +
+ +
+
+
+
+

Typography

+

Use our custom typography examples for your headings, titles and other text. For further typography examples please visit Bootstrap docs

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

Headings

+
+
+
+
+

h1. heading

+

h2. heading

+

h3. heading

+

h4. heading

+
h5. heading
+
h6. heading
+
+ +
+

h1. heading

+

h2. heading

+

h3. heading

+

h4. heading

+
h5. heading
+
h6. heading
+
+ +
+ +
+ + + + + +
+ +
+
+

Display Headings

+
+
+

Display 1

+

Display 2

+

Display 3

+

Display 4

+

Display 5

+

Display 6

+
+ + + + + +
+ +
+
+

Tiny Headings

+
+
+
+
+

Tiny Heading

+
+ +
+

Tiny Heading with Line

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

Lead

+
+
+

Lead

+

Lead Larger

+
+ + + + + +
+ +
+
+

Lists

+
+
+
+
+
    +
  • Aenean eu leo quam.
  • +
  • Nullam quis risus eget.
  • +
  • Donec id elit non mi porta.
  • +
  • Fusce dapibus cursus.
  • +
+
+ +
+
    +
  • Aenean eu leo quam.
  • +
  • Nullam quis risus eget.
  • +
  • Donec id elit non mi porta.
  • +
  • Fusce dapibus cursus.
  • +
+
+ +
+
    +
  • Aenean eu leo quam.
  • +
  • Nullam quis risus eget.
  • +
  • Donec id elit non mi porta.
  • +
  • Fusce dapibus cursus.
  • +
+
+ +
+ +
+ + + + + +
+ +
+
+

Blockquote

+
+
+
+
+
+
+

Sed posuere consectetur est at lobortis. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis, est non commodo luctus, nisi erat porttitor ligula lacinia odio.

+
+ +
+
+ +
+
+
+
+
+

Sed posuere consectetur est at lobortis. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis, est non commodo luctus.

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

Dropcap

+
+
+
+
+

Aenean non lectus sit amet est imperdiet cursus elementum vitae eros. Cras quis odio in risus euismod suscipit. Fusce viverra ligula vel justo bibendum semper amet.

+
+ +
+

Aenean non lectus sit amet est imperdiet cursus elementum vitae eros. Cras quis odio in risus euismod suscipit. Fusce viverra ligula vel justo bibendum semper amet.

+
+ +
+

Aenean non lectus sit amet est imperdiet cursus elementum vitae eros. Cras quis odio in risus euismod suscipit. Fusce viverra ligula vel justo bibendum semper amet.

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

Links

+

Available options:

+

link-body, link-aqua, link-green, link-leaf, link-navy, link-orange, link-pink, link-purple, link-red, link-violet, link-yellow, link-fuchsia, link-sky, link-grape.

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

Think unique and be creative. Make a difference with Sandbox.

+

Everything you need to create your next unique and professional website, including impressive and ready-made blocks and pages.

+ Buy Sandbox +
+ +
+ + +
+ +
+ +
+ + + +
+ + + + + \ No newline at end of file diff --git a/sandbox310/dev/docs/faq.html b/sandbox310/dev/docs/faq.html new file mode 100644 index 0000000..e563644 --- /dev/null +++ b/sandbox310/dev/docs/faq.html @@ -0,0 +1,757 @@ + + + + + + + + + + Sandbox - Modern & Multipurpose Bootstrap 5 Template + + + + + + +
+
+ + +
+ +
+
+
+
+

FAQ

+

Find answers to some frequently asked questions here.

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

Frequently Asked Questions

+

If you don't see an answer to your question here, please feel free to contact us with the links below:

+ Contact Form + Discussions Page +
+
+
+ +
+ +
+
+

You can reach the v2.0.0 documentation here

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

Yes. Gulp is optional. You can use plain HTML / CSS / JS to customize Sandbox. Files you need are located in dev folder.

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

All third-party plugin JS files are located in src/assets/js/vendor and their CSS files are in src/assets/css/vendor. Just remove unwanted vendor JS / CSS files from vendor folders and then remove unwanted functions from src/assets/js/theme.js and recompile.

+

If you're not using Gulp, you can remove unwanted plugins manually from dev/assets/js/plugins.js, dev/assets/js/theme.js and their CSS from dev/assets/css/plugins.css.

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

Bootstrap SCSS imports are located in src/assets/scss/_bootstrap.scss and theme SCSS imports are in src/assets/scss/theme/_theme.scss. Remove or comment any unwanted import and recompile.

+

If you're not using Gulp, you can remove unwanted CSS manually from dev/assets/css/style.css

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

No, not currently. Although with the use of RTLCSS project you can generate RTL version of style.css, however some template specific styles won’t have support for RTL out of the box.

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

Due to the same-origin policy SVGInject does not work when run from the local file system in many browsers (Chrome, Safari). Please test on a working web server.

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

Follow the instructions here to reach the guide on configuring the contact or newsletter forms in Sandbox. If the forms don't work or if you receive any errors please keep in mind that the contact forms won't work on local environment. Please test them on a working web server.

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

No, as of v3.0.0, Sandbox no longer requires jQuery.

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

Sandbox is an HTML template, not a Wordpress theme. So it cannot be installed in Wordpress.

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

There is a known browsers-spesific issue regarding image-mask that prevents them from working on local environments. (Running from a filesystem is now restricted, so you can no longer reference one file from another.) If you upload the template on a working server image masks should work properly.

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

You can disable sourcemaps in dist/asssets/css/style.css by uncommenting lines 148 and 158 on gulpfile.js and then running gulp serve command.

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

Use the code below to add link to dropdown parent:

+
+ +
+
+
<li class="nav-item dropdown dropdown-mega parent-link">
+  <a class="nav-link" href="PARENT LINK">Dropdown</a>
+  <a class="nav-link dropdown-toggle" href="#" data-bs-toggle="dropdown"><span class="visually-hidden">Toggle Dropdown</span></a>
+  <ul class="dropdown-menu mega-menu">
+    ...
+  </ul>
+</li>
+
+
+
+ +
+ +
+
+ +
+ +
+
+

The font used in the Sandbox logo is Manrope

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

Think unique and be creative. Make a difference with Sandbox.

+

Everything you need to create your next unique and professional website, including impressive and ready-made blocks and pages.

+ Buy Sandbox +
+ +
+ + +
+ +
+ +
+ + + +
+ + + + + \ No newline at end of file diff --git a/sandbox310/dev/docs/forms.html b/sandbox310/dev/docs/forms.html new file mode 100644 index 0000000..dbce265 --- /dev/null +++ b/sandbox310/dev/docs/forms.html @@ -0,0 +1,663 @@ + + + + + + + + + + Sandbox - Modern & Multipurpose Bootstrap 5 Template + + + + + + +
+
+ + +
+ +
+
+
+
+

Forms

+

Below you can find instructions on how to make contact or newsletter forms work.

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

Contact Form

+
+
+

Specify recipient e-mail addresses by filling $fromEmail and $sendToEmail options in assets/php/contact.php. These email addresses will receive all form inquires/messages.

+
+ + + + + +
+ +
+
+

Configuration

+
+
+

Other than specifying recipient addresses as shown above, you can also change email subject, fields, success and error alert messages and enable SMTP authentication if necessary in assets/php/contact.php under CONFIGURATION part. Pay attention to comments for explanations.

+
+ + + + + +
+ +
+
+

Newsletter

+
+
+

After creating your own custom newsletter form through Signup Forms - Embedded Forms in Mailchimp website, replacing the newsletter form action with the one in your generated newsletter code should be enough to personalize the existing subscription forms in Sandbox.

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

Think unique and be creative. Make a difference with Sandbox.

+

Everything you need to create your next unique and professional website, including impressive and ready-made blocks and pages.

+ Buy Sandbox +
+ +
+ + +
+ +
+ +
+ + + +
+ + + + + \ No newline at end of file diff --git a/sandbox310/dev/docs/index.html b/sandbox310/dev/docs/index.html new file mode 100644 index 0000000..d87dd2f --- /dev/null +++ b/sandbox310/dev/docs/index.html @@ -0,0 +1,649 @@ + + + + + + + + + + Sandbox - Modern & Multipurpose Bootstrap 5 Template + + + + + + +
+
+ + +
+ +
+
+
+
+

Get Started

+

Guide to get started with Sandbox Modern & Multipurpose Bootstrap 5 Template.

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

Overview

+
+
+

This guide will help you get started with Sandbox. All the information regarding file structure, build tools, components, credits, license and FAQ can be found here.

+

If you have any questions that are beyond the scope of this help documentation, please feel free to contact us with the links below and please don't forget to provide your website URL.

+ Contact Form + Discussions Page +
+
+

Please remember...

+
    +
  • Requests sent during weekends or on holidays will be replied on business days.
  • +
  • We only provide support for the issues related to the features that are included in the template. Debugging or providing guides on how to make custom modifications are not part of our support. Thank you for understanding.
  • +
+
+ +
+ +
+ +
+ +
+
+

File Structure

+
+
+
    +
  • dev All template files with unminified CSS / JS. Use this folder if you don't wish to use Node.js / Gulp / SASS.
  • +
  • dist All template distribution files like HTML / CSS / JS that have been processed (compiled / minified) from src folder using Node.js / Gulp.
  • +
  • src All template source files like HTML / SCSS / CSS / JS that are then processed (compiled / minified) to dist folder.
      +
    • src/assets/js Contains main theme.js and JS vendor files. If you don't wish to use all included plugins and scripts, just remove unwanted vendor JS files from src/assets/js/vendor then remove unwanted functions from src/assets/js/theme.js and recompile.
    • +
    • src/assets/css Contains CSS vendor files. If you don't wish to use all included plugins, just remove unwanted vendor CSS from src/assets/css/vendor and recompile.
    • +
    • src/assets/scss Contains all project SCSS files that are compiled and minified in dist/assets/css folder.
    • +
    +
  • +
  • dev/docs & dist/docs Contain all documentation files (installation, blocks, elements, etc.) regarding the template. You can also reach the documentation from the live demo as well.
  • +
  • package.json Includes the list of dependencies to install from npm.
  • +
  • gulpfile.js Configuration file for Gulp library. It contains all tasks to perform with Gulp. Learn more about it from official Gulp documentation.
  • +
+
+ +
+ +
+
+

Installation

+ +
+
+

If you'd like to speed up development process with Node.js / Gulp / SASS, then follow these steps:

+
    +
  1. Install Node.js if you don’t have it yet.
  2. +
  3. Run npm install gulp-cli -g command, if you haven't already installed Gulp CLI previously.
  4. +
  5. Unzip the template package and in the root project folder sandbox, go to your command line and run npm install. This will install the npm packages listed in the package.json file.
  6. +
  7. You should now have the project files set up and all the npm packages installed.
  8. +
+
+ +
+ +
+
+

Gulp Commands

+
+
+
    +
  • gulp This command will fire default gulp task which includes: creating dist folder, launching BrowserSync, merging vendor libraries, JS minification, SASS and HTML compilation and starting watch task.
  • +
  • gulp serve This command will launch watch task and BrowserSync. It will watch changes of your HTML / SCSS / CSS / JS files and automatically compile them.
  • +
  • gulp build:dist This will create dist which includes all template files with minified CSS / JS.
  • +
  • gulp build:dev This will create dev which includes all template files with unminified CSS / JS.
  • +
+

When you want to kill the server just hit Control + C

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

Think unique and be creative. Make a difference with Sandbox.

+

Everything you need to create your next unique and professional website, including impressive and ready-made blocks and pages.

+ Buy Sandbox +
+ +
+ + +
+ +
+ +
+ + + +
+ + + + + \ No newline at end of file diff --git a/sandbox310/dev/docs/styleguide/backgrounds.html b/sandbox310/dev/docs/styleguide/backgrounds.html new file mode 100644 index 0000000..2144f26 --- /dev/null +++ b/sandbox310/dev/docs/styleguide/backgrounds.html @@ -0,0 +1,721 @@ + + + + + + + + + + Sandbox - Modern & Multipurpose Bootstrap 5 Template + + + + + + +
+
+ + +
+ +
+
+
+
+

Backgrounds

+

Below you can find the list of abstract and gradient background images that come bundled with Sandbox.

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

Abstract

+
    +
  • +
    +
    +
    + bg2.jpg +
    + +
    +
  • +
  • +
    +
    +
    + bg3.jpg +
    + +
    +
  • +
  • +
    +
    +
    + bg4.jpg +
    + +
    +
  • +
  • +
    +
    +
    + bg13.jpg +
    + +
    +
  • +
+
+
+

Gradient

+
    +
  • +
    +
    +
    + bg14.png +
    + +
    +
  • +
  • +
    +
    +
    + bg15.png +
    + +
    +
  • +
  • +
    +
    +
    + bg16.png +
    + +
    +
  • +
  • +
    +
    +
    + bg17.png +
    + +
    +
  • +
  • +
    +
    +
    + bg18.png +
    + +
    +
  • +
  • +
    +
    +
    + bg19.png +
    + +
    +
  • +
  • +
    +
    +
    + bg20.png +
    + +
    +
  • +
  • +
    +
    +
    + bg21.png +
    + +
    +
  • +
  • +
    +
    +
    + bg22.png +
    + +
    +
  • +
  • +
    +
    +
    + bg23.png +
    + +
    +
  • +
  • +
    +
    +
    + bg24.png +
    + +
    +
  • +
  • +
    +
    +
    + bg25.png +
    + +
    +
  • +
+
+
+ +
+ +
+ +
+ +
+
+
+
+

Think unique and be creative. Make a difference with Sandbox.

+

Everything you need to create your next unique and professional website, including impressive and ready-made blocks and pages.

+ Buy Sandbox +
+ +
+ + +
+ +
+ +
+ + + +
+ + + + + \ No newline at end of file diff --git a/sandbox310/dev/docs/styleguide/colors.html b/sandbox310/dev/docs/styleguide/colors.html new file mode 100644 index 0000000..c523112 --- /dev/null +++ b/sandbox310/dev/docs/styleguide/colors.html @@ -0,0 +1,981 @@ + + + + + + + + + + Sandbox - Modern & Multipurpose Bootstrap 5 Template + + + + + + +
+
+ + +
+ +
+
+
+
+

Colors

+

Use our custom color options to add color to your backgrounds, text or to change the theme color scheme.

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

Theme Colors

+
+
+

To change the theme color, add color CSS file you wish to use inside the <head> tag, right after style.css link, in all your HTML pages. Available color options: aqua.css, green.css, leaf.css, navy.css, orange.css, pink.css, purple.css, red.css, violet.css, yellow.css, fuchsia.css, sky.css, grape.css.

+
+ + + + + +
+ +
+
+

Changing Primary Color

+
+
+

To change the primary color to a custom color, open src/assets/scss/user-variables.scss and assign your custom color value to $primary and recompile.

+
+ + + + + +
+ +
+
+

Background Colors

+
+
+
+
+
+
.bg-yellow
+
.bg-pale-yellow
+ +
+
+ +
+
+
.bg-orange
+
.bg-pale-orange
+ +
+
+ +
+
+
.bg-red
+
.bg-pale-red
+ +
+
+ +
+
+
.bg-pink
+
.bg-pale-pink
+ +
+
+ +
+
+
.bg-violet
+
.bg-pale-violet
+ +
+
+ +
+
+
.bg-purple
+
.bg-pale-purple
+ +
+
+ +
+
+
.bg-blue
+
.bg-pale-blue
+ +
+
+ +
+
+
.bg-aqua
+
.bg-pale-aqua
+ +
+
+ +
+
+
.bg-green
+
.bg-pale-green
+ +
+
+ +
+
+
.bg-leaf
+
.bg-pale-leaf
+ +
+
+ +
+
+
.bg-ash
+
.bg-pale-ash
+ +
+
+ +
+
+
.bg-navy
+
.bg-pale-navy
+ +
+
+ +
+
+
.bg-fuchsia
+
.bg-pale-fuchsia
+ +
+
+ +
+
+
.bg-sky
+
.bg-pale-sky
+ +
+
+ +
+
+
.bg-grape
+
.bg-pale-grape
+ +
+
+ +
+
+
.gradient-1
+
+
+ +
+
+
.gradient-2
+
+
+ +
+
+
.gradient-3
+
+
+ +
+
+
.gradient-4
+
+
+ +
+
+
.gradient-5
+
+
+ +
+
+
.gradient-6
+
+
+ +
+
+
.gradient-7
+
+
+ +
+ +
+ + + + + +
+ +
+
+

Text Colors

+
+
+
+
+

.text-yellow

+

.text-orange

+

.text-red

+

.text-pink

+

.text-fuchsia

+
+ +
+

.text-violet

+

.text-purple

+

.text-blue

+

.text-aqua

+

.text-sky

+
+ +
+

.text-green

+

.text-leaf

+

.text-ash

+

.text-navy

+

.text-grape

+
+ +
+

.text-primary

+
+ +
+

.text-muted

+
+ +
+

.text-white

+
+ +
+

.gradient-1

+
+

.gradient-2

+
+

.gradient-3

+
+ +
+

.gradient-4

+
+

.gradient-5

+
+ +
+

.gradient-6

+
+

.gradient-7

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

Think unique and be creative. Make a difference with Sandbox.

+

Everything you need to create your next unique and professional website, including impressive and ready-made blocks and pages.

+ Buy Sandbox +
+ +
+ + +
+ +
+ +
+ + + +
+ + + + + \ No newline at end of file diff --git a/sandbox310/dev/docs/styleguide/fonts.html b/sandbox310/dev/docs/styleguide/fonts.html new file mode 100644 index 0000000..8f682b2 --- /dev/null +++ b/sandbox310/dev/docs/styleguide/fonts.html @@ -0,0 +1,661 @@ + + + + + + + + + + Sandbox - Modern & Multipurpose Bootstrap 5 Template + + + + + + +
+
+ + +
+ +
+
+
+
+

Fonts

+

Use one of the existing font options or a custom font of your choice to change the overall font in Sandbox.

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

Font Options

+
+
+ +

Manrope is the default font in Sandbox. If you wish to use one of the other available font options, add the link of the font CSS file you wish to use inside the <head> tag, right after style.css link, in all your HTML pages.

+
+ + + + + +
+ +
+
+

Google Fonts

+
+
+

To use a custom Google Font, open src/assets/scss/user-variables.scss, and use the example code below to add @import link and name of your font.

+
+ + + + + +
+ +
+
+

@font-face

+
+
+

To use a custom font with @font-face, first add the font files inside folder src/assets/fonts/ Then use the example below to import your custom font.

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

Think unique and be creative. Make a difference with Sandbox.

+

Everything you need to create your next unique and professional website, including impressive and ready-made blocks and pages.

+ Buy Sandbox +
+ +
+ + +
+ +
+ +
+ + + +
+ + + + + \ No newline at end of file diff --git a/sandbox310/dev/docs/styleguide/icons-font.html b/sandbox310/dev/docs/styleguide/icons-font.html new file mode 100644 index 0000000..311882a --- /dev/null +++ b/sandbox310/dev/docs/styleguide/icons-font.html @@ -0,0 +1,11563 @@ + + + + + + + + + + Sandbox - Modern & Multipurpose Bootstrap 5 Template + + + + + + +
+
+ + +
+ +
+
+
+
+

Unicons

+

Below you can find the list of 1110+ solid font icons. All these retina-ready icons can easily be styled by color, size, shadow, and anything possible with CSS. For more information on the icons please visit Unicons website

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

Arrows

+
    +
  • +
    +
    + + align-center-h +
    + +
    +
  • +
  • +
    +
    + + align-center-v +
    + +
    +
  • +
  • +
    +
    + + angle-double-down +
    + +
    +
  • +
  • +
    +
    + + angle-double-left +
    + +
    +
  • +
  • +
    +
    + + angle-double-right +
    + +
    +
  • +
  • +
    +
    + + angle-double-up +
    + +
    +
  • +
  • +
    +
    + + angle-down +
    + +
    +
  • +
  • +
    +
    + + angle-left +
    + +
    +
  • +
  • +
    +
    + + angle-left-b +
    + +
    +
  • +
  • +
    +
    + + angle-right +
    + +
    +
  • +
  • +
    +
    + + angle-right-b +
    + +
    +
  • +
  • +
    +
    + + angle-up +
    + +
    +
  • +
  • +
    +
    + + arrow +
    + +
    +
  • +
  • +
    +
    + + arrow-break +
    + +
    +
  • +
  • +
    +
    + + arrow-circle-down +
    + +
    +
  • +
  • +
    +
    + + arrow-circle-left +
    + +
    +
  • +
  • +
    +
    + + arrow-circle-right +
    + +
    +
  • +
  • +
    +
    + + arrow-circle-up +
    + +
    +
  • +
  • +
    +
    + + arrow-compress-h +
    + +
    +
  • +
  • +
    +
    + + arrow-down +
    + +
    +
  • +
  • +
    +
    + + arrow-down-left +
    + +
    +
  • +
  • +
    +
    + + arrow-down-right +
    + +
    +
  • +
  • +
    +
    + + arrow-from-right +
    + +
    +
  • +
  • +
    +
    + + arrow-from-top +
    + +
    +
  • +
  • +
    +
    + + arrow-growth +
    + +
    +
  • +
  • +
    +
    + + arrow-left +
    + +
    +
  • +
  • +
    +
    + + arrow-random +
    + +
    +
  • +
  • +
    +
    + + arrow-resize-diagonal +
    + +
    +
  • +
  • +
    +
    + + arrow-right +
    + +
    +
  • +
  • +
    +
    + + arrow-to-bottom +
    + +
    +
  • +
  • +
    +
    + + arrow-to-right +
    + +
    +
  • +
  • +
    +
    + + arrow-up +
    + +
    +
  • +
  • +
    +
    + + arrow-up-left +
    + +
    +
  • +
  • +
    +
    + + arrow-up-right +
    + +
    +
  • +
  • +
    +
    + + arrows-h +
    + +
    +
  • +
  • +
    +
    + + arrows-h-alt +
    + +
    +
  • +
  • +
    +
    + + arrows-left-down +
    + +
    +
  • +
  • +
    +
    + + arrows-maximize +
    + +
    +
  • +
  • +
    +
    + + arrows-merge +
    + +
    +
  • +
  • +
    +
    + + arrows-resize +
    + +
    +
  • +
  • +
    +
    + + arrows-resize-h +
    + +
    +
  • +
  • +
    +
    + + arrows-resize-v +
    + +
    +
  • +
  • +
    +
    + + arrows-right-down +
    + +
    +
  • +
  • +
    +
    + + arrows-shrink-h +
    + +
    +
  • +
  • +
    +
    + + arrows-shrink-v +
    + +
    +
  • +
  • +
    +
    + + arrows-up-right +
    + +
    +
  • +
  • +
    +
    + + arrows-v +
    + +
    +
  • +
  • +
    +
    + + arrows-v-alt +
    + +
    +
  • +
  • +
    +
    + + caret-right +
    + +
    +
  • +
  • +
    +
    + + chart-down +
    + +
    +
  • +
  • +
    +
    + + compress-alt +
    + +
    +
  • +
  • +
    +
    + + compress-alt-left +
    + +
    +
  • +
  • +
    +
    + + compress-arrows +
    + +
    +
  • +
  • +
    +
    + + compress-point +
    + +
    +
  • +
  • +
    +
    + + corner-down-left +
    + +
    +
  • +
  • +
    +
    + + corner-down-right +
    + +
    +
  • +
  • +
    +
    + + corner-down-right-alt +
    + +
    +
  • +
  • +
    +
    + + corner-left-down +
    + +
    +
  • +
  • +
    +
    + + corner-right-down +
    + +
    +
  • +
  • +
    +
    + + corner-up-left +
    + +
    +
  • +
  • +
    +
    + + corner-up-left-alt +
    + +
    +
  • +
  • +
    +
    + + corner-up-right +
    + +
    +
  • +
  • +
    +
    + + corner-up-right-alt +
    + +
    +
  • +
  • +
    +
    + + direction +
    + +
    +
  • +
  • +
    +
    + + download-alt +
    + +
    +
  • +
  • +
    +
    + + enter +
    + +
    +
  • +
  • +
    +
    + + exchange +
    + +
    +
  • +
  • +
    +
    + + exchange-alt +
    + +
    +
  • +
  • +
    +
    + + expand-alt +
    + +
    +
  • +
  • +
    +
    + + expand-arrows +
    + +
    +
  • +
  • +
    +
    + + expand-arrows-alt +
    + +
    +
  • +
  • +
    +
    + + expand-from-corner +
    + +
    +
  • +
  • +
    +
    + + expand-left +
    + +
    +
  • +
  • +
    +
    + + expand-right +
    + +
    +
  • +
  • +
    +
    + + export +
    + +
    +
  • +
  • +
    +
    + + import +
    + +
    +
  • +
  • +
    +
    + + left-arrow-from-left +
    + +
    +
  • +
  • +
    +
    + + left-arrow-to-left +
    + +
    +
  • +
  • +
    +
    + + maximize-left +
    + +
    +
  • +
  • +
    +
    + + scaling-left +
    + +
    +
  • +
  • +
    +
    + + scaling-right +
    + +
    +
  • +
  • +
    +
    + + scroll +
    + +
    +
  • +
  • +
    +
    + + scroll-h +
    + +
    +
  • +
  • +
    +
    + + shuffle +
    + +
    +
  • +
  • +
    +
    + + sort +
    + +
    +
  • +
  • +
    +
    + + sorting +
    + +
    +
  • +
  • +
    +
    + + top-arrow-from-top +
    + +
    +
  • +
  • +
    +
    + + top-arrow-to-top +
    + +
    +
  • +
  • +
    +
    + + upload-alt +
    + +
    +
  • +
+
+
+

Brand Logos

+
    +
  • +
    +
    + + 500px +
    + +
    +
  • +
  • +
    +
    + + adobe +
    + +
    +
  • +
  • +
    +
    + + adobe-alt +
    + +
    +
  • +
  • +
    +
    + + amazon +
    + +
    +
  • +
  • +
    +
    + + android +
    + +
    +
  • +
  • +
    +
    + + android-alt +
    + +
    +
  • +
  • +
    +
    + + apple +
    + +
    +
  • +
  • +
    +
    + + apple-alt +
    + +
    +
  • +
  • +
    +
    + + behance +
    + +
    +
  • +
  • +
    +
    + + behance-alt +
    + +
    +
  • +
  • +
    +
    + + bing +
    + +
    +
  • +
  • +
    +
    + + bitcoin +
    + +
    +
  • +
  • +
    +
    + + bitcoin-alt +
    + +
    +
  • +
  • +
    +
    + + black-berry +
    + +
    +
  • +
  • +
    +
    + + blogger +
    + +
    +
  • +
  • +
    +
    + + blogger-alt +
    + +
    +
  • +
  • +
    +
    + + css3-simple +
    + +
    +
  • +
  • +
    +
    + + discord +
    + +
    +
  • +
  • +
    +
    + + docker +
    + +
    +
  • +
  • +
    +
    + + dribbble +
    + +
    +
  • +
  • +
    +
    + + dropbox +
    + +
    +
  • +
  • +
    +
    + + facebook +
    + +
    +
  • +
  • +
    +
    + + facebook-f +
    + +
    +
  • +
  • +
    +
    + + facebook-messenger +
    + +
    +
  • +
  • +
    +
    + + facebook-messenger-alt +
    + +
    +
  • +
  • +
    +
    + + github +
    + +
    +
  • +
  • +
    +
    + + github-alt +
    + +
    +
  • +
  • +
    +
    + + gitlab +
    + +
    +
  • +
  • +
    +
    + + google +
    + +
    +
  • +
  • +
    +
    + + google-drive +
    + +
    +
  • +
  • +
    +
    + + google-drive-alt +
    + +
    +
  • +
  • +
    +
    + + google-hangouts +
    + +
    +
  • +
  • +
    +
    + + google-hangouts-alt +
    + +
    +
  • +
  • +
    +
    + + google-play +
    + +
    +
  • +
  • +
    +
    + + hipchat +
    + +
    +
  • +
  • +
    +
    + + html3 +
    + +
    +
  • +
  • +
    +
    + + html3-alt +
    + +
    +
  • +
  • +
    +
    + + html5 +
    + +
    +
  • +
  • +
    +
    + + html5-alt +
    + +
    +
  • +
  • +
    +
    + + instagram +
    + +
    +
  • +
  • +
    +
    + + instagram-alt +
    + +
    +
  • +
  • +
    +
    + + intercom +
    + +
    +
  • +
  • +
    +
    + + intercom-alt +
    + +
    +
  • +
  • +
    +
    + + java-script +
    + +
    +
  • +
  • +
    +
    + + line +
    + +
    +
  • +
  • +
    +
    + + linkedin +
    + +
    +
  • +
  • +
    +
    + + linkedin-alt +
    + +
    +
  • +
  • +
    +
    + + linux +
    + +
    +
  • +
  • +
    +
    + + lottiefiles +
    + +
    +
  • +
  • +
    +
    + + lottiefiles-alt +
    + +
    +
  • +
  • +
    +
    + + master-card +
    + +
    +
  • +
  • +
    +
    + + medium-m +
    + +
    +
  • +
  • +
    +
    + + microsoft +
    + +
    +
  • +
  • +
    +
    + + okta +
    + +
    +
  • +
  • +
    +
    + + opera +
    + +
    +
  • +
  • +
    +
    + + opera-alt +
    + +
    +
  • +
  • +
    +
    + + pagelines +
    + +
    +
  • +
  • +
    +
    + + pagerduty +
    + +
    +
  • +
  • +
    +
    + + paypal +
    + +
    +
  • +
  • +
    +
    + + programming-language +
    + +
    +
  • +
  • +
    +
    + + react +
    + +
    +
  • +
  • +
    +
    + + reddit-alien-alt +
    + +
    +
  • +
  • +
    +
    + + skype +
    + +
    +
  • +
  • +
    +
    + + skype-alt +
    + +
    +
  • +
  • +
    +
    + + slack +
    + +
    +
  • +
  • +
    +
    + + slack-alt +
    + +
    +
  • +
  • +
    +
    + + snapchat-alt +
    + +
    +
  • +
  • +
    +
    + + snapchat-ghost +
    + +
    +
  • +
  • +
    +
    + + snapchat-square +
    + +
    +
  • +
  • +
    +
    + + swiggy +
    + +
    +
  • +
  • +
    +
    + + telegram +
    + +
    +
  • +
  • +
    +
    + + telegram-alt +
    + +
    +
  • +
  • +
    +
    + + tumblr +
    + +
    +
  • +
  • +
    +
    + + tumblr-alt +
    + +
    +
  • +
  • +
    +
    + + tumblr-square +
    + +
    +
  • +
  • +
    +
    + + twitter +
    + +
    +
  • +
  • +
    +
    + + twitter-alt +
    + +
    +
  • +
  • +
    +
    + + visual-studio +
    + +
    +
  • +
  • +
    +
    + + vk +
    + +
    +
  • +
  • +
    +
    + + vk-alt +
    + +
    +
  • +
  • +
    +
    + + vuejs +
    + +
    +
  • +
  • +
    +
    + + vuejs-alt +
    + +
    +
  • +
  • +
    +
    + + whatsapp +
    + +
    +
  • +
  • +
    +
    + + whatsapp-alt +
    + +
    +
  • +
  • +
    +
    + + windows +
    + +
    +
  • +
  • +
    +
    + + wordpress +
    + +
    +
  • +
  • +
    +
    + + wordpress-simple +
    + +
    +
  • +
  • +
    +
    + + youtube +
    + +
    +
  • +
+
+
+

Business

+
    +
  • +
    +
    + + analysis +
    + +
    +
  • +
  • +
    +
    + + analytics +
    + +
    +
  • +
  • +
    +
    + + bag +
    + +
    +
  • +
  • +
    +
    + + bag-alt +
    + +
    +
  • +
  • +
    +
    + + bill +
    + +
    +
  • +
  • +
    +
    + + bitcoin-circle +
    + +
    +
  • +
  • +
    +
    + + bitcoin-sign +
    + +
    +
  • +
  • +
    +
    + + briefcase +
    + +
    +
  • +
  • +
    +
    + + briefcase-alt +
    + +
    +
  • +
  • +
    +
    + + calculator-alt +
    + +
    +
  • +
  • +
    +
    + + calendar-alt +
    + +
    +
  • +
  • +
    +
    + + chart +
    + +
    +
  • +
  • +
    +
    + + chart-bar +
    + +
    +
  • +
  • +
    +
    + + chart-bar-alt +
    + +
    +
  • +
  • +
    +
    + + chart-growth +
    + +
    +
  • +
  • +
    +
    + + chart-growth-alt +
    + +
    +
  • +
  • +
    +
    + + chart-line +
    + +
    +
  • +
  • +
    +
    + + chart-pie +
    + +
    +
  • +
  • +
    +
    + + chart-pie-alt +
    + +
    +
  • +
  • +
    +
    + + coins +
    + +
    +
  • +
  • +
    +
    + + comparison +
    + +
    +
  • +
  • +
    +
    + + credit-card +
    + +
    +
  • +
  • +
    +
    + + crosshair +
    + +
    +
  • +
  • +
    +
    + + crosshair-alt +
    + +
    +
  • +
  • +
    +
    + + crosshairs +
    + +
    +
  • +
  • +
    +
    + + dollar-alt +
    + +
    +
  • +
  • +
    +
    + + dollar-sign +
    + +
    +
  • +
  • +
    +
    + + dollar-sign-alt +
    + +
    +
  • +
  • +
    +
    + + euro +
    + +
    +
  • +
  • +
    +
    + + euro-circle +
    + +
    +
  • +
  • +
    +
    + + gold +
    + +
    +
  • +
  • +
    +
    + + graph-bar +
    + +
    +
  • +
  • +
    +
    + + hunting +
    + +
    +
  • +
  • +
    +
    + + invoice +
    + +
    +
  • +
  • +
    +
    + + lightbulb +
    + +
    +
  • +
  • +
    +
    + + lightbulb-alt +
    + +
    +
  • +
  • +
    +
    + + lira-sign +
    + +
    +
  • +
  • +
    +
    + + money-bill +
    + +
    +
  • +
  • +
    +
    + + money-bill-stack +
    + +
    +
  • +
  • +
    +
    + + money-insert +
    + +
    +
  • +
  • +
    +
    + + money-stack +
    + +
    +
  • +
  • +
    +
    + + money-withdraw +
    + +
    +
  • +
  • +
    +
    + + money-withdrawal +
    + +
    +
  • +
  • +
    +
    + + moneybag +
    + +
    +
  • +
  • +
    +
    + + moneybag-alt +
    + +
    +
  • +
  • +
    +
    + + panel-add +
    + +
    +
  • +
  • +
    +
    + + percentage +
    + +
    +
  • +
  • +
    +
    + + pound +
    + +
    +
  • +
  • +
    +
    + + pound-circle +
    + +
    +
  • +
  • +
    +
    + + presentation-line +
    + +
    +
  • +
  • +
    +
    + + puzzle-piece +
    + +
    +
  • +
  • +
    +
    + + receipt +
    + +
    +
  • +
  • +
    +
    + + receipt-alt +
    + +
    +
  • +
  • +
    +
    + + rupee-sign +
    + +
    +
  • +
  • +
    +
    + + schedule +
    + +
    +
  • +
  • +
    +
    + + signal-alt-3 +
    + +
    +
  • +
  • +
    +
    + + sitemap +
    + +
    +
  • +
  • +
    +
    + + suitcase +
    + +
    +
  • +
  • +
    +
    + + suitcase-alt +
    + +
    +
  • +
  • +
    +
    + + university +
    + +
    +
  • +
  • +
    +
    + + usd-circle +
    + +
    +
  • +
  • +
    +
    + + usd-square +
    + +
    +
  • +
  • +
    +
    + + yen +
    + +
    +
  • +
  • +
    +
    + + yen-circle +
    + +
    +
  • +
+
+
+

Chat

+
    +
  • +
    +
    + + chat +
    + +
    +
  • +
  • +
    +
    + + chat-bubble-user +
    + +
    +
  • +
  • +
    +
    + + chat-info +
    + +
    +
  • +
  • +
    +
    + + comment +
    + +
    +
  • +
  • +
    +
    + + comment-add +
    + +
    +
  • +
  • +
    +
    + + comment-alt +
    + +
    +
  • +
  • +
    +
    + + comment-alt-block +
    + +
    +
  • +
  • +
    +
    + + comment-alt-chart-lines +
    + +
    +
  • +
  • +
    +
    + + comment-alt-check +
    + +
    +
  • +
  • +
    +
    + + comment-alt-dots +
    + +
    +
  • +
  • +
    +
    + + comment-alt-download +
    + +
    +
  • +
  • +
    +
    + + comment-alt-edit +
    + +
    +
  • +
  • +
    +
    + + comment-alt-exclamation +
    + +
    +
  • +
  • +
    +
    + + comment-alt-heart +
    + +
    +
  • +
  • +
    +
    + + comment-alt-image +
    + +
    +
  • +
  • +
    +
    + + comment-alt-info +
    + +
    +
  • +
  • +
    +
    + + comment-alt-lines +
    + +
    +
  • +
  • +
    +
    + + comment-alt-lock +
    + +
    +
  • +
  • +
    +
    + + comment-alt-medical +
    + +
    +
  • +
  • +
    +
    + + comment-alt-message +
    + +
    +
  • +
  • +
    +
    + + comment-alt-notes +
    + +
    +
  • +
  • +
    +
    + + comment-alt-plus +
    + +
    +
  • +
  • +
    +
    + + comment-alt-question +
    + +
    +
  • +
  • +
    +
    + + comment-alt-redo +
    + +
    +
  • +
  • +
    +
    + + comment-alt-search +
    + +
    +
  • +
  • +
    +
    + + comment-alt-share +
    + +
    +
  • +
  • +
    +
    + + comment-alt-shield +
    + +
    +
  • +
  • +
    +
    + + comment-alt-upload +
    + +
    +
  • +
  • +
    +
    + + comment-alt-verify +
    + +
    +
  • +
  • +
    +
    + + comment-block +
    + +
    +
  • +
  • +
    +
    + + comment-chart-line +
    + +
    +
  • +
  • +
    +
    + + comment-check +
    + +
    +
  • +
  • +
    +
    + + comment-dots +
    + +
    +
  • +
  • +
    +
    + + comment-download +
    + +
    +
  • +
  • +
    +
    + + comment-edit +
    + +
    +
  • +
  • +
    +
    + + comment-exclamation +
    + +
    +
  • +
  • +
    +
    + + comment-heart +
    + +
    +
  • +
  • +
    +
    + + comment-image +
    + +
    +
  • +
  • +
    +
    + + comment-info +
    + +
    +
  • +
  • +
    +
    + + comment-info-alt +
    + +
    +
  • +
  • +
    +
    + + comment-lines +
    + +
    +
  • +
  • +
    +
    + + comment-lock +
    + +
    +
  • +
  • +
    +
    + + comment-medical +
    + +
    +
  • +
  • +
    +
    + + comment-message +
    + +
    +
  • +
  • +
    +
    + + comment-notes +
    + +
    +
  • +
  • +
    +
    + + comment-plus +
    + +
    +
  • +
  • +
    +
    + + comment-question +
    + +
    +
  • +
  • +
    +
    + + comment-redo +
    + +
    +
  • +
  • +
    +
    + + comment-search +
    + +
    +
  • +
  • +
    +
    + + comment-share +
    + +
    +
  • +
  • +
    +
    + + comment-shield +
    + +
    +
  • +
  • +
    +
    + + comment-upload +
    + +
    +
  • +
  • +
    +
    + + comment-verify +
    + +
    +
  • +
  • +
    +
    + + comments +
    + +
    +
  • +
  • +
    +
    + + comments-alt +
    + +
    +
  • +
  • +
    +
    + + share +
    + +
    +
  • +
+
+
+

Cloud and Web

+
    +
  • +
    +
    + + brackets-curly +
    + +
    +
  • +
  • +
    +
    + + browser +
    + +
    +
  • +
  • +
    +
    + + bug +
    + +
    +
  • +
  • +
    +
    + + channel +
    + +
    +
  • +
  • +
    +
    + + channel-add +
    + +
    +
  • +
  • +
    +
    + + cloud-block +
    + +
    +
  • +
  • +
    +
    + + cloud-bookmark +
    + +
    +
  • +
  • +
    +
    + + cloud-check +
    + +
    +
  • +
  • +
    +
    + + cloud-computing +
    + +
    +
  • +
  • +
    +
    + + cloud-data-connection +
    + +
    +
  • +
  • +
    +
    + + cloud-database-tree +
    + +
    +
  • +
  • +
    +
    + + cloud-download +
    + +
    +
  • +
  • +
    +
    + + cloud-exclamation +
    + +
    +
  • +
  • +
    +
    + + cloud-heart +
    + +
    +
  • +
  • +
    +
    + + cloud-info +
    + +
    +
  • +
  • +
    +
    + + cloud-lock +
    + +
    +
  • +
  • +
    +
    + + cloud-question +
    + +
    +
  • +
  • +
    +
    + + cloud-redo +
    + +
    +
  • +
  • +
    +
    + + cloud-share +
    + +
    +
  • +
  • +
    +
    + + cloud-shield +
    + +
    +
  • +
  • +
    +
    + + cloud-slash +
    + +
    +
  • +
  • +
    +
    + + cloud-times +
    + +
    +
  • +
  • +
    +
    + + cloud-unlock +
    + +
    +
  • +
  • +
    +
    + + cloud-upload +
    + +
    +
  • +
  • +
    +
    + + cloud-wifi +
    + +
    +
  • +
  • +
    +
    + + code-branch +
    + +
    +
  • +
  • +
    +
    + + columns +
    + +
    +
  • +
  • +
    +
    + + data-sharing +
    + +
    +
  • +
  • +
    +
    + + database +
    + +
    +
  • +
  • +
    +
    + + database-alt +
    + +
    +
  • +
  • +
    +
    + + grid +
    + +
    +
  • +
  • +
    +
    + + server +
    + +
    +
  • +
  • +
    +
    + + server-alt +
    + +
    +
  • +
  • +
    +
    + + server-connection +
    + +
    +
  • +
  • +
    +
    + + server-network +
    + +
    +
  • +
  • +
    +
    + + server-network-alt +
    + +
    +
  • +
  • +
    +
    + + servers +
    + +
    +
  • +
  • +
    +
    + + web-grid +
    + +
    +
  • +
  • +
    +
    + + web-grid-alt +
    + +
    +
  • +
  • +
    +
    + + web-section +
    + +
    +
  • +
  • +
    +
    + + web-section-alt +
    + +
    +
  • +
  • +
    +
    + + window +
    + +
    +
  • +
  • +
    +
    + + window-grid +
    + +
    +
  • +
  • +
    +
    + + window-maximize +
    + +
    +
  • +
  • +
    +
    + + window-section +
    + +
    +
  • +
+
+
+

Communication

+
    +
  • +
    +
    + + calling +
    + +
    +
  • +
  • +
    +
    + + desktop-cloud-alt +
    + +
    +
  • +
  • +
    +
    + + envelope +
    + +
    +
  • +
  • +
    +
    + + envelope-add +
    + +
    +
  • +
  • +
    +
    + + envelope-alt +
    + +
    +
  • +
  • +
    +
    + + envelope-block +
    + +
    +
  • +
  • +
    +
    + + envelope-bookmark +
    + +
    +
  • +
  • +
    +
    + + envelope-check +
    + +
    +
  • +
  • +
    +
    + + envelope-download +
    + +
    +
  • +
  • +
    +
    + + envelope-download-alt +
    + +
    +
  • +
  • +
    +
    + + envelope-edit +
    + +
    +
  • +
  • +
    +
    + + envelope-exclamation +
    + +
    +
  • +
  • +
    +
    + + envelope-heart +
    + +
    +
  • +
  • +
    +
    + + envelope-info +
    + +
    +
  • +
  • +
    +
    + + envelope-lock +
    + +
    +
  • +
  • +
    +
    + + envelope-minus +
    + +
    +
  • +
  • +
    +
    + + envelope-open +
    + +
    +
  • +
  • +
    +
    + + envelope-question +
    + +
    +
  • +
  • +
    +
    + + envelope-receive +
    + +
    +
  • +
  • +
    +
    + + envelope-redo +
    + +
    +
  • +
  • +
    +
    + + envelope-search +
    + +
    +
  • +
  • +
    +
    + + envelope-send +
    + +
    +
  • +
  • +
    +
    + + envelope-share +
    + +
    +
  • +
  • +
    +
    + + envelope-shield +
    + +
    +
  • +
  • +
    +
    + + envelope-star +
    + +
    +
  • +
  • +
    +
    + + envelope-times +
    + +
    +
  • +
  • +
    +
    + + envelope-upload +
    + +
    +
  • +
  • +
    +
    + + envelope-upload-alt +
    + +
    +
  • +
  • +
    +
    + + envelopes +
    + +
    +
  • +
  • +
    +
    + + fast-mail +
    + +
    +
  • +
  • +
    +
    + + fast-mail-alt +
    + +
    +
  • +
  • +
    +
    + + forwaded-call +
    + +
    +
  • +
  • +
    +
    + + incoming-call +
    + +
    +
  • +
  • +
    +
    + + laptop-cloud +
    + +
    +
  • +
  • +
    +
    + + laptop-connection +
    + +
    +
  • +
  • +
    +
    + + mailbox +
    + +
    +
  • +
  • +
    +
    + + mailbox-alt +
    + +
    +
  • +
  • +
    +
    + + missed-call +
    + +
    +
  • +
  • +
    +
    + + outgoing-call +
    + +
    +
  • +
  • +
    +
    + + phone +
    + +
    +
  • +
  • +
    +
    + + phone-alt +
    + +
    +
  • +
  • +
    +
    + + phone-pause +
    + +
    +
  • +
  • +
    +
    + + phone-slash +
    + +
    +
  • +
  • +
    +
    + + phone-times +
    + +
    +
  • +
  • +
    +
    + + phone-volume +
    + +
    +
  • +
  • +
    +
    + + post-stamp +
    + +
    +
  • +
  • +
    +
    + + postcard +
    + +
    +
  • +
  • +
    +
    + + rss-alt +
    + +
    +
  • +
+
+
+

Construction

+
    +
  • +
    +
    + + constructor +
    + +
    +
  • +
  • +
    +
    + + drill +
    + +
    +
  • +
  • +
    +
    + + hard-hat +
    + +
    +
  • +
  • +
    +
    + + jackhammer +
    + +
    +
  • +
  • +
    +
    + + no-entry +
    + +
    +
  • +
  • +
    +
    + + paint-tool +
    + +
    +
  • +
  • +
    +
    + + screw +
    + +
    +
  • +
  • +
    +
    + + shovel +
    + +
    +
  • +
  • +
    +
    + + tape +
    + +
    +
  • +
  • +
    +
    + + traffic-barrier +
    + +
    +
  • +
  • +
    +
    + + trowel +
    + +
    +
  • +
  • +
    +
    + + wall +
    + +
    +
  • +
  • +
    +
    + + wheel-barrow +
    + +
    +
  • +
+
+
+

Content

+
    +
  • +
    +
    + + align +
    + +
    +
  • +
  • +
    +
    + + align-alt +
    + +
    +
  • +
  • +
    +
    + + align-center +
    + +
    +
  • +
  • +
    +
    + + align-center-alt +
    + +
    +
  • +
  • +
    +
    + + align-center-justify +
    + +
    +
  • +
  • +
    +
    + + align-justify +
    + +
    +
  • +
  • +
    +
    + + align-left +
    + +
    +
  • +
  • +
    +
    + + align-left-justify +
    + +
    +
  • +
  • +
    +
    + + align-letter-right +
    + +
    +
  • +
  • +
    +
    + + align-right +
    + +
    +
  • +
  • +
    +
    + + align-right-justify +
    + +
    +
  • +
  • +
    +
    + + bars +
    + +
    +
  • +
  • +
    +
    + + bold +
    + +
    +
  • +
  • +
    +
    + + border-alt +
    + +
    +
  • +
  • +
    +
    + + border-bottom +
    + +
    +
  • +
  • +
    +
    + + border-clear +
    + +
    +
  • +
  • +
    +
    + + border-horizontal +
    + +
    +
  • +
  • +
    +
    + + border-inner +
    + +
    +
  • +
  • +
    +
    + + border-left +
    + +
    +
  • +
  • +
    +
    + + border-right +
    + +
    +
  • +
  • +
    +
    + + border-top +
    + +
    +
  • +
  • +
    +
    + + border-vertical +
    + +
    +
  • +
  • +
    +
    + + dialpad +
    + +
    +
  • +
  • +
    +
    + + dialpad-alt +
    + +
    +
  • +
  • +
    +
    + + document-layout-center +
    + +
    +
  • +
  • +
    +
    + + document-layout-left +
    + +
    +
  • +
  • +
    +
    + + document-layout-right +
    + +
    +
  • +
  • +
    +
    + + english-to-chinese +
    + +
    +
  • +
  • +
    +
    + + font +
    + +
    +
  • +
  • +
    +
    + + grip-horizontal-line +
    + +
    +
  • +
  • +
    +
    + + hindi-to-chinese +
    + +
    +
  • +
  • +
    +
    + + italic +
    + +
    +
  • +
  • +
    +
    + + language +
    + +
    +
  • +
  • +
    +
    + + left-indent +
    + +
    +
  • +
  • +
    +
    + + left-indent-alt +
    + +
    +
  • +
  • +
    +
    + + left-to-right-text-direction +
    + +
    +
  • +
  • +
    +
    + + letter-chinese-a +
    + +
    +
  • +
  • +
    +
    + + letter-english-a +
    + +
    +
  • +
  • +
    +
    + + letter-hindi-a +
    + +
    +
  • +
  • +
    +
    + + letter-japanese-a +
    + +
    +
  • +
  • +
    +
    + + list-ui-alt +
    + +
    +
  • +
  • +
    +
    + + list-ul +
    + +
    +
  • +
  • +
    +
    + + paragraph +
    + +
    +
  • +
  • +
    +
    + + right-indent-alt +
    + +
    +
  • +
  • +
    +
    + + right-to-left-text-direction +
    + +
    +
  • +
  • +
    +
    + + sigma +
    + +
    +
  • +
  • +
    +
    + + sort-amount-down +
    + +
    +
  • +
  • +
    +
    + + sort-amount-up +
    + +
    +
  • +
  • +
    +
    + + subject +
    + +
    +
  • +
  • +
    +
    + + text +
    + +
    +
  • +
  • +
    +
    + + text-fields +
    + +
    +
  • +
  • +
    +
    + + text-size +
    + +
    +
  • +
  • +
    +
    + + text-strike-through +
    + +
    +
  • +
  • +
    +
    + + underline +
    + +
    +
  • +
  • +
    +
    + + wrap-text +
    + +
    +
  • +
+
+
+

Design Tools

+
    +
  • +
    +
    + + apps +
    + +
    +
  • +
  • +
    +
    + + border-out +
    + +
    +
  • +
  • +
    +
    + + bring-bottom +
    + +
    +
  • +
  • +
    +
    + + bring-front +
    + +
    +
  • +
  • +
    +
    + + brush-alt +
    + +
    +
  • +
  • +
    +
    + + circle-layer +
    + +
    +
  • +
  • +
    +
    + + compress +
    + +
    +
  • +
  • +
    +
    + + compress-lines +
    + +
    +
  • +
  • +
    +
    + + compress-v +
    + +
    +
  • +
  • +
    +
    + + crop-alt +
    + +
    +
  • +
  • +
    +
    + + crop-alt-rotate-left +
    + +
    +
  • +
  • +
    +
    + + crop-alt-rotate-right +
    + +
    +
  • +
  • +
    +
    + + exclude +
    + +
    +
  • +
  • +
    +
    + + flip-h +
    + +
    +
  • +
  • +
    +
    + + flip-h-alt +
    + +
    +
  • +
  • +
    +
    + + flip-v +
    + +
    +
  • +
  • +
    +
    + + flip-v-alt +
    + +
    +
  • +
  • +
    +
    + + grids +
    + +
    +
  • +
  • +
    +
    + + horizontal-align-center +
    + +
    +
  • +
  • +
    +
    + + horizontal-align-left +
    + +
    +
  • +
  • +
    +
    + + horizontal-align-right +
    + +
    +
  • +
  • +
    +
    + + horizontal-distribution-center +
    + +
    +
  • +
  • +
    +
    + + horizontal-distribution-left +
    + +
    +
  • +
  • +
    +
    + + horizontal-distribution-right +
    + +
    +
  • +
  • +
    +
    + + icons +
    + +
    +
  • +
  • +
    +
    + + illustration +
    + +
    +
  • +
  • +
    +
    + + image-resize-landscape +
    + +
    +
  • +
  • +
    +
    + + image-resize-square +
    + +
    +
  • +
  • +
    +
    + + layers-alt +
    + +
    +
  • +
  • +
    +
    + + line-alt +
    + +
    +
  • +
  • +
    +
    + + line-spacing +
    + +
    +
  • +
  • +
    +
    + + minus-path +
    + +
    +
  • +
  • +
    +
    + + object-group +
    + +
    +
  • +
  • +
    +
    + + object-ungroup +
    + +
    +
  • +
  • +
    +
    + + palette +
    + +
    +
  • +
  • +
    +
    + + panorama-h +
    + +
    +
  • +
  • +
    +
    + + panorama-h-alt +
    + +
    +
  • +
  • +
    +
    + + panorama-v +
    + +
    +
  • +
  • +
    +
    + + pathfinder +
    + +
    +
  • +
  • +
    +
    + + pathfinder-unite +
    + +
    +
  • +
  • +
    +
    + + repeat +
    + +
    +
  • +
  • +
    +
    + + ruler +
    + +
    +
  • +
  • +
    +
    + + ruler-combined +
    + +
    +
  • +
  • +
    +
    + + shrink +
    + +
    +
  • +
  • +
    +
    + + spin +
    + +
    +
  • +
  • +
    +
    + + square-full +
    + +
    +
  • +
  • +
    +
    + + table +
    + +
    +
  • +
  • +
    +
    + + th +
    + +
    +
  • +
  • +
    +
    + + th-large +
    + +
    +
  • +
  • +
    +
    + + th-slash +
    + +
    +
  • +
  • +
    +
    + + vector-square +
    + +
    +
  • +
  • +
    +
    + + vector-square-alt +
    + +
    +
  • +
  • +
    +
    + + vertical-align-bottom +
    + +
    +
  • +
  • +
    +
    + + vertical-align-center +
    + +
    +
  • +
  • +
    +
    + + vertical-align-top +
    + +
    +
  • +
  • +
    +
    + + vertical-distribute-bottom +
    + +
    +
  • +
  • +
    +
    + + vertical-distribution-center +
    + +
    +
  • +
  • +
    +
    + + vertical-distribution-top +
    + +
    +
  • +
+
+
+

Devices

+
    +
  • +
    +
    + + circuit +
    + +
    +
  • +
  • +
    +
    + + desktop +
    + +
    +
  • +
  • +
    +
    + + desktop-alt +
    + +
    +
  • +
  • +
    +
    + + hdd +
    + +
    +
  • +
  • +
    +
    + + laptop +
    + +
    +
  • +
  • +
    +
    + + mobile-android +
    + +
    +
  • +
  • +
    +
    + + mobile-android-alt +
    + +
    +
  • +
  • +
    +
    + + modem +
    + +
    +
  • +
  • +
    +
    + + monitor +
    + +
    +
  • +
  • +
    +
    + + mouse +
    + +
    +
  • +
  • +
    +
    + + mouse-alt +
    + +
    +
  • +
  • +
    +
    + + mouse-alt-2 +
    + +
    +
  • +
  • +
    +
    + + print +
    + +
    +
  • +
  • +
    +
    + + processor +
    + +
    +
  • +
  • +
    +
    + + tablet +
    + +
    +
  • +
  • +
    +
    + + webcam +
    + +
    +
  • +
  • +
    +
    + + weight +
    + +
    +
  • +
  • +
    +
    + + wifi-router +
    + +
    +
  • +
+
+
+

Education

+
    +
  • +
    +
    + + abacus +
    + +
    +
  • +
  • +
    +
    + + atom +
    + +
    +
  • +
  • +
    +
    + + award +
    + +
    +
  • +
  • +
    +
    + + award-alt +
    + +
    +
  • +
  • +
    +
    + + backpack +
    + +
    +
  • +
  • +
    +
    + + bell-school +
    + +
    +
  • +
  • +
    +
    + + book +
    + +
    +
  • +
  • +
    +
    + + book-alt +
    + +
    +
  • +
  • +
    +
    + + book-open +
    + +
    +
  • +
  • +
    +
    + + brain +
    + +
    +
  • +
  • +
    +
    + + cell +
    + +
    +
  • +
  • +
    +
    + + diary +
    + +
    +
  • +
  • +
    +
    + + diary-alt +
    + +
    +
  • +
  • +
    +
    + + dna +
    + +
    +
  • +
  • +
    +
    + + flask +
    + +
    +
  • +
  • +
    +
    + + flask-potion +
    + +
    +
  • +
  • +
    +
    + + game-structure +
    + +
    +
  • +
  • +
    +
    + + graduation-cap +
    + +
    +
  • +
  • +
    +
    + + medal +
    + +
    +
  • +
  • +
    +
    + + meeting-board +
    + +
    +
  • +
  • +
    +
    + + notebooks +
    + +
    +
  • +
  • +
    +
    + + notes +
    + +
    +
  • +
  • +
    +
    + + podium +
    + +
    +
  • +
  • +
    +
    + + presentation +
    + +
    +
  • +
  • +
    +
    + + presentation-check +
    + +
    +
  • +
  • +
    +
    + + presentation-edit +
    + +
    +
  • +
  • +
    +
    + + presentation-lines-alt +
    + +
    +
  • +
  • +
    +
    + + presentation-minus +
    + +
    +
  • +
  • +
    +
    + + presentation-play +
    + +
    +
  • +
  • +
    +
    + + presentation-plus +
    + +
    +
  • +
  • +
    +
    + + presentation-times +
    + +
    +
  • +
  • +
    +
    + + robot +
    + +
    +
  • +
  • +
    +
    + + sperms +
    + +
    +
  • +
  • +
    +
    + + telescope +
    + +
    +
  • +
+
+
+

Emoji

+
    +
  • +
    +
    + + angry +
    + +
    +
  • +
  • +
    +
    + + annoyed +
    + +
    +
  • +
  • +
    +
    + + annoyed-alt +
    + +
    +
  • +
  • +
    +
    + + confused +
    + +
    +
  • +
  • +
    +
    + + dizzy-meh +
    + +
    +
  • +
  • +
    +
    + + emoji +
    + +
    +
  • +
  • +
    +
    + + frown +
    + +
    +
  • +
  • +
    +
    + + grin +
    + +
    +
  • +
  • +
    +
    + + grin-tongue-wink +
    + +
    +
  • +
  • +
    +
    + + grin-tongue-wink-alt +
    + +
    +
  • +
  • +
    +
    + + kid +
    + +
    +
  • +
  • +
    +
    + + laughing +
    + +
    +
  • +
  • +
    +
    + + meh +
    + +
    +
  • +
  • +
    +
    + + meh-alt +
    + +
    +
  • +
  • +
    +
    + + meh-closed-eye +
    + +
    +
  • +
  • +
    +
    + + nerd +
    + +
    +
  • +
  • +
    +
    + + ninja +
    + +
    +
  • +
  • +
    +
    + + sad +
    + +
    +
  • +
  • +
    +
    + + sad-cry +
    + +
    +
  • +
  • +
    +
    + + sad-crying +
    + +
    +
  • +
  • +
    +
    + + sad-dizzy +
    + +
    +
  • +
  • +
    +
    + + sad-squint +
    + +
    +
  • +
  • +
    +
    + + sick +
    + +
    +
  • +
  • +
    +
    + + silence +
    + +
    +
  • +
  • +
    +
    + + silent-squint +
    + +
    +
  • +
  • +
    +
    + + smile +
    + +
    +
  • +
  • +
    +
    + + smile-beam +
    + +
    +
  • +
  • +
    +
    + + smile-dizzy +
    + +
    +
  • +
  • +
    +
    + + smile-squint-wink +
    + +
    +
  • +
  • +
    +
    + + smile-squint-wink-alt +
    + +
    +
  • +
  • +
    +
    + + smile-wink +
    + +
    +
  • +
  • +
    +
    + + smile-wink-alt +
    + +
    +
  • +
  • +
    +
    + + squint +
    + +
    +
  • +
  • +
    +
    + + surprise +
    + +
    +
  • +
  • +
    +
    + + unamused +
    + +
    +
  • +
+
+
+

File and Folder

+
    +
  • +
    +
    + + books +
    + +
    +
  • +
  • +
    +
    + + clipboard +
    + +
    +
  • +
  • +
    +
    + + clipboard-alt +
    + +
    +
  • +
  • +
    +
    + + clipboard-blank +
    + +
    +
  • +
  • +
    +
    + + clipboard-notes +
    + +
    +
  • +
  • +
    +
    + + copy +
    + +
    +
  • +
  • +
    +
    + + copy-alt +
    + +
    +
  • +
  • +
    +
    + + copy-landscape +
    + +
    +
  • +
  • +
    +
    + + document-info +
    + +
    +
  • +
  • +
    +
    + + file +
    + +
    +
  • +
  • +
    +
    + + file-alt +
    + +
    +
  • +
  • +
    +
    + + file-blank +
    + +
    +
  • +
  • +
    +
    + + file-block-alt +
    + +
    +
  • +
  • +
    +
    + + file-bookmark-alt +
    + +
    +
  • +
  • +
    +
    + + file-check +
    + +
    +
  • +
  • +
    +
    + + file-check-alt +
    + +
    +
  • +
  • +
    +
    + + file-contract +
    + +
    +
  • +
  • +
    +
    + + file-contract-dollar +
    + +
    +
  • +
  • +
    +
    + + file-copy-alt +
    + +
    +
  • +
  • +
    +
    + + file-download +
    + +
    +
  • +
  • +
    +
    + + file-download-alt +
    + +
    +
  • +
  • +
    +
    + + file-edit-alt +
    + +
    +
  • +
  • +
    +
    + + file-exclamation +
    + +
    +
  • +
  • +
    +
    + + file-exclamation-alt +
    + +
    +
  • +
  • +
    +
    + + file-export +
    + +
    +
  • +
  • +
    +
    + + file-graph +
    + +
    +
  • +
  • +
    +
    + + file-heart +
    + +
    +
  • +
  • +
    +
    + + file-import +
    + +
    +
  • +
  • +
    +
    + + file-info-alt +
    + +
    +
  • +
  • +
    +
    + + file-landscape +
    + +
    +
  • +
  • +
    +
    + + file-landscape-alt +
    + +
    +
  • +
  • +
    +
    + + file-lock-alt +
    + +
    +
  • +
  • +
    +
    + + file-medical +
    + +
    +
  • +
  • +
    +
    + + file-minus +
    + +
    +
  • +
  • +
    +
    + + file-minus-alt +
    + +
    +
  • +
  • +
    +
    + + file-network +
    + +
    +
  • +
  • +
    +
    + + file-plus +
    + +
    +
  • +
  • +
    +
    + + file-plus-alt +
    + +
    +
  • +
  • +
    +
    + + file-question +
    + +
    +
  • +
  • +
    +
    + + file-question-alt +
    + +
    +
  • +
  • +
    +
    + + file-redo-alt +
    + +
    +
  • +
  • +
    +
    + + file-search-alt +
    + +
    +
  • +
  • +
    +
    + + file-share-alt +
    + +
    +
  • +
  • +
    +
    + + file-shield-alt +
    + +
    +
  • +
  • +
    +
    + + file-times +
    + +
    +
  • +
  • +
    +
    + + file-times-alt +
    + +
    +
  • +
  • +
    +
    + + file-upload +
    + +
    +
  • +
  • +
    +
    + + file-upload-alt +
    + +
    +
  • +
  • +
    +
    + + files-landscapes +
    + +
    +
  • +
  • +
    +
    + + files-landscapes-alt +
    + +
    +
  • +
  • +
    +
    + + folder +
    + +
    +
  • +
  • +
    +
    + + folder-check +
    + +
    +
  • +
  • +
    +
    + + folder-download +
    + +
    +
  • +
  • +
    +
    + + folder-exclamation +
    + +
    +
  • +
  • +
    +
    + + folder-heart +
    + +
    +
  • +
  • +
    +
    + + folder-info +
    + +
    +
  • +
  • +
    +
    + + folder-lock +
    + +
    +
  • +
  • +
    +
    + + folder-medical +
    + +
    +
  • +
  • +
    +
    + + folder-minus +
    + +
    +
  • +
  • +
    +
    + + folder-network +
    + +
    +
  • +
  • +
    +
    + + folder-open +
    + +
    +
  • +
  • +
    +
    + + folder-plus +
    + +
    +
  • +
  • +
    +
    + + folder-question +
    + +
    +
  • +
  • +
    +
    + + folder-times +
    + +
    +
  • +
  • +
    +
    + + folder-upload +
    + +
    +
  • +
+
+
+

Location and Map

+
    +
  • +
    +
    + + compass +
    + +
    +
  • +
  • +
    +
    + + directions +
    + +
    +
  • +
  • +
    +
    + + location-arrow +
    + +
    +
  • +
  • +
    +
    + + location-arrow-alt +
    + +
    +
  • +
  • +
    +
    + + location-pin-alt +
    + +
    +
  • +
  • +
    +
    + + location-point +
    + +
    +
  • +
  • +
    +
    + + map +
    + +
    +
  • +
  • +
    +
    + + map-marker +
    + +
    +
  • +
  • +
    +
    + + map-marker-alt +
    + +
    +
  • +
  • +
    +
    + + map-marker-edit +
    + +
    +
  • +
  • +
    +
    + + map-marker-info +
    + +
    +
  • +
  • +
    +
    + + map-marker-minus +
    + +
    +
  • +
  • +
    +
    + + map-marker-plus +
    + +
    +
  • +
  • +
    +
    + + map-marker-question +
    + +
    +
  • +
  • +
    +
    + + map-marker-shield +
    + +
    +
  • +
  • +
    +
    + + map-pin +
    + +
    +
  • +
  • +
    +
    + + map-pin-alt +
    + +
    +
  • +
  • +
    +
    + + navigator +
    + +
    +
  • +
  • +
    +
    + + sign-alt +
    + +
    +
  • +
  • +
    +
    + + sign-left +
    + +
    +
  • +
  • +
    +
    + + sign-right +
    + +
    +
  • +
+
+
+

Medical

+
    +
  • +
    +
    + + ambulance +
    + +
    +
  • +
  • +
    +
    + + assistive-listening-systems +
    + +
    +
  • +
  • +
    +
    + + band-aid +
    + +
    +
  • +
  • +
    +
    + + book-medical +
    + +
    +
  • +
  • +
    +
    + + capsule +
    + +
    +
  • +
  • +
    +
    + + clinic-medical +
    + +
    +
  • +
  • +
    +
    + + coronavirus +
    + +
    +
  • +
  • +
    +
    + + ear +
    + +
    +
  • +
  • +
    +
    + + file-medical-alt +
    + +
    +
  • +
  • +
    +
    + + head-side +
    + +
    +
  • +
  • +
    +
    + + head-side-cough +
    + +
    +
  • +
  • +
    +
    + + head-side-mask +
    + +
    +
  • +
  • +
    +
    + + heart-medical +
    + +
    +
  • +
  • +
    +
    + + heart-rate +
    + +
    +
  • +
  • +
    +
    + + heartbeat +
    + +
    +
  • +
  • +
    +
    + + hospital +
    + +
    +
  • +
  • +
    +
    + + hospital-square-sign +
    + +
    +
  • +
  • +
    +
    + + hospital-symbol +
    + +
    +
  • +
  • +
    +
    + + house-user +
    + +
    +
  • +
  • +
    +
    + + medical-drip +
    + +
    +
  • +
  • +
    +
    + + medical-square +
    + +
    +
  • +
  • +
    +
    + + medical-square-full +
    + +
    +
  • +
  • +
    +
    + + medkit +
    + +
    +
  • +
  • +
    +
    + + microscope +
    + +
    +
  • +
  • +
    +
    + + monitor-heart-rate +
    + +
    +
  • +
  • +
    +
    + + prescription-bottle +
    + +
    +
  • +
  • +
    +
    + + sanitizer +
    + +
    +
  • +
  • +
    +
    + + sanitizer-alt +
    + +
    +
  • +
  • +
    +
    + + shield-plus +
    + +
    +
  • +
  • +
    +
    + + social-distancing +
    + +
    +
  • +
  • +
    +
    + + stethoscope +
    + +
    +
  • +
  • +
    +
    + + stethoscope-alt +
    + +
    +
  • +
  • +
    +
    + + store-slash +
    + +
    +
  • +
  • +
    +
    + + stretcher +
    + +
    +
  • +
  • +
    +
    + + syringe +
    + +
    +
  • +
  • +
    +
    + + tablets +
    + +
    +
  • +
  • +
    +
    + + thermometer +
    + +
    +
  • +
  • +
    +
    + + toilet-paper +
    + +
    +
  • +
  • +
    +
    + + user-arrows +
    + +
    +
  • +
  • +
    +
    + + user-md +
    + +
    +
  • +
  • +
    +
    + + user-nurse +
    + +
    +
  • +
  • +
    +
    + + virus-slash +
    + +
    +
  • +
  • +
    +
    + + wheelchair-alt +
    + +
    +
  • +
+
+
+

Multimedia

+
    +
  • +
    +
    + + airplay +
    + +
    +
  • +
  • +
    +
    + + backward +
    + +
    +
  • +
  • +
    +
    + + bolt-slash +
    + +
    +
  • +
  • +
    +
    + + boombox +
    + +
    +
  • +
  • +
    +
    + + camera +
    + +
    +
  • +
  • +
    +
    + + camera-change +
    + +
    +
  • +
  • +
    +
    + + camera-plus +
    + +
    +
  • +
  • +
    +
    + + clapper-board +
    + +
    +
  • +
  • +
    +
    + + compact-disc +
    + +
    +
  • +
  • +
    +
    + + equal-circle +
    + +
    +
  • +
  • +
    +
    + + film +
    + +
    +
  • +
  • +
    +
    + + flower +
    + +
    +
  • +
  • +
    +
    + + forward +
    + +
    +
  • +
  • +
    +
    + + headphone-slash +
    + +
    +
  • +
  • +
    +
    + + headphones +
    + +
    +
  • +
  • +
    +
    + + headphones-alt +
    + +
    +
  • +
  • +
    +
    + + image +
    + +
    +
  • +
  • +
    +
    + + image-block +
    + +
    +
  • +
  • +
    +
    + + image-broken +
    + +
    +
  • +
  • +
    +
    + + image-check +
    + +
    +
  • +
  • +
    +
    + + image-download +
    + +
    +
  • +
  • +
    +
    + + image-edit +
    + +
    +
  • +
  • +
    +
    + + image-lock +
    + +
    +
  • +
  • +
    +
    + + image-minus +
    + +
    +
  • +
  • +
    +
    + + image-plus +
    + +
    +
  • +
  • +
    +
    + + image-question +
    + +
    +
  • +
  • +
    +
    + + image-redo +
    + +
    +
  • +
  • +
    +
    + + image-search +
    + +
    +
  • +
  • +
    +
    + + image-share +
    + +
    +
  • +
  • +
    +
    + + image-shield +
    + +
    +
  • +
  • +
    +
    + + image-times +
    + +
    +
  • +
  • +
    +
    + + image-upload +
    + +
    +
  • +
  • +
    +
    + + image-v +
    + +
    +
  • +
  • +
    +
    + + images +
    + +
    +
  • +
  • +
    +
    + + microphone-slash +
    + +
    +
  • +
  • +
    +
    + + mountains +
    + +
    +
  • +
  • +
    +
    + + music +
    + +
    +
  • +
  • +
    +
    + + music-note +
    + +
    +
  • +
  • +
    +
    + + music-tune-slash +
    + +
    +
  • +
  • +
    +
    + + pause +
    + +
    +
  • +
  • +
    +
    + + pause-circle +
    + +
    +
  • +
  • +
    +
    + + picture +
    + +
    +
  • +
  • +
    +
    + + play +
    + +
    +
  • +
  • +
    +
    + + play-circle +
    + +
    +
  • +
  • +
    +
    + + previous +
    + +
    +
  • +
  • +
    +
    + + record-audio +
    + +
    +
  • +
  • +
    +
    + + rss-interface +
    + +
    +
  • +
  • +
    +
    + + scenery +
    + +
    +
  • +
  • +
    +
    + + selfie +
    + +
    +
  • +
  • +
    +
    + + shutter +
    + +
    +
  • +
  • +
    +
    + + shutter-alt +
    + +
    +
  • +
  • +
    +
    + + skip-forward +
    + +
    +
  • +
  • +
    +
    + + skip-forward-alt +
    + +
    +
  • +
  • +
    +
    + + skip-forward-circle +
    + +
    +
  • +
  • +
    +
    + + slider-h +
    + +
    +
  • +
  • +
    +
    + + slider-h-range +
    + +
    +
  • +
  • +
    +
    + + sliders-v +
    + +
    +
  • +
  • +
    +
    + + sliders-v-alt +
    + +
    +
  • +
  • +
    +
    + + step-backward +
    + +
    +
  • +
  • +
    +
    + + step-backward-alt +
    + +
    +
  • +
  • +
    +
    + + step-backward-circle +
    + +
    +
  • +
  • +
    +
    + + step-forward +
    + +
    +
  • +
  • +
    +
    + + stop-circle +
    + +
    +
  • +
  • +
    +
    + + ticket +
    + +
    +
  • +
  • +
    +
    + + video +
    + +
    +
  • +
  • +
    +
    + + video-question +
    + +
    +
  • +
+
+
+

Photography Tools

+
    +
  • +
    +
    + + bright +
    + +
    +
  • +
  • +
    +
    + + capture +
    + +
    +
  • +
  • +
    +
    + + exposure-alt +
    + +
    +
  • +
  • +
    +
    + + exposure-increase +
    + +
    +
  • +
  • +
    +
    + + eye +
    + +
    +
  • +
  • +
    +
    + + focus +
    + +
    +
  • +
  • +
    +
    + + focus-add +
    + +
    +
  • +
  • +
    +
    + + focus-target +
    + +
    +
  • +
+
+
+

Security

+
    +
  • +
    +
    + + keyhole-circle +
    + +
    +
  • +
  • +
    +
    + + keyhole-square +
    + +
    +
  • +
  • +
    +
    + + keyhole-square-full +
    + +
    +
  • +
  • +
    +
    + + lock +
    + +
    +
  • +
  • +
    +
    + + lock-access +
    + +
    +
  • +
  • +
    +
    + + lock-alt +
    + +
    +
  • +
  • +
    +
    + + lock-open-alt +
    + +
    +
  • +
  • +
    +
    + + padlock +
    + +
    +
  • +
  • +
    +
    + + shield +
    + +
    +
  • +
  • +
    +
    + + shield-check +
    + +
    +
  • +
  • +
    +
    + + shield-exclamation +
    + +
    +
  • +
  • +
    +
    + + shield-question +
    + +
    +
  • +
  • +
    +
    + + shield-slash +
    + +
    +
  • +
  • +
    +
    + + unlock +
    + +
    +
  • +
  • +
    +
    + + unlock-alt +
    + +
    +
  • +
+
+
+

Shape

+
    +
  • +
    +
    + + circle +
    + +
    +
  • +
  • +
    +
    + + heart +
    + +
    +
  • +
  • +
    +
    + + heart-alt +
    + +
    +
  • +
  • +
    +
    + + octagon +
    + +
    +
  • +
  • +
    +
    + + pentagon +
    + +
    +
  • +
  • +
    +
    + + polygon +
    + +
    +
  • +
  • +
    +
    + + square +
    + +
    +
  • +
  • +
    +
    + + square-shape +
    + +
    +
  • +
  • +
    +
    + + star +
    + +
    +
  • +
  • +
    +
    + + triangle +
    + +
    +
  • +
+
+
+

Shopping

+
    +
  • +
    +
    + + archive +
    + +
    +
  • +
  • +
    +
    + + credit-card-search +
    + +
    +
  • +
  • +
    +
    + + gift +
    + +
    +
  • +
  • +
    +
    + + label +
    + +
    +
  • +
  • +
    +
    + + label-alt +
    + +
    +
  • +
  • +
    +
    + + pricetag-alt +
    + +
    +
  • +
  • +
    +
    + + qrcode-scan +
    + +
    +
  • +
  • +
    +
    + + shop +
    + +
    +
  • +
  • +
    +
    + + shopping-bag +
    + +
    +
  • +
  • +
    +
    + + shopping-basket +
    + +
    +
  • +
  • +
    +
    + + shopping-cart +
    + +
    +
  • +
  • +
    +
    + + shopping-cart-alt +
    + +
    +
  • +
  • +
    +
    + + store +
    + +
    +
  • +
  • +
    +
    + + store-alt +
    + +
    +
  • +
  • +
    +
    + + tag +
    + +
    +
  • +
  • +
    +
    + + tag-alt +
    + +
    +
  • +
  • +
    +
    + + transaction +
    + +
    +
  • +
+
+
+

Sign and Symbol

+
    +
  • +
    +
    + + accessible-icon-alt +
    + +
    +
  • +
  • +
    +
    + + ban +
    + +
    +
  • +
  • +
    +
    + + closed-captioning +
    + +
    +
  • +
  • +
    +
    + + closed-captioning-slash +
    + +
    +
  • +
  • +
    +
    + + copyright +
    + +
    +
  • +
  • +
    +
    + + creative-commons-pd +
    + +
    +
  • +
  • +
    +
    + + mars +
    + +
    +
  • +
  • +
    +
    + + parking-circle +
    + +
    +
  • +
  • +
    +
    + + parking-square +
    + +
    +
  • +
  • +
    +
    + + registered +
    + +
    +
  • +
  • +
    +
    + + servicemark +
    + +
    +
  • +
  • +
    +
    + + trademark +
    + +
    +
  • +
  • +
    +
    + + trademark-circle +
    + +
    +
  • +
  • +
    +
    + + venus +
    + +
    +
  • +
  • +
    +
    + + wheelchair +
    + +
    +
  • +
+
+
+

Sports

+
    +
  • +
    +
    + + baseball-ball +
    + +
    +
  • +
  • +
    +
    + + basketball +
    + +
    +
  • +
  • +
    +
    + + basketball-hoop +
    + +
    +
  • +
  • +
    +
    + + bowling-ball +
    + +
    +
  • +
  • +
    +
    + + club +
    + +
    +
  • +
  • +
    +
    + + diamond +
    + +
    +
  • +
  • +
    +
    + + dice-five +
    + +
    +
  • +
  • +
    +
    + + dice-four +
    + +
    +
  • +
  • +
    +
    + + dice-one +
    + +
    +
  • +
  • +
    +
    + + dice-six +
    + +
    +
  • +
  • +
    +
    + + dice-three +
    + +
    +
  • +
  • +
    +
    + + dice-two +
    + +
    +
  • +
  • +
    +
    + + dumbbell +
    + +
    +
  • +
  • +
    +
    + + football +
    + +
    +
  • +
  • +
    +
    + + football-ball +
    + +
    +
  • +
  • +
    +
    + + golf-ball +
    + +
    +
  • +
  • +
    +
    + + heart-sign +
    + +
    +
  • +
  • +
    +
    + + kayak +
    + +
    +
  • +
  • +
    +
    + + spade +
    + +
    +
  • +
  • +
    +
    + + table-tennis +
    + +
    +
  • +
  • +
    +
    + + tennis-ball +
    + +
    +
  • +
  • +
    +
    + + trophy +
    + +
    +
  • +
  • +
    +
    + + volleyball +
    + +
    +
  • +
+
+
+

Time

+
    +
  • +
    +
    + + clock +
    + +
    +
  • +
  • +
    +
    + + clock-eight +
    + +
    +
  • +
  • +
    +
    + + clock-five +
    + +
    +
  • +
  • +
    +
    + + clock-nine +
    + +
    +
  • +
  • +
    +
    + + clock-seven +
    + +
    +
  • +
  • +
    +
    + + clock-ten +
    + +
    +
  • +
  • +
    +
    + + clock-three +
    + +
    +
  • +
  • +
    +
    + + clock-two +
    + +
    +
  • +
  • +
    +
    + + stopwatch +
    + +
    +
  • +
  • +
    +
    + + stopwatch-slash +
    + +
    +
  • +
  • +
    +
    + + watch +
    + +
    +
  • +
  • +
    +
    + + watch-alt +
    + +
    +
  • +
+
+
+

Transport

+
    +
  • +
    +
    + + bus +
    + +
    +
  • +
  • +
    +
    + + bus-alt +
    + +
    +
  • +
  • +
    +
    + + bus-school +
    + +
    +
  • +
  • +
    +
    + + car-sideview +
    + +
    +
  • +
  • +
    +
    + + car-wash +
    + +
    +
  • +
  • +
    +
    + + luggage-cart +
    + +
    +
  • +
  • +
    +
    + + metro +
    + +
    +
  • +
  • +
    +
    + + parcel +
    + +
    +
  • +
  • +
    +
    + + ship +
    + +
    +
  • +
  • +
    +
    + + subway +
    + +
    +
  • +
  • +
    +
    + + subway-alt +
    + +
    +
  • +
  • +
    +
    + + taxi +
    + +
    +
  • +
  • +
    +
    + + truck +
    + +
    +
  • +
  • +
    +
    + + truck-loading +
    + +
    +
  • +
+
+
+

User Interface

+
    +
  • +
    +
    + + plus-0 +
    + +
    +
  • +
  • +
    +
    + + plus-3 +
    + +
    +
  • +
  • +
    +
    + + plus-6 +
    + +
    +
  • +
  • +
    +
    + + plus-10 +
    + +
    +
  • +
  • +
    +
    + + plus-12 +
    + +
    +
  • +
  • +
    +
    + + plus-13 +
    + +
    +
  • +
  • +
    +
    + + plus-16 +
    + +
    +
  • +
  • +
    +
    + + plus-17 +
    + +
    +
  • +
  • +
    +
    + + plus-18 +
    + +
    +
  • +
  • +
    +
    + + plus-21 +
    + +
    +
  • +
  • +
    +
    + + adjust +
    + +
    +
  • +
  • +
    +
    + + adjust-alt +
    + +
    +
  • +
  • +
    +
    + + adjust-circle +
    + +
    +
  • +
  • +
    +
    + + adjust-half +
    + +
    +
  • +
  • +
    +
    + + anchor +
    + +
    +
  • +
  • +
    +
    + + android-phone-slash +
    + +
    +
  • +
  • +
    +
    + + ankh +
    + +
    +
  • +
  • +
    +
    + + archive-alt +
    + +
    +
  • +
  • +
    +
    + + archway +
    + +
    +
  • +
  • +
    +
    + + asterisk +
    + +
    +
  • +
  • +
    +
    + + at +
    + +
    +
  • +
  • +
    +
    + + auto-flash +
    + +
    +
  • +
  • +
    +
    + + baby-carriage +
    + +
    +
  • +
  • +
    +
    + + backspace +
    + +
    +
  • +
  • +
    +
    + + bag-slash +
    + +
    +
  • +
  • +
    +
    + + balance-scale +
    + +
    +
  • +
  • +
    +
    + + bath +
    + +
    +
  • +
  • +
    +
    + + battery-bolt +
    + +
    +
  • +
  • +
    +
    + + battery-empty +
    + +
    +
  • +
  • +
    +
    + + bed +
    + +
    +
  • +
  • +
    +
    + + bed-double +
    + +
    +
  • +
  • +
    +
    + + bell +
    + +
    +
  • +
  • +
    +
    + + bell-slash +
    + +
    +
  • +
  • +
    +
    + + bluetooth-b +
    + +
    +
  • +
  • +
    +
    + + bolt +
    + +
    +
  • +
  • +
    +
    + + bolt-alt +
    + +
    +
  • +
  • +
    +
    + + bookmark +
    + +
    +
  • +
  • +
    +
    + + bookmark-full +
    + +
    +
  • +
  • +
    +
    + + box +
    + +
    +
  • +
  • +
    +
    + + brightness +
    + +
    +
  • +
  • +
    +
    + + brightness-empty +
    + +
    +
  • +
  • +
    +
    + + brightness-half +
    + +
    +
  • +
  • +
    +
    + + brightness-low +
    + +
    +
  • +
  • +
    +
    + + brightness-minus +
    + +
    +
  • +
  • +
    +
    + + brightness-plus +
    + +
    +
  • +
  • +
    +
    + + building +
    + +
    +
  • +
  • +
    +
    + + bullseye +
    + +
    +
  • +
  • +
    +
    + + calculator +
    + +
    +
  • +
  • +
    +
    + + calendar-slash +
    + +
    +
  • +
  • +
    +
    + + calender +
    + +
    +
  • +
  • +
    +
    + + camera-slash +
    + +
    +
  • +
  • +
    +
    + + cancel +
    + +
    +
  • +
  • +
    +
    + + car +
    + +
    +
  • +
  • +
    +
    + + car-slash +
    + +
    +
  • +
  • +
    +
    + + card-atm +
    + +
    +
  • +
  • +
    +
    + + check +
    + +
    +
  • +
  • +
    +
    + + check-circle +
    + +
    +
  • +
  • +
    +
    + + check-square +
    + +
    +
  • +
  • +
    +
    + + coffee +
    + +
    +
  • +
  • +
    +
    + + cog +
    + +
    +
  • +
  • +
    +
    + + comment-alt-slash +
    + +
    +
  • +
  • +
    +
    + + comment-slash +
    + +
    +
  • +
  • +
    +
    + + create-dashboard +
    + +
    +
  • +
  • +
    +
    + + crockery +
    + +
    +
  • +
  • +
    +
    + + cube +
    + +
    +
  • +
  • +
    +
    + + dashboard +
    + +
    +
  • +
  • +
    +
    + + desktop-alt-slash +
    + +
    +
  • +
  • +
    +
    + + desktop-slash +
    + +
    +
  • +
  • +
    +
    + + draggabledots +
    + +
    +
  • +
  • +
    +
    + + edit +
    + +
    +
  • +
  • +
    +
    + + edit-alt +
    + +
    +
  • +
  • +
    +
    + + elipsis-double-v-alt +
    + +
    +
  • +
  • +
    +
    + + ellipsis-h +
    + +
    +
  • +
  • +
    +
    + + ellipsis-v +
    + +
    +
  • +
  • +
    +
    + + estate +
    + +
    +
  • +
  • +
    +
    + + exclamation +
    + +
    +
  • +
  • +
    +
    + + exclamation-circle +
    + +
    +
  • +
  • +
    +
    + + exclamation-octagon +
    + +
    +
  • +
  • +
    +
    + + exclamation-triangle +
    + +
    +
  • +
  • +
    +
    + + external-link-alt +
    + +
    +
  • +
  • +
    +
    + + eye-slash +
    + +
    +
  • +
  • +
    +
    + + favorite +
    + +
    +
  • +
  • +
    +
    + + feedback +
    + +
    +
  • +
  • +
    +
    + + fidget-spinner +
    + +
    +
  • +
  • +
    +
    + + file-lanscape-slash +
    + +
    +
  • +
  • +
    +
    + + file-slash +
    + +
    +
  • +
  • +
    +
    + + filter +
    + +
    +
  • +
  • +
    +
    + + filter-slash +
    + +
    +
  • +
  • +
    +
    + + fire +
    + +
    +
  • +
  • +
    +
    + + folder-slash +
    + +
    +
  • +
  • +
    +
    + + football-american +
    + +
    +
  • +
  • +
    +
    + + glass +
    + +
    +
  • +
  • +
    +
    + + glass-martini +
    + +
    +
  • +
  • +
    +
    + + glass-martini-alt +
    + +
    +
  • +
  • +
    +
    + + glass-martini-alt-slash +
    + +
    +
  • +
  • +
    +
    + + glass-tea +
    + +
    +
  • +
  • +
    +
    + + globe +
    + +
    +
  • +
  • +
    +
    + + heart-break +
    + +
    +
  • +
  • +
    +
    + + history +
    + +
    +
  • +
  • +
    +
    + + history-alt +
    + +
    +
  • +
  • +
    +
    + + home +
    + +
    +
  • +
  • +
    +
    + + hourglass +
    + +
    +
  • +
  • +
    +
    + + image-alt-slash +
    + +
    +
  • +
  • +
    +
    + + image-slash +
    + +
    +
  • +
  • +
    +
    + + inbox +
    + +
    +
  • +
  • +
    +
    + + info +
    + +
    +
  • +
  • +
    +
    + + info-circle +
    + +
    +
  • +
  • +
    +
    + + key-skeleton +
    + +
    +
  • +
  • +
    +
    + + key-skeleton-alt +
    + +
    +
  • +
  • +
    +
    + + keyboard +
    + +
    +
  • +
  • +
    +
    + + keyboard-alt +
    + +
    +
  • +
  • +
    +
    + + keyboard-hide +
    + +
    +
  • +
  • +
    +
    + + keyboard-show +
    + +
    +
  • +
  • +
    +
    + + lamp +
    + +
    +
  • +
  • +
    +
    + + layer-group +
    + +
    +
  • +
  • +
    +
    + + layer-group-slash +
    + +
    +
  • +
  • +
    +
    + + layers +
    + +
    +
  • +
  • +
    +
    + + layers-slash +
    + +
    +
  • +
  • +
    +
    + + life-ring +
    + +
    +
  • +
  • +
    +
    + + link +
    + +
    +
  • +
  • +
    +
    + + link-add +
    + +
    +
  • +
  • +
    +
    + + link-alt +
    + +
    +
  • +
  • +
    +
    + + link-broken +
    + +
    +
  • +
  • +
    +
    + + link-h +
    + +
    +
  • +
  • +
    +
    + + list-ol +
    + +
    +
  • +
  • +
    +
    + + list-ol-alt +
    + +
    +
  • +
  • +
    +
    + + lock-slash +
    + +
    +
  • +
  • +
    +
    + + map-marker-slash +
    + +
    +
  • +
  • +
    +
    + + megaphone +
    + +
    +
  • +
  • +
    +
    + + message +
    + +
    +
  • +
  • +
    +
    + + microphone +
    + +
    +
  • +
  • +
    +
    + + minus +
    + +
    +
  • +
  • +
    +
    + + minus-circle +
    + +
    +
  • +
  • +
    +
    + + minus-square +
    + +
    +
  • +
  • +
    +
    + + minus-square-full +
    + +
    +
  • +
  • +
    +
    + + mobile-vibrate +
    + +
    +
  • +
  • +
    +
    + + money-bill-slash +
    + +
    +
  • +
  • +
    +
    + + multiply +
    + +
    +
  • +
  • +
    +
    + + newspaper +
    + +
    +
  • +
  • +
    +
    + + package +
    + +
    +
  • +
  • +
    +
    + + paperclip +
    + +
    +
  • +
  • +
    +
    + + pen +
    + +
    +
  • +
  • +
    +
    + + pizza-slice +
    + +
    +
  • +
  • +
    +
    + + plane +
    + +
    +
  • +
  • +
    +
    + + plane-arrival +
    + +
    +
  • +
  • +
    +
    + + plane-departure +
    + +
    +
  • +
  • +
    +
    + + plane-fly +
    + +
    +
  • +
  • +
    +
    + + plug +
    + +
    +
  • +
  • +
    +
    + + plus +
    + +
    +
  • +
  • +
    +
    + + plus-circle +
    + +
    +
  • +
  • +
    +
    + + plus-square +
    + +
    +
  • +
  • +
    +
    + + power +
    + +
    +
  • +
  • +
    +
    + + print-slash +
    + +
    +
  • +
  • +
    +
    + + process +
    + +
    +
  • +
  • +
    +
    + + pump +
    + +
    +
  • +
  • +
    +
    + + question +
    + +
    +
  • +
  • +
    +
    + + question-circle +
    + +
    +
  • +
  • +
    +
    + + redo +
    + +
    +
  • +
  • +
    +
    + + refresh +
    + +
    +
  • +
  • +
    +
    + + restaurant +
    + +
    +
  • +
  • +
    +
    + + rocket +
    + +
    +
  • +
  • +
    +
    + + rope-way +
    + +
    +
  • +
  • +
    +
    + + rotate-360 +
    + +
    +
  • +
  • +
    +
    + + rss +
    + +
    +
  • +
  • +
    +
    + + save +
    + +
    +
  • +
  • +
    +
    + + search +
    + +
    +
  • +
  • +
    +
    + + search-alt +
    + +
    +
  • +
  • +
    +
    + + search-minus +
    + +
    +
  • +
  • +
    +
    + + search-plus +
    + +
    +
  • +
  • +
    +
    + + setting +
    + +
    +
  • +
  • +
    +
    + + share-alt +
    + +
    +
  • +
  • +
    +
    + + sign-in-alt +
    + +
    +
  • +
  • +
    +
    + + sign-out-alt +
    + +
    +
  • +
  • +
    +
    + + signal +
    + +
    +
  • +
  • +
    +
    + + signal-alt +
    + +
    +
  • +
  • +
    +
    + + signin +
    + +
    +
  • +
  • +
    +
    + + signout +
    + +
    +
  • +
  • +
    +
    + + sim-card +
    + +
    +
  • +
  • +
    +
    + + space-key +
    + +
    +
  • +
  • +
    +
    + + spinner +
    + +
    +
  • +
  • +
    +
    + + spinner-alt +
    + +
    +
  • +
  • +
    +
    + + star-half-alt +
    + +
    +
  • +
  • +
    +
    + + streering +
    + +
    +
  • +
  • +
    +
    + + sun +
    + +
    +
  • +
  • +
    +
    + + swatchbook +
    + +
    +
  • +
  • +
    +
    + + swimmer +
    + +
    +
  • +
  • +
    +
    + + sync +
    + +
    +
  • +
  • +
    +
    + + sync-exclamation +
    + +
    +
  • +
  • +
    +
    + + sync-slash +
    + +
    +
  • +
  • +
    +
    + + tachometer-fast +
    + +
    +
  • +
  • +
    +
    + + tachometer-fast-alt +
    + +
    +
  • +
  • +
    +
    + + tear +
    + +
    +
  • +
  • +
    +
    + + thumbs-down +
    + +
    +
  • +
  • +
    +
    + + thumbs-up +
    + +
    +
  • +
  • +
    +
    + + times +
    + +
    +
  • +
  • +
    +
    + + times-circle +
    + +
    +
  • +
  • +
    +
    + + times-square +
    + +
    +
  • +
  • +
    +
    + + toggle-off +
    + +
    +
  • +
  • +
    +
    + + toggle-on +
    + +
    +
  • +
  • +
    +
    + + traffic-light +
    + +
    +
  • +
  • +
    +
    + + trash +
    + +
    +
  • +
  • +
    +
    + + trash-alt +
    + +
    +
  • +
  • +
    +
    + + trees +
    + +
    +
  • +
  • +
    +
    + + tv-retro +
    + +
    +
  • +
  • +
    +
    + + tv-retro-slash +
    + +
    +
  • +
  • +
    +
    + + umbrella +
    + +
    +
  • +
  • +
    +
    + + upload +
    + +
    +
  • +
  • +
    +
    + + utensils +
    + +
    +
  • +
  • +
    +
    + + utensils-alt +
    + +
    +
  • +
  • +
    +
    + + video-slash +
    + +
    +
  • +
  • +
    +
    + + voicemail +
    + +
    +
  • +
  • +
    +
    + + voicemail-rectangle +
    + +
    +
  • +
  • +
    +
    + + volume +
    + +
    +
  • +
  • +
    +
    + + volume-down +
    + +
    +
  • +
  • +
    +
    + + volume-mute +
    + +
    +
  • +
  • +
    +
    + + volume-off +
    + +
    +
  • +
  • +
    +
    + + volume-up +
    + +
    +
  • +
  • +
    +
    + + wallet +
    + +
    +
  • +
  • +
    +
    + + water-drop-slash +
    + +
    +
  • +
  • +
    +
    + + water-glass +
    + +
    +
  • +
  • +
    +
    + + wifi +
    + +
    +
  • +
  • +
    +
    + + wifi-slash +
    + +
    +
  • +
  • +
    +
    + + wrench +
    + +
    +
  • +
  • +
    +
    + + x +
    + +
    +
  • +
  • +
    +
    + + x-add +
    + +
    +
  • +
  • +
    +
    + + yin-yang +
    + +
    +
  • +
+
+
+

Users

+
    +
  • +
    +
    + + book-reader +
    + +
    +
  • +
  • +
    +
    + + user +
    + +
    +
  • +
  • +
    +
    + + user-check +
    + +
    +
  • +
  • +
    +
    + + user-circle +
    + +
    +
  • +
  • +
    +
    + + user-exclamation +
    + +
    +
  • +
  • +
    +
    + + user-location +
    + +
    +
  • +
  • +
    +
    + + user-minus +
    + +
    +
  • +
  • +
    +
    + + user-plus +
    + +
    +
  • +
  • +
    +
    + + user-square +
    + +
    +
  • +
  • +
    +
    + + user-times +
    + +
    +
  • +
  • +
    +
    + + users-alt +
    + +
    +
  • +
+
+
+

Weather

+
    +
  • +
    +
    + + celsius +
    + +
    +
  • +
  • +
    +
    + + cloud +
    + +
    +
  • +
  • +
    +
    + + cloud-drizzle +
    + +
    +
  • +
  • +
    +
    + + cloud-hail +
    + +
    +
  • +
  • +
    +
    + + cloud-meatball +
    + +
    +
  • +
  • +
    +
    + + cloud-moon +
    + +
    +
  • +
  • +
    +
    + + cloud-moon-hail +
    + +
    +
  • +
  • +
    +
    + + cloud-moon-meatball +
    + +
    +
  • +
  • +
    +
    + + cloud-moon-rain +
    + +
    +
  • +
  • +
    +
    + + cloud-moon-showers +
    + +
    +
  • +
  • +
    +
    + + cloud-rain +
    + +
    +
  • +
  • +
    +
    + + cloud-rain-sun +
    + +
    +
  • +
  • +
    +
    + + cloud-showers +
    + +
    +
  • +
  • +
    +
    + + cloud-showers-alt +
    + +
    +
  • +
  • +
    +
    + + cloud-showers-heavy +
    + +
    +
  • +
  • +
    +
    + + cloud-sun +
    + +
    +
  • +
  • +
    +
    + + cloud-sun-hail +
    + +
    +
  • +
  • +
    +
    + + cloud-sun-meatball +
    + +
    +
  • +
  • +
    +
    + + cloud-sun-rain +
    + +
    +
  • +
  • +
    +
    + + cloud-sun-rain-alt +
    + +
    +
  • +
  • +
    +
    + + cloud-sun-tear +
    + +
    +
  • +
  • +
    +
    + + cloud-wind +
    + +
    +
  • +
  • +
    +
    + + clouds +
    + +
    +
  • +
  • +
    +
    + + desert +
    + +
    +
  • +
  • +
    +
    + + fahrenheit +
    + +
    +
  • +
  • +
    +
    + + forecastcloud-moon-tear +
    + +
    +
  • +
  • +
    +
    + + moon +
    + +
    +
  • +
  • +
    +
    + + moon-eclipse +
    + +
    +
  • +
  • +
    +
    + + moonset +
    + +
    +
  • +
  • +
    +
    + + mountains-sun +
    + +
    +
  • +
  • +
    +
    + + n-a +
    + +
    +
  • +
  • +
    +
    + + rainbow +
    + +
    +
  • +
  • +
    +
    + + raindrops +
    + +
    +
  • +
  • +
    +
    + + raindrops-alt +
    + +
    +
  • +
  • +
    +
    + + snow-flake +
    + +
    +
  • +
  • +
    +
    + + snowflake +
    + +
    +
  • +
  • +
    +
    + + snowflake-alt +
    + +
    +
  • +
  • +
    +
    + + sunset +
    + +
    +
  • +
  • +
    +
    + + temperature +
    + +
    +
  • +
  • +
    +
    + + temperature-empty +
    + +
    +
  • +
  • +
    +
    + + temperature-half +
    + +
    +
  • +
  • +
    +
    + + temperature-minus +
    + +
    +
  • +
  • +
    +
    + + temperature-plus +
    + +
    +
  • +
  • +
    +
    + + temperature-quarter +
    + +
    +
  • +
  • +
    +
    + + temperature-three-quarter +
    + +
    +
  • +
  • +
    +
    + + thunderstorm +
    + +
    +
  • +
  • +
    +
    + + thunderstorm-moon +
    + +
    +
  • +
  • +
    +
    + + thunderstorm-sun +
    + +
    +
  • +
  • +
    +
    + + tornado +
    + +
    +
  • +
  • +
    +
    + + water +
    + +
    +
  • +
  • +
    +
    + + wind +
    + +
    +
  • +
  • +
    +
    + + wind-moon +
    + +
    +
  • +
  • +
    +
    + + wind-sun +
    + +
    +
  • +
  • +
    +
    + + windsock +
    + +
    +
  • +
  • +
    +
    + + windy +
    + +
    +
  • +
+
+
+ +
+ +
+ +
+ +
+
+
+
+

Think unique and be creative. Make a difference with Sandbox.

+

Everything you need to create your next unique and professional website, including impressive and ready-made blocks and pages.

+ Buy Sandbox +
+ +
+ + +
+ +
+ +
+ + + +
+ + + + + \ No newline at end of file diff --git a/sandbox310/dev/docs/styleguide/icons-svg.html b/sandbox310/dev/docs/styleguide/icons-svg.html new file mode 100644 index 0000000..ef78b14 --- /dev/null +++ b/sandbox310/dev/docs/styleguide/icons-svg.html @@ -0,0 +1,4817 @@ + + + + + + + + + + Sandbox - Modern & Multipurpose Bootstrap 5 Template + + + + + + +
+
+ + +
+ +
+
+
+
+

SVG Icons

+

Below you can find the list of all SVG icons included in Sandbox. Copy their codes easily with the copy buttons.

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

Lineal

+

Below you can find the list of all lineal SVG icons with their code snippets. All these retina-ready icons can easily be styled by color and size. To reach the resource of this set visit Flaticon

+

Colors

+
+
+
+
+
+ + +
+ text-primary +
+ +
+
+ + +
+ text-aqua +
+ +
+
+ + +
+ text-green +
+ +
+
+ + +
+ text-leaf +
+ +
+
+ + +
+ text-navy +
+ +
+
+ + +
+ text-orange +
+ +
+
+ + +
+ text-pink +
+ +
+
+ + +
+ text-purple +
+ +
+
+ + +
+ text-red +
+ +
+
+ + +
+ text-violet +
+ +
+
+ + +
+ text-yellow +
+ +
+
+ + +
+ text-blue +
+ +
+
+ + +
+ text-fuchsia +
+ +
+
+ + +
+ text-sky +
+ +
+
+ + +
+ text-grape +
+ +
+ +
+ +
+ +

Sizes

+
+
+
+
+
+ + +
+ icon-svg-lg +
+ +
+
+ + +
+ icon-svg-md +
+ +
+
+ + +
+ icon-svg-sm +
+ +
+
+ + +
+ icon-svg-xs +
+ +
+ +
+ +
+ +

Icons

+
    +
  • +
    +
    + + adjust +
    + +
    +
  • +
  • +
    +
    + + agenda +
    + +
    +
  • +
  • +
    +
    + + analytics +
    + +
    +
  • +
  • +
    +
    + + award +
    + +
    +
  • +
  • +
    +
    + + award-2 +
    + +
    +
  • +
  • +
    +
    + + badge +
    + +
    +
  • +
  • +
    +
    + + balance +
    + +
    +
  • +
  • +
    +
    + + bar-chart +
    + +
    +
  • +
  • +
    +
    + + barcode +
    + +
    +
  • +
  • +
    +
    + + bell +
    + +
    +
  • +
  • +
    +
    + + box +
    + +
    +
  • +
  • +
    +
    + + briefcase +
    + +
    +
  • +
  • +
    +
    + + briefcase-2 +
    + +
    +
  • +
  • +
    +
    + + browser +
    + +
    +
  • +
  • +
    +
    + + browser-2 +
    + +
    +
  • +
  • +
    +
    + + brush +
    + +
    +
  • +
  • +
    +
    + + bucket +
    + +
    +
  • +
  • +
    +
    + + cake +
    + +
    +
  • +
  • +
    +
    + + calculator +
    + +
    +
  • +
  • +
    +
    + + calendar +
    + +
    +
  • +
  • +
    +
    + + certificate +
    + +
    +
  • +
  • +
    +
    + + chat +
    + +
    +
  • +
  • +
    +
    + + chat-2 +
    + +
    +
  • +
  • +
    +
    + + check +
    + +
    +
  • +
  • +
    +
    + + check-2 +
    + +
    +
  • +
  • +
    +
    + + check-list +
    + +
    +
  • +
  • +
    +
    + + clipboard +
    + +
    +
  • +
  • +
    +
    + + clock +
    + +
    +
  • +
  • +
    +
    + + clock-2 +
    + +
    +
  • +
  • +
    +
    + + clock-3 +
    + +
    +
  • +
  • +
    +
    + + cloud-computing +
    + +
    +
  • +
  • +
    +
    + + cloud-computing-2 +
    + +
    +
  • +
  • +
    +
    + + cloud-computing-3 +
    + +
    +
  • +
  • +
    +
    + + coffee-cup +
    + +
    +
  • +
  • +
    +
    + + coin +
    + +
    +
  • +
  • +
    +
    + + compass +
    + +
    +
  • +
  • +
    +
    + + computer +
    + +
    +
  • +
  • +
    +
    + + controller +
    + +
    +
  • +
  • +
    +
    + + controller-2 +
    + +
    +
  • +
  • +
    +
    + + crayons +
    + +
    +
  • +
  • +
    +
    + + crop +
    + +
    +
  • +
  • +
    +
    + + design +
    + +
    +
  • +
  • +
    +
    + + directions +
    + +
    +
  • +
  • +
    +
    + + discount-tag +
    + +
    +
  • +
  • +
    +
    + + download +
    + +
    +
  • +
  • +
    +
    + + earth +
    + +
    +
  • +
  • +
    +
    + + edit-text +
    + +
    +
  • +
  • +
    +
    + + email +
    + +
    +
  • +
  • +
    +
    + + email-2 +
    + +
    +
  • +
  • +
    +
    + + email-3 +
    + +
    +
  • +
  • +
    +
    + + exchange +
    + +
    +
  • +
  • +
    +
    + + expand +
    + +
    +
  • +
  • +
    +
    + + fax +
    + +
    +
  • +
  • +
    +
    + + files +
    + +
    +
  • +
  • +
    +
    + + fullscreen +
    + +
    +
  • +
  • +
    +
    + + geolocalization +
    + +
    +
  • +
  • +
    +
    + + gift +
    + +
    +
  • +
  • +
    +
    + + group-2 +
    + +
    +
  • +
  • +
    +
    + + growth +
    + +
    +
  • +
  • +
    +
    + + handshake +
    + +
    +
  • +
  • +
    +
    + + headphone +
    + +
    +
  • +
  • +
    +
    + + headphone-2 +
    + +
    +
  • +
  • +
    +
    + + heart +
    + +
    +
  • +
  • +
    +
    + + home +
    + +
    +
  • +
  • +
    +
    + + hourglass +
    + +
    +
  • +
  • +
    +
    + + house +
    + +
    +
  • +
  • +
    +
    + + id-card +
    + +
    +
  • +
  • +
    +
    + + insurance +
    + +
    +
  • +
  • +
    +
    + + invoice +
    + +
    +
  • +
  • +
    +
    + + laptop +
    + +
    +
  • +
  • +
    +
    + + levels +
    + +
    +
  • +
  • +
    +
    + + light-bulb +
    + +
    +
  • +
  • +
    +
    + + link +
    + +
    +
  • +
  • +
    +
    + + list +
    + +
    +
  • +
  • +
    +
    + + loading +
    + +
    +
  • +
  • +
    +
    + + lock +
    + +
    +
  • +
  • +
    +
    + + login +
    + +
    +
  • +
  • +
    +
    + + logout +
    + +
    +
  • +
  • +
    +
    + + loss +
    + +
    +
  • +
  • +
    +
    + + loyalty +
    + +
    +
  • +
  • +
    +
    + + map +
    + +
    +
  • +
  • +
    +
    + + maximize +
    + +
    +
  • +
  • +
    +
    + + medal +
    + +
    +
  • +
  • +
    +
    + + meeting +
    + +
    +
  • +
  • +
    +
    + + megaphone +
    + +
    +
  • +
  • +
    +
    + + menu +
    + +
    +
  • +
  • +
    +
    + + microphone +
    + +
    +
  • +
  • +
    +
    + + minimize +
    + +
    +
  • +
  • +
    +
    + + money +
    + +
    +
  • +
  • +
    +
    + + music +
    + +
    +
  • +
  • +
    +
    + + networking +
    + +
    +
  • +
  • +
    +
    + + networking-2 +
    + +
    +
  • +
  • +
    +
    + + open +
    + +
    +
  • +
  • +
    +
    + + padlock +
    + +
    +
  • +
  • +
    +
    + + paint-roller +
    + +
    +
  • +
  • +
    +
    + + paper-plane +
    + +
    +
  • +
  • +
    +
    + + paper +
    + +
    +
  • +
  • +
    +
    + + password +
    + +
    +
  • +
  • +
    +
    + + photo-camera +
    + +
    +
  • +
  • +
    +
    + + picture +
    + +
    +
  • +
  • +
    +
    + + pictures +
    + +
    +
  • +
  • +
    +
    + + pie-chart +
    + +
    +
  • +
  • +
    +
    + + pie-chart-2 +
    + +
    +
  • +
  • +
    +
    + + pin +
    + +
    +
  • +
  • +
    +
    + + pin-2 +
    + +
    +
  • +
  • +
    +
    + + plan +
    + +
    +
  • +
  • +
    +
    + + price-tag +
    + +
    +
  • +
  • +
    +
    + + printer +
    + +
    +
  • +
  • +
    +
    + + profits +
    + +
    +
  • +
  • +
    +
    + + puzzle +
    + +
    +
  • +
  • +
    +
    + + puzzle-2 +
    + +
    +
  • +
  • +
    +
    + + ranking +
    + +
    +
  • +
  • +
    +
    + + refresh +
    + +
    +
  • +
  • +
    +
    + + rocket +
    + +
    +
  • +
  • +
    +
    + + savings +
    + +
    +
  • +
  • +
    +
    + + scale +
    + +
    +
  • +
  • +
    +
    + + scroll +
    + +
    +
  • +
  • +
    +
    + + scroll-2 +
    + +
    +
  • +
  • +
    +
    + + search +
    + +
    +
  • +
  • +
    +
    + + search-2 +
    + +
    +
  • +
  • +
    +
    + + server +
    + +
    +
  • +
  • +
    +
    + + settings +
    + +
    +
  • +
  • +
    +
    + + settings-2 +
    + +
    +
  • +
  • +
    +
    + + settings-3 +
    + +
    +
  • +
  • +
    +
    + + shield +
    + +
    +
  • +
  • +
    +
    + + shield-2 +
    + +
    +
  • +
  • +
    +
    + + shop +
    + +
    +
  • +
  • +
    +
    + + shop-2 +
    + +
    +
  • +
  • +
    +
    + + shope-3 +
    + +
    +
  • +
  • +
    +
    + + shopping-basket +
    + +
    +
  • +
  • +
    +
    + + shopping-cart +
    + +
    +
  • +
  • +
    +
    + + show +
    + +
    +
  • +
  • +
    +
    + + sitemap +
    + +
    +
  • +
  • +
    +
    + + smartphone +
    + +
    +
  • +
  • +
    +
    + + smartphone-2 +
    + +
    +
  • +
  • +
    +
    + + smartphone-3 +
    + +
    +
  • +
  • +
    +
    + + smartphone-4 +
    + +
    +
  • +
  • +
    +
    + + smartwatch +
    + +
    +
  • +
  • +
    +
    + + speedometer +
    + +
    +
  • +
  • +
    +
    + + square +
    + +
    +
  • +
  • +
    +
    + + stars +
    + +
    +
  • +
  • +
    +
    + + startup +
    + +
    +
  • +
  • +
    +
    + + statistics +
    + +
    +
  • +
  • +
    +
    + + sticker +
    + +
    +
  • +
  • +
    +
    + + target +
    + +
    +
  • +
  • +
    +
    + + target-2 +
    + +
    +
  • +
  • +
    +
    + + team +
    + +
    +
  • +
  • +
    +
    + + telemarketer +
    + +
    +
  • +
  • +
    +
    + + telephone +
    + +
    +
  • +
  • +
    +
    + + telephone-2 +
    + +
    +
  • +
  • +
    +
    + + telephone-3 +
    + +
    +
  • +
  • +
    +
    + + television +
    + +
    +
  • +
  • +
    +
    + + tie +
    + +
    +
  • +
  • +
    +
    + + tools +
    + +
    +
  • +
  • +
    +
    + + touch-screen +
    + +
    +
  • +
  • +
    +
    + + truck +
    + +
    +
  • +
  • +
    +
    + + upload +
    + +
    +
  • +
  • +
    +
    + + user +
    + +
    +
  • +
  • +
    +
    + + video +
    + +
    +
  • +
  • +
    +
    + + video-2 +
    + +
    +
  • +
  • +
    +
    + + video-camera +
    + +
    +
  • +
  • +
    +
    + + video-editing +
    + +
    +
  • +
  • +
    +
    + + wallet +
    + +
    +
  • +
  • +
    +
    + + watercolor +
    + +
    +
  • +
  • +
    +
    + + web +
    + +
    +
  • +
  • +
    +
    + + workflow +
    + +
    +
  • +
+
+
+

Solid Mono

+

Below you can find the list of all solid mono SVG icons with their code snippets. All these retina-ready icons can easily be styled by color and size. To reach the resource of this set visit Flaticon

+

Colors

+
+
+
+
+
+ + +
+ text-primary +
+ +
+
+ + +
+ text-aqua +
+ +
+
+ + +
+ text-green +
+ +
+
+ + +
+ text-leaf +
+ +
+
+ + +
+ text-navy +
+ +
+
+ + +
+ text-orange +
+ +
+
+ + +
+ text-pink +
+ +
+
+ + +
+ text-purple +
+ +
+
+ + +
+ text-red +
+ +
+
+ + +
+ text-violet +
+ +
+
+ + +
+ text-yellow +
+ +
+
+ + +
+ text-blue +
+ +
+
+ + +
+ text-fuchsia +
+ +
+
+ + +
+ text-sky +
+ +
+
+ + +
+ text-grape +
+ +
+ +
+ +
+ +

Sizes

+
+
+
+
+
+ +
+ icon-svg-lg +
+ +
+
+ +
+ icon-svg-md +
+ +
+
+ +
+ icon-svg-sm +
+ +
+
+ +
+ icon-svg-xs +
+ +
+ +
+ +
+ +

Icons

+
    +
  • +
    +
    + + 3d +
    + +
    +
  • +
  • +
    +
    + + alarm +
    + +
    +
  • +
  • +
    +
    + + audience +
    + +
    +
  • +
  • +
    +
    + + badge +
    + +
    +
  • +
  • +
    +
    + + bar-chart +
    + +
    +
  • +
  • +
    +
    + + bar-chart-2 +
    + +
    +
  • +
  • +
    +
    + + bell +
    + +
    +
  • +
  • +
    +
    + + briefcase +
    + +
    +
  • +
  • +
    +
    + + bucket +
    + +
    +
  • +
  • +
    +
    + + building +
    + +
    +
  • +
  • +
    +
    + + bulb +
    + +
    +
  • +
  • +
    +
    + + bullhorn +
    + +
    +
  • +
  • +
    +
    + + calendar +
    + +
    +
  • +
  • +
    +
    + + camera +
    + +
    +
  • +
  • +
    +
    + + chatting +
    + +
    +
  • +
  • +
    +
    + + chatting-2 +
    + +
    +
  • +
  • +
    +
    + + checked +
    + +
    +
  • +
  • +
    +
    + + clipboard +
    + +
    +
  • +
  • +
    +
    + + cloud-download +
    + +
    +
  • +
  • +
    +
    + + cloud-group +
    + +
    +
  • +
  • +
    +
    + + cloud-network +
    + +
    +
  • +
  • +
    +
    + + cloud-network-2 +
    + +
    +
  • +
  • +
    +
    + + cloud-transfer +
    + +
    +
  • +
  • +
    +
    + + code +
    + +
    +
  • +
  • +
    +
    + + coffee-cup +
    + +
    +
  • +
  • +
    +
    + + coin +
    + +
    +
  • +
  • +
    +
    + + coin-decrease +
    + +
    +
  • +
  • +
    +
    + + coin-lock +
    + +
    +
  • +
  • +
    +
    + + coin-reload +
    + +
    +
  • +
  • +
    +
    + + coin-rise +
    + +
    +
  • +
  • +
    +
    + + compare +
    + +
    +
  • +
  • +
    +
    + + computer +
    + +
    +
  • +
  • +
    +
    + + conference +
    + +
    +
  • +
  • +
    +
    + + content +
    + +
    +
  • +
  • +
    +
    + + controls-2 +
    + +
    +
  • +
  • +
    +
    + + controls +
    + +
    +
  • +
  • +
    +
    + + crop +
    + +
    +
  • +
  • +
    +
    + + crosshair +
    + +
    +
  • +
  • +
    +
    + + deal +
    + +
    +
  • +
  • +
    +
    + + delivery-box +
    + +
    +
  • +
  • +
    +
    + + devices +
    + +
    +
  • +
  • +
    +
    + + director +
    + +
    +
  • +
  • +
    +
    + + discussion +
    + +
    +
  • +
  • +
    +
    + + dot +
    + +
    +
  • +
  • +
    +
    + + double-click +
    + +
    +
  • +
  • +
    +
    + + e-commerce +
    + +
    +
  • +
  • +
    +
    + + edit +
    + +
    +
  • +
  • +
    +
    + + edit-2 +
    + +
    +
  • +
  • +
    +
    + + email-2 +
    + +
    +
  • +
  • +
    +
    + + emails +
    + +
    +
  • +
  • +
    +
    + + employees +
    + +
    +
  • +
  • +
    +
    + + feather +
    + +
    +
  • +
  • +
    +
    + + gamepad +
    + +
    +
  • +
  • +
    +
    + + gears +
    + +
    +
  • +
  • +
    +
    + + globe-2 +
    + +
    +
  • +
  • +
    +
    + + headphone +
    + +
    +
  • +
  • +
    +
    + + health-insurance +
    + +
    +
  • +
  • +
    +
    + + image +
    + +
    +
  • +
  • +
    +
    + + images +
    + +
    +
  • +
  • +
    +
    + + infographic +
    + +
    +
  • +
  • +
    +
    + + lamp +
    + +
    +
  • +
  • +
    +
    + + layers +
    + +
    +
  • +
  • +
    +
    + + layout-2 +
    + +
    +
  • +
  • +
    +
    + + layout-3 +
    + +
    +
  • +
  • +
    +
    + + layout +
    + +
    +
  • +
  • +
    +
    + + like +
    + +
    +
  • +
  • +
    +
    + + link +
    + +
    +
  • +
  • +
    +
    + + list +
    + +
    +
  • +
  • +
    +
    + + lock +
    + +
    +
  • +
  • +
    +
    + + love +
    + +
    +
  • +
  • +
    +
    + + marker +
    + +
    +
  • +
  • +
    +
    + + mask +
    + +
    +
  • +
  • +
    +
    + + medal +
    + +
    +
  • +
  • +
    +
    + + monitor +
    + +
    +
  • +
  • +
    +
    + + navigation +
    + +
    +
  • +
  • +
    +
    + + network +
    + +
    +
  • +
  • +
    +
    + + note +
    + +
    +
  • +
  • +
    +
    + + paint +
    + +
    +
  • +
  • +
    +
    + + paper-plane +
    + +
    +
  • +
  • +
    +
    + + partnership +
    + +
    +
  • +
  • +
    +
    + + pen-tool +
    + +
    +
  • +
  • +
    +
    + + pie-chart +
    + +
    +
  • +
  • +
    +
    + + pin +
    + +
    +
  • +
  • +
    +
    + + plane +
    + +
    +
  • +
  • +
    +
    + + price-tag +
    + +
    +
  • +
  • +
    +
    + + printer +
    + +
    +
  • +
  • +
    +
    + + push-cart +
    + +
    +
  • +
  • +
    +
    + + puzzle +
    + +
    +
  • +
  • +
    +
    + + rocket +
    + +
    +
  • +
  • +
    +
    + + roller +
    + +
    +
  • +
  • +
    +
    + + rotary +
    + +
    +
  • +
  • +
    +
    + + safe +
    + +
    +
  • +
  • +
    +
    + + script +
    + +
    +
  • +
  • +
    +
    + + search +
    + +
    +
  • +
  • +
    +
    + + secure +
    + +
    +
  • +
  • +
    +
    + + selected +
    + +
    +
  • +
  • +
    +
    + + seo-2 +
    + +
    +
  • +
  • +
    +
    + + seo +
    + +
    +
  • +
  • +
    +
    + + server +
    + +
    +
  • +
  • +
    +
    + + setting +
    + +
    +
  • +
  • +
    +
    + + share +
    + +
    +
  • +
  • +
    +
    + + sharing +
    + +
    +
  • +
  • +
    +
    + + shipment +
    + +
    +
  • +
  • +
    +
    + + shopping-bag +
    + +
    +
  • +
  • +
    +
    + + shopping-basket +
    + +
    +
  • +
  • +
    +
    + + shopping-cart +
    + +
    +
  • +
  • +
    +
    + + smartphone +
    + +
    +
  • +
  • +
    +
    + + supermarket +
    + +
    +
  • +
  • +
    +
    + + synchronize +
    + +
    +
  • +
  • +
    +
    + + team +
    + +
    +
  • +
  • +
    +
    + + target +
    + +
    +
  • +
  • +
    +
    + + toggle +
    + +
    +
  • +
  • +
    +
    + + touchscreen +
    + +
    +
  • +
  • +
    +
    + + transfer +
    + +
    +
  • +
  • +
    +
    + + travel-insurance +
    + +
    +
  • +
  • +
    +
    + + tv-screen +
    + +
    +
  • +
  • +
    +
    + + verify +
    + +
    +
  • +
  • +
    +
    + + video-chat +
    + +
    +
  • +
  • +
    +
    + + video-player +
    + +
    +
  • +
  • +
    +
    + + videocall +
    + +
    +
  • +
  • +
    +
    + + videocall-2 +
    + +
    +
  • +
  • +
    +
    + + wallet +
    + +
    +
  • +
  • +
    +
    + + web-browser +
    + +
    +
  • +
  • +
    +
    + + web-programming +
    + +
    +
  • +
+
+
+

Solid Duo

+

Below you can find the list of all solid duo SVG icons with their code snippets. All these retina-ready icons can easily be styled by color and size. To reach the resource of this set visit Flaticon

+

Colors

+
+
+
+
+
+ + +
+ text-green-fuchsia +
+ +
+
+ + +
+ text-purple-aqua +
+ +
+
+ + +
+ text-blue-pink +
+ +
+
+ + +
+ text-navy-green +
+ +
+
+ + +
+ text-grape-green +
+ +
+
+ + +
+ text-green-red +
+ +
+
+ + +
+ text-grape-yellow +
+ +
+
+ + +
+ text-purple-pink +
+ +
+
+ + +
+ text-red-yellow +
+ +
+
+ + +
+ text-grape-fuchsia +
+ +
+
+ + +
+ text-sky-pink +
+ +
+
+ + +
+ text-navy-sky +
+ +
+ +
+ +
+ +

Sizes

+
+
+
+
+
+ +
+ icon-svg-lg +
+ +
+
+ +
+ icon-svg-md +
+ +
+
+ +
+ icon-svg-sm +
+ +
+
+ +
+ icon-svg-xs +
+ +
+ +
+ +
+ +

Icons

+
    +
  • +
    +
    + + 3d +
    + +
    +
  • +
  • +
    +
    + + alarm +
    + +
    +
  • +
  • +
    +
    + + audience +
    + +
    +
  • +
  • +
    +
    + + badge +
    + +
    +
  • +
  • +
    +
    + + bar-chart +
    + +
    +
  • +
  • +
    +
    + + bar-chart-2 +
    + +
    +
  • +
  • +
    +
    + + bell +
    + +
    +
  • +
  • +
    +
    + + briefcase +
    + +
    +
  • +
  • +
    +
    + + bucket +
    + +
    +
  • +
  • +
    +
    + + building +
    + +
    +
  • +
  • +
    +
    + + bulb +
    + +
    +
  • +
  • +
    +
    + + bullhorn +
    + +
    +
  • +
  • +
    +
    + + calendar +
    + +
    +
  • +
  • +
    +
    + + camera +
    + +
    +
  • +
  • +
    +
    + + chatting +
    + +
    +
  • +
  • +
    +
    + + chatting-2 +
    + +
    +
  • +
  • +
    +
    + + checked +
    + +
    +
  • +
  • +
    +
    + + clipboard +
    + +
    +
  • +
  • +
    +
    + + cloud-download +
    + +
    +
  • +
  • +
    +
    + + cloud-group +
    + +
    +
  • +
  • +
    +
    + + cloud-network +
    + +
    +
  • +
  • +
    +
    + + cloud-network-2 +
    + +
    +
  • +
  • +
    +
    + + cloud-transfer +
    + +
    +
  • +
  • +
    +
    + + code +
    + +
    +
  • +
  • +
    +
    + + coffee-cup +
    + +
    +
  • +
  • +
    +
    + + coin +
    + +
    +
  • +
  • +
    +
    + + coin-decrease +
    + +
    +
  • +
  • +
    +
    + + coin-lock +
    + +
    +
  • +
  • +
    +
    + + coin-reload +
    + +
    +
  • +
  • +
    +
    + + coin-rise +
    + +
    +
  • +
  • +
    +
    + + compare +
    + +
    +
  • +
  • +
    +
    + + computer +
    + +
    +
  • +
  • +
    +
    + + conference +
    + +
    +
  • +
  • +
    +
    + + content +
    + +
    +
  • +
  • +
    +
    + + controls-2 +
    + +
    +
  • +
  • +
    +
    + + controls +
    + +
    +
  • +
  • +
    +
    + + crop +
    + +
    +
  • +
  • +
    +
    + + crosshair +
    + +
    +
  • +
  • +
    +
    + + deal +
    + +
    +
  • +
  • +
    +
    + + delivery-box +
    + +
    +
  • +
  • +
    +
    + + devices +
    + +
    +
  • +
  • +
    +
    + + director +
    + +
    +
  • +
  • +
    +
    + + discussion +
    + +
    +
  • +
  • +
    +
    + + dot +
    + +
    +
  • +
  • +
    +
    + + double-click +
    + +
    +
  • +
  • +
    +
    + + e-commerce +
    + +
    +
  • +
  • +
    +
    + + edit +
    + +
    +
  • +
  • +
    +
    + + edit-2 +
    + +
    +
  • +
  • +
    +
    + + email-2 +
    + +
    +
  • +
  • +
    +
    + + emails +
    + +
    +
  • +
  • +
    +
    + + employees +
    + +
    +
  • +
  • +
    +
    + + feather +
    + +
    +
  • +
  • +
    +
    + + gamepad +
    + +
    +
  • +
  • +
    +
    + + gears +
    + +
    +
  • +
  • +
    +
    + + globe-2 +
    + +
    +
  • +
  • +
    +
    + + headphone +
    + +
    +
  • +
  • +
    +
    + + health-insurance +
    + +
    +
  • +
  • +
    +
    + + image +
    + +
    +
  • +
  • +
    +
    + + images +
    + +
    +
  • +
  • +
    +
    + + infographic +
    + +
    +
  • +
  • +
    +
    + + lamp +
    + +
    +
  • +
  • +
    +
    + + layers +
    + +
    +
  • +
  • +
    +
    + + layout-2 +
    + +
    +
  • +
  • +
    +
    + + layout-3 +
    + +
    +
  • +
  • +
    +
    + + layout +
    + +
    +
  • +
  • +
    +
    + + like +
    + +
    +
  • +
  • +
    +
    + + link +
    + +
    +
  • +
  • +
    +
    + + list +
    + +
    +
  • +
  • +
    +
    + + lock +
    + +
    +
  • +
  • +
    +
    + + love +
    + +
    +
  • +
  • +
    +
    + + marker +
    + +
    +
  • +
  • +
    +
    + + mask +
    + +
    +
  • +
  • +
    +
    + + medal +
    + +
    +
  • +
  • +
    +
    + + monitor +
    + +
    +
  • +
  • +
    +
    + + navigation +
    + +
    +
  • +
  • +
    +
    + + network +
    + +
    +
  • +
  • +
    +
    + + note +
    + +
    +
  • +
  • +
    +
    + + paint +
    + +
    +
  • +
  • +
    +
    + + paper-plane +
    + +
    +
  • +
  • +
    +
    + + partnership +
    + +
    +
  • +
  • +
    +
    + + pen-tool +
    + +
    +
  • +
  • +
    +
    + + pie-chart +
    + +
    +
  • +
  • +
    +
    + + pin +
    + +
    +
  • +
  • +
    +
    + + plane +
    + +
    +
  • +
  • +
    +
    + + price-tag +
    + +
    +
  • +
  • +
    +
    + + printer +
    + +
    +
  • +
  • +
    +
    + + push-cart +
    + +
    +
  • +
  • +
    +
    + + puzzle +
    + +
    +
  • +
  • +
    +
    + + rocket +
    + +
    +
  • +
  • +
    +
    + + roller +
    + +
    +
  • +
  • +
    +
    + + rotary +
    + +
    +
  • +
  • +
    +
    + + safe +
    + +
    +
  • +
  • +
    +
    + + script +
    + +
    +
  • +
  • +
    +
    + + search +
    + +
    +
  • +
  • +
    +
    + + secure +
    + +
    +
  • +
  • +
    +
    + + selected +
    + +
    +
  • +
  • +
    +
    + + seo-2 +
    + +
    +
  • +
  • +
    +
    + + seo +
    + +
    +
  • +
  • +
    +
    + + server +
    + +
    +
  • +
  • +
    +
    + + setting +
    + +
    +
  • +
  • +
    +
    + + share +
    + +
    +
  • +
  • +
    +
    + + sharing +
    + +
    +
  • +
  • +
    +
    + + shipment +
    + +
    +
  • +
  • +
    +
    + + shopping-bag +
    + +
    +
  • +
  • +
    +
    + + shopping-basket +
    + +
    +
  • +
  • +
    +
    + + shopping-cart +
    + +
    +
  • +
  • +
    +
    + + smartphone +
    + +
    +
  • +
  • +
    +
    + + supermarket +
    + +
    +
  • +
  • +
    +
    + + synchronize +
    + +
    +
  • +
  • +
    +
    + + target +
    + +
    +
  • +
  • +
    +
    + + team +
    + +
    +
  • +
  • +
    +
    + + toggle +
    + +
    +
  • +
  • +
    +
    + + touchscreen +
    + +
    +
  • +
  • +
    +
    + + transfer +
    + +
    +
  • +
  • +
    +
    + + travel-insurance +
    + +
    +
  • +
  • +
    +
    + + tv-screen +
    + +
    +
  • +
  • +
    +
    + + verify +
    + +
    +
  • +
  • +
    +
    + + video-chat +
    + +
    +
  • +
  • +
    +
    + + video-player +
    + +
    +
  • +
  • +
    +
    + + videocall +
    + +
    +
  • +
  • +
    +
    + + videocall-2 +
    + +
    +
  • +
  • +
    +
    + + wallet +
    + +
    +
  • +
  • +
    +
    + + web-browser +
    + +
    +
  • +
  • +
    +
    + + web-programming +
    + +
    +
  • +
+
+
+ +
+ +
+ +
+ +
+
+
+
+

Think unique and be creative. Make a difference with Sandbox.

+

Everything you need to create your next unique and professional website, including impressive and ready-made blocks and pages.

+ Buy Sandbox +
+ +
+ + +
+ +
+ +
+ + + +
+ + + + + \ No newline at end of file diff --git a/sandbox310/dev/docs/styleguide/illustrations.html b/sandbox310/dev/docs/styleguide/illustrations.html new file mode 100644 index 0000000..f7dab48 --- /dev/null +++ b/sandbox310/dev/docs/styleguide/illustrations.html @@ -0,0 +1,991 @@ + + + + + + + + + + Sandbox - Modern & Multipurpose Bootstrap 5 Template + + + + + + +
+
+ + +
+ +
+
+
+
+

Illustrations

+

Below you can find the list of illustrations that come bundled with Sandbox.

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

Set 1

+ +
+
+

Set 2

+ +
+
+

Set 3

+ +
+
+

Set 4

+ +
+
+

Set 5

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

Think unique and be creative. Make a difference with Sandbox.

+

Everything you need to create your next unique and professional website, including impressive and ready-made blocks and pages.

+ Buy Sandbox +
+ +
+ + +
+ +
+ +
+ + + +
+ + + + + \ No newline at end of file diff --git a/sandbox310/dev/docs/styleguide/misc.html b/sandbox310/dev/docs/styleguide/misc.html new file mode 100644 index 0000000..577436f --- /dev/null +++ b/sandbox310/dev/docs/styleguide/misc.html @@ -0,0 +1,701 @@ + + + + + + + + + + Sandbox - Modern & Multipurpose Bootstrap 5 Template + + + + + + +
+
+ + +
+ +
+
+
+
+

Misc

+

Learn more about some miscellaneous styling features used in Sandbox.

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

Spacing

+
+
+

Sandbox adds additional spacing variables to existing Bootstrap spacing ranging between values 0 and 25

+
+ +
+ +
+
+

Font Size

+
+
+

Quickly change the font-size of text using .fs-* classes ranging between 1 and 200, while sm, and lg also apply.

+
+ + + + + +
+ +
+
+

Line Height

+
+
+

Change the line height with .lh-* utilities.

+
+ + + + + +
+ +
+
+

Letter Spacing

+
+
+

Change the letter spacing with .ls-* utilities.

+
+ + + + + +
+ +
+
+

Gutters

+
+
+

Spacing variables mentioned above can also be used for column gutters. More information regarding Bootstrap gutters can be found on Bootstrap docs

+
+ +
+ +
+
+

Retina Images

+
+
+

In order to display a high resolution image on devices with retina display, you need two versions of the image. One with regular size and another with twice its size. The high resolution one should have the exact same name with @2x at the end.

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

Think unique and be creative. Make a difference with Sandbox.

+

Everything you need to create your next unique and professional website, including impressive and ready-made blocks and pages.

+ Buy Sandbox +
+ +
+ + +
+ +
+ +
+ + + +
+ + + + + \ No newline at end of file diff --git a/sandbox310/dev/index.html b/sandbox310/dev/index.html new file mode 100644 index 0000000..7fc699c --- /dev/null +++ b/sandbox310/dev/index.html @@ -0,0 +1,1539 @@ + + + + + + + + + + Sandbox - Modern & Multipurpose Bootstrap 5 Template + + + + + + + + +
+
+ + + + +
+ +
+
+
+
+

Create a powerful but effortless website for

+

Build your website in minutes with the help of countless amazing features of Sandbox.

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

NO

+

jQuery

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

21

+
+

Functional, impressive and rich demos to start with

+
+ +
+ +
+

New Demos

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

Demo Layout XVIII

+
    +
  • Network, Marketing
  • +
  • SVG icons
  • +
  • 3D illustrations
  • +
  • Gradient image
  • +
+ See Demo +
+ +
+ +
+ +
+ +
+ +
+
+
+
+
+
+
+
+
+ +
+
+
+ +
+ +
+ +
+

Demo Layout XIX

+
    +
  • Agency, Startup
  • +
  • Gradient image
  • +
  • SVG icons
  • +
  • Colorful design
  • +
+ See Demo +
+ +
+ +
+ +
+ +
+ +
+
+
+
+
+
+
+
+
+ +
+
+
+ +
+ +
+ +
+

Demo Layout XX

+
    +
  • Agency, Startup
  • +
  • Framed layout
  • +
  • Illustrations
  • +
  • Video background
  • +
+ See Demo +
+ +
+ +
+ +
+ +
+ +
+
+
+
+
+
+
+
+
+ +
+
+
+ +
+ +
+ +
+

Demo Layout XXI

+
    +
  • Studio, Startup
  • +
  • Illustrations
  • +
  • Wave dividers
  • +
  • Colorful design
  • +
+ See Demo +
+ +
+ +
+ +
+ +
+ +

Previous Demos

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

Demo Layout I

+
    +
  • SEO, Marketing
  • +
  • Colorful design
  • +
  • Illustrations
  • +
  • Pricing table
  • +
+ See Demo +
+ +
+ +
+ +
+ +
+ +
+
+
+
+
+
+
+
+
+ +
+
+
+ +
+ +
+ +
+

Demo Layout II

+
    +
  • Business, Marketing
  • +
  • Serif headings
  • +
  • Solid colors
  • +
  • Video lightbox
  • +
+ See Demo +
+ +
+ +
+ +
+ +
+ +
+
+
+
+
+
+
+
+
+ +
+
+
+ +
+ +
+ +
+

Demo Layout III

+
    +
  • Service, Marketing
  • +
  • Angled sections
  • +
  • Soft colors
  • +
  • Animations
  • +
+ See Demo +
+ +
+ +
+ +
+ +
+ +
+
+
+
+
+
+
+
+
+ +
+
+
+ +
+ +
+ +
+

Demo Layout IV

+
    +
  • Corporate, Startup
  • +
  • Serif headings
  • +
  • Tiled images
  • +
  • Video lightbox
  • +
+ See Demo +
+ +
+ +
+ +
+ +
+ +
+
+
+
+
+
+
+
+
+ +
+
+
+ +
+ +
+ +
+

Demo Layout V

+
    +
  • SaaS, Software
  • +
  • Tiled images
  • +
  • Animations
  • +
  • Pricing table
  • +
+ See Demo +
+ +
+ +
+ +
+ +
+ +
+
+
+
+
+
+
+
+
+ +
+
+
+ +
+ +
+ +
+

Demo Layout VI

+
    +
  • Landing, Product
  • +
  • SVG icons
  • +
  • Animations
  • +
  • Soft colors
  • +
+ See Demo +
+ +
+ +
+ +
+ +
+ +
+
+
+
+
+
+
+
+
+ +
+
+
+ +
+ +
+ +
+

Demo Layout VII

+
    +
  • Agency, Startup
  • +
  • Illustrations
  • +
  • Soft colors
  • +
  • Project display
  • +
+ See Demo +
+ +
+ +
+ +
+ +
+ +
+
+
+
+
+
+
+
+
+ +
+
+
+ +
+ +
+ +
+

Demo Layout VIII

+
    +
  • Corporate, Business
  • +
  • Animated header
  • +
  • SVG icons
  • +
  • Soft colors
  • +
+ See Demo +
+ +
+ +
+ +
+ +
+ +
+
+
+
+
+
+
+
+
+ +
+
+
+ +
+ +
+ +
+

Demo Layout IX

+
    +
  • SaaS, Software
  • +
  • SVG icons
  • +
  • Serif headings
  • +
  • Testimonials
  • +
+ See Demo +
+ +
+ +
+ +
+ +
+ +
+
+
+
+
+
+
+
+
+ +
+
+
+ +
+ +
+ +
+

Demo Layout X

+
    +
  • Business, Marketing
  • +
  • Animations
  • +
  • Simple testimonials
  • +
  • Tiled images
  • +
+ See Demo +
+ +
+ +
+ +
+ +
+ +
+
+
+
+
+
+
+
+
+ +
+
+
+ +
+ +
+ +
+

Demo Layout XI

+
    +
  • Marketing, Service
  • +
  • Animated header
  • +
  • Tiled images
  • +
  • Soft colors
  • +
+ See Demo +
+ +
+ +
+ +
+ +
+ +
+
+
+
+
+
+
+
+
+ +
+
+
+ +
+ +
+ +
+

Demo Layout XII

+
    +
  • Agency, Studio
  • +
  • SVG icons
  • +
  • Masonry portfolio
  • +
  • Soft colors
  • +
+ See Demo +
+ +
+ +
+ +
+ +
+ +
+
+
+
+
+
+
+
+
+ +
+
+
+ +
+ +
+ +
+

Demo Layout XIII

+
    +
  • Agency, Startup
  • +
  • Animations
  • +
  • Parallax testimonials
  • +
  • Angled sections
  • +
+ See Demo +
+ +
+ +
+ +
+ +
+ +
+
+
+
+
+
+
+
+
+ +
+
+
+ +
+ +
+ +
+

Demo Layout XIV

+
    +
  • Startup, Creative
  • +
  • Image section
  • +
  • Background shapes
  • +
  • Detailed footer
  • +
+ See Demo +
+ +
+ +
+ +
+ +
+ +
+
+
+
+
+
+
+
+
+ +
+
+
+ +
+ +
+ +
+

Demo Layout XV

+
    +
  • Business, Service
  • +
  • Video lightbox
  • +
  • Background shapes
  • +
  • Newsletter
  • +
+ See Demo +
+ +
+ +
+ +
+ +
+ +
+
+
+
+
+
+
+
+
+ +
+
+
+ +
+ +
+ +
+

Demo Layout XVI

+
    +
  • Personal, Portfolio
  • +
  • Shape mask
  • +
  • Detailed portfolio
  • +
  • Contact form
  • +
+ See Demo +
+ +
+ +
+ +
+ +
+ +
+
+
+
+
+
+
+
+
+ +
+
+
+ +
+ +
+ +
+

Demo Layout XVII

+
    +
  • Business, Corporate
  • +
  • Soft colors
  • +
  • Animated header
  • +
  • Content in box
  • +
+ See Demo +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+
+ + + +
+
+ +
+ +
+
+
+
+ +

Save your time and money by choosing Sandbox for your website.

+
+ +
+ +
+
+
+
+

250+

+

UI elements

+
+ +
+

130+

+

Pre-made blocks

+
+ +
+

100+

+

Neatly coded pages

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

Modern Portfolio Layouts

+

Build and manage an eye-catching and impressive portfolio fast and without effort.

+
+
+
+
+
+
+
+

Useful Blog Layouts

+

Create an attractive and stunning journal to tell the world your wonderful stories.

+
+
+
+
+
+
+
+

Cool Features & Elements

+

Sandbox includes amazing features and elements to create rich and attractive pages.

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

13 Headers & 5 Footers

+

Choose from various gorgeous header and footer styles to serve you best for your needs.

+
+
+
+
+
+
+
+

Color & Font Options

+

You can either use the included color and fonts or easily add your own choices.

+
+
+
+
+
+
+
+

Fully Responsive Layout

+

Sandbox adapts to different screen sizes therefore it is compatible with any device.

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

Built with Sass
& Bootstrap 5

+
+ +
+ +

SEO-friendly
Coding

+
+ +
+ +

Valid W3C
HTML5 & CSS3

+
+ +
+ +

Retina-ready
Graphics

+
+ +
+ +

One-page
Layout Option

+
+ +
+ +

Isotope
Filterable Gallery

+
+ +
+ +

Mailchimp
Compatible

+
+ +
+ +

Contact Form
w/o Page Refresh

+
+ +
+ +

Animations
on Page Scroll

+
+ +
+ +

Top-Notch Support
& Free Updates

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

Think unique and be creative. Make a difference with Sandbox.

+

Everything you need to create your next unique and professional website, including impressive and ready-made blocks and pages.

+ Buy Sandbox +
+ +
+ + +
+ +
+ +
+ +
+ + + +
+ + + + + \ No newline at end of file diff --git a/sandbox310/dev/onepage.html b/sandbox310/dev/onepage.html new file mode 100644 index 0000000..5b7f612 --- /dev/null +++ b/sandbox310/dev/onepage.html @@ -0,0 +1,607 @@ + + + + + + + + + + Sandbox - Modern & Multipurpose Bootstrap 5 Template + + + + + + +
+
+ + +
+ +
+
+
+
+
+

Creative. Smart. Awesome.

+

We are an award winning web & mobile design agency that strongly believes in the power of creative ideas.

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

    Marketing

    +
    +
  • +
  • +

    Strategy

    +
    +
  • +
  • +

    Development

    +
    +
  • +
  • +

    Data Analysis

    +
    +
  • +
+ +
+ +
+

The full service we are offering is specifically designed to meet your business needs and projects.

+

Integer posuere erat a ante venenatis dapibus posuere velit aliquet. Morbi leo risus, porta ac consectetur ac, vestibulum at eros. Praesent commodo cursus magna, vel scelerisque nisl consectetur duis mollis commodo.

+
+ +
+ +
+
+ +

Marketing

+

Nulla vitae elit libero, a pharetra augue. Donec id elit non mi porta gravida at eget metus. Cras justo cum sociis natoque magnis.

+
+ +
+ +

Strategy

+

Nulla vitae elit libero, a pharetra augue. Donec id elit non mi porta gravida at eget metus. Cras justo cum sociis natoque magnis.

+
+ +
+ +

Development

+

Nulla vitae elit libero, a pharetra augue. Donec id elit non mi porta gravida at eget metus. Cras justo cum sociis natoque magnis.

+
+ +
+ +

Data Analysis

+

Nulla vitae elit libero, a pharetra augue. Donec id elit non mi porta gravida at eget metus. Cras justo cum sociis natoque magnis.

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

How It Works?

+

Everything you need on creating a business process.

+
+
+ +
+
+

Collect Ideas

+

Nulla vitae elit libero pharetra augue dapibus.

+
+
+
+
+ +
+
+

Data Analysis

+

Vivamus sagittis lacus augue laoreet vel.

+
+
+
+
+ +
+
+

Magic Touch

+

Cras mattis consectetur purus sit amet.

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

Why Choose Us?

+

A few reasons why our valued customers choose us.

+
+
+
+ +
+ +
+
+

Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Praesent commodo cursus magna, vel.

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

Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Praesent commodo cursus magna, vel.

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

Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Praesent commodo cursus magna, vel.

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

Meet the Team

+

Save your time and money by choosing our professional team.

+

Donec id elit non mi porta gravida at eget metus. Morbi leo risus, porta ac consectetur ac, vestibulum at eros tempus porttitor.

+ See All Members +
+ +
+
+
+
+
+ +

Cory Zamora

+
Marketing Specialist
+

Etiam porta sem magna malesuada mollis.

+ + +
+ +
+ +

Coriss Ambady

+
Financial Analyst
+

Aenean eu leo quam. Pellentesque ornare lacinia.

+ + +
+ +
+ +

Nikolas Brooten

+
Sales Manager
+

Donec ornare elit quam porta gravida at eget.

+ + +
+ +
+ +

Jackie Sanders

+
Investment Planner
+

Nullam risus eget urna mollis ornare vel eu leo.

+ + +
+ +
+ +

Tina Geller

+
Assistant Buyer
+

Vivamus sagittis lacus vel augue laoreet rutrum.

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

ā€œVivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Vestibulum ligula porta felis euismod semper. Cras justo odio consectetur.ā€

+
+
+
Coriss Ambady
+

Financial Analyst

+
+
+
+
+ +
+
+

ā€œVivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Vestibulum ligula porta felis euismod semper. Cras justo odio consectetur.ā€

+
+
+
Cory Zamora
+

Marketing Specialist

+
+
+
+
+ +
+
+

ā€œVivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Vestibulum ligula porta felis euismod semper. Cras justo odio consectetur.ā€

+
+
+
Nikolas Brooten
+

Sales Manager

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

Get In Touch

+

Got any questions? Don't hesitate to get in touch.

+
+
+
+
+
+
Address
+
Moonshine St. 14/05 Light City, London
+
+
+
+
+
+
+
+
Phone
+

00 (123) 456 78 90

+
+
+
+
+
+
+
+
E-mail
+

sandbox@email.com

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

Ā© 2021 Sandbox.
All rights reserved.

+ + +
+ +
+ +
+
+

Get in Touch

+
Moonshine St. 14/05 Light City, London, United Kingdom
+ info@email.com
00 (123) 456 78 90 +
+ +
+ +
+
+

Learn More

+ +
+ +
+ +
+
+

Our Newsletter

+

Subscribe to our newsletter to get our news & deals delivered to you.

+ + +
+ +
+ +
+ +
+ +
+
+ + + +
+ + + + + \ No newline at end of file diff --git a/sandbox310/dev/page-loader.html b/sandbox310/dev/page-loader.html new file mode 100644 index 0000000..66eca36 --- /dev/null +++ b/sandbox310/dev/page-loader.html @@ -0,0 +1,827 @@ + + + + + + + + + + Sandbox - Modern & Multipurpose Bootstrap 5 Template + + + + + + +
+
+
+ + +
+ +
+
+
+
+

Page Loader

+

To enable page loader, after body tag, add:

+ <div class="page-loader"></div> +
+ +
+ +
+ +
+ +
+
+
+
+
+
+
+
+
+
+
+

7518

+

Completed Projects

+
+ +
+

3472

+

Satisfied Customers

+
+ +
+

2184

+

Expert Employees

+
+ +
+

4523

+

Awards Won

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

What We Do?

+

The full service we are offering is specifically designed to meet your business needs and projects.

+
+
+
+
+
+
+
+

24/7 Support

+

Nulla vitae elit libero pharetra augue dapibus.

+
+
+
+ +
+
+
+
+
+
+

Secure Payments

+

Vivamus sagittis lacus augue laoreet vel.

+
+
+
+ +
+
+
+
+
+
+

Daily Updates

+

Cras mattis consectetur purus sit amet.

+
+
+
+ +
+
+
+
+
+
+

Market Research

+

Aenean lacinia bibendum nulla sed consectetur.

+
+
+
+ +
+ +
+ +
+ +

How We Do It?

+

We make your spending stress-free for you to have the perfect control.

+
+
01 +

Concept

+

Nulla vitae elit libero elit non porta gravida eget metus cras. Aenean eu leo quam. Pellentesque ornare.

+
+ +
02 +

Prepare

+

Vestibulum id ligula porta felis euismod semper. Sed posuere consectetur est at lobortis.

+
+ +
03 +

Retouch

+

Integer posuere erat a ante venenatis dapibus posuere velit aliquet. Nulla vitae elit libero.

+
+ +
04 +

Finalize

+

Integer posuere erat, consectetur adipiscing elit. Fusce dapibus, tellus ac cursus commodo.

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

Find out everything you need to know about creating a business process model.

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

Our Pricing

+

We offer great prices, premium and quality products for your business.

+

Enjoy a free 30-day trial and experience the full service. No credit card required!

+ See All Prices +
+ +
+
+

Monthly

+
+
+
+
+
+

Yearly (Save 30%)

+
+
+
+
+
+
+
+
+
$19 month
+
$199 year
+
+ +

Premium Plan

+
    +
  • 5 Projects
  • +
  • 100K API Access
  • +
  • 200MB Storage
  • +
  • Weekly Reports
  • +
  • 7/24 Support
  • +
+ Choose Plan +
+ +
+ +
+ + + +
+ +
+ +
+ +
+
+
+
+
+
+
+ +
+
+
+
+
+ +
+
+
+

5000+

+

Satisfied Customers

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

Let’s Talk

+

Let's make something great together. We are trusted by over 5000+ clients. Join them by using our services and grow your business.

+

Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Maecenas faucibus mollis interdum. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus.

+ Join Us +
+ +
+ +
+ +
+ +
+ +
+
+
+
+
+ +

Ā© 2021 Sandbox.
All rights reserved.

+ + +
+ +
+ +
+
+

Get in Touch

+
Moonshine St. 14/05 Light City, London, United Kingdom
+ info@email.com
00 (123) 456 78 90 +
+ +
+ +
+
+

Learn More

+ +
+ +
+ +
+
+

Our Newsletter

+

Subscribe to our newsletter to get our news & deals delivered to you.

+ + +
+ +
+ +
+ +
+ +
+
+ + + +
+ + + + + \ No newline at end of file diff --git a/sandbox310/dev/pricing.html b/sandbox310/dev/pricing.html new file mode 100644 index 0000000..868d964 --- /dev/null +++ b/sandbox310/dev/pricing.html @@ -0,0 +1,965 @@ + + + + + + + + + + Sandbox - Modern & Multipurpose Bootstrap 5 Template + + + + + + +
+
+ + +
+ +
+
+
+
+

Our Pricing

+

We offer great prices, premium products and quality service for your business.

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

Monthly

+
+
+
+
+
+

Yearly

+
+
+
+
+
+ +

Basic Plan

+
+
$9 month
+
$99 year
+
+ +
    +
  • 1 Project
  • +
  • 100K API Access
  • +
  • 100MB Storage
  • +
  • Weekly Reports
  • +
  • 7/24 Support
  • +
+ Choose Plan +
+ +
+ +
+ + + +
+
+
+ +

Corporate Plan

+
+
$49 month
+
$499 year
+
+ +
    +
  • 20 Projects
  • +
  • 300K API Access
  • +
  • 500MB Storage
  • +
  • Weekly Reports
  • +
  • 7/24 Support
  • +
+ Choose Plan +
+ +
+ +
+ +
+ +
+ +
+
+
+
+
+
+
+

24/7 Support

+

Nulla vitae elit libero, a pharetra augue. Donec id elit non mi porta gravida at eget. Fusce dapibus tellus.

+ Learn More +
+
+
+ +
+
+
+
+
+
+

Daily Updates

+

Maecenas faucibus mollis interdum. Vivamus sagittis lacus vel augue laoreet. Sed posuere consectetur.

+ Learn More +
+
+
+ +
+
+
+
+
+
+

Market Research

+

Cras justo odio, dapibus ac facilisis in, egestas eget quam. Praesent commodo cursus magna scelerisque.

+ Learn More +
+
+
+ +
+ +

Pricing FAQ

+

If you don't see an answer to your question, you can send us an email from our contact form.

+
+
+
+
+
+ +
+ +
+
+

Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec sed odio dui. Cras justo odio, dapibus ac facilisis.

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

Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec sed odio dui. Cras justo odio, dapibus ac facilisis.

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

Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec sed odio dui. Cras justo odio, dapibus ac facilisis.

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

Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec sed odio dui. Cras justo odio, dapibus ac facilisis.

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

Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec sed odio dui. Cras justo odio, dapibus ac facilisis.

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

Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec sed odio dui. Cras justo odio, dapibus ac facilisis.

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

Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec sed odio dui. Cras justo odio, dapibus ac facilisis.

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

Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec sed odio dui. Cras justo odio, dapibus ac facilisis.

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

Happy Customers

+

Customer satisfaction is our major goal. See what our customers are saying about us.

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

ā€œVivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Vestibulum id ligula porta felis euismod semper. Cras justo odio dapibus facilisis sociis natoque penatibus.ā€

+
+ +
+
Coriss Ambady
+

Financial Analyst

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

ā€œVivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Vestibulum id ligula porta felis euismod semper. Cras justo odio dapibus facilisis sociis natoque penatibus.ā€

+
+ +
+
Cory Zamora
+

Marketing Specialist

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

ā€œVivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Vestibulum id ligula porta felis euismod semper. Cras justo odio dapibus facilisis sociis natoque penatibus.ā€

+
+ +
+
Nikolas Brooten
+

Sales Manager

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

ā€œVivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Vestibulum id ligula porta felis euismod semper. Cras justo odio dapibus facilisis sociis natoque penatibus.ā€

+
+ +
+
Coriss Ambady
+

Financial Analyst

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

ā€œVivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Vestibulum id ligula porta felis euismod semper. Cras justo odio dapibus facilisis sociis natoque penatibus.ā€

+
+ +
+
Jackie Sanders
+

Investment Planner

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

ā€œVivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Vestibulum id ligula porta felis euismod semper. Cras justo odio dapibus facilisis sociis natoque penatibus.ā€

+
+ +
+
Laura Widerski
+

Sales Specialist

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

Join Our Community

+

We are trusted by over 5000+ clients. Join them by using our services and grow your business.

+ Join Us +
+ +
+ +
+ +
+ +
+ +
+
+
+
+
+ +

Ā© 2021 Sandbox.
All rights reserved.

+ + +
+ +
+ +
+
+

Get in Touch

+
Moonshine St. 14/05 Light City, London, United Kingdom
+ info@email.com
00 (123) 456 78 90 +
+ +
+ +
+
+

Learn More

+ +
+ +
+ +
+
+

Our Newsletter

+

Subscribe to our newsletter to get our news & deals delivered to you.

+ + +
+ +
+ +
+ +
+ +
+
+ + + +
+ + + + + \ No newline at end of file diff --git a/sandbox310/dev/projects.html b/sandbox310/dev/projects.html new file mode 100644 index 0000000..8db9f08 --- /dev/null +++ b/sandbox310/dev/projects.html @@ -0,0 +1,735 @@ + + + + + + + + + + Sandbox - Modern & Multipurpose Bootstrap 5 Template + + + + + + +
+
+ + +
+ +
+
+
+
+

Check out some of our awesome projects with creative ideas.

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

Cras Fermentum Sem

+
+ +
+

Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit.

+ See Project +
+ +
+ +
+ +
+
+
+
+ +
+
+
+
+ +
+
+
+
+ +
+ +
+ +
+
+
+
+
+ +

Vulputate Sollicitudin

+
+ +
+

Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit.

+ See Project +
+ +
+ +
+ +
+
+
+
+ +
+
+
+
+ +
+
+
+
+ +
+ +
+ +
+
+
+
+
+ +

Vulputate Sollicitudin

+
+ +
+

Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit.

+ See Project +
+ +
+ +
+ +
+
+
+
+ +
+
+
+
+ +
+
+
+
+ +
+ +
+ +
+
+
+
+
+ +

Ornare Commodo Mollis

+
+ +
+

Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit.

+ See Project +
+ +
+ +
+ +
+
+
+
+ +
+
+
+
+ +
+
+
+
+ +
+ +
+ +
+
+
+
+
+ +

Porta Tortor Vulputate

+
+ +
+

Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit.

+ See Project +
+ +
+ +
+ +
+
+
+
+ +
+
+
+
+ +
+
+
+
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+
+
+
+
+ +

Ā© 2021 Sandbox.
All rights reserved.

+ + +
+ +
+ +
+
+

Get in Touch

+
Moonshine St. 14/05 Light City, London, United Kingdom
+ info@email.com
00 (123) 456 78 90 +
+ +
+ +
+
+

Learn More

+ +
+ +
+ +
+
+

Our Newsletter

+

Subscribe to our newsletter to get our news & deals delivered to you.

+ + +
+ +
+ +
+ +
+ +
+
+ + + +
+ + + + + \ No newline at end of file diff --git a/sandbox310/dev/projects2.html b/sandbox310/dev/projects2.html new file mode 100644 index 0000000..a351b6a --- /dev/null +++ b/sandbox310/dev/projects2.html @@ -0,0 +1,746 @@ + + + + + + + + + + Sandbox - Modern & Multipurpose Bootstrap 5 Template + + + + + + +
+
+ + +
+ +
+
+
+
+

Projects

+

Check out some of our awesome projects with creative ideas and great design.

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

Cras Fermentum Sem

+
+ +
+

Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit.

+ See Project +
+ +
+ +
+ +
+ +
+ +
+ +
+
+
+
+
+
+
+ +

Mollis Ipsum Mattis

+
+ +
+

Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit. Nullam id dolor id nibh ultricies vehicula.

+ See Project +
+ +
+ +
+ +
+ +
+ +
+ +
+
+
+
+
+
+
+ +

Ipsum Ultricies Cursus

+
+ +
+

Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit.

+ See Project +
+ +
+ +
+ +
+ +
+ +
+ +
+
+
+
+
+
+
+ +

Sollicitudin Ornare Porta

+
+ +
+

Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit.

+ See Project +
+ +
+ +
+ +
+ +
+ +
+ +
+
+
+
+
+
+
+ +

Inceptos Euismod Egestas

+
+ +
+

Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit. Nullam id dolor id nibh ultricies vehicula.

+ See Project +
+ +
+ +
+ +
+ +
+ +
+ +
+
+
+
+
+
+
+ +

Ipsum Mollis Vulputate

+
+ +
+

Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit.

+ See Project +
+ +
+ +
+ +
+ +
+ +
+ +
+
+
+
+
+
+
+ +

Porta Ornare Cras

+
+ +
+

Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit.

+ See Project +
+ +
+ +
+ +
+ +
+ +
+ +
+ + + +
+ +
+ +
+ +
+
+
+
+
+ +

Ā© 2021 Sandbox.
All rights reserved.

+ + +
+ +
+ +
+
+

Get in Touch

+
Moonshine St. 14/05 Light City, London, United Kingdom
+ info@email.com
00 (123) 456 78 90 +
+ +
+ +
+
+

Learn More

+ +
+ +
+ +
+
+

Our Newsletter

+

Subscribe to our newsletter to get our news & deals delivered to you.

+ + +
+ +
+ +
+ +
+ +
+
+ + + +
+ + + + + \ No newline at end of file diff --git a/sandbox310/dev/projects3.html b/sandbox310/dev/projects3.html new file mode 100644 index 0000000..9abb889 --- /dev/null +++ b/sandbox310/dev/projects3.html @@ -0,0 +1,677 @@ + + + + + + + + + + Sandbox - Modern & Multipurpose Bootstrap 5 Template + + + + + + +
+
+ + +
+ +
+
+
+
+

Check out some of our awesome projects with creative ideas.

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

Filter:

+ +
+
+
+
+
+
+ +

Cras Fermentum Sem

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

Mollis Ipsum Mattis

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

Ipsum Ultricies Cursus

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

Sollicitudin Ornare Porta

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

Inceptos Euismod Egestas

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

Ipsum Mollis Vulputate

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

Porta Ornare Cras

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

Vulputate Sollicitudin

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

Magna Tristique Inceptos

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

Ridiculus Elit

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

Ā© 2021 Sandbox.
All rights reserved.

+ + +
+ +
+ +
+
+

Get in Touch

+
Moonshine St. 14/05 Light City, London, United Kingdom
+ info@email.com
00 (123) 456 78 90 +
+ +
+ +
+
+

Learn More

+ +
+ +
+ +
+
+

Our Newsletter

+

Subscribe to our newsletter to get our news & deals delivered to you.

+ + +
+ +
+ +
+ +
+ +
+
+ + + +
+ + + + + \ No newline at end of file diff --git a/sandbox310/dev/projects4.html b/sandbox310/dev/projects4.html new file mode 100644 index 0000000..738e845 --- /dev/null +++ b/sandbox310/dev/projects4.html @@ -0,0 +1,666 @@ + + + + + + + + + + Sandbox - Modern & Multipurpose Bootstrap 5 Template + + + + + + +
+
+ + +
+ +
+
+
+
+

Projects

+

Check out some of our awesome projects with creative ideas and great design.

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

Filter:

+ +
+
+
+
+
+
+ +

Cras Fermentum Sem

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

Mollis Ipsum Mattis

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

Ipsum Ultricies Cursus

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

Inceptos Euismod Egestas

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

Sollicitudin Ornare Porta

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

Ipsum Mollis Vulputate

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

Porta Ornare Cras

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

Vulputate Sollicitudin

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

Magna Tristique Inceptos

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

Ā© 2021 Sandbox.
All rights reserved.

+ + +
+ +
+ +
+
+

Get in Touch

+
Moonshine St. 14/05 Light City, London, United Kingdom
+ info@email.com
00 (123) 456 78 90 +
+ +
+ +
+
+

Learn More

+ +
+ +
+ +
+
+

Our Newsletter

+

Subscribe to our newsletter to get our news & deals delivered to you.

+ + +
+ +
+ +
+ +
+ +
+
+ + + +
+ + + + + \ No newline at end of file diff --git a/sandbox310/dev/services.html b/sandbox310/dev/services.html new file mode 100644 index 0000000..3fa77c6 --- /dev/null +++ b/sandbox310/dev/services.html @@ -0,0 +1,825 @@ + + + + + + + + + + Sandbox - Modern & Multipurpose Bootstrap 5 Template + + + + + + +
+
+ + +
+ +
+
+
+
+

Our Services

+

We are a creative company that focuses on establishing long-term relationships with customers.

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

7518

+

Completed Projects

+
+ +
+

3472

+

Satisfied Customers

+
+ +
+

2184

+

Expert Employees

+
+ +
+

4523

+

Awards Won

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

What We Do?

+

The full service we are offering is specifically designed to meet your business needs and projects.

+
+
+
+
+
+
+
+

24/7 Support

+

Nulla vitae elit libero pharetra augue dapibus.

+
+
+
+ +
+
+
+
+
+
+

Secure Payments

+

Vivamus sagittis lacus augue laoreet vel.

+
+
+
+ +
+
+
+
+
+
+

Daily Updates

+

Cras mattis consectetur purus sit amet.

+
+
+
+ +
+
+
+
+
+
+

Market Research

+

Aenean lacinia bibendum nulla sed consectetur.

+
+
+
+ +
+ +
+ +
+ +

How We Do It?

+

We make your spending stress-free for you to have the perfect control.

+
+
01 +

Concept

+

Nulla vitae elit libero elit non porta gravida eget metus cras. Aenean eu leo quam. Pellentesque ornare.

+
+ +
02 +

Prepare

+

Vestibulum id ligula porta felis euismod semper. Sed posuere consectetur est at lobortis.

+
+ +
03 +

Retouch

+

Integer posuere erat a ante venenatis dapibus posuere velit aliquet. Nulla vitae elit libero.

+
+ +
04 +

Finalize

+

Integer posuere erat, consectetur adipiscing elit. Fusce dapibus, tellus ac cursus commodo.

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

Find out everything you need to know about creating a business process model.

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

Our Pricing

+

We offer great prices, premium and quality products for your business.

+

Enjoy a free 30-day trial and experience the full service. No credit card required!

+ See All Prices +
+ +
+
+

Monthly

+
+
+
+
+
+

Yearly (Save 30%)

+
+
+
+
+
+
+
+
+
$19 month
+
$199 year
+
+ +

Premium Plan

+
    +
  • 5 Projects
  • +
  • 100K API Access
  • +
  • 200MB Storage
  • +
  • Weekly Reports
  • +
  • 7/24 Support
  • +
+ Choose Plan +
+ +
+ +
+ + + +
+ +
+ +
+ +
+
+
+
+
+
+
+ +
+
+
+
+
+ +
+
+
+

5000+

+

Satisfied Customers

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

Let’s Talk

+

Let's make something great together. We are trusted by over 5000+ clients. Join them by using our services and grow your business.

+

Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Maecenas faucibus mollis interdum. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus.

+ Join Us +
+ +
+ +
+ +
+ +
+ +
+
+
+
+
+ +

Ā© 2021 Sandbox.
All rights reserved.

+ + +
+ +
+ +
+
+

Get in Touch

+
Moonshine St. 14/05 Light City, London, United Kingdom
+ info@email.com
00 (123) 456 78 90 +
+ +
+ +
+
+

Learn More

+ +
+ +
+ +
+
+

Our Newsletter

+

Subscribe to our newsletter to get our news & deals delivered to you.

+ + +
+ +
+ +
+ +
+ +
+
+ + + +
+ + + + + \ No newline at end of file diff --git a/sandbox310/dev/services2.html b/sandbox310/dev/services2.html new file mode 100644 index 0000000..c3021c4 --- /dev/null +++ b/sandbox310/dev/services2.html @@ -0,0 +1,865 @@ + + + + + + + + + + Sandbox - Modern & Multipurpose Bootstrap 5 Template + + + + + + +
+
+ + +
+ +
+
+
+
+

Our Services

+

We are a creative company that focuses on establishing long-term relationships with customers.

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

24/7 Support

+

Nulla vitae elit libero, a pharetra augue. Donec id elit non mi porta.

+
+ +
+ +
+ +
+
+
+ +

Secure Payments

+

Nulla vitae elit libero, a pharetra augue. Donec id elit non mi porta.

+
+ +
+ +
+ +
+
+
+ +

Daily Updates

+

Nulla vitae elit libero, a pharetra augue.

+
+ +
+ +
+ +
+
+
+ +

Market Research

+

Nulla vitae elit libero, a pharetra augue. Donec id elit non mi porta gravida at eget.

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

What We Do?

+

The service we offer is specifically designed to meet your needs.

+

Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Maecenas sed diam eget risus varius blandit sit amet non magna. Maecenas faucibus mollis interdum. Praesent commodo cursus magna, vel scelerisque nisl consectetur et.

+ More Details +
+ +
+ +
+ +
+ +
+
+
+
+
+
+
+ +
+
+ +
+ +
+
+

Our Process

+

Find out everything you need to know about creating a business process model

+
+
+

1. Concept

+

Nulla vitae elit libero elit non porta gravida eget metus cras.

+
+ +
+

2. Prepare

+

Nulla vitae elit libero elit non porta gravida eget metus cras.

+
+ +
+

3. Retouch

+

Nulla vitae elit libero elit non porta gravida eget metus cras.

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

We bring rapid solutions to make the life of our customers easier.

+
    +
  • +

    Marketing

    +
    +
  • +
  • +

    Strategy

    +
    +
  • +
  • +

    Development

    +
    +
  • +
  • +

    Data Analysis

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

We make your spending stress-free for you to have the perfect control.

+

Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Praesent commodo cursus magna, vel scelerisque nisl consectetur et.

+
+
+
    +
  • Aenean quam ornare. Curabitur blandit.
  • +
  • Nullam quis risus eget urna mollis ornare.
  • +
+
+ +
+
    +
  • Etiam porta euismod malesuada mollis.
  • +
  • Vivamus sagittis lacus vel augue rutrum.
  • +
+
+ +
+ +
+ +
+ +
+ +
+ +
+
+
+
+

Our Pricing

+

We offer great prices, premium products and quality service for your business.

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

Monthly

+
+
+
+
+
+

Yearly

+
+
+
+
+
+ +

Basic Plan

+
+
$9 month
+
$99 year
+
+ +
    +
  • 1 Project
  • +
  • 100K API Access
  • +
  • 100MB Storage
  • +
  • Weekly Reports
  • +
  • 7/24 Support
  • +
+ Choose Plan +
+ +
+ +
+ + + +
+
+
+ +

Corporate Plan

+
+
$49 month
+
$499 year
+
+ +
    +
  • 20 Projects
  • +
  • 300K API Access
  • +
  • 500MB Storage
  • +
  • Weekly Reports
  • +
  • 7/24 Support
  • +
+ Choose Plan +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+
+
+
+

Join Our Community

+

We are trusted by over 5000+ clients. Join them now and grow your business.

+
+ +
+ +
+
+
+
+

7518

+

Completed Projects

+
+ +
+

5472

+

Satisfied Customers

+
+ +
+

2184

+

Expert Employees

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

Ā© 2021 Sandbox.
All rights reserved.

+ + +
+ +
+ +
+
+

Get in Touch

+
Moonshine St. 14/05 Light City, London, United Kingdom
+ info@email.com
00 (123) 456 78 90 +
+ +
+ +
+
+

Learn More

+ +
+ +
+ +
+
+

Our Newsletter

+

Subscribe to our newsletter to get our news & deals delivered to you.

+ + +
+ +
+ +
+ +
+ +
+
+ + + +
+ + + + + \ No newline at end of file diff --git a/sandbox310/dev/shop-cart.html b/sandbox310/dev/shop-cart.html new file mode 100644 index 0000000..6152cda --- /dev/null +++ b/sandbox310/dev/shop-cart.html @@ -0,0 +1,852 @@ + + + + + + + + + + Sandbox - Modern & Multipurpose Bootstrap 5 Template + + + + + + +
+
+ + +
+
+

Your Cart

+ +
+
+
+
+
+
+
+

Nike Air Sneakers

+

$55.00 $45.99

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

Colorful Sneakers

+

$45.00

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

Polaroid Camera

+

$45.00

+
+ +
+ +
+
+
+
+ +
+ + + +
+ +
+ + + +
+ +
+
+ + +
+ +
+ +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
Product
+
+
Price
+
+
Quantity
+
+
Total
+
+
+
+

Nike Air Sneakers

+
Color: Black
+
Size: 43
+
+
+

$55.00 $45.99

+
+
+ +
+ +
+

$45.99

+
+ +
+
+
+

Colorful Sneakers

+
Color: Misc
+
Size: 43
+
+
+

$45.00

+
+
+ +
+ +
+

$45.00

+
+ +
+
+
+

Polaroid Camera

+
Color: Black
+
+
+

$45.00

+
+
+ +
+ +
+

$45.00

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

Order Summary

+
+ + + + + + + + + + + + + + + + + + + +
Subtotal +

$135.99

+
Discount (5%) +

-$6.8

+
Shipping +

$10

+
Grand Total +

$152.79

+
+
+ Proceed to Checkout +
+ +
+ +
+ +
+ +
+
+
+
+
+
+ +
+
+

Free Shipping

+

Duis mollis gravida commodo id luctus erat porttitor ligula, eget lacinia odio sem.

+
+
+
+ +
+
+
+ +
+
+

30 Days Return

+

Duis mollis gravida commodo id luctus erat porttitor ligula, eget lacinia odio sem.

+
+
+
+ +
+
+
+ +
+
+

2-Years Warranty

+

Duis mollis gravida commodo id luctus erat porttitor ligula, eget lacinia odio sem.

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

Ā© 2021 Sandbox.
All rights reserved.

+ + +
+ +
+ +
+
+

Get in Touch

+
Moonshine St. 14/05 Light City, London, United Kingdom
+ info@email.com
00 (123) 456 78 90 +
+ +
+ +
+
+

Learn More

+ +
+ +
+ +
+
+

Our Newsletter

+

Subscribe to our newsletter to get our news & deals delivered to you.

+ + +
+ +
+ +
+ +
+ +
+
+ + + +
+ + + + + \ No newline at end of file diff --git a/sandbox310/dev/shop-checkout.html b/sandbox310/dev/shop-checkout.html new file mode 100644 index 0000000..3a9d639 --- /dev/null +++ b/sandbox310/dev/shop-checkout.html @@ -0,0 +1,987 @@ + + + + + + + + + + Sandbox - Modern & Multipurpose Bootstrap 5 Template + + + + + + +
+
+ + +
+
+

Your Cart

+ +
+
+
+
+
+
+
+

Nike Air Sneakers

+

$55.00 $45.99

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

Colorful Sneakers

+

$45.00

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

Polaroid Camera

+

$45.00

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

Billing address

+
+
+
+
+ + +
Valid first name is required.
+
+
+
+
+ + +
Valid last name is required.
+
+
+
+
+ + +
Please enter a valid email address for shipping updates.
+
+
+
+
+ + +
Please enter your shipping address.
+
+
+
+
+ + +
+
+
+
+ +
Please select a valid country.
+
+
+
+
+ +
Please provide a valid state.
+
+
+
+
+ + +
Zip code required.
+
+
+
+
+
+ + +
+
+ + +
+
+

Payment

+
+
+ + +
+
+ + +
+
+ + +
+
+
+
+
+
+
+ + +
Credit card number is required
+
+
+
+
+ + +
Name on card is required
+
+
+
+
+ + +
Expiration date required
+
+
+
+
+ + +
Security code required
+
+
+
+
+
+
+
+ +
+

Order Summary

+
+
+
+
+
+

Nike Air Sneakers

+
Color: Black
+
Size: 43
+
+
+
+

$45.99

+
+
+ +
+
+
+
+

Colorful Sneakers

+
Color: Misc
+
Size: 43
+
+
+
+

$45.00

+
+
+ +
+
+
+
+

Polaroid Camera

+
Color: Black
+
+
+
+

$45.00

+
+
+ +
+ +
+

Shipping

+
+
+ + + Shipment may take 5-6 business days +
+
+ + + Shipment may take 2-3 business days +
+
+
+ + + + + + + + + + + + + + + + + + + +
Subtotal +

$135.99

+
Discount (5%) +

-$6.8

+
Shipping +

$10

+
Grand Total +

$152.79

+
+
+ Place Order +
+ +
+ +
+ +
+ + + + + +
+
+
+
+
+
+ +
+
+

Free Shipping

+

Duis mollis gravida commodo id luctus erat porttitor ligula, eget lacinia odio sem.

+
+
+
+ +
+
+
+ +
+
+

30 Days Return

+

Duis mollis gravida commodo id luctus erat porttitor ligula, eget lacinia odio sem.

+
+
+
+ +
+
+
+ +
+
+

2-Years Warranty

+

Duis mollis gravida commodo id luctus erat porttitor ligula, eget lacinia odio sem.

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

Ā© 2021 Sandbox.
All rights reserved.

+ + +
+ +
+ +
+
+

Get in Touch

+
Moonshine St. 14/05 Light City, London, United Kingdom
+ info@email.com
00 (123) 456 78 90 +
+ +
+ +
+
+

Learn More

+ +
+ +
+ +
+
+

Our Newsletter

+

Subscribe to our newsletter to get our news & deals delivered to you.

+ + +
+ +
+ +
+ +
+ +
+
+ + + +
+ + + + + \ No newline at end of file diff --git a/sandbox310/dev/shop-product.html b/sandbox310/dev/shop-product.html new file mode 100644 index 0000000..6f3ac5c --- /dev/null +++ b/sandbox310/dev/shop-product.html @@ -0,0 +1,1161 @@ + + + + + + + + + + Sandbox - Modern & Multipurpose Bootstrap 5 Template + + + + + + +
+
+ + +
+
+

Your Cart

+ +
+
+
+
+
+
+
+

Nike Air Sneakers

+

$55.00 $45.99

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

Colorful Sneakers

+

$45.00

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

Polaroid Camera

+

$45.00

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

Curology Skincare Set

+

$55.00

+ (3 Reviews) +
+ +

Cum sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus mus. Duis mollis, est non commodo luctus. Nulla vitae elit libero pharetra augue. Donec id elit non mi porta gravida at eget metus.

+
+
+ Choose a size + + + + + +
+
+ Choose a color + + + + + +
+
+
+
+
+ +
+ +
+
+ +
+
+ +
+
+ +
+ +
+ +
+ +
+ + + +
+
+

Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Morbi leo risus, porta ac consectetur ac, vestibulum at eros. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Sed posuere consectetur est at lobortis. Sed posuere consectetur est at lobortis. Nulla vitae elit libero, a pharetra augue. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Nullam id dolor id nibh ultricies vehicula ut id elit. Maecenas sed diam eget risus varius blandit sit amet non magna. Integer posuere erat a ante venenatis dapibus posuere velit aliquet. Nullam quis risus eget urna mollis ornare vel eu leo. Vestibulum id ligula porta felis euismod semper.

+

Vestibulum id ligula porta felis euismod semper. Nullam id dolor id nibh ultricies vehicula ut id elit. Maecenas faucibus mollis interdum. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.

+
+ +
+

Integer posuere erat a ante venenatis dapibus posuere velit aliquet. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Morbi leo risus, porta ac consectetur ac, vestibulum at eros. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Lorem ipsum dolor sit amet, consectetur adipiscing elit.

+
+ +
+

Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Integer posuere erat a ante venenatis dapibus posuere velit aliquet. Cras mattis consectetur purus sit amet fermentum. Maecenas sed diam eget risus varius blandit sit amet non magna. Sed posuere consectetur est at lobortis. Curabitur blandit tempus porttitor. Aenean lacinia bibendum nulla sed consectetur. Nulla vitae elit libero, a pharetra augue. Morbi leo risus, porta ac consectetur ac, vestibulum at eros. Praesent commodo cursus magna, vel scelerisque nisl consectetur et.

+
+ +
+ +
+ +
+ +
+
+

You Might Also Like

+
+
+
+
+
+ + + + Add to Cart + Sale! +
+
+
+ + +
+

Nike Air Sneakers

+

$55.00 $45.00

+
+ +
+ +
+
+ + + + Add to Cart +
+
+
+ + +
+

Apple Watch

+

$55.00

+
+ +
+ +
+
+ + + + Add to Cart + New! +
+
+
+ +
+

Headphones

+

$55.00

+
+ +
+ +
+
+ + + + Add to Cart +
+
+
+ + +
+

Colorful Sneakers

+

$55.00

+
+ +
+ +
+
+ + + + Add to Cart +
+
+
+ + +
+

Polaroid Camera

+

$55.00

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

Ratings & Reviews

+
+ +
+
+ +
+ +
+ +
+ +
+
    +
  1. +
    +
    +
    +
    Connor Gibson
    + + +
    + +
    + +
    + +
    Highly recommended!
    +
    +

    Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit. Sed posuere consectetur est at lobortis integer posuere erat ante.

    +
    +

    Was this review helpful?

    +
    + 5 + 5 +
    +
    +
  2. +
  3. +
    +
    +
    +
    Nikolas Brooten
    + + +
    + +
    + +
    + +
    Great product
    +
    +

    Quisque tristique tincidunt metus non aliquam. Quisque ac risus sit amet quam sollicitudin vestibulum vitae malesuada libero. Mauris magna elit, suscipit non ornare et, blandit a tellus. Pellentesque dignissim ornare faucibus mollis.

    +
    +

    Was this review helpful?

    +
    + 5 + 5 +
    +
    +
  4. +
  5. +
    +
    +
    +
    Pearce Frye
    + + +
    + +
    + +
    + +
    Could be better
    +
    +

    Cras mattis consectetur purus sit amet fermentum. Integer posuere erat a ante venenatis dapibus posuere velit aliquet. Etiam porta sem malesuada magna mollis.

    +
    +

    Was this review helpful?

    +
    + 5 + 5 +
    +
    +
  6. +
  7. +
    +
    +
    +
    Nikolas Brooten
    + + +
    + +
    + +
    + +
    I'm going to return it
    +
    +

    Nullam id dolor id nibh ultricies vehicula ut id. Cras mattis consectetur purus sit amet fermentum. Aenean eu leo quam. Pellentesque ornare sem lacinia aenean bibendum nulla consectetur.

    +
    +

    Was this review helpful?

    +
    + 5 + 5 +
    +
    +
  8. +
  9. +
    +
    +
    +
    Lou Bloxham
    + + +
    + +
    + +
    + +
    +

    Sed posuere consectetur est at lobortis. Vestibulum id ligula porta felis euismod semper. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.

    +
    +

    Was this review helpful?

    +
    + 5 + 5 +
    +
    +
  10. +
+
+ + + +
+ +
+ +
+ +
+ +
+
+
+
+
+
+ +
+
+

Free Shipping

+

Duis mollis gravida commodo id luctus erat porttitor ligula, eget lacinia odio sem.

+
+
+
+ +
+
+
+ +
+
+

30 Days Return

+

Duis mollis gravida commodo id luctus erat porttitor ligula, eget lacinia odio sem.

+
+
+
+ +
+
+
+ +
+
+

2-Years Warranty

+

Duis mollis gravida commodo id luctus erat porttitor ligula, eget lacinia odio sem.

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

Ā© 2021 Sandbox.
All rights reserved.

+ + +
+ +
+ +
+
+

Get in Touch

+
Moonshine St. 14/05 Light City, London, United Kingdom
+ info@email.com
00 (123) 456 78 90 +
+ +
+ +
+
+

Learn More

+ +
+ +
+ +
+
+

Our Newsletter

+

Subscribe to our newsletter to get our news & deals delivered to you.

+ + +
+ +
+ +
+ +
+ +
+
+ + + +
+ + + + + \ No newline at end of file diff --git a/sandbox310/dev/shop.html b/sandbox310/dev/shop.html new file mode 100644 index 0000000..99d894d --- /dev/null +++ b/sandbox310/dev/shop.html @@ -0,0 +1,893 @@ + + + + + + + + + + Sandbox - Modern & Multipurpose Bootstrap 5 Template + + + + + + +
+
+ + +
+
+

Your Cart

+ +
+
+
+
+
+
+
+

Nike Air Sneakers

+

$55.00 $45.99

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

Colorful Sneakers

+

$45.00

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

Polaroid Camera

+

$45.00

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

Shop Layout

+

Integer posuere erat a ante venenatis dapibus.

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

New Arrivals

+ + +
+ +
+
+ +
+ +
+ +
+ +
+
+
+
+ + + + Add to Cart + Sale! +
+
+
+ + +
+

Nike Air Sneakers

+

$55.00 $45.00

+
+ +
+ +
+
+ + + + Add to Cart +
+
+
+ + +
+

Apple Watch

+

$55.00

+
+ +
+ +
+
+ + + + Add to Cart + New! +
+
+
+ +
+

Headphones

+

$55.00

+
+ +
+ +
+
+ + + + Add to Cart +
+
+
+ + +
+

Colorful Sneakers

+

$55.00

+
+ +
+ +
+
+ + + + Add to Cart +
+
+
+ + +
+

Polaroid Camera

+

$55.00

+
+ +
+ +
+
+ + + + Add to Cart +
+
+
+ + +
+

Curology Cleanser

+

$55.00

+
+ +
+ +
+
+ + + + Add to Cart +
+
+
+ + +
+

Q&Q Wall Clock

+

$55.00

+
+ +
+ +
+
+ + + + Add to Cart +
+
+
+ +
+

Earphones

+

$55.00

+
+ +
+ +
+
+ + + + Add to Cart +
+
+
+ + +
+

Apple Watch Milano Loop

+

$55.00

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

Free Shipping

+

Duis mollis gravida commodo id luctus erat porttitor ligula, eget lacinia odio sem.

+
+
+
+ +
+
+
+ +
+
+

30 Days Return

+

Duis mollis gravida commodo id luctus erat porttitor ligula, eget lacinia odio sem.

+
+
+
+ +
+
+
+ +
+
+

2-Years Warranty

+

Duis mollis gravida commodo id luctus erat porttitor ligula, eget lacinia odio sem.

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

Ā© 2021 Sandbox.
All rights reserved.

+ + +
+ +
+ +
+
+

Get in Touch

+
Moonshine St. 14/05 Light City, London, United Kingdom
+ info@email.com
00 (123) 456 78 90 +
+ +
+ +
+
+

Learn More

+ +
+ +
+ +
+
+

Our Newsletter

+

Subscribe to our newsletter to get our news & deals delivered to you.

+ + +
+ +
+ +
+ +
+ +
+
+ + + +
+ + + + + \ No newline at end of file diff --git a/sandbox310/dev/shop2.html b/sandbox310/dev/shop2.html new file mode 100644 index 0000000..4107f91 --- /dev/null +++ b/sandbox310/dev/shop2.html @@ -0,0 +1,1044 @@ + + + + + + + + + + Sandbox - Modern & Multipurpose Bootstrap 5 Template + + + + + + +
+
+ + +
+
+

Your Cart

+ +
+
+
+
+
+
+
+

Nike Air Sneakers

+

$55.00 $45.99

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

Colorful Sneakers

+

$45.00

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

Polaroid Camera

+

$45.00

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

New Arrivals

+

Showing 1–9 of 30 results

+
+ +
+
+ +
+ +
+ +
+ +
+
+
+
+ + + + Add to Cart + Sale! +
+
+
+ + +
+

Nike Air Sneakers

+

$55.00 $45.00

+
+ +
+ +
+
+ + + + Add to Cart +
+
+
+ + +
+

Apple Watch

+

$55.00

+
+ +
+ +
+
+ + + + Add to Cart + New! +
+
+
+ +
+

Headphones

+

$55.00

+
+ +
+ +
+
+ + + + Add to Cart +
+
+
+ + +
+

Colorful Sneakers

+

$55.00

+
+ +
+ +
+
+ + + + Add to Cart +
+
+
+ + +
+

Polaroid Camera

+

$55.00

+
+ +
+ +
+
+ + + + Add to Cart +
+
+
+ + +
+

Curology Cleanser

+

$55.00

+
+ +
+ +
+
+ + + + Add to Cart +
+
+
+ + +
+

Q&Q Wall Clock

+

$55.00

+
+ +
+ +
+
+ + + + Add to Cart +
+
+
+ +
+

Earphones

+

$55.00

+
+ +
+ +
+
+ + + + Add to Cart +
+
+
+ + +
+

Apple Watch Milano Loop

+

$55.00

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

Free Shipping

+

Duis mollis gravida commodo id luctus erat porttitor ligula, eget lacinia odio sem.

+
+
+
+ +
+
+
+ +
+
+

30 Days Return

+

Duis mollis gravida commodo id luctus erat porttitor ligula, eget lacinia odio sem.

+
+
+
+ +
+
+
+ +
+
+

2-Years Warranty

+

Duis mollis gravida commodo id luctus erat porttitor ligula, eget lacinia odio sem.

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

Ā© 2021 Sandbox.
All rights reserved.

+ + +
+ +
+ +
+
+

Get in Touch

+
Moonshine St. 14/05 Light City, London, United Kingdom
+ info@email.com
00 (123) 456 78 90 +
+ +
+ +
+
+

Learn More

+ +
+ +
+ +
+
+

Our Newsletter

+

Subscribe to our newsletter to get our news & deals delivered to you.

+ + +
+ +
+ +
+ +
+ +
+
+ + + +
+ + + + + \ No newline at end of file diff --git a/sandbox310/dev/signin.html b/sandbox310/dev/signin.html new file mode 100644 index 0000000..1dcfb76 --- /dev/null +++ b/sandbox310/dev/signin.html @@ -0,0 +1,584 @@ + + + + + + + + + + Sandbox - Modern & Multipurpose Bootstrap 5 Template + + + + + + +
+
+ + +
+ +
+
+
+
+

Sign In

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

Welcome Back

+

Fill your email and password to sign in.

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

Forgot Password?

+

Don't have an account? Sign up

+
or
+ + +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+
+
+
+
+ +

Ā© 2021 Sandbox.
All rights reserved.

+ + +
+ +
+ +
+
+

Get in Touch

+
Moonshine St. 14/05 Light City, London, United Kingdom
+ info@email.com
00 (123) 456 78 90 +
+ +
+ +
+
+

Learn More

+ +
+ +
+ +
+
+

Our Newsletter

+

Subscribe to our newsletter to get our news & deals delivered to you.

+ + +
+ +
+ +
+ +
+ +
+
+ + + +
+ + + + + \ No newline at end of file diff --git a/sandbox310/dev/signin2.html b/sandbox310/dev/signin2.html new file mode 100644 index 0000000..806d433 --- /dev/null +++ b/sandbox310/dev/signin2.html @@ -0,0 +1,594 @@ + + + + + + + + + + Sandbox - Modern & Multipurpose Bootstrap 5 Template + + + + + + +
+
+ + +
+ +
+
+
+
+

Sign In

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

Welcome Back

+

Fill your email and password to sign in.

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

Forgot Password?

+

Don't have an account? Sign up

+
or
+ + +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+
+
+
+
+ +

Ā© 2021 Sandbox.
All rights reserved.

+ + +
+ +
+ +
+
+

Get in Touch

+
Moonshine St. 14/05 Light City, London, United Kingdom
+ info@email.com
00 (123) 456 78 90 +
+ +
+ +
+
+

Learn More

+ +
+ +
+ +
+
+

Our Newsletter

+

Subscribe to our newsletter to get our news & deals delivered to you.

+ + +
+ +
+ +
+ +
+ +
+
+ + + +
+ + + + + \ No newline at end of file diff --git a/sandbox310/dev/signup.html b/sandbox310/dev/signup.html new file mode 100644 index 0000000..ac582c7 --- /dev/null +++ b/sandbox310/dev/signup.html @@ -0,0 +1,592 @@ + + + + + + + + + + Sandbox - Modern & Multipurpose Bootstrap 5 Template + + + + + + +
+
+ + +
+ +
+
+
+
+

Sign Up

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

Sign up to Sandbox

+

Registration takes less than a minute.

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

Already have an account? Sign in

+
or
+ + +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+
+
+
+
+ +

Ā© 2021 Sandbox.
All rights reserved.

+ + +
+ +
+ +
+
+

Get in Touch

+
Moonshine St. 14/05 Light City, London, United Kingdom
+ info@email.com
00 (123) 456 78 90 +
+ +
+ +
+
+

Learn More

+ +
+ +
+ +
+
+

Our Newsletter

+

Subscribe to our newsletter to get our news & deals delivered to you.

+ + +
+ +
+ +
+ +
+ +
+
+ + + +
+ + + + + \ No newline at end of file diff --git a/sandbox310/dev/signup2.html b/sandbox310/dev/signup2.html new file mode 100644 index 0000000..557628b --- /dev/null +++ b/sandbox310/dev/signup2.html @@ -0,0 +1,602 @@ + + + + + + + + + + Sandbox - Modern & Multipurpose Bootstrap 5 Template + + + + + + +
+
+ + +
+ +
+
+
+
+

Sign Up

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

Sign up to Sandbox

+

Registration takes less than a minute.

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

Already have an account? Sign in

+
or
+ + +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+
+
+
+
+ +

Ā© 2021 Sandbox.
All rights reserved.

+ + +
+ +
+ +
+
+

Get in Touch

+
Moonshine St. 14/05 Light City, London, United Kingdom
+ info@email.com
00 (123) 456 78 90 +
+ +
+ +
+
+

Learn More

+ +
+ +
+ +
+
+

Our Newsletter

+

Subscribe to our newsletter to get our news & deals delivered to you.

+ + +
+ +
+ +
+ +
+ +
+
+ + + +
+ + + + + \ No newline at end of file diff --git a/sandbox310/dev/single-project.html b/sandbox310/dev/single-project.html new file mode 100644 index 0000000..d27cad4 --- /dev/null +++ b/sandbox310/dev/single-project.html @@ -0,0 +1,644 @@ + + + + + + + + + + Sandbox - Modern & Multipurpose Bootstrap 5 Template + + + + + + +
+
+ + +
+ +
+
+
+
+
+ + +

Commodo Dolor Bibendum Parturient Cursus Mollis

+

Integer posuere erat a ante venenatis dapibus posuere. Maecenas faucibus mollis interdum.

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

About the Project

+
+
+

Cras mattis consectetur purus sit amet fermentum. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Integer posuere erat a ante venenatis. Etiam porta sem malesuada magna mollis euismod. Aenean lacinia bibendum.

+

Donec id elit non mi porta gravida at eget metus. Cras mattis consectetur purus sit amet fermentum. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Donec sed odio dui. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Sed posuere consectetur est at lobortis. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor.

+
+ +
+
    +
  • +
    Date
    +

    17 May 2018

    +
  • +
  • +
    Client Name
    +

    Cool House

    +
  • +
+ See Project +
+ +
+ +
+ +
+ +
+
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+ +
+
+

Quam Mollis Bibendum

+

Maecenas sed diam eget risus varius blandit sit amet non magna. Donec ullamcorper nulla non metus auctor fringilla. Cras mattis consectetur purus sit amet fermentum. Aenean lacinia bibendum nulla sed consectetur. Curabitur blandit tempus porttitor. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Donec id elit non mi porta gravida at eget metus. Donec id elit non mi porta gravida at eget metus. Cras mattis consectetur purus sit amet fermentum.

+

Aenean lacinia bibendum nulla sed consectetur. Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit. Maecenas faucibus mollis interdum. Maecenas sed diam eget risus varius blandit sit amet non magna. Morbi leo risus, porta ac consectetur ac, vestibulum at eros. Nulla vitae elit libero, a pharetra augue. Maecenas faucibus mollis interdum etiam porta.

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

Ā© 2021 Sandbox.
All rights reserved.

+ + +
+ +
+ +
+
+

Get in Touch

+
Moonshine St. 14/05 Light City, London, United Kingdom
+ info@email.com
00 (123) 456 78 90 +
+ +
+ +
+
+

Learn More

+ +
+ +
+ +
+
+

Our Newsletter

+

Subscribe to our newsletter to get our news & deals delivered to you.

+ + +
+ +
+ +
+ +
+ +
+
+ + + +
+ + + + + \ No newline at end of file diff --git a/sandbox310/dev/single-project2.html b/sandbox310/dev/single-project2.html new file mode 100644 index 0000000..1ecf5b4 --- /dev/null +++ b/sandbox310/dev/single-project2.html @@ -0,0 +1,654 @@ + + + + + + + + + + Sandbox - Modern & Multipurpose Bootstrap 5 Template + + + + + + +
+
+ + +
+ +
+
+
+
+
+ + +

Commodo Dolor Bibendum Parturient Cursus Mollis

+

Integer posuere erat a ante venenatis dapibus posuere. Maecenas faucibus mollis interdum.

+
+ +
+ +
+ +
+ +
+ +
+
+
+
+
+
+
+
+ +
+
+
Vivamus sagittis lacus augue
+
+ +
+ +
+ +
+ +
+
+
Vivamus sagittis lacus augue
+
+ +
+ +
+ +
+ +
+
+
Vivamus sagittis lacus augue
+
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+
+

About the Project

+
+
+

Cras mattis consectetur purus sit amet fermentum. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Integer posuere erat a ante venenatis. Etiam porta sem malesuada magna mollis euismod. Aenean lacinia bibendum.

+

Donec id elit non mi porta gravida at eget metus. Cras mattis consectetur purus sit amet fermentum. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Donec sed odio dui. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Sed posuere consectetur est at lobortis. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor.

+
+ +
+
    +
  • +
    Date
    +

    17 May 2018

    +
  • +
  • +
    Client Name
    +

    Cool House

    +
  • +
+ See Project +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+
+
+ + + + +
+ +
+ +
+ +
+ +
+
+
+
+
+ +

Ā© 2021 Sandbox.
All rights reserved.

+ + +
+ +
+ +
+
+

Get in Touch

+
Moonshine St. 14/05 Light City, London, United Kingdom
+ info@email.com
00 (123) 456 78 90 +
+ +
+ +
+
+

Learn More

+ +
+ +
+ +
+
+

Our Newsletter

+

Subscribe to our newsletter to get our news & deals delivered to you.

+ + +
+ +
+ +
+ +
+ +
+
+ + + +
+ + + + + \ No newline at end of file diff --git a/sandbox310/dev/single-project3.html b/sandbox310/dev/single-project3.html new file mode 100644 index 0000000..91853e6 --- /dev/null +++ b/sandbox310/dev/single-project3.html @@ -0,0 +1,650 @@ + + + + + + + + + + Sandbox - Modern & Multipurpose Bootstrap 5 Template + + + + + + +
+
+ + +
+ +
+
+
+
+
+ + +

Commodo Dolor Bibendum Parturient Cursus Mollis

+

Integer posuere erat a ante venenatis dapibus posuere. Maecenas faucibus mollis interdum.

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

About the Project

+
+
+

Cras mattis consectetur purus sit amet fermentum. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Integer posuere erat a ante venenatis. Etiam porta sem malesuada magna mollis euismod. Aenean lacinia bibendum.

+

Donec id elit non mi porta gravida at eget metus. Cras mattis consectetur purus sit amet fermentum. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Donec sed odio dui. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Sed posuere consectetur est at lobortis. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor.

+
+ +
+
    +
  • +
    Date
    +

    17 May 2018

    +
  • +
  • +
    Client Name
    +

    Cool House

    +
  • +
+ See Project +
+ +
+ +
+ +
+ +
+ +
+ +
+
+
+
+
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+ +
+ +
+ +
+ +
+ +
+
+
+ + + + +
+ +
+ +
+ +
+ +
+
+
+
+
+ +

Ā© 2021 Sandbox.
All rights reserved.

+ + +
+ +
+ +
+
+

Get in Touch

+
Moonshine St. 14/05 Light City, London, United Kingdom
+ info@email.com
00 (123) 456 78 90 +
+ +
+ +
+
+

Learn More

+ +
+ +
+ +
+
+

Our Newsletter

+

Subscribe to our newsletter to get our news & deals delivered to you.

+ + +
+ +
+ +
+ +
+ +
+
+ + + +
+ + + + + \ No newline at end of file diff --git a/sandbox310/dev/terms.html b/sandbox310/dev/terms.html new file mode 100644 index 0000000..79c3c25 --- /dev/null +++ b/sandbox310/dev/terms.html @@ -0,0 +1,658 @@ + + + + + + + + + + Sandbox - Modern & Multipurpose Bootstrap 5 Template + + + + + + +
+
+ + +
+ +
+
+
+
+

Terms and Conditions

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

1. Terms and Conditions

+

Donec id elit non mi porta gravida at eget metus. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Cras mattis consectetur purus sit amet fermentum. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla vitae elit libero, a pharetra augue. Nullam quis risus eget urna mollis ornare vel eu leo. Cras justo odio, dapibus ac facilisis in, egestas eget quam.

+

Sed posuere consectetur est at lobortis. Maecenas faucibus mollis interdum. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec id elit non mi porta gravida at eget metus. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.

+

Nullam quis risus eget urna mollis ornare vel eu leo. Maecenas sed diam eget risus varius blandit sit amet non magna. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Nullam id dolor id nibh ultricies vehicula ut id elit. Donec ullamcorper nulla non metus auctor fringilla. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam porta sem malesuada magna mollis euismod. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Nulla vitae elit libero, a pharetra augue. Curabitur blandit tempus porttitor. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Aenean eu leo quam. Pellentesque ornare sem.

+
    +
  • Aenean eu leo quam ornare curabitur blandit tempus.
  • +
  • Nullam quis risus eget urna mollis ornare donec elit.
  • +
  • Etiam porta sem malesuada magna mollis euismod.
  • +
  • Fermentum massa vivamus faucibus amet euismod.
  • +
+
+ +
+ +
+
+
+
+

2. Privacy Policy

+

Donec id elit non mi porta gravida at eget metus. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Cras mattis consectetur purus sit amet fermentum. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla vitae elit libero, a pharetra augue. Nullam quis risus eget urna mollis ornare vel eu leo. Cras justo odio, dapibus ac facilisis in, egestas eget quam.

+

Sed posuere consectetur est at lobortis. Maecenas faucibus mollis interdum. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec id elit non mi porta gravida at eget metus. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.

+
    +
  • Aenean eu leo quam ornare curabitur blandit tempus.
  • +
  • Nullam quis risus eget urna mollis ornare donec elit.
  • +
  • Etiam porta sem malesuada magna mollis euismod.
  • +
  • Fermentum massa vivamus faucibus amet euismod.
  • +
+

Nullam quis risus eget urna mollis ornare vel eu leo. Maecenas sed diam eget risus varius blandit sit amet non magna. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Nullam id dolor id nibh ultricies vehicula ut id elit. Donec ullamcorper nulla non metus auctor fringilla. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam porta sem malesuada magna mollis euismod. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Nulla vitae elit libero, a pharetra augue. Curabitur blandit tempus porttitor. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Aenean eu leo quam. Pellentesque ornare sem.

+
+ +
+ +
+
+
+
+

3. User Policy

+

Donec id elit non mi porta gravida at eget metus. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Cras mattis consectetur purus sit amet fermentum. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla vitae elit libero, a pharetra augue. Nullam quis risus eget urna mollis ornare vel eu leo. Cras justo odio, dapibus ac facilisis in, egestas eget quam.

+

Sed posuere consectetur est at lobortis. Maecenas faucibus mollis interdum. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec id elit non mi porta gravida at eget metus. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.

+

Nullam quis risus eget urna mollis ornare vel eu leo. Maecenas sed diam eget risus varius blandit sit amet non magna. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Nullam id dolor id nibh ultricies vehicula ut id elit. Donec ullamcorper nulla non metus auctor fringilla. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam porta sem malesuada magna mollis euismod. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Nulla vitae elit libero, a pharetra augue. Curabitur blandit tempus porttitor. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Aenean eu leo quam. Pellentesque ornare sem.

+
+ +
+ +
+
+
+
+

4. Copyrights

+

Donec id elit non mi porta gravida at eget metus. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Cras mattis consectetur purus sit amet fermentum. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla vitae elit libero, a pharetra augue. Nullam quis risus eget urna mollis ornare vel eu leo. Cras justo odio, dapibus ac facilisis in, egestas eget quam.

+

Sed posuere consectetur est at lobortis. Maecenas faucibus mollis interdum. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec id elit non mi porta gravida at eget metus. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.

+
    +
  • Aenean eu leo quam ornare curabitur blandit tempus.
  • +
  • Nullam quis risus eget urna mollis ornare donec elit.
  • +
  • Etiam porta sem malesuada magna mollis euismod.
  • +
  • Fermentum massa vivamus faucibus amet euismod.
  • +
+

Nullam quis risus eget urna mollis ornare vel eu leo. Maecenas sed diam eget risus varius blandit sit amet non magna. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Nullam id dolor id nibh ultricies vehicula ut id elit. Donec ullamcorper nulla non metus auctor fringilla. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam porta sem malesuada magna mollis euismod. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Nulla vitae elit libero, a pharetra augue. Curabitur blandit tempus porttitor. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Aenean eu leo quam. Pellentesque ornare sem.

+
+ +
+ +
+
+
+
+

5. Cookies

+

Donec id elit non mi porta gravida at eget metus. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Cras mattis consectetur purus sit amet fermentum. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla vitae elit libero, a pharetra augue. Nullam quis risus eget urna mollis ornare vel eu leo. Cras justo odio, dapibus ac facilisis in, egestas eget quam.

+

Sed posuere consectetur est at lobortis. Maecenas faucibus mollis interdum. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec id elit non mi porta gravida at eget metus. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.

+

Nullam quis risus eget urna mollis ornare vel eu leo. Maecenas sed diam eget risus varius blandit sit amet non magna. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Nullam id dolor id nibh ultricies vehicula ut id elit. Donec ullamcorper nulla non metus auctor fringilla. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam porta sem malesuada magna mollis euismod. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Nulla vitae elit libero, a pharetra augue. Curabitur blandit tempus porttitor. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Aenean eu leo quam. Pellentesque ornare sem.

+
+ +
+ +
+
+
+
+

6. Account & Billing

+

Donec id elit non mi porta gravida at eget metus. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Cras mattis consectetur purus sit amet fermentum. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla vitae elit libero, a pharetra augue. Nullam quis risus eget urna mollis ornare vel eu leo. Cras justo odio, dapibus ac facilisis in, egestas eget quam.

+

Sed posuere consectetur est at lobortis. Maecenas faucibus mollis interdum. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec id elit non mi porta gravida at eget metus. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.

+

Nullam quis risus eget urna mollis ornare vel eu leo. Maecenas sed diam eget risus varius blandit sit amet non magna. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Nullam id dolor id nibh ultricies vehicula ut id elit. Donec ullamcorper nulla non metus auctor fringilla. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam porta sem malesuada magna mollis euismod. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Nulla vitae elit libero, a pharetra augue. Curabitur blandit tempus porttitor. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Aenean eu leo quam. Pellentesque ornare sem.

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

Ā© 2021 Sandbox.
All rights reserved.

+ + +
+ +
+ +
+
+

Get in Touch

+
Moonshine St. 14/05 Light City, London, United Kingdom
+ info@email.com
00 (123) 456 78 90 +
+ +
+ +
+
+

Learn More

+ +
+ +
+ +
+
+

Our Newsletter

+

Subscribe to our newsletter to get our news & deals delivered to you.

+ + +
+ +
+ +
+ +
+ +
+
+ + + +
+ + + + + \ No newline at end of file diff --git a/sandbox310/gulpfile.js b/sandbox310/gulpfile.js new file mode 100644 index 0000000..7d65b7b --- /dev/null +++ b/sandbox310/gulpfile.js @@ -0,0 +1,446 @@ +'use strict'; + +/* Paths */ +var path = { + dev: { + html: 'dev/', + js: 'dev/assets/js/', + css: 'dev/assets/css/', + style: 'dev/assets/css/', + fontcss: 'dev/assets/css/fonts/', + colorcss: 'dev/assets/css/colors/', + img: 'dev/assets/img/', + fonts: 'dev/assets/fonts/', + media: 'dev/assets/media/', + php: 'dev/assets/php/' + }, + dist: { + html: 'dist/', + js: 'dist/assets/js/', + css: 'dist/assets/css/', + style: 'dist/assets/css/', + fontcss: 'dist/assets/css/fonts/', + colorcss: 'dist/assets/css/colors/', + img: 'dist/assets/img/', + fonts: 'dist/assets/fonts/', + media: 'dist/assets/media/', + php: 'dist/assets/php/' + }, + src: { + html: ['src/**/*.html', '!src/partials/**/*.html', '!src/assets/php/**/*.html'], + partials: 'src/partials/', + js: 'src/assets/js/', + vendorjs: 'src/assets/js/vendor/*.*', + themejs: 'src/assets/js/theme.js', + style: 'src/assets/scss/style.scss', + fontcss: 'src/assets/scss/fonts/*.*', + colorcss: ['src/assets/scss/colors/*.scss', 'src/assets/scss/theme/_colors.scss'], + vendorcss: 'src/assets/css/vendor/*.*', + img: 'src/assets/img/**/*.*', + fonts: 'src/assets/fonts/**/*.*', + media: 'src/assets/media/**/*.*', + php: 'src/assets/php/**/*.*' + }, + watch: { + html: ['src/**/*.html', '!src/assets/php/**/*.html'], + partials: 'src/partials/**/*.*', + themejs: 'src/assets/js/theme.js', + vendorjs: 'src/assets/js/vendor/*.*', + css: ['src/assets/scss/**/*.scss', '!src/assets/scss/fonts/*.scss', '!src/assets/scss/colors/*.scss', '!src/assets/scss/theme/_colors.scss'], + fontcss: 'src/assets/scss/fonts/*.scss', + colorcss: ['src/assets/scss/colors/*.scss', 'src/assets/scss/theme/_colors.scss'], + vendorcss: 'src/assets/css/vendor/*.*', + img: 'src/assets/img/**/*.*', + fonts: 'src/assets/fonts/**/*.*', + media: 'src/assets/media/**/*.*', + php: 'src/assets/php/', + user: 'src/assets/scss/_user-variables.scss' + }, + clean: { + dev: 'dev/*', + dist: 'dist/*', + } +}; + +/* Include gulp and plugins */ +var gulp = require('gulp'), + webserver = require('browser-sync'), + reload = webserver.reload, + plumber = require('gulp-plumber'), + sourcemaps = require('gulp-sourcemaps'), + sass = require('gulp-sass')(require('sass')), + sassUnicode = require('gulp-sass-unicode'), + autoprefixer = require('gulp-autoprefixer'), + cleanCSS = require('gulp-clean-css'), + uglify = require('gulp-uglify'), + cache = require('gulp-cache'), + imagemin = require('gulp-imagemin'), + jpegrecompress = require('imagemin-jpeg-recompress'), + pngquant = require('imagemin-pngquant'), + del = require('del'), + fileinclude = require('gulp-file-include'), + beautify = require('gulp-beautify'), + minify = require('gulp-minify'), + concat = require('gulp-concat'), + jsImport = require('gulp-js-import'), + newer = require('gulp-newer'), + replace = require('gulp-replace'), + touch = require('gulp-touch-cmd'); + +/* Server */ +var config = { + server: { + baseDir: './dist' + }, + ghostMode: false, // By setting true, clicks, scrolls and form inputs on any device will be mirrored to all others + notify: false +}; + +/* Tasks */ + +// Start the server +gulp.task('webserver', function () { + webserver(config); +}); + +// Compile html +gulp.task('html:dev', function () { + return gulp.src(path.src.html) + .pipe(newer({ dest: path.dev.html, extra: path.watch.partials })) + .pipe(plumber()) + .pipe(fileinclude({ prefix: '@@', basepath: path.src.partials })) + .pipe(beautify.html({ indent_size: 2, preserve_newlines: false })) + .pipe(gulp.dest(path.dev.html)) + .pipe(touch()) +}); +gulp.task('html:dist', function () { + return gulp.src(path.src.html) + .pipe(newer({ dest: path.dist.html, extra: path.watch.partials })) + .pipe(plumber()) + .pipe(fileinclude({ prefix: '@@', basepath: path.src.partials })) + .pipe(beautify.html({ indent_size: 2, preserve_newlines: false })) + .pipe(gulp.dest(path.dist.html)) + .pipe(touch()) + .on('end', () => { reload(); }); +}); + +// Compile theme styles +gulp.task('css:dev', function () { + return gulp.src(path.src.style) + .pipe(newer(path.dev.style)) + .pipe(plumber()) + .pipe(sass() + .on('error', function (err) { + sass.logError(err); + this.emit('end'); + }) + ) + .pipe(sassUnicode()) + .pipe(autoprefixer()) + .pipe(beautify.css({ indent_size: 2, preserve_newlines: false, newline_between_rules: false })) + .pipe(gulp.dest(path.dev.style)) + .pipe(touch()) +}); +gulp.task('css:dist', function () { + return gulp.src(path.src.style) + .pipe(newer(path.dist.style)) + .pipe(plumber()) + .pipe(sourcemaps.init()) + .pipe(sass() + .on('error', function (err) { + sass.logError(err); + this.emit('end'); + }) + ) + .pipe(sassUnicode()) + .pipe(autoprefixer()) + .pipe(cleanCSS()) + .pipe(sourcemaps.write('.')) + .pipe(gulp.dest(path.dist.style)) + .pipe(touch()) + .on('end', () => { reload(); }); +}); + +// Move fonts +gulp.task('fonts:dev', function () { + return gulp.src(path.src.fonts) + .pipe(newer(path.dev.fonts)) + .pipe(gulp.dest(path.dev.fonts)); +}); +gulp.task('fonts:dist', function () { + return gulp.src(path.src.fonts) + .pipe(newer(path.dist.fonts)) + .pipe(gulp.dest(path.dist.fonts)); +}); + +// Compile font styles +gulp.task('fontcss:dev', function () { + return gulp.src(path.src.fontcss) + .pipe(newer(path.dev.fontcss)) + .pipe(plumber()) + .pipe(sass() + .on('error', function (err) { + sass.logError(err); + this.emit('end'); + }) + ) + .pipe(sassUnicode()) + .pipe(autoprefixer()) + .pipe(cleanCSS()) + .pipe(beautify.css({ indent_size: 2, preserve_newlines: false, newline_between_rules: false })) + .pipe(gulp.dest(path.dev.fontcss)) + .pipe(touch()) +}); +gulp.task('fontcss:dist', function () { + return gulp.src(path.src.fontcss) + .pipe(newer(path.dist.fontcss)) + .pipe(plumber()) + .pipe(sass() + .on('error', function (err) { + sass.logError(err); + this.emit('end'); + }) + ) + .pipe(sassUnicode()) + .pipe(autoprefixer()) + .pipe(cleanCSS()) + .pipe(beautify.css({ indent_size: 2, preserve_newlines: false, newline_between_rules: false })) + .pipe(gulp.dest(path.dist.fontcss)) + .pipe(touch()) + .on('end', () => { reload(); }); +}); + +// Compile color styles +gulp.task('colorcss:dev', function () { + return gulp.src(path.src.colorcss) + .pipe(plumber()) + .pipe(sass() + .on('error', function (err) { + sass.logError(err); + this.emit('end'); + }) + ) + .pipe(sassUnicode()) + .pipe(autoprefixer()) + .pipe(beautify.css({ indent_size: 2, preserve_newlines: false, newline_between_rules: false })) + .pipe(gulp.dest(path.dev.colorcss)) + .pipe(touch()) +}); +gulp.task('colorcss:dist', function () { + return gulp.src(path.src.colorcss) + .pipe(plumber()) + .pipe(sass() + .on('error', function (err) { + sass.logError(err); + this.emit('end'); + }) + ) + .pipe(sassUnicode()) + .pipe(autoprefixer()) + .pipe(cleanCSS()) + .pipe(gulp.dest(path.dist.colorcss)) + .pipe(touch()) + .on('end', () => { reload(); }); +}); + +// Compile vendor styles +gulp.task('vendorcss:dev', function () { + return gulp.src(path.src.vendorcss) + .pipe(concat('plugins.css')) + .pipe(beautify.css({ indent_size: 2, preserve_newlines: false, newline_between_rules: false })) + .pipe(gulp.dest(path.dev.css)) + .pipe(touch()) +}); +gulp.task('vendorcss:dist', function () { + return gulp.src(path.src.vendorcss) + .pipe(concat('plugins.css')) + .pipe(cleanCSS()) + .pipe(gulp.dest(path.dist.css)) + .pipe(touch()) + .on('end', () => { reload(); }); +}); + +// Compile vendor plugins js +gulp.task('pluginsjs:dev', function() { + return gulp.src([ + 'node_modules/bootstrap/dist/js/bootstrap.bundle.js', + path.src.vendorjs + ]) + .pipe(jsImport({hideConsole: true})) + .pipe(concat('plugins.js')) + .pipe(gulp.dest(path.dev.js)) + .pipe(touch()) +}); +gulp.task('pluginsjs:dist', function() { + return gulp.src([ + 'node_modules/bootstrap/dist/js/bootstrap.bundle.js', + path.src.vendorjs + ]) + .pipe(jsImport({hideConsole: true})) + .pipe(concat('plugins.js')) + .pipe(uglify()) + .pipe(gulp.dest(path.dist.js)) + .pipe(touch()) + .on('end', () => { reload(); }); +}); + +// Compile theme js +gulp.task('themejs:dev', function () { + return gulp.src(path.src.themejs) + .pipe(gulp.dest(path.dev.js)) + .pipe(plumber()) + .pipe(gulp.dest(path.dev.js)) +}); +gulp.task('themejs:dist', function () { + return gulp.src(path.src.themejs) + .pipe(gulp.dest(path.dist.js)) + .pipe(plumber()) + //.pipe(uglify()) + .pipe(gulp.dest(path.dist.js)) + .on('end', () => { reload(); }); +}); + +// Move media +gulp.task('media:dev', function () { + return gulp.src(path.src.media) + .pipe(newer(path.dev.media)) + .pipe(gulp.dest(path.dev.media)); +}); +gulp.task('media:dist', function () { + return gulp.src(path.src.media) + .pipe(newer(path.dist.media)) + .pipe(gulp.dest(path.dist.media)); +}); + +// Move php +gulp.task('php:dev', function () { + return gulp.src(path.src.php) + .pipe(newer(path.dev.php)) + .pipe(gulp.dest(path.dev.php)); +}); +gulp.task('php:dist', function () { + return gulp.src(path.src.php) + .pipe(newer(path.dist.php)) + .pipe(gulp.dest(path.dist.php)); +}); + +// Image processing +gulp.task('image:dev', function () { + return gulp.src(path.src.img) + .pipe(newer(path.dev.img)) + .pipe(cache(imagemin([ + imagemin.gifsicle({ interlaced: true }), + jpegrecompress({ + progressive: true, + max: 90, + min: 80 + }), + pngquant(), + imagemin.svgo({ plugins: [{ removeViewBox: false }] })]))) + .pipe(gulp.dest(path.dev.img)); +}); +gulp.task('image:dist', function () { + return gulp.src(path.src.img) + .pipe(newer(path.dist.img)) + .pipe(cache(imagemin([ + imagemin.gifsicle({ interlaced: true }), + jpegrecompress({ + progressive: true, + max: 90, + min: 80 + }), + pngquant(), + imagemin.svgo({ plugins: [{ removeViewBox: false }] }) + ]))) + .pipe(gulp.dest(path.dist.img)) + .on('end', () => { reload(); }); +}); + +// Remove catalog dev +gulp.task('clean:dev', function () { + return del(path.clean.dev); +}); +gulp.task('clean:dist', function () { + return del(path.clean.dist); +}); + +// Clear cache +gulp.task('cache:clear', function () { + cache.clearAll(); +}); + +// Assembly Dev +gulp.task('build:dev', + gulp.series('clean:dev', + gulp.parallel( + 'html:dev', + 'css:dev', + 'fontcss:dev', + 'colorcss:dev', + 'vendorcss:dev', + 'pluginsjs:dev', + 'themejs:dev', + 'fonts:dev', + 'media:dev', + 'php:dev', + 'image:dev' + ) + ) +); + +// Assembly Dist +gulp.task('build:dist', + gulp.series('clean:dist', + gulp.parallel( + 'html:dist', + 'css:dist', + 'fontcss:dist', + 'colorcss:dist', + 'vendorcss:dist', + 'pluginsjs:dist', + 'themejs:dist', + 'fonts:dist', + 'media:dist', + 'php:dist', + 'image:dist' + ) + ) +); + + +// Launching tasks when files change +gulp.task('watch', function () { + gulp.watch(path.watch.html, gulp.series('html:dist')); + gulp.watch(path.watch.css, gulp.series('css:dist')); + gulp.watch(path.watch.fontcss, gulp.series('fontcss:dist')); + gulp.watch(path.watch.colorcss, gulp.series('colorcss:dist')); + gulp.watch(path.watch.vendorcss, gulp.series('vendorcss:dist')); + gulp.watch(path.watch.vendorjs, gulp.series('pluginsjs:dist')); + gulp.watch(path.watch.themejs, gulp.series('themejs:dist')); + gulp.watch(path.watch.img, gulp.series('image:dist')); + gulp.watch(path.watch.fonts, gulp.series('fonts:dist')); + gulp.watch(path.watch.media, gulp.series('media:dist')); + gulp.watch(path.watch.php, gulp.series('php:dist')); + gulp.watch(path.watch.user, gulp.series('colorcss:dist')); +}); + +// Serve +gulp.task('serve', gulp.series( + gulp.parallel('webserver','watch') +)); + +// Dev +gulp.task('build:dev', gulp.series( + 'build:dev' +)); + +// Dist +gulp.task('build:dist', gulp.series( + 'build:dist' +)); + +// Default tasks +gulp.task('default', gulp.series( + 'build:dist', + gulp.parallel('webserver','watch') +)); diff --git a/sandbox310/package-lock.json b/sandbox310/package-lock.json new file mode 100644 index 0000000..fc3f9ee --- /dev/null +++ b/sandbox310/package-lock.json @@ -0,0 +1,21416 @@ +{ + "name": "sandbox", + "version": "3.1.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "sandbox", + "version": "3.1.0", + "devDependencies": { + "@popperjs/core": "^2.11.2", + "bootstrap": "^5.1.3", + "browser-sync": "~2.27.7", + "del": "~6.0.0", + "gulp": "~4.0.2", + "gulp-autoprefixer": "^8.0.0", + "gulp-beautify": "^3.0.0", + "gulp-cache": "~1.1.3", + "gulp-clean-css": "^4.3.0", + "gulp-concat": "^2.6.1", + "gulp-file-include": "^2.3.0", + "gulp-imagemin": "~7.1.0", + "gulp-js-import": "^1.0.6", + "gulp-minify": "^3.1.0", + "gulp-newer": "^1.4.0", + "gulp-plumber": "~1.2.1", + "gulp-replace": "^1.1.3", + "gulp-sass": "^5.1.0", + "gulp-sass-unicode": "^1.0.5", + "gulp-sourcemaps": "~3.0.0", + "gulp-touch-cmd": "0.0.1", + "gulp-uglify": "~3.0.2", + "imagemin-jpeg-recompress": "~7.0.0", + "imagemin-pngquant": "~9.0.2", + "sass": "1.49.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.16.7.tgz", + "integrity": "sha512-9E9FJowqAsytyOY6LG+1KuueckRL+aQW+mKvXRXnuFGyRAyepJPmEo9vgMfXUA6O9u3IeEdv9MAkppFcaQwogQ==", + "dev": true, + "dependencies": { + "regenerator-runtime": "^0.13.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@gulp-sourcemaps/identity-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@gulp-sourcemaps/identity-map/-/identity-map-2.0.1.tgz", + "integrity": "sha512-Tb+nSISZku+eQ4X1lAkevcQa+jknn/OVUgZ3XCxEKIsLsqYuPoJwJOPQeaOk75X3WPftb29GWY1eqE7GLsXb1Q==", + "dev": true, + "dependencies": { + "acorn": "^6.4.1", + "normalize-path": "^3.0.0", + "postcss": "^7.0.16", + "source-map": "^0.6.0", + "through2": "^3.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/@gulp-sourcemaps/identity-map/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "node_modules/@gulp-sourcemaps/identity-map/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/@gulp-sourcemaps/identity-map/node_modules/through2": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.2.tgz", + "integrity": "sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==", + "dev": true, + "dependencies": { + "inherits": "^2.0.4", + "readable-stream": "2 || 3" + } + }, + "node_modules/@gulp-sourcemaps/map-sources": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@gulp-sourcemaps/map-sources/-/map-sources-1.0.0.tgz", + "integrity": "sha1-iQrnxdjId/bThIYCFazp1+yUW9o=", + "dev": true, + "dependencies": { + "normalize-path": "^2.0.1", + "through2": "^2.0.3" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/@gulp-sourcemaps/map-sources/node_modules/normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@popperjs/core": { + "version": "2.11.2", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.2.tgz", + "integrity": "sha512-92FRmppjjqz29VMJ2dn+xdyXZBrMlE42AV6Kq6BwjWV7CNUW1hs2FtxSNLQE+gJhaZ6AAmYuO9y8dshhcBl7vA==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@sindresorhus/is": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.7.0.tgz", + "integrity": "sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@types/expect": { + "version": "1.20.4", + "resolved": "https://registry.npmjs.org/@types/expect/-/expect-1.20.4.tgz", + "integrity": "sha512-Q5Vn3yjTDyCMV50TB6VRIbQNxSE4OmZR86VSbGaNpfUolm0iePBB4KdEEHmxoY5sT2+2DIvXW0rvMDP2nHZ4Mg==", + "dev": true + }, + "node_modules/@types/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", + "dev": true, + "dependencies": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "node_modules/@types/minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", + "dev": true + }, + "node_modules/@types/node": { + "version": "14.18.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.10.tgz", + "integrity": "sha512-6iihJ/Pp5fsFJ/aEDGyvT4pHGmCpq7ToQ/yf4bl5SbVAvwpspYJ+v3jO7n8UyjhQVHTy+KNszOozDdv+O6sovQ==", + "dev": true + }, + "node_modules/@types/q": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.5.tgz", + "integrity": "sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ==", + "dev": true, + "optional": true + }, + "node_modules/@types/vinyl": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/vinyl/-/vinyl-2.0.6.tgz", + "integrity": "sha512-ayJ0iOCDNHnKpKTgBG6Q6JOnHTj9zFta+3j2b8Ejza0e4cvRyMn0ZoLEmbPrTHe5YYRlDYPvPWVdV4cTaRyH7g==", + "dev": true, + "dependencies": { + "@types/expect": "^1.20.4", + "@types/node": "*" + } + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "node_modules/accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "dev": true, + "dependencies": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/after": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", + "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=", + "dev": true + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-colors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", + "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", + "dev": true, + "dependencies": { + "ansi-wrap": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ansi-cyan": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-cyan/-/ansi-cyan-0.1.1.tgz", + "integrity": "sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM=", + "dev": true, + "dependencies": { + "ansi-wrap": "0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ansi-gray": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", + "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=", + "dev": true, + "dependencies": { + "ansi-wrap": "0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ansi-red": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz", + "integrity": "sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw=", + "dev": true, + "dependencies": { + "ansi-wrap": "0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ansi-wrap": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", + "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/append-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/append-buffer/-/append-buffer-1.0.2.tgz", + "integrity": "sha1-2CIM9GYIFSXv6lBhTz3mUU36WPE=", + "dev": true, + "dependencies": { + "buffer-equal": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arch": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", + "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/archive-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/archive-type/-/archive-type-4.0.0.tgz", + "integrity": "sha1-+S5yIzBW38aWlHJ0nCZ72wRrHXA=", + "dev": true, + "dependencies": { + "file-type": "^4.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/archive-type/node_modules/file-type": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-4.4.0.tgz", + "integrity": "sha1-G2AOX8ofvcboDApwxxyNul95BsU=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", + "dev": true + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "optional": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-filter": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/arr-filter/-/arr-filter-1.1.2.tgz", + "integrity": "sha1-Q/3d0JHo7xGqTEXZzcGOLf8XEe4=", + "dev": true, + "dependencies": { + "make-iterator": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/arr-map/-/arr-map-2.0.2.tgz", + "integrity": "sha1-Onc0X/wc814qkYJWAfnljy4kysQ=", + "dev": true, + "dependencies": { + "make-iterator": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-differ": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", + "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", + "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-initial": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/array-initial/-/array-initial-1.1.0.tgz", + "integrity": "sha1-L6dLJnOTccOUe9enrcc74zSz15U=", + "dev": true, + "dependencies": { + "array-slice": "^1.0.0", + "is-number": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-initial/node_modules/is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-last": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/array-last/-/array-last-1.3.0.tgz", + "integrity": "sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg==", + "dev": true, + "dependencies": { + "is-number": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-last/node_modules/is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-slice": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", + "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-sort": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-sort/-/array-sort-1.0.0.tgz", + "integrity": "sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg==", + "dev": true, + "dependencies": { + "default-compare": "^1.0.0", + "get-value": "^2.0.6", + "kind-of": "^5.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arraybuffer.slice": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", + "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==", + "dev": true + }, + "node_modules/assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + }, + "node_modules/async-done": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/async-done/-/async-done-1.3.2.tgz", + "integrity": "sha512-uYkTP8dw2og1tu1nmza1n1CMW0qb8gWWlwqMmLb7MhBVs4BXrFziT6HXUd+/RlRA/i4H9AkofYloUbs1fwMqlw==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.2", + "process-nextick-args": "^2.0.0", + "stream-exhaust": "^1.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", + "dev": true + }, + "node_modules/async-each-series": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/async-each-series/-/async-each-series-0.1.1.tgz", + "integrity": "sha1-dhfBkXQB/Yykooqtzj266Yr+tDI=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/async-settle": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-settle/-/async-settle-1.0.0.tgz", + "integrity": "sha1-HQqRS7Aldb7IqPOnTlCA9yssDGs=", + "dev": true, + "dependencies": { + "async-done": "^1.2.2" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true, + "bin": { + "atob": "bin/atob.js" + }, + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/autoprefixer": { + "version": "10.4.2", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.2.tgz", + "integrity": "sha512-9fOPpHKuDW1w/0EKfRmVnxTDt8166MAnLI3mgZ1JCnhNtYWxcJ6Ud5CO/AVOZi/AvFa8DY9RTy3h3+tFBlrrdQ==", + "dev": true, + "dependencies": { + "browserslist": "^4.19.1", + "caniuse-lite": "^1.0.30001297", + "fraction.js": "^4.1.2", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/axios": { + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", + "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", + "dev": true, + "dependencies": { + "follow-redirects": "^1.14.0" + } + }, + "node_modules/bach": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/bach/-/bach-1.2.0.tgz", + "integrity": "sha1-Szzpa/JxNPeaG0FKUcFONMO9mIA=", + "dev": true, + "dependencies": { + "arr-filter": "^1.1.1", + "arr-flatten": "^1.0.1", + "arr-map": "^2.0.0", + "array-each": "^1.0.0", + "array-initial": "^1.0.0", + "array-last": "^1.1.1", + "async-done": "^1.2.2", + "async-settle": "^1.0.0", + "now-and-later": "^2.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/backo2": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", + "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=", + "dev": true + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "dependencies": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base64-arraybuffer": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz", + "integrity": "sha1-mBjHngWbE1X5fgQooBfIOOkLqBI=", + "dev": true, + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", + "dev": true, + "engines": { + "node": "^4.5.0 || >= 5.9" + } + }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", + "dev": true + }, + "node_modules/beeper": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/beeper/-/beeper-1.1.1.tgz", + "integrity": "sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/bin-build": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bin-build/-/bin-build-3.0.0.tgz", + "integrity": "sha512-jcUOof71/TNAI2uM5uoUaDq2ePcVBQ3R/qhxAz1rX7UfvduAL/RXD3jXzvn8cVcDJdGVkiR1shal3OH0ImpuhA==", + "dev": true, + "dependencies": { + "decompress": "^4.0.0", + "download": "^6.2.2", + "execa": "^0.7.0", + "p-map-series": "^1.0.0", + "tempfile": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/bin-build/node_modules/cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "dependencies": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "node_modules/bin-build/node_modules/execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "dev": true, + "dependencies": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/bin-build/node_modules/get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/bin-check": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bin-check/-/bin-check-4.1.0.tgz", + "integrity": "sha512-b6weQyEUKsDGFlACWSIOfveEnImkJyK/FGW6FAG42loyoquvjdtOIqO6yBFzHyqyVVhNgNkQxxx09SFLK28YnA==", + "dev": true, + "dependencies": { + "execa": "^0.7.0", + "executable": "^4.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/bin-check/node_modules/cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "dependencies": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "node_modules/bin-check/node_modules/execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "dev": true, + "dependencies": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/bin-check/node_modules/get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/bin-version": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bin-version/-/bin-version-3.1.0.tgz", + "integrity": "sha512-Mkfm4iE1VFt4xd4vH+gx+0/71esbfus2LsnCGe8Pi4mndSPyT+NGES/Eg99jx8/lUGWfu3z2yuB/bt5UB+iVbQ==", + "dev": true, + "dependencies": { + "execa": "^1.0.0", + "find-versions": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/bin-version-check": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/bin-version-check/-/bin-version-check-4.0.0.tgz", + "integrity": "sha512-sR631OrhC+1f8Cvs8WyVWOA33Y8tgwjETNPyyD/myRBXLkfS/vl74FmH/lFcRl9KY3zwGh7jFhvyk9vV3/3ilQ==", + "dev": true, + "dependencies": { + "bin-version": "^3.0.0", + "semver": "^5.6.0", + "semver-truncate": "^1.1.2" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/bin-wrapper": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bin-wrapper/-/bin-wrapper-4.1.0.tgz", + "integrity": "sha512-hfRmo7hWIXPkbpi0ZltboCMVrU+0ClXR/JgbCKKjlDjQf6igXa7OwdqNcFWQZPZTgiY7ZpzE3+LjjkLiTN2T7Q==", + "dev": true, + "dependencies": { + "bin-check": "^4.1.0", + "bin-version-check": "^4.0.0", + "download": "^7.1.0", + "import-lazy": "^3.1.0", + "os-filter-obj": "^2.0.0", + "pify": "^4.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/bin-wrapper/node_modules/download": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/download/-/download-7.1.0.tgz", + "integrity": "sha512-xqnBTVd/E+GxJVrX5/eUJiLYjCGPwMpdL+jGhGU57BvtcA7wwhtHVbXBeUk51kOpW3S7Jn3BQbN9Q1R1Km2qDQ==", + "dev": true, + "dependencies": { + "archive-type": "^4.0.0", + "caw": "^2.0.1", + "content-disposition": "^0.5.2", + "decompress": "^4.2.0", + "ext-name": "^5.0.0", + "file-type": "^8.1.0", + "filenamify": "^2.0.0", + "get-stream": "^3.0.0", + "got": "^8.3.1", + "make-dir": "^1.2.0", + "p-event": "^2.1.0", + "pify": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/bin-wrapper/node_modules/download/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/bin-wrapper/node_modules/file-type": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-8.1.0.tgz", + "integrity": "sha512-qyQ0pzAy78gVoJsmYeNgl8uH8yKhr1lVhW7JbzJmnlRi0I4R2eEDEJZVKG8agpDnLpacwNbDhLNG/LMdxHD2YQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/bin-wrapper/node_modules/get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/bin-wrapper/node_modules/got": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/got/-/got-8.3.2.tgz", + "integrity": "sha512-qjUJ5U/hawxosMryILofZCkm3C84PLJS/0grRIpjAwu+Lkxxj5cxeCU25BG0/3mDSpXKTyZr8oh8wIgLaH0QCw==", + "dev": true, + "dependencies": { + "@sindresorhus/is": "^0.7.0", + "cacheable-request": "^2.1.1", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "into-stream": "^3.1.0", + "is-retry-allowed": "^1.1.0", + "isurl": "^1.0.0-alpha5", + "lowercase-keys": "^1.0.0", + "mimic-response": "^1.0.0", + "p-cancelable": "^0.4.0", + "p-timeout": "^2.0.1", + "pify": "^3.0.0", + "safe-buffer": "^5.1.1", + "timed-out": "^4.0.1", + "url-parse-lax": "^3.0.0", + "url-to-options": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/bin-wrapper/node_modules/got/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/bin-wrapper/node_modules/make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dev": true, + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/bin-wrapper/node_modules/make-dir/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/bin-wrapper/node_modules/p-cancelable": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.4.1.tgz", + "integrity": "sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/bin-wrapper/node_modules/p-event": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/p-event/-/p-event-2.3.1.tgz", + "integrity": "sha512-NQCqOFhbpVTMX4qMe8PF8lbGtzZ+LCiN7pcNrb/413Na7+TRoe1xkKUzuWa/YEJdGQ0FvKtj35EEbDoVPO2kbA==", + "dev": true, + "dependencies": { + "p-timeout": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/bin-wrapper/node_modules/p-timeout": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-2.0.1.tgz", + "integrity": "sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA==", + "dev": true, + "dependencies": { + "p-finally": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/bin-wrapper/node_modules/prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/bin-wrapper/node_modules/url-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", + "dev": true, + "dependencies": { + "prepend-http": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/binaryextensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binaryextensions/-/binaryextensions-2.3.0.tgz", + "integrity": "sha512-nAihlQsYGyc5Bwq6+EsubvANYGExeJKHDO3RjnvwU042fawQTQfM3Kxn7IHUXQOz4bzfwsGYYHGSvXyW4zOGLg==", + "dev": true, + "engines": { + "node": ">=0.8" + }, + "funding": { + "url": "https://bevry.me/fund" + } + }, + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dev": true, + "optional": true, + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, + "node_modules/bl": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz", + "integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==", + "dev": true, + "dependencies": { + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/blob": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz", + "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==", + "dev": true + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "dev": true, + "optional": true + }, + "node_modules/bootstrap": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.1.3.tgz", + "integrity": "sha512-fcQztozJ8jToQWXxVuEyXWW+dSo8AiXWKwiSSrKWsRB/Qt+Ewwza+JWoLKiTuQLaEPhdNAJ7+Dosc9DOIqNy7Q==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/bootstrap" + }, + "peerDependencies": { + "@popperjs/core": "^2.10.2" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-sync": { + "version": "2.27.7", + "resolved": "https://registry.npmjs.org/browser-sync/-/browser-sync-2.27.7.tgz", + "integrity": "sha512-9ElnnA/u+s2Jd+IgY+2SImB+sAEIteHsMG0NR96m7Ph/wztpvJCUpyC2on1KqmG9iAp941j+5jfmd34tEguGbg==", + "dev": true, + "dependencies": { + "browser-sync-client": "^2.27.7", + "browser-sync-ui": "^2.27.7", + "bs-recipes": "1.3.4", + "bs-snippet-injector": "^2.0.1", + "chokidar": "^3.5.1", + "connect": "3.6.6", + "connect-history-api-fallback": "^1", + "dev-ip": "^1.0.1", + "easy-extender": "^2.3.4", + "eazy-logger": "3.1.0", + "etag": "^1.8.1", + "fresh": "^0.5.2", + "fs-extra": "3.0.1", + "http-proxy": "^1.18.1", + "immutable": "^3", + "localtunnel": "^2.0.1", + "micromatch": "^4.0.2", + "opn": "5.3.0", + "portscanner": "2.1.1", + "qs": "6.2.3", + "raw-body": "^2.3.2", + "resp-modifier": "6.0.2", + "rx": "4.1.0", + "send": "0.16.2", + "serve-index": "1.9.1", + "serve-static": "1.13.2", + "server-destroy": "1.0.1", + "socket.io": "2.4.0", + "ua-parser-js": "1.0.2", + "yargs": "^15.4.1" + }, + "bin": { + "browser-sync": "dist/bin.js" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/browser-sync-client": { + "version": "2.27.7", + "resolved": "https://registry.npmjs.org/browser-sync-client/-/browser-sync-client-2.27.7.tgz", + "integrity": "sha512-wKg9UP9a4sCIkBBAXUdbkdWFJzfSAQizGh+nC19W9y9zOo9s5jqeYRFUUbs7x5WKhjtspT+xetVp9AtBJ6BmWg==", + "dev": true, + "dependencies": { + "etag": "1.8.1", + "fresh": "0.5.2", + "mitt": "^1.1.3", + "rxjs": "^5.5.6" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/browser-sync-ui": { + "version": "2.27.7", + "resolved": "https://registry.npmjs.org/browser-sync-ui/-/browser-sync-ui-2.27.7.tgz", + "integrity": "sha512-Bt4OQpx9p18OIzk0KKyu7jqlvmjacasUlk8ARY3uuIyiFWSBiRgr2i6XY8dEMF14DtbooaEBOpHEu9VCYvMcCw==", + "dev": true, + "dependencies": { + "async-each-series": "0.1.1", + "connect-history-api-fallback": "^1", + "immutable": "^3", + "server-destroy": "1.0.1", + "socket.io-client": "^2.4.0", + "stream-throttle": "^0.1.3" + } + }, + "node_modules/browserslist": { + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.1.tgz", + "integrity": "sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A==", + "dev": true, + "dependencies": { + "caniuse-lite": "^1.0.30001286", + "electron-to-chromium": "^1.4.17", + "escalade": "^3.1.1", + "node-releases": "^2.0.1", + "picocolors": "^1.0.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + } + }, + "node_modules/bs-recipes": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/bs-recipes/-/bs-recipes-1.3.4.tgz", + "integrity": "sha1-DS1NSKcYyMBEdp/cT4lZLci2lYU=", + "dev": true + }, + "node_modules/bs-snippet-injector": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/bs-snippet-injector/-/bs-snippet-injector-2.0.1.tgz", + "integrity": "sha1-YbU5PxH1JVntEgaTEANDtu2wTdU=", + "dev": true + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-alloc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", + "dev": true, + "dependencies": { + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" + } + }, + "node_modules/buffer-alloc-unsafe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", + "dev": true + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/buffer-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz", + "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/buffer-fill": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=", + "dev": true + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/bytes": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.1.tgz", + "integrity": "sha512-dWe4nWO/ruEOY7HkUJ5gFt1DCFV9zPRoJr8pV0/ASQermOZjtq8jMjOprC0Kd10GLN+l7xaUPvxzJFWtxGu8Fg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "dependencies": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cache-swap": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/cache-swap/-/cache-swap-0.3.0.tgz", + "integrity": "sha1-HFQaoQilAQb2ML3Zj+HeyLoTP1E=", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "mkdirp": "^0.5.1", + "object-assign": "^4.0.1", + "rimraf": "^2.4.0" + } + }, + "node_modules/cache-swap/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/cacheable-request": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-2.1.4.tgz", + "integrity": "sha1-DYCIAbY0KtM8kd+dC0TcCbkeXD0=", + "dev": true, + "dependencies": { + "clone-response": "1.0.2", + "get-stream": "3.0.0", + "http-cache-semantics": "3.8.1", + "keyv": "3.0.0", + "lowercase-keys": "1.0.0", + "normalize-url": "2.0.1", + "responselike": "1.0.2" + } + }, + "node_modules/cacheable-request/node_modules/get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/cacheable-request/node_modules/lowercase-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", + "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cacheable-request/node_modules/normalize-url": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-2.0.1.tgz", + "integrity": "sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==", + "dev": true, + "dependencies": { + "prepend-http": "^2.0.0", + "query-string": "^5.0.1", + "sort-keys": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cacheable-request/node_modules/prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/cacheable-request/node_modules/sort-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", + "integrity": "sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=", + "dev": true, + "dependencies": { + "is-plain-obj": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "dev": true, + "optional": true, + "dependencies": { + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001304", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001304.tgz", + "integrity": "sha512-bdsfZd6K6ap87AGqSHJP/s1V+U6Z5lyrcbBu3ovbCCf8cSYpwTtGrCBObMpJqwxfTbLW6YTIdbb1jEeTelcpYQ==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + } + }, + "node_modules/caw": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/caw/-/caw-2.0.1.tgz", + "integrity": "sha512-Cg8/ZSBEa8ZVY9HspcGUYaK63d/bN7rqS3CYCzEGUxuYv6UlmcjzDUz2fCFFHyTvUW5Pk0I+3hkA3iXlIj6guA==", + "dev": true, + "dependencies": { + "get-proxy": "^2.0.0", + "isurl": "^1.0.0-alpha5", + "tunnel-agent": "^0.6.0", + "url-to-options": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "dependencies": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clean-css": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz", + "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==", + "dev": true, + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/clone-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", + "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/clone-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", + "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "dev": true, + "dependencies": { + "mimic-response": "^1.0.0" + } + }, + "node_modules/clone-stats": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", + "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", + "dev": true + }, + "node_modules/cloneable-readable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.3.tgz", + "integrity": "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "process-nextick-args": "^2.0.0", + "readable-stream": "^2.3.5" + } + }, + "node_modules/coa": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", + "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", + "dev": true, + "optional": true, + "dependencies": { + "@types/q": "^1.5.1", + "chalk": "^2.4.1", + "q": "^1.1.2" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/coa/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "optional": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/coa/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "optional": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/coa/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "optional": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/coa/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true, + "optional": true + }, + "node_modules/coa/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "optional": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/coa/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "optional": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/collection-map": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-map/-/collection-map-1.0.0.tgz", + "integrity": "sha1-rqDwb40mx4DCt1SUOFVEsiVa8Yw=", + "dev": true, + "dependencies": { + "arr-map": "^2.0.2", + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "dependencies": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true, + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "node_modules/component-bind": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", + "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=", + "dev": true + }, + "node_modules/component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "node_modules/component-inherit": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", + "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "engines": [ + "node >= 0.8" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/concat-with-sourcemaps": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/concat-with-sourcemaps/-/concat-with-sourcemaps-1.1.0.tgz", + "integrity": "sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg==", + "dev": true, + "dependencies": { + "source-map": "^0.6.1" + } + }, + "node_modules/config-chain": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", + "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", + "dev": true, + "dependencies": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, + "node_modules/connect": { + "version": "3.6.6", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.6.tgz", + "integrity": "sha1-Ce/2xVr3I24TcTWnJXSFi2eG9SQ=", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "finalhandler": "1.1.0", + "parseurl": "~1.3.2", + "utils-merge": "1.0.1" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/console-stream": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/console-stream/-/console-stream-0.1.1.tgz", + "integrity": "sha1-oJX+B7IEZZVfL6/Si11yvM2UnUQ=", + "dev": true, + "optional": true + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dev": true, + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-disposition/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/convert-source-map": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.1" + } + }, + "node_modules/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/copy-props": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/copy-props/-/copy-props-2.0.5.tgz", + "integrity": "sha512-XBlx8HSqrT0ObQwmSzM7WE5k8FxTV75h1DX1Z3n6NhQ/UYYAvInWYmG06vFt7hQZArE2fuO62aihiWIVQwh1sw==", + "dev": true, + "dependencies": { + "each-props": "^1.3.2", + "is-plain-object": "^5.0.0" + } + }, + "node_modules/core-js": { + "version": "3.20.3", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.20.3.tgz", + "integrity": "sha512-vVl8j8ph6tRS3B8qir40H7yw7voy17xL0piAjlbBUsH7WIfzoedL/ZOr1OV9FyZQLWXsayOJyV4tnRyXR85/ag==", + "dev": true, + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/css": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/css/-/css-3.0.0.tgz", + "integrity": "sha512-DG9pFfwOrzc+hawpmqX/dHYHJG+Bsdb0klhyi1sDneOgGOXy9wQIC8hzyVp1e4NRYDBdxcylvywPkkXCHAzTyQ==", + "dev": true, + "dependencies": { + "inherits": "^2.0.4", + "source-map": "^0.6.1", + "source-map-resolve": "^0.6.0" + } + }, + "node_modules/css-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", + "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", + "dev": true, + "optional": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^3.2.1", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" + } + }, + "node_modules/css-select-base-adapter": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", + "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==", + "dev": true, + "optional": true + }, + "node_modules/css-tree": { + "version": "1.0.0-alpha.37", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", + "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", + "dev": true, + "optional": true, + "dependencies": { + "mdn-data": "2.0.4", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/css-what": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", + "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", + "dev": true, + "optional": true, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/csso": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "dev": true, + "optional": true, + "dependencies": { + "css-tree": "^1.1.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/csso/node_modules/css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "dev": true, + "optional": true, + "dependencies": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "dev": true, + "optional": true + }, + "node_modules/currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "dev": true, + "optional": true, + "dependencies": { + "array-find-index": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "dev": true, + "dependencies": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "node_modules/dateformat": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.2.0.tgz", + "integrity": "sha1-QGXiATz5+5Ft39gu+1Bq1MZ2kGI=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/debug-fabulous": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/debug-fabulous/-/debug-fabulous-1.1.0.tgz", + "integrity": "sha512-GZqvGIgKNlUnHUPQhepnUZFIMoi3dgZKQBzKDeL2g7oJF9SNAji/AAu36dusFUas0O+pae74lNeoIPHqXWDkLg==", + "dev": true, + "dependencies": { + "debug": "3.X", + "memoizee": "0.4.X", + "object-assign": "4.X" + } + }, + "node_modules/debug-fabulous/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/debug-fabulous/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/decompress": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/decompress/-/decompress-4.2.1.tgz", + "integrity": "sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ==", + "dev": true, + "dependencies": { + "decompress-tar": "^4.0.0", + "decompress-tarbz2": "^4.0.0", + "decompress-targz": "^4.0.0", + "decompress-unzip": "^4.0.1", + "graceful-fs": "^4.1.10", + "make-dir": "^1.0.0", + "pify": "^2.3.0", + "strip-dirs": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "dev": true, + "dependencies": { + "mimic-response": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/decompress-tar": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-4.1.1.tgz", + "integrity": "sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==", + "dev": true, + "dependencies": { + "file-type": "^5.2.0", + "is-stream": "^1.1.0", + "tar-stream": "^1.5.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/decompress-tar/node_modules/file-type": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", + "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/decompress-tarbz2": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz", + "integrity": "sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==", + "dev": true, + "dependencies": { + "decompress-tar": "^4.1.0", + "file-type": "^6.1.0", + "is-stream": "^1.1.0", + "seek-bzip": "^1.0.5", + "unbzip2-stream": "^1.0.9" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/decompress-tarbz2/node_modules/file-type": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-6.2.0.tgz", + "integrity": "sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/decompress-targz": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/decompress-targz/-/decompress-targz-4.1.1.tgz", + "integrity": "sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==", + "dev": true, + "dependencies": { + "decompress-tar": "^4.1.1", + "file-type": "^5.2.0", + "is-stream": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/decompress-targz/node_modules/file-type": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", + "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/decompress-unzip": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-4.0.1.tgz", + "integrity": "sha1-3qrM39FK6vhVePczroIQ+bSEj2k=", + "dev": true, + "dependencies": { + "file-type": "^3.8.0", + "get-stream": "^2.2.0", + "pify": "^2.3.0", + "yauzl": "^2.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/decompress-unzip/node_modules/file-type": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", + "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decompress-unzip/node_modules/get-stream": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz", + "integrity": "sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4=", + "dev": true, + "dependencies": { + "object-assign": "^4.0.1", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decompress-unzip/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decompress/node_modules/make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dev": true, + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/decompress/node_modules/make-dir/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/decompress/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/default-compare/-/default-compare-1.0.0.tgz", + "integrity": "sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ==", + "dev": true, + "dependencies": { + "kind-of": "^5.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-resolution": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/default-resolution/-/default-resolution-2.0.0.tgz", + "integrity": "sha1-vLgrqnKtebQmp2cy8aga1t8m1oQ=", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "dependencies": { + "object-keys": "^1.0.12" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/del": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/del/-/del-6.0.0.tgz", + "integrity": "sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ==", + "dev": true, + "dependencies": { + "globby": "^11.0.1", + "graceful-fs": "^4.2.4", + "is-glob": "^4.0.1", + "is-path-cwd": "^2.2.0", + "is-path-inside": "^3.0.2", + "p-map": "^4.0.0", + "rimraf": "^3.0.2", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "dev": true + }, + "node_modules/detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/detect-newline": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz", + "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dev-ip": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dev-ip/-/dev-ip-1.0.1.tgz", + "integrity": "sha1-p2o+0YVb56ASu4rBbLgPPADcKPA=", + "dev": true, + "bin": { + "dev-ip": "lib/dev-ip.js" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true + }, + "node_modules/dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "dev": true, + "optional": true, + "dependencies": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + } + }, + "node_modules/dom-serializer/node_modules/domelementtype": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "optional": true + }, + "node_modules/domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "dev": true, + "optional": true + }, + "node_modules/domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "dev": true, + "optional": true, + "dependencies": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "node_modules/download": { + "version": "6.2.5", + "resolved": "https://registry.npmjs.org/download/-/download-6.2.5.tgz", + "integrity": "sha512-DpO9K1sXAST8Cpzb7kmEhogJxymyVUd5qz/vCOSyvwtp2Klj2XcDt5YUuasgxka44SxF0q5RriKIwJmQHG2AuA==", + "dev": true, + "dependencies": { + "caw": "^2.0.0", + "content-disposition": "^0.5.2", + "decompress": "^4.0.0", + "ext-name": "^5.0.0", + "file-type": "5.2.0", + "filenamify": "^2.0.0", + "get-stream": "^3.0.0", + "got": "^7.0.0", + "make-dir": "^1.0.0", + "p-event": "^1.0.0", + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/download/node_modules/file-type": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", + "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/download/node_modules/get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/download/node_modules/make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dev": true, + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/download/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/duplexer2": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", + "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=", + "dev": true, + "dependencies": { + "readable-stream": "~1.1.9" + } + }, + "node_modules/duplexer2/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "node_modules/duplexer2/node_modules/readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/duplexer2/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, + "node_modules/duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", + "dev": true + }, + "node_modules/duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "node_modules/each-props": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/each-props/-/each-props-1.3.2.tgz", + "integrity": "sha512-vV0Hem3zAGkJAyU7JSjixeU66rwdynTAa1vofCrSA5fEln+m67Az9CcnkVD776/fsN/UjIWmBDoNRS6t6G9RfA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.1", + "object.defaults": "^1.1.0" + } + }, + "node_modules/each-props/node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/easy-extender": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/easy-extender/-/easy-extender-2.3.4.tgz", + "integrity": "sha512-8cAwm6md1YTiPpOvDULYJL4ZS6WfM5/cTeVVh4JsvyYZAoqlRVUpHL9Gr5Fy7HA6xcSZicUia3DeAgO3Us8E+Q==", + "dev": true, + "dependencies": { + "lodash": "^4.17.10" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/eazy-logger": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/eazy-logger/-/eazy-logger-3.1.0.tgz", + "integrity": "sha512-/snsn2JqBtUSSstEl4R0RKjkisGHAhvYj89i7r3ytNUKW12y178KDZwXLXIgwDqLW6E/VRMT9qfld7wvFae8bQ==", + "dev": true, + "dependencies": { + "tfunk": "^4.0.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/editorconfig": { + "version": "0.15.3", + "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-0.15.3.tgz", + "integrity": "sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g==", + "dev": true, + "dependencies": { + "commander": "^2.19.0", + "lru-cache": "^4.1.5", + "semver": "^5.6.0", + "sigmund": "^1.0.1" + }, + "bin": { + "editorconfig": "bin/editorconfig" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, + "node_modules/electron-to-chromium": { + "version": "1.4.59", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.59.tgz", + "integrity": "sha512-AOJ3cAE0TWxz4fQ9zkND5hWrQg16nsZKVz9INOot1oV//u4wWu5xrj9CQMmPTYskkZRunSRc9sAnr4EkexXokg==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/engine.io": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.5.0.tgz", + "integrity": "sha512-21HlvPUKaitDGE4GXNtQ7PLP0Sz4aWLddMPw2VTyFz1FVZqu/kZsJUO8WNpKuE/OCL7nkfRaOui2ZCJloGznGA==", + "dev": true, + "dependencies": { + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.4.1", + "debug": "~4.1.0", + "engine.io-parser": "~2.2.0", + "ws": "~7.4.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/engine.io-client": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.5.2.tgz", + "integrity": "sha512-QEqIp+gJ/kMHeUun7f5Vv3bteRHppHH/FMBQX/esFj/fuYfjyUKWGMo3VCvIP/V8bE9KcjHmRZrhIz2Z9oNsDA==", + "dev": true, + "dependencies": { + "component-emitter": "~1.3.0", + "component-inherit": "0.0.3", + "debug": "~3.1.0", + "engine.io-parser": "~2.2.0", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "parseqs": "0.0.6", + "parseuri": "0.0.6", + "ws": "~7.4.2", + "xmlhttprequest-ssl": "~1.6.2", + "yeast": "0.1.2" + } + }, + "node_modules/engine.io-client/node_modules/debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/engine.io-parser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.2.1.tgz", + "integrity": "sha512-x+dN/fBH8Ro8TFwJ+rkB2AmuVw9Yu2mockR/p3W8f8YtExwFgDvBDi0GWyb4ZLkpahtDGZgtr3zLovanJghPqg==", + "dev": true, + "dependencies": { + "after": "0.8.2", + "arraybuffer.slice": "~0.0.7", + "base64-arraybuffer": "0.1.4", + "blob": "0.0.5", + "has-binary2": "~1.0.2" + } + }, + "node_modules/engine.io/node_modules/debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/engine.io/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "optional": true, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz", + "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==", + "dev": true, + "optional": true, + "dependencies": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "get-symbol-description": "^1.0.0", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.4", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.1", + "is-string": "^1.0.7", + "is-weakref": "^1.0.1", + "object-inspect": "^1.11.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "optional": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es5-ext": { + "version": "0.10.53", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", + "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", + "dev": true, + "dependencies": { + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.3", + "next-tick": "~1.0.0" + } + }, + "node_modules/es5-ext/node_modules/next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", + "dev": true + }, + "node_modules/es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "dev": true, + "dependencies": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "dev": true, + "dependencies": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "node_modules/es6-weak-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", + "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", + "dev": true, + "dependencies": { + "d": "1", + "es5-ext": "^0.10.46", + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "optional": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", + "dev": true, + "dependencies": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, + "node_modules/exec-buffer": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/exec-buffer/-/exec-buffer-3.2.0.tgz", + "integrity": "sha512-wsiD+2Tp6BWHoVv3B+5Dcx6E7u5zky+hUwOHjuH2hKSLR3dvRmX8fk8UD8uqQixHs4Wk6eDmiegVrMPjKj7wpA==", + "dev": true, + "dependencies": { + "execa": "^0.7.0", + "p-finally": "^1.0.0", + "pify": "^3.0.0", + "rimraf": "^2.5.4", + "tempfile": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/exec-buffer/node_modules/cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "dependencies": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "node_modules/exec-buffer/node_modules/execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "dev": true, + "dependencies": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/exec-buffer/node_modules/get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/exec-buffer/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/exec-buffer/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "dependencies": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/executable": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz", + "integrity": "sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==", + "dev": true, + "dependencies": { + "pify": "^2.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/executable/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "dependencies": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "dev": true, + "dependencies": { + "homedir-polyfill": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ext": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.6.0.tgz", + "integrity": "sha512-sdBImtzkq2HpkdRLtlLWDa6w4DX22ijZLKx8BMPUuKe1c5lbN6xwQDQCxSfxBQnHZ13ls/FH0MQZx/q/gr6FQg==", + "dev": true, + "dependencies": { + "type": "^2.5.0" + } + }, + "node_modules/ext-list": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/ext-list/-/ext-list-2.2.2.tgz", + "integrity": "sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA==", + "dev": true, + "dependencies": { + "mime-db": "^1.28.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ext-name": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ext-name/-/ext-name-5.0.0.tgz", + "integrity": "sha512-yblEwXAbGv1VQDmow7s38W77hzAgJAO50ztBLMcUyUBfxv1HC+LGwtiEN+Co6LtlqT/5uwVOxsD4TNIilWhwdQ==", + "dev": true, + "dependencies": { + "ext-list": "^2.0.0", + "sort-keys-length": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ext/node_modules/type": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/type/-/type-2.5.0.tgz", + "integrity": "sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw==", + "dev": true + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "dependencies": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fancy-log": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", + "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==", + "dev": true, + "dependencies": { + "ansi-gray": "^0.1.1", + "color-support": "^1.1.3", + "parse-node-version": "^1.0.0", + "time-stamp": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/fast-glob": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", + "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-levenshtein": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-1.1.4.tgz", + "integrity": "sha1-5qdUzI8V5YmHqpy9J69m/W9OWvk=", + "dev": true + }, + "node_modules/fast-xml-parser": { + "version": "3.21.1", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-3.21.1.tgz", + "integrity": "sha512-FTFVjYoBOZTJekiUsawGsSYV9QL0A+zDYCRj7y34IO6Jg+2IMYEtQa+bbictpdpV8dHxXywqU7C0gRDEOFtBFg==", + "dev": true, + "optional": true, + "dependencies": { + "strnum": "^1.0.4" + }, + "bin": { + "xml2js": "cli.js" + }, + "funding": { + "type": "paypal", + "url": "https://paypal.me/naturalintelligence" + } + }, + "node_modules/fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", + "dev": true, + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "dev": true, + "optional": true, + "dependencies": { + "escape-string-regexp": "^1.0.5", + "object-assign": "^4.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/file-type": { + "version": "12.4.2", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-12.4.2.tgz", + "integrity": "sha512-UssQP5ZgIOKelfsaB5CuGAL+Y+q7EmONuiwF3N5HAH0t27rvrttgi6Ra9k/+DVaY9UF6+ybxu5pOXLUdA8N7Vg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "dev": true, + "optional": true + }, + "node_modules/filename-reserved-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz", + "integrity": "sha1-q/c9+rc10EVECr/qLZHzieu/oik=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/filenamify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-2.1.0.tgz", + "integrity": "sha512-ICw7NTT6RsDp2rnYKVd8Fu4cr6ITzGy3+u4vUujPkabyaz+03F24NWEX7fs5fp+kBonlaqPH8fAO2NM+SXt/JA==", + "dev": true, + "dependencies": { + "filename-reserved-regex": "^2.0.0", + "strip-outer": "^1.0.0", + "trim-repeated": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", + "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.1", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "statuses": "~1.3.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "dependencies": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/find-versions": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-3.2.0.tgz", + "integrity": "sha512-P8WRou2S+oe222TOCHitLy8zj+SIsVJh52VP4lvXkaFVnOFFdoWv1H1Jjvel1aI6NCFOAaeAVm8qrI0odiLcww==", + "dev": true, + "dependencies": { + "semver-regex": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/findup-sync": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", + "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", + "dev": true, + "dependencies": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/findup-sync/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/node_modules/to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fined": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz", + "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==", + "dev": true, + "dependencies": { + "expand-tilde": "^2.0.2", + "is-plain-object": "^2.0.3", + "object.defaults": "^1.1.0", + "object.pick": "^1.2.0", + "parse-filepath": "^1.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/fined/node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/flagged-respawn": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", + "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/flatnest": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/flatnest/-/flatnest-1.0.0.tgz", + "integrity": "sha1-IEIa0FtGxjytMO8UqOxiX4az8cU=", + "dev": true + }, + "node_modules/flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "node_modules/follow-redirects": { + "version": "1.14.7", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.7.tgz", + "integrity": "sha512-+hbxoLbFMbRKDwohX8GkTataGqO6Jb7jGwpAlwgy2bIz25XtRm7KEzJM76R1WiNT5SwZkX4Y75SwBolkpmE7iQ==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", + "dev": true, + "dependencies": { + "for-in": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fraction.js": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.1.2.tgz", + "integrity": "sha512-o2RiJQ6DZaR/5+Si0qJUIy637QMRudSi9kU/FFzx9EZazrIdnBgpU+3sEWCxAVhH2RtxW2Oz+T4p2o8uOPVcgA==", + "dev": true, + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://www.patreon.com/infusion" + } + }, + "node_modules/fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "dependencies": { + "map-cache": "^0.2.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true + }, + "node_modules/fs-extra": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz", + "integrity": "sha1-N5TzeMWLNC6n27sjCVEJxLO2IpE=", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^3.0.0", + "universalify": "^0.1.0" + } + }, + "node_modules/fs-mkdirp-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz", + "integrity": "sha1-C3gV/DIBxqaeFNuYzgmMFpNSWes=", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.11", + "through2": "^2.0.3" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proxy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/get-proxy/-/get-proxy-2.1.0.tgz", + "integrity": "sha512-zmZIaQTWnNQb4R4fJUEp/FC51eZsc6EkErspy3xtIYStaq8EB/hDIWipxsal+E8rz0qD7f2sL/NA9Xee4RInJw==", + "dev": true, + "dependencies": { + "npm-conf": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "optional": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gifsicle": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/gifsicle/-/gifsicle-5.3.0.tgz", + "integrity": "sha512-FJTpgdj1Ow/FITB7SVza5HlzXa+/lqEY0tHQazAJbuAdvyJtkH4wIdsR2K414oaTwRXHFLLF+tYbipj+OpYg+Q==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "dependencies": { + "bin-build": "^3.0.0", + "bin-wrapper": "^4.0.0", + "execa": "^5.0.0" + }, + "bin": { + "gifsicle": "cli.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/imagemin/gisicle-bin?sponsor=1" + } + }, + "node_modules/gifsicle/node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "optional": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/gifsicle/node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "optional": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/gifsicle/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gifsicle/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gifsicle/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "optional": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/gifsicle/node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/gifsicle/node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "optional": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/gifsicle/node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/gifsicle/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "optional": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob-stream": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz", + "integrity": "sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ=", + "dev": true, + "dependencies": { + "extend": "^3.0.0", + "glob": "^7.1.1", + "glob-parent": "^3.1.0", + "is-negated-glob": "^1.0.0", + "ordered-read-streams": "^1.0.0", + "pumpify": "^1.3.5", + "readable-stream": "^2.1.5", + "remove-trailing-separator": "^1.0.1", + "to-absolute-glob": "^2.0.0", + "unique-stream": "^2.0.2" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/glob-stream/node_modules/glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "dependencies": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + } + }, + "node_modules/glob-stream/node_modules/is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-watcher": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-5.0.5.tgz", + "integrity": "sha512-zOZgGGEHPklZNjZQaZ9f41i7F2YwE+tS5ZHrDhbBCk3stwahn5vQxnFmBJZHoYdusR6R1bLSXeGUy/BhctwKzw==", + "dev": true, + "dependencies": { + "anymatch": "^2.0.0", + "async-done": "^1.2.0", + "chokidar": "^2.0.0", + "is-negated-glob": "^1.0.0", + "just-debounce": "^1.0.0", + "normalize-path": "^3.0.0", + "object.defaults": "^1.1.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/glob-watcher/node_modules/anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "dependencies": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "node_modules/glob-watcher/node_modules/anymatch/node_modules/normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-watcher/node_modules/binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-watcher/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-watcher/node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-watcher/node_modules/chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "deprecated": "Chokidar 2 does not receive security updates since 2019. Upgrade to chokidar 3 with 15x fewer dependencies", + "dev": true, + "dependencies": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + }, + "optionalDependencies": { + "fsevents": "^1.2.7" + } + }, + "node_modules/glob-watcher/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-watcher/node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-watcher/node_modules/fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "deprecated": "fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "dependencies": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/glob-watcher/node_modules/glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "dependencies": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + } + }, + "node_modules/glob-watcher/node_modules/glob-parent/node_modules/is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-watcher/node_modules/is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "dependencies": { + "binary-extensions": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-watcher/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-watcher/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-watcher/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-watcher/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-watcher/node_modules/micromatch/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-watcher/node_modules/readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/glob-watcher/node_modules/to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "dependencies": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "dev": true, + "dependencies": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glogg": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.2.tgz", + "integrity": "sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA==", + "dev": true, + "dependencies": { + "sparkles": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/got": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/got/-/got-7.1.0.tgz", + "integrity": "sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==", + "dev": true, + "dependencies": { + "decompress-response": "^3.2.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "is-plain-obj": "^1.1.0", + "is-retry-allowed": "^1.0.0", + "is-stream": "^1.0.0", + "isurl": "^1.0.0-alpha5", + "lowercase-keys": "^1.0.0", + "p-cancelable": "^0.3.0", + "p-timeout": "^1.1.1", + "safe-buffer": "^5.0.1", + "timed-out": "^4.0.0", + "url-parse-lax": "^1.0.0", + "url-to-options": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/got/node_modules/get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.9", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", + "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==", + "dev": true + }, + "node_modules/gulp": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/gulp/-/gulp-4.0.2.tgz", + "integrity": "sha512-dvEs27SCZt2ibF29xYgmnwwCYZxdxhQ/+LFWlbAW8y7jt68L/65402Lz3+CKy0Ov4rOs+NERmDq7YlZaDqUIfA==", + "dev": true, + "dependencies": { + "glob-watcher": "^5.0.3", + "gulp-cli": "^2.2.0", + "undertaker": "^1.2.1", + "vinyl-fs": "^3.0.0" + }, + "bin": { + "gulp": "bin/gulp.js" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/gulp-autoprefixer": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/gulp-autoprefixer/-/gulp-autoprefixer-8.0.0.tgz", + "integrity": "sha512-sVR++PIaXpa81p52dmmA/jt50bw0egmylK5mjagfgOJ8uLDGaF9tHyzvetkY9Uo0gBZUS5sVqN3kX/GlUKOyog==", + "dev": true, + "dependencies": { + "autoprefixer": "^10.2.6", + "fancy-log": "^1.3.3", + "plugin-error": "^1.0.1", + "postcss": "^8.3.0", + "through2": "^4.0.2", + "vinyl-sourcemaps-apply": "^0.2.1" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "gulp": ">=4" + }, + "peerDependenciesMeta": { + "gulp": { + "optional": true + } + } + }, + "node_modules/gulp-autoprefixer/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/gulp-autoprefixer/node_modules/through2": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", + "dev": true, + "dependencies": { + "readable-stream": "3" + } + }, + "node_modules/gulp-beautify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/gulp-beautify/-/gulp-beautify-3.0.0.tgz", + "integrity": "sha512-Srxzb7+AQjNm+NkEVpLBfnFtN93jofVc4d4qI+N4MTPRF/vZ14jC4QA6WUZsZZZxc/oYk4bjcqQOUhmopFWlXg==", + "dev": true, + "dependencies": { + "js-beautify": "^1.8.8", + "through2": "^2.0.0" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/gulp-cache": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/gulp-cache/-/gulp-cache-1.1.3.tgz", + "integrity": "sha512-NE814LdX1NWQn2sMzn+Rf673o4mqlgg7OyLf92oQ4KEl6DdPfduEGLNH+HexLVcFZXH93DBuxFOvpv4/Js5VaA==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.5.5", + "cache-swap": "^0.3.0", + "core-js": "3", + "object.pick": "^1.3.0", + "plugin-error": "^1.0.1", + "through2": "3.0.1", + "vinyl": "^2.2.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/gulp-cache/node_modules/through2": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.1.tgz", + "integrity": "sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww==", + "dev": true, + "dependencies": { + "readable-stream": "2 || 3" + } + }, + "node_modules/gulp-clean-css": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/gulp-clean-css/-/gulp-clean-css-4.3.0.tgz", + "integrity": "sha512-mGyeT3qqFXTy61j0zOIciS4MkYziF2U594t2Vs9rUnpkEHqfu6aDITMp8xOvZcvdX61Uz3y1mVERRYmjzQF5fg==", + "dev": true, + "dependencies": { + "clean-css": "4.2.3", + "plugin-error": "1.0.1", + "through2": "3.0.1", + "vinyl-sourcemaps-apply": "0.2.1" + } + }, + "node_modules/gulp-clean-css/node_modules/through2": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.1.tgz", + "integrity": "sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww==", + "dev": true, + "dependencies": { + "readable-stream": "2 || 3" + } + }, + "node_modules/gulp-cli": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/gulp-cli/-/gulp-cli-2.3.0.tgz", + "integrity": "sha512-zzGBl5fHo0EKSXsHzjspp3y5CONegCm8ErO5Qh0UzFzk2y4tMvzLWhoDokADbarfZRL2pGpRp7yt6gfJX4ph7A==", + "dev": true, + "dependencies": { + "ansi-colors": "^1.0.1", + "archy": "^1.0.0", + "array-sort": "^1.0.0", + "color-support": "^1.1.3", + "concat-stream": "^1.6.0", + "copy-props": "^2.0.1", + "fancy-log": "^1.3.2", + "gulplog": "^1.0.0", + "interpret": "^1.4.0", + "isobject": "^3.0.1", + "liftoff": "^3.1.0", + "matchdep": "^2.0.0", + "mute-stdout": "^1.0.0", + "pretty-hrtime": "^1.0.0", + "replace-homedir": "^1.0.0", + "semver-greatest-satisfied-range": "^1.1.0", + "v8flags": "^3.2.0", + "yargs": "^7.1.0" + }, + "bin": { + "gulp": "bin/gulp.js" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/gulp-cli/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp-cli/node_modules/camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp-cli/node_modules/cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "dependencies": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "node_modules/gulp-cli/node_modules/get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "dev": true + }, + "node_modules/gulp-cli/node_modules/is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "dependencies": { + "number-is-nan": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp-cli/node_modules/require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "node_modules/gulp-cli/node_modules/string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "dependencies": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp-cli/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp-cli/node_modules/which-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", + "dev": true + }, + "node_modules/gulp-cli/node_modules/wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "dependencies": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp-cli/node_modules/y18n": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", + "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==", + "dev": true + }, + "node_modules/gulp-cli/node_modules/yargs": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.2.tgz", + "integrity": "sha512-ZEjj/dQYQy0Zx0lgLMLR8QuaqTihnxirir7EwUHp1Axq4e3+k8jXU5K0VLbNvedv1f4EWtBonDIZm0NUr+jCcA==", + "dev": true, + "dependencies": { + "camelcase": "^3.0.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.2", + "which-module": "^1.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^5.0.1" + } + }, + "node_modules/gulp-cli/node_modules/yargs-parser": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.1.tgz", + "integrity": "sha512-wpav5XYiddjXxirPoCTUPbqM0PXvJ9hiBMvuJgInvo4/lAOTZzUprArw17q2O1P2+GHhbBr18/iQwjL5Z9BqfA==", + "dev": true, + "dependencies": { + "camelcase": "^3.0.0", + "object.assign": "^4.1.0" + } + }, + "node_modules/gulp-concat": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/gulp-concat/-/gulp-concat-2.6.1.tgz", + "integrity": "sha1-Yz0WyV2IUEYorQJmVmPO5aR5M1M=", + "dev": true, + "dependencies": { + "concat-with-sourcemaps": "^1.0.0", + "through2": "^2.0.0", + "vinyl": "^2.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/gulp-file-include": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/gulp-file-include/-/gulp-file-include-2.3.0.tgz", + "integrity": "sha512-OoMq5QtXHYz6hu2dZm1OxravcqrPXGeCNvOtz+8/589zFKcdpKGGvFXz/Aw4hx8pKZqaS+oJusgKDVQ4dCzqSg==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-stream": "^2.0.0", + "extend": "^3.0.2", + "flatnest": "^1.0.0", + "json5": "^2.1.3", + "plugin-error": "^1.0.1", + "through2": "^4.0.2", + "vinyl": "^2.2.1" + } + }, + "node_modules/gulp-file-include/node_modules/concat-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", + "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", + "dev": true, + "engines": [ + "node >= 6.0" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.0.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/gulp-file-include/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/gulp-file-include/node_modules/through2": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", + "dev": true, + "dependencies": { + "readable-stream": "3" + } + }, + "node_modules/gulp-imagemin": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/gulp-imagemin/-/gulp-imagemin-7.1.0.tgz", + "integrity": "sha512-6xBTNybmPY2YrvrhhlS8Mxi0zn0ypusLon63p9XXxDtIf7U7c6KcViz94K7Skosucr3378A6IY2kJSjJyuwylQ==", + "dev": true, + "dependencies": { + "chalk": "^3.0.0", + "fancy-log": "^1.3.2", + "imagemin": "^7.0.0", + "plugin-error": "^1.0.1", + "plur": "^3.0.1", + "pretty-bytes": "^5.3.0", + "through2-concurrent": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + }, + "optionalDependencies": { + "imagemin-gifsicle": "^7.0.0", + "imagemin-mozjpeg": "^8.0.0", + "imagemin-optipng": "^7.0.0", + "imagemin-svgo": "^7.0.0" + }, + "peerDependencies": { + "gulp": ">=4" + }, + "peerDependenciesMeta": { + "gulp": { + "optional": true + } + } + }, + "node_modules/gulp-js-import": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/gulp-js-import/-/gulp-js-import-1.0.6.tgz", + "integrity": "sha1-aWrGuPp2qGapTgALDw4liF6DrCU=", + "dev": true, + "dependencies": { + "gulp-util": "^3.0.7", + "through2": "^2.0.1" + } + }, + "node_modules/gulp-minify": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/gulp-minify/-/gulp-minify-3.1.0.tgz", + "integrity": "sha512-ixF41aYg+NQikI8hpoHdEclYcQkbGdXQu1CBdHaU7Epg8H6e8d2jWXw1+rBPgYwl/XpKgjHj7NI6gkhoSNSSAg==", + "dev": true, + "dependencies": { + "ansi-colors": "^1.0.1", + "minimatch": "^3.0.2", + "plugin-error": "^0.1.2", + "terser": "^3.7.6", + "through2": "^2.0.3", + "vinyl": "^2.1.0" + } + }, + "node_modules/gulp-minify/node_modules/arr-diff": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-1.1.0.tgz", + "integrity": "sha1-aHwydYFjWI/vfeezb6vklesaOZo=", + "dev": true, + "dependencies": { + "arr-flatten": "^1.0.1", + "array-slice": "^0.2.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp-minify/node_modules/arr-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-2.1.0.tgz", + "integrity": "sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp-minify/node_modules/array-slice": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", + "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp-minify/node_modules/extend-shallow": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-1.1.4.tgz", + "integrity": "sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=", + "dev": true, + "dependencies": { + "kind-of": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp-minify/node_modules/kind-of": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz", + "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp-minify/node_modules/plugin-error": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-0.1.2.tgz", + "integrity": "sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4=", + "dev": true, + "dependencies": { + "ansi-cyan": "^0.1.1", + "ansi-red": "^0.1.1", + "arr-diff": "^1.0.1", + "arr-union": "^2.0.1", + "extend-shallow": "^1.1.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp-newer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/gulp-newer/-/gulp-newer-1.4.0.tgz", + "integrity": "sha512-h79fGO55S/P9eAADbLAP9aTtVYpLSR1ONj08VPaSdVVNVYhTS8p1CO1TW7kEMu+hC+sytmCqcUr5LesvZEtDoQ==", + "dev": true, + "dependencies": { + "glob": "^7.0.3", + "kew": "^0.7.0", + "plugin-error": "^0.1.2" + } + }, + "node_modules/gulp-newer/node_modules/arr-diff": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-1.1.0.tgz", + "integrity": "sha1-aHwydYFjWI/vfeezb6vklesaOZo=", + "dev": true, + "dependencies": { + "arr-flatten": "^1.0.1", + "array-slice": "^0.2.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp-newer/node_modules/arr-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-2.1.0.tgz", + "integrity": "sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp-newer/node_modules/array-slice": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", + "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp-newer/node_modules/extend-shallow": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-1.1.4.tgz", + "integrity": "sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=", + "dev": true, + "dependencies": { + "kind-of": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp-newer/node_modules/kind-of": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz", + "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp-newer/node_modules/plugin-error": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-0.1.2.tgz", + "integrity": "sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4=", + "dev": true, + "dependencies": { + "ansi-cyan": "^0.1.1", + "ansi-red": "^0.1.1", + "arr-diff": "^1.0.1", + "arr-union": "^2.0.1", + "extend-shallow": "^1.1.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp-plumber": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/gulp-plumber/-/gulp-plumber-1.2.1.tgz", + "integrity": "sha512-mctAi9msEAG7XzW5ytDVZ9PxWMzzi1pS2rBH7lA095DhMa6KEXjm+St0GOCc567pJKJ/oCvosVAZEpAey0q2eQ==", + "dev": true, + "dependencies": { + "chalk": "^1.1.3", + "fancy-log": "^1.3.2", + "plugin-error": "^0.1.2", + "through2": "^2.0.3" + }, + "engines": { + "node": ">=0.10", + "npm": ">=1.2.10" + } + }, + "node_modules/gulp-plumber/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp-plumber/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp-plumber/node_modules/arr-diff": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-1.1.0.tgz", + "integrity": "sha1-aHwydYFjWI/vfeezb6vklesaOZo=", + "dev": true, + "dependencies": { + "arr-flatten": "^1.0.1", + "array-slice": "^0.2.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp-plumber/node_modules/arr-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-2.1.0.tgz", + "integrity": "sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp-plumber/node_modules/array-slice": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", + "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp-plumber/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp-plumber/node_modules/extend-shallow": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-1.1.4.tgz", + "integrity": "sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=", + "dev": true, + "dependencies": { + "kind-of": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp-plumber/node_modules/kind-of": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz", + "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp-plumber/node_modules/plugin-error": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-0.1.2.tgz", + "integrity": "sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4=", + "dev": true, + "dependencies": { + "ansi-cyan": "^0.1.1", + "ansi-red": "^0.1.1", + "arr-diff": "^1.0.1", + "arr-union": "^2.0.1", + "extend-shallow": "^1.1.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp-plumber/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp-plumber/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/gulp-replace": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/gulp-replace/-/gulp-replace-1.1.3.tgz", + "integrity": "sha512-HcPHpWY4XdF8zxYkDODHnG2+7a3nD/Y8Mfu3aBgMiCFDW3X2GiOKXllsAmILcxe3KZT2BXoN18WrpEFm48KfLQ==", + "dev": true, + "dependencies": { + "@types/node": "^14.14.41", + "@types/vinyl": "^2.0.4", + "istextorbinary": "^3.0.0", + "replacestream": "^4.0.3", + "yargs-parser": ">=5.0.0-security.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/gulp-sass": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/gulp-sass/-/gulp-sass-5.1.0.tgz", + "integrity": "sha512-7VT0uaF+VZCmkNBglfe1b34bxn/AfcssquLKVDYnCDJ3xNBaW7cUuI3p3BQmoKcoKFrs9jdzUxyb+u+NGfL4OQ==", + "dev": true, + "dependencies": { + "lodash.clonedeep": "^4.5.0", + "picocolors": "^1.0.0", + "plugin-error": "^1.0.1", + "replace-ext": "^2.0.0", + "strip-ansi": "^6.0.1", + "vinyl-sourcemaps-apply": "^0.2.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/gulp-sass-unicode": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/gulp-sass-unicode/-/gulp-sass-unicode-1.0.5.tgz", + "integrity": "sha512-CiV9RpZWKbKKmgz+tw9a0xyCDljYkVqX3rmMV6mfsUpSyqMhP7I5lfoZaF4S81vJaqMxhORQmQWptB8kVBGxRA==", + "dev": true, + "dependencies": { + "gulp": "^4.0.0", + "plugin-error": "^1.0.1", + "through2": "^3.0.1" + } + }, + "node_modules/gulp-sass-unicode/node_modules/through2": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.2.tgz", + "integrity": "sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==", + "dev": true, + "dependencies": { + "inherits": "^2.0.4", + "readable-stream": "2 || 3" + } + }, + "node_modules/gulp-sourcemaps": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/gulp-sourcemaps/-/gulp-sourcemaps-3.0.0.tgz", + "integrity": "sha512-RqvUckJkuYqy4VaIH60RMal4ZtG0IbQ6PXMNkNsshEGJ9cldUPRb/YCgboYae+CLAs1HQNb4ADTKCx65HInquQ==", + "dev": true, + "dependencies": { + "@gulp-sourcemaps/identity-map": "^2.0.1", + "@gulp-sourcemaps/map-sources": "^1.0.0", + "acorn": "^6.4.1", + "convert-source-map": "^1.0.0", + "css": "^3.0.0", + "debug-fabulous": "^1.0.0", + "detect-newline": "^2.0.0", + "graceful-fs": "^4.0.0", + "source-map": "^0.6.0", + "strip-bom-string": "^1.0.0", + "through2": "^2.0.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/gulp-touch-cmd": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/gulp-touch-cmd/-/gulp-touch-cmd-0.0.1.tgz", + "integrity": "sha1-c669BA9cv79Wegbj/beXbvD7iMw=", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "through2": "^2.0.3" + } + }, + "node_modules/gulp-uglify": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gulp-uglify/-/gulp-uglify-3.0.2.tgz", + "integrity": "sha512-gk1dhB74AkV2kzqPMQBLA3jPoIAPd/nlNzP2XMDSG8XZrqnlCiDGAqC+rZOumzFvB5zOphlFh6yr3lgcAb/OOg==", + "dev": true, + "dependencies": { + "array-each": "^1.0.1", + "extend-shallow": "^3.0.2", + "gulplog": "^1.0.0", + "has-gulplog": "^0.1.0", + "isobject": "^3.0.1", + "make-error-cause": "^1.1.1", + "safe-buffer": "^5.1.2", + "through2": "^2.0.0", + "uglify-js": "^3.0.5", + "vinyl-sourcemaps-apply": "^0.2.0" + } + }, + "node_modules/gulp-util": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz", + "integrity": "sha1-AFTh50RQLifATBh8PsxQXdVLu08=", + "deprecated": "gulp-util is deprecated - replace it, following the guidelines at https://medium.com/gulpjs/gulp-util-ca3b1f9f9ac5", + "dev": true, + "dependencies": { + "array-differ": "^1.0.0", + "array-uniq": "^1.0.2", + "beeper": "^1.0.0", + "chalk": "^1.0.0", + "dateformat": "^2.0.0", + "fancy-log": "^1.1.0", + "gulplog": "^1.0.0", + "has-gulplog": "^0.1.0", + "lodash._reescape": "^3.0.0", + "lodash._reevaluate": "^3.0.0", + "lodash._reinterpolate": "^3.0.0", + "lodash.template": "^3.0.0", + "minimist": "^1.1.0", + "multipipe": "^0.1.2", + "object-assign": "^3.0.0", + "replace-ext": "0.0.1", + "through2": "^2.0.0", + "vinyl": "^0.5.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/gulp-util/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp-util/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp-util/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp-util/node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/gulp-util/node_modules/clone-stats": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", + "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=", + "dev": true + }, + "node_modules/gulp-util/node_modules/object-assign": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", + "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp-util/node_modules/replace-ext": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", + "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/gulp-util/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp-util/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/gulp-util/node_modules/vinyl": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz", + "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=", + "dev": true, + "dependencies": { + "clone": "^1.0.0", + "clone-stats": "^0.0.1", + "replace-ext": "0.0.1" + }, + "engines": { + "node": ">= 0.9" + } + }, + "node_modules/gulplog": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", + "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", + "dev": true, + "dependencies": { + "glogg": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-ansi/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "dev": true, + "optional": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-binary2": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", + "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==", + "dev": true, + "dependencies": { + "isarray": "2.0.1" + } + }, + "node_modules/has-binary2/node_modules/isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", + "dev": true + }, + "node_modules/has-cors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", + "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=", + "dev": true + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/has-gulplog": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz", + "integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=", + "dev": true, + "dependencies": { + "sparkles": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/has-symbol-support-x": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz", + "integrity": "sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-to-string-tag-x": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz", + "integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==", + "dev": true, + "dependencies": { + "has-symbol-support-x": "^1.4.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "optional": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "dependencies": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "dependencies": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "dependencies": { + "parse-passwd": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "node_modules/http-cache-semantics": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz", + "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==", + "dev": true + }, + "node_modules/http-errors": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "dev": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/http-errors/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "optional": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/imagemin": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/imagemin/-/imagemin-7.0.1.tgz", + "integrity": "sha512-33AmZ+xjZhg2JMCe+vDf6a9mzWukE7l+wAtesjE7KyteqqKjzxv7aVQeWnul1Ve26mWvEQqyPwl0OctNBfSR9w==", + "dev": true, + "dependencies": { + "file-type": "^12.0.0", + "globby": "^10.0.0", + "graceful-fs": "^4.2.2", + "junk": "^3.1.0", + "make-dir": "^3.0.0", + "p-pipe": "^3.0.0", + "replace-ext": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/imagemin-gifsicle": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/imagemin-gifsicle/-/imagemin-gifsicle-7.0.0.tgz", + "integrity": "sha512-LaP38xhxAwS3W8PFh4y5iQ6feoTSF+dTAXFRUEYQWYst6Xd+9L/iPk34QGgK/VO/objmIlmq9TStGfVY2IcHIA==", + "dev": true, + "optional": true, + "dependencies": { + "execa": "^1.0.0", + "gifsicle": "^5.0.0", + "is-gif": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/imagemin/imagemin-gifsicle?sponsor=1" + } + }, + "node_modules/imagemin-jpeg-recompress": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/imagemin-jpeg-recompress/-/imagemin-jpeg-recompress-7.0.0.tgz", + "integrity": "sha512-8bO1I6Xncw82i1drrLL/IemZfdD8+oZImUFzMffHUP4YrvyJZpbS8QTC95yIQuuA0NLWDaGuB93sGN8z4T3DnA==", + "dev": true, + "dependencies": { + "exec-buffer": "^3.0.0", + "is-jpg": "^2.0.0", + "jpeg-recompress-bin": "^5.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/imagemin-mozjpeg": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/imagemin-mozjpeg/-/imagemin-mozjpeg-8.0.0.tgz", + "integrity": "sha512-+EciPiIjCb8JWjQNr1q8sYWYf7GDCNDxPYnkD11TNIjjWNzaV+oTg4DpOPQjl5ZX/KRCPMEgS79zLYAQzLitIA==", + "dev": true, + "optional": true, + "dependencies": { + "execa": "^1.0.0", + "is-jpg": "^2.0.0", + "mozjpeg": "^6.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/imagemin-optipng": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/imagemin-optipng/-/imagemin-optipng-7.1.0.tgz", + "integrity": "sha512-JNORTZ6j6untH7e5gF4aWdhDCxe3ODsSLKs/f7Grewy3ebZpl1ZsU+VUTPY4rzeHgaFA8GSWOoA8V2M3OixWZQ==", + "dev": true, + "optional": true, + "dependencies": { + "exec-buffer": "^3.0.0", + "is-png": "^2.0.0", + "optipng-bin": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/imagemin-pngquant": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/imagemin-pngquant/-/imagemin-pngquant-9.0.2.tgz", + "integrity": "sha512-cj//bKo8+Frd/DM8l6Pg9pws1pnDUjgb7ae++sUX1kUVdv2nrngPykhiUOgFeE0LGY/LmUbCf4egCHC4YUcZSg==", + "dev": true, + "dependencies": { + "execa": "^4.0.0", + "is-png": "^2.0.0", + "is-stream": "^2.0.0", + "ow": "^0.17.0", + "pngquant-bin": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/imagemin-pngquant/node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/imagemin-pngquant/node_modules/execa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/imagemin-pngquant/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imagemin-pngquant/node_modules/human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "dev": true, + "engines": { + "node": ">=8.12.0" + } + }, + "node_modules/imagemin-pngquant/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imagemin-pngquant/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/imagemin-pngquant/node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/imagemin-pngquant/node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/imagemin-pngquant/node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/imagemin-pngquant/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/imagemin-svgo": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/imagemin-svgo/-/imagemin-svgo-7.1.0.tgz", + "integrity": "sha512-0JlIZNWP0Luasn1HT82uB9nU9aa+vUj6kpT+MjPW11LbprXC+iC4HDwn1r4Q2/91qj4iy9tRZNsFySMlEpLdpg==", + "dev": true, + "optional": true, + "dependencies": { + "is-svg": "^4.2.1", + "svgo": "^1.3.2" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sindresorhus/imagemin-svgo?sponsor=1" + } + }, + "node_modules/imagemin/node_modules/globby": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz", + "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==", + "dev": true, + "dependencies": { + "@types/glob": "^7.1.1", + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.0.3", + "glob": "^7.1.3", + "ignore": "^5.1.1", + "merge2": "^1.2.3", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/imagemin/node_modules/replace-ext": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz", + "integrity": "sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/immutable": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.2.tgz", + "integrity": "sha1-wkOZUUVbs5kT2vKBN28VMOEErfM=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/import-lazy": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-3.1.0.tgz", + "integrity": "sha512-8/gvXvX2JMn0F+CDlSC4l6kOmVaLOO3XLkksI7CI3Ud95KDYJuYur2b9P/PUt/i/pDAMd/DulQsNbbbmRRsDIQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", + "dev": true + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "node_modules/internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "dev": true, + "optional": true, + "dependencies": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/into-stream": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-3.1.0.tgz", + "integrity": "sha1-lvsKk2wSur1v8XUqF9BWFqvQlMY=", + "dev": true, + "dependencies": { + "from2": "^2.1.1", + "p-is-promise": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/irregular-plurals": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-2.0.0.tgz", + "integrity": "sha512-Y75zBYLkh0lJ9qxeHlMjQ7bSbyiSqNW/UOPWDmzC7cXskL1hekSITh1Oc6JV0XCWWZ9DE8VYSB71xocLk3gmGw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "dev": true, + "dependencies": { + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "optional": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "optional": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "node_modules/is-callable": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", + "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", + "dev": true, + "optional": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", + "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "optional": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-descriptor/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extendable/node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finite": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", + "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-gif": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-gif/-/is-gif-3.0.0.tgz", + "integrity": "sha512-IqJ/jlbw5WJSNfwQ/lHEDXF8rxhRgF6ythk2oiEvhpG29F704eX9NO6TvPfMiq9DrbwgcEDnETYNcZDPewQoVw==", + "dev": true, + "optional": true, + "dependencies": { + "file-type": "^10.4.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-gif/node_modules/file-type": { + "version": "10.11.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-10.11.0.tgz", + "integrity": "sha512-uzk64HRpUZyTGZtVuvrjP0FYxzQrBf4rojot6J65YMEbwBLB0CWm0CLojVpwpmFmxcE/lkvYICgfcGozbBq6rw==", + "dev": true, + "optional": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-jpg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-jpg/-/is-jpg-2.0.0.tgz", + "integrity": "sha1-LhmX+m6RZuqsAkLarkQ0A+TvHZc=", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-natural-number": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-4.0.1.tgz", + "integrity": "sha1-q5124dtM7VHjXeDHLr7PCfc0zeg=", + "dev": true + }, + "node_modules/is-negated-glob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", + "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true, + "optional": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-like": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/is-number-like/-/is-number-like-1.0.8.tgz", + "integrity": "sha512-6rZi3ezCyFcn5L71ywzz2bS5b2Igl1En3eTlZlvKjpz1n3IZLAYMbKYAIQgFmEu0GENg92ziU/faEOA/aixjbA==", + "dev": true, + "dependencies": { + "lodash.isfinite": "^3.3.2" + } + }, + "node_modules/is-number-object": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz", + "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==", + "dev": true, + "optional": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.2.tgz", + "integrity": "sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-png": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-png/-/is-png-2.0.0.tgz", + "integrity": "sha512-4KPGizaVGj2LK7xwJIz8o5B2ubu1D/vcQsgOGFEDlpcvgZHto4gBnyd0ig7Ws+67ixmwKoNmu0hYnpo6AaKb5g==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-promise": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", + "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", + "dev": true + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "optional": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-relative": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "dev": true, + "dependencies": { + "is-unc-path": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-retry-allowed": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", + "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz", + "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==", + "dev": true, + "optional": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "optional": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-svg": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-4.3.2.tgz", + "integrity": "sha512-mM90duy00JGMyjqIVHu9gNTjywdZV+8qNasX8cm/EEYZ53PHDgajvbBwNVvty5dwSAxLUD3p3bdo+7sR/UMrpw==", + "dev": true, + "optional": true, + "dependencies": { + "fast-xml-parser": "^3.19.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "optional": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-unc-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "dev": true, + "dependencies": { + "unc-path-regex": "^0.1.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "node_modules/is-valid-glob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-1.0.0.tgz", + "integrity": "sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "optional": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/istextorbinary": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/istextorbinary/-/istextorbinary-3.3.0.tgz", + "integrity": "sha512-Tvq1W6NAcZeJ8op+Hq7tdZ434rqnMx4CCZ7H0ff83uEloDvVbqAwaMTZcafKGJT0VHkYzuXUiCY4hlXQg6WfoQ==", + "dev": true, + "dependencies": { + "binaryextensions": "^2.2.0", + "textextensions": "^3.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://bevry.me/fund" + } + }, + "node_modules/isurl": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz", + "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==", + "dev": true, + "dependencies": { + "has-to-string-tag-x": "^1.2.0", + "is-object": "^1.0.1" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/jpeg-recompress-bin": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/jpeg-recompress-bin/-/jpeg-recompress-bin-5.1.2.tgz", + "integrity": "sha512-JjR7+gqmw1D1jYgicMpRi+t/Si13+xOMDuvYRSQFMkrKmnOwTqti+9U9ZHrbUnXjrulqK9Sjjq/Hn8E9UnOFpA==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "bin-build": "^3.0.0", + "bin-wrapper": "^4.1.0" + }, + "bin": { + "jpeg-recompress": "cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/js-beautify": { + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.14.0.tgz", + "integrity": "sha512-yuck9KirNSCAwyNJbqW+BxJqJ0NLJ4PwBUzQQACl5O3qHMBXVkXb/rD0ilh/Lat/tn88zSZ+CAHOlk0DsY7GuQ==", + "dev": true, + "dependencies": { + "config-chain": "^1.1.12", + "editorconfig": "^0.15.3", + "glob": "^7.1.3", + "nopt": "^5.0.0" + }, + "bin": { + "css-beautify": "js/bin/css-beautify.js", + "html-beautify": "js/bin/html-beautify.js", + "js-beautify": "js/bin/js-beautify.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "optional": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz", + "integrity": "sha1-pezG9l9T9mLEQVx2daAzHQmS7GY=", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/junk": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/junk/-/junk-3.1.0.tgz", + "integrity": "sha512-pBxcB3LFc8QVgdggvZWyeys+hnrNWg4OcZIU/1X59k5jQdLBlCsYGRQaz234SqoRLTCgMH00fY0xRJH+F9METQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/just-debounce": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/just-debounce/-/just-debounce-1.1.0.tgz", + "integrity": "sha512-qpcRocdkUmf+UTNBYx5w6dexX5J31AKK1OmPwH630a83DdVVUIngk55RSAiIGpQyoH0dlr872VHfPjnQnK1qDQ==", + "dev": true + }, + "node_modules/kew": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/kew/-/kew-0.7.0.tgz", + "integrity": "sha1-edk9LTM2PW/dKXCzNdkUGtWR15s=", + "dev": true + }, + "node_modules/keyv": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.0.0.tgz", + "integrity": "sha512-eguHnq22OE3uVoSYG0LVWNP+4ppamWr9+zWBe1bsNcovIMy6huUJFPgy4mGwCd/rnl3vOLGW1MTlu4c57CT1xA==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.0" + } + }, + "node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/last-run": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/last-run/-/last-run-1.1.1.tgz", + "integrity": "sha1-RblpQsF7HHnHchmCWbqUO+v4yls=", + "dev": true, + "dependencies": { + "default-resolution": "^2.0.0", + "es6-weak-map": "^2.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/lazystream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", + "dev": true, + "dependencies": { + "readable-stream": "^2.0.5" + }, + "engines": { + "node": ">= 0.6.3" + } + }, + "node_modules/lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "dev": true, + "dependencies": { + "invert-kv": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lead": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lead/-/lead-1.0.0.tgz", + "integrity": "sha1-bxT5mje+Op3XhPVJVpDlkDRm7kI=", + "dev": true, + "dependencies": { + "flush-write-stream": "^1.0.2" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/liftoff": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-3.1.0.tgz", + "integrity": "sha512-DlIPlJUkCV0Ips2zf2pJP0unEoT1kwYhiiPUGF3s/jtxTCjziNLoiVVh+jqWOWeFi6mmwQ5fNxvAUyPad4Dfog==", + "dev": true, + "dependencies": { + "extend": "^3.0.0", + "findup-sync": "^3.0.0", + "fined": "^1.0.1", + "flagged-respawn": "^1.0.0", + "is-plain-object": "^2.0.4", + "object.map": "^1.0.0", + "rechoir": "^0.6.2", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/liftoff/node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/limiter": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.5.tgz", + "integrity": "sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==", + "dev": true + }, + "node_modules/load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/load-json-file/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/localtunnel": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/localtunnel/-/localtunnel-2.0.2.tgz", + "integrity": "sha512-n418Cn5ynvJd7m/N1d9WVJISLJF/ellZnfsLnx8WBWGzxv/ntNcFkJ1o6se5quUhCplfLGBNL5tYHiq5WF3Nug==", + "dev": true, + "dependencies": { + "axios": "0.21.4", + "debug": "4.3.2", + "openurl": "1.1.1", + "yargs": "17.1.1" + }, + "bin": { + "lt": "bin/lt.js" + }, + "engines": { + "node": ">=8.3.0" + } + }, + "node_modules/localtunnel/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/localtunnel/node_modules/debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/localtunnel/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/localtunnel/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/localtunnel/node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/localtunnel/node_modules/yargs": { + "version": "17.1.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.1.1.tgz", + "integrity": "sha512-c2k48R0PwKIqKhPMWjeiF6y2xY/gPMUlro0sgxqXpbOIohWiLNXWslsootttv7E1e73QPAMQSg5FeySbVcpsPQ==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/localtunnel/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/lodash._basecopy": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", + "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", + "dev": true + }, + "node_modules/lodash._basetostring": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz", + "integrity": "sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U=", + "dev": true + }, + "node_modules/lodash._basevalues": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz", + "integrity": "sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc=", + "dev": true + }, + "node_modules/lodash._getnative": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", + "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", + "dev": true + }, + "node_modules/lodash._isiterateecall": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", + "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", + "dev": true + }, + "node_modules/lodash._reescape": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reescape/-/lodash._reescape-3.0.0.tgz", + "integrity": "sha1-Kx1vXf4HyKNVdT5fJ/rH8c3hYWo=", + "dev": true + }, + "node_modules/lodash._reevaluate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz", + "integrity": "sha1-WLx0xAZklTrgsSTYBpltrKQx4u0=", + "dev": true + }, + "node_modules/lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", + "dev": true + }, + "node_modules/lodash._root": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz", + "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=", + "dev": true + }, + "node_modules/lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", + "dev": true + }, + "node_modules/lodash.escape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz", + "integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=", + "dev": true, + "dependencies": { + "lodash._root": "^3.0.0" + } + }, + "node_modules/lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", + "dev": true + }, + "node_modules/lodash.isarray": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", + "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", + "dev": true + }, + "node_modules/lodash.isfinite": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz", + "integrity": "sha1-+4m2WpqAKBgz8LdHizpRBPiY67M=", + "dev": true + }, + "node_modules/lodash.keys": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", + "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", + "dev": true, + "dependencies": { + "lodash._getnative": "^3.0.0", + "lodash.isarguments": "^3.0.0", + "lodash.isarray": "^3.0.0" + } + }, + "node_modules/lodash.restparam": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", + "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=", + "dev": true + }, + "node_modules/lodash.template": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz", + "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=", + "dev": true, + "dependencies": { + "lodash._basecopy": "^3.0.0", + "lodash._basetostring": "^3.0.0", + "lodash._basevalues": "^3.0.0", + "lodash._isiterateecall": "^3.0.0", + "lodash._reinterpolate": "^3.0.0", + "lodash.escape": "^3.0.0", + "lodash.keys": "^3.0.0", + "lodash.restparam": "^3.0.0", + "lodash.templatesettings": "^3.0.0" + } + }, + "node_modules/lodash.templatesettings": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz", + "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=", + "dev": true, + "dependencies": { + "lodash._reinterpolate": "^3.0.0", + "lodash.escape": "^3.0.0" + } + }, + "node_modules/logalot": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/logalot/-/logalot-2.1.0.tgz", + "integrity": "sha1-X46MkNME7fElMJUaVVSruMXj9VI=", + "dev": true, + "optional": true, + "dependencies": { + "figures": "^1.3.5", + "squeak": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/longest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "dev": true, + "optional": true, + "dependencies": { + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lpad-align": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/lpad-align/-/lpad-align-1.1.2.tgz", + "integrity": "sha1-IfYArBwwlcPG5JfuZyce4ISB/p4=", + "dev": true, + "optional": true, + "dependencies": { + "get-stdin": "^4.0.1", + "indent-string": "^2.1.0", + "longest": "^1.0.0", + "meow": "^3.3.0" + }, + "bin": { + "lpad-align": "cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lpad-align/node_modules/indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "dev": true, + "optional": true, + "dependencies": { + "repeating": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "dependencies": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "node_modules/lru-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz", + "integrity": "sha1-Jzi9nw089PhEkMVzbEhpmsYyzaM=", + "dev": true, + "dependencies": { + "es5-ext": "~0.10.2" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "node_modules/make-error-cause": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/make-error-cause/-/make-error-cause-1.2.2.tgz", + "integrity": "sha1-3wOI/NCzeBbf8KX7gQiTl3fcvJ0=", + "dev": true, + "dependencies": { + "make-error": "^1.2.0" + } + }, + "node_modules/make-iterator": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", + "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/make-iterator/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "dependencies": { + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matchdep": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/matchdep/-/matchdep-2.0.0.tgz", + "integrity": "sha1-xvNINKDY28OzfCfui7yyfHd1WC4=", + "dev": true, + "dependencies": { + "findup-sync": "^2.0.0", + "micromatch": "^3.0.4", + "resolve": "^1.4.0", + "stack-trace": "0.0.10" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/matchdep/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matchdep/node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matchdep/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matchdep/node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matchdep/node_modules/findup-sync": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", + "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", + "dev": true, + "dependencies": { + "detect-file": "^1.0.0", + "is-glob": "^3.1.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/matchdep/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matchdep/node_modules/is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matchdep/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matchdep/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matchdep/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matchdep/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matchdep/node_modules/to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mdn-data": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", + "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==", + "dev": true, + "optional": true + }, + "node_modules/memoizee": { + "version": "0.4.15", + "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.15.tgz", + "integrity": "sha512-UBWmJpLZd5STPm7PMUlOw/TSy972M+z8gcyQ5veOnSDRREz/0bmpyTfKt3/51DhEBqCZQn1udM/5flcSPYhkdQ==", + "dev": true, + "dependencies": { + "d": "^1.0.1", + "es5-ext": "^0.10.53", + "es6-weak-map": "^2.0.3", + "event-emitter": "^0.3.5", + "is-promise": "^2.2.2", + "lru-queue": "^0.1.0", + "next-tick": "^1.1.0", + "timers-ext": "^0.1.7" + } + }, + "node_modules/meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "dev": true, + "optional": true, + "dependencies": { + "camelcase-keys": "^2.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", + "dev": true, + "bin": { + "mime": "cli.js" + } + }, + "node_modules/mime-db": { + "version": "1.51.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", + "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.34", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", + "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", + "dev": true, + "dependencies": { + "mime-db": "1.51.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "node_modules/mitt": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-1.2.0.tgz", + "integrity": "sha512-r6lj77KlwqLhIUku9UWYes7KJtsczvolZkzp8hbaDPPaE24OmWl5s539Mytlj22siEQKosZ26qCBgda2PKwoJw==", + "dev": true + }, + "node_modules/mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "dependencies": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/mozjpeg": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/mozjpeg/-/mozjpeg-6.0.1.tgz", + "integrity": "sha512-9Z59pJMi8ni+IUvSH5xQwK5tNLw7p3dwDNCZ3o1xE+of3G5Hc/yOz6Ue/YuLiBXU3ZB5oaHPURyPdqfBX/QYJA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "dependencies": { + "bin-build": "^3.0.0", + "bin-wrapper": "^4.0.0", + "logalot": "^2.1.0" + }, + "bin": { + "mozjpeg": "cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/multipipe": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", + "integrity": "sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=", + "dev": true, + "dependencies": { + "duplexer2": "0.0.2" + } + }, + "node_modules/mute-stdout": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mute-stdout/-/mute-stdout-1.0.1.tgz", + "integrity": "sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/nan": { + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", + "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==", + "dev": true, + "optional": true + }, + "node_modules/nanoid": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.2.0.tgz", + "integrity": "sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA==", + "dev": true, + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/next-tick": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", + "dev": true + }, + "node_modules/nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "node_modules/node-releases": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz", + "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==", + "dev": true + }, + "node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dev": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/now-and-later": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-2.0.1.tgz", + "integrity": "sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ==", + "dev": true, + "dependencies": { + "once": "^1.3.2" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/npm-conf": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/npm-conf/-/npm-conf-1.1.3.tgz", + "integrity": "sha512-Yic4bZHJOt9RCFbRP3GgpqhScOY4HH3V2P8yBj6CeYq118Qr+BLXqT2JvpJ00mryLESpgOxf5XlFv4ZjXxLScw==", + "dev": true, + "dependencies": { + "config-chain": "^1.1.11", + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-conf/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "dependencies": { + "path-key": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "dev": true, + "optional": true, + "dependencies": { + "boolbase": "~1.0.0" + } + }, + "node_modules/number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "dependencies": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-descriptor/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", + "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==", + "dev": true, + "optional": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "dependencies": { + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.defaults": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", + "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", + "dev": true, + "dependencies": { + "array-each": "^1.0.1", + "array-slice": "^1.0.0", + "for-own": "^1.0.0", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.getownpropertydescriptors": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.3.tgz", + "integrity": "sha512-VdDoCwvJI4QdC6ndjpqFmoL3/+HxffFBbcJzKi5hwLLqqx3mdbedRpfZDdK0SrOSauj8X4GzBvnDZl4vTN7dOw==", + "dev": true, + "optional": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", + "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=", + "dev": true, + "dependencies": { + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.reduce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.reduce/-/object.reduce-1.0.1.tgz", + "integrity": "sha1-b+NI8qx/oPlcpiEiZZkJaCW7A60=", + "dev": true, + "dependencies": { + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.values": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", + "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", + "dev": true, + "optional": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/openurl": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/openurl/-/openurl-1.1.1.tgz", + "integrity": "sha1-OHW0sO96UsFW8NtB1GCduw+Us4c=", + "dev": true + }, + "node_modules/opn": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.3.0.tgz", + "integrity": "sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g==", + "dev": true, + "dependencies": { + "is-wsl": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/optipng-bin": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/optipng-bin/-/optipng-bin-6.0.0.tgz", + "integrity": "sha512-95bB4y8IaTsa/8x6QH4bLUuyvyOoGBCLDA7wOgDL8UFqJpSUh1Hob8JRJhit+wC1ZLN3tQ7mFt7KuBj0x8F2Wg==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "dependencies": { + "bin-build": "^3.0.0", + "bin-wrapper": "^4.0.0", + "logalot": "^2.0.0" + }, + "bin": { + "optipng": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ordered-read-streams": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz", + "integrity": "sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=", + "dev": true, + "dependencies": { + "readable-stream": "^2.0.1" + } + }, + "node_modules/os-filter-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/os-filter-obj/-/os-filter-obj-2.0.0.tgz", + "integrity": "sha512-uksVLsqG3pVdzzPvmAHpBK0wKxYItuzZr7SziusRPoz67tGV8rL1szZ6IdeUrbqLjGDwApBtN29eEE3IqGHOjg==", + "dev": true, + "dependencies": { + "arch": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "dev": true, + "dependencies": { + "lcid": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ow": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/ow/-/ow-0.17.0.tgz", + "integrity": "sha512-i3keDzDQP5lWIe4oODyDFey1qVrq2hXKTuTH2VpqwpYtzPiKZt2ziRI4NBQmgW40AnV5Euz17OyWweCb+bNEQA==", + "dev": true, + "dependencies": { + "type-fest": "^0.11.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-cancelable": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz", + "integrity": "sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-event": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-event/-/p-event-1.3.0.tgz", + "integrity": "sha1-jmtPT2XHK8W2/ii3XtqHT5akoIU=", + "dev": true, + "dependencies": { + "p-timeout": "^1.1.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-is-promise": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz", + "integrity": "sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map-series": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-map-series/-/p-map-series-1.0.0.tgz", + "integrity": "sha1-v5j+V1cFZYqeE1G++4WuTB8Hvco=", + "dev": true, + "dependencies": { + "p-reduce": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-pipe": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-pipe/-/p-pipe-3.1.0.tgz", + "integrity": "sha512-08pj8ATpzMR0Y80x50yJHn37NF6vjrqHutASaX5LiH5npS9XPvrUmscd9MF5R4fuYRHOxQR1FfMIlF7AzwoPqw==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-reduce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-1.0.0.tgz", + "integrity": "sha1-GMKw3ZNqRpClKfgjH1ig/bakffo=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-timeout": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-1.2.1.tgz", + "integrity": "sha1-XrOzU7f86Z8QGhA4iAuwVOu+o4Y=", + "dev": true, + "dependencies": { + "p-finally": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-filepath": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", + "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", + "dev": true, + "dependencies": { + "is-absolute": "^1.0.0", + "map-cache": "^0.2.0", + "path-root": "^0.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "dependencies": { + "error-ex": "^1.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parse-node-version": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parseqs": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.6.tgz", + "integrity": "sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w==", + "dev": true + }, + "node_modules/parseuri": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.6.tgz", + "integrity": "sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow==", + "dev": true + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "node_modules/path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "dependencies": { + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-root": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", + "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", + "dev": true, + "dependencies": { + "path-root-regex": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-root-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", + "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", + "dev": true + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "dependencies": { + "pinkie": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/plugin-error": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz", + "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==", + "dev": true, + "dependencies": { + "ansi-colors": "^1.0.1", + "arr-diff": "^4.0.0", + "arr-union": "^3.1.0", + "extend-shallow": "^3.0.2" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/plur": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/plur/-/plur-3.1.1.tgz", + "integrity": "sha512-t1Ax8KUvV3FFII8ltczPn2tJdjqbd1sIzu6t4JL7nQ3EyeL/lTrj5PWKb06ic5/6XYDr65rQ4uzQEGN70/6X5w==", + "dev": true, + "dependencies": { + "irregular-plurals": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pngquant-bin": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/pngquant-bin/-/pngquant-bin-6.0.1.tgz", + "integrity": "sha512-Q3PUyolfktf+hYio6wsg3SanQzEU/v8aICg/WpzxXcuCMRb7H2Q81okfpcEztbMvw25ILjd3a87doj2N9kvbpQ==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "bin-build": "^3.0.0", + "bin-wrapper": "^4.0.1", + "execa": "^4.0.0" + }, + "bin": { + "pngquant": "cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/pngquant-bin/node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/pngquant-bin/node_modules/execa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/pngquant-bin/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pngquant-bin/node_modules/human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "dev": true, + "engines": { + "node": ">=8.12.0" + } + }, + "node_modules/pngquant-bin/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pngquant-bin/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pngquant-bin/node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/pngquant-bin/node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pngquant-bin/node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/pngquant-bin/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/portscanner": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/portscanner/-/portscanner-2.1.1.tgz", + "integrity": "sha1-6rtAnk3iSVD1oqUW01rnaTQ/u5Y=", + "dev": true, + "dependencies": { + "async": "1.5.2", + "is-number-like": "^1.0.3" + }, + "engines": { + "node": ">=0.4", + "npm": ">=1.0.0" + } + }, + "node_modules/posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss": { + "version": "8.4.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.6.tgz", + "integrity": "sha512-OovjwIzs9Te46vlEx7+uXB0PLijpwjXGKXjVGGPIGubGpq7uh5Xgf6D6FiJ/SzJMBosHDp6a2hiXOS97iBXcaA==", + "dev": true, + "dependencies": { + "nanoid": "^3.2.0", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "node_modules/prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pretty-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pretty-hrtime": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "node_modules/proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=", + "dev": true + }, + "node_modules/pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dev": true, + "dependencies": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + } + }, + "node_modules/pumpify/node_modules/pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" + } + }, + "node_modules/qs": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.2.3.tgz", + "integrity": "sha1-HPyyXBCpsrSDBT/zn138kjOQjP4=", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/query-string": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", + "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", + "dev": true, + "dependencies": { + "decode-uri-component": "^0.2.0", + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.2.tgz", + "integrity": "sha512-RPMAFUJP19WIet/99ngh6Iv8fzAbqum4Li7AD6DtGaW2RpMB/11xDoalPiJMTbu6I3hkbMVkATvZrqb9EEqeeQ==", + "dev": true, + "dependencies": { + "bytes": "3.1.1", + "http-errors": "1.8.1", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "dependencies": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "dependencies": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-pkg/node_modules/path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-pkg/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "dev": true, + "dependencies": { + "resolve": "^1.1.6" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "dev": true, + "optional": true, + "dependencies": { + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/redent/node_modules/indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "dev": true, + "optional": true, + "dependencies": { + "repeating": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.13.9", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", + "dev": true + }, + "node_modules/regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "dependencies": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/remove-bom-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz", + "integrity": "sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5", + "is-utf8": "^0.2.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/remove-bom-stream": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz", + "integrity": "sha1-BfGlk/FuQuH7kOv1nejlaVJflSM=", + "dev": true, + "dependencies": { + "remove-bom-buffer": "^3.0.0", + "safe-buffer": "^5.1.0", + "through2": "^2.0.3" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "node_modules/repeat-element": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "optional": true, + "dependencies": { + "is-finite": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/replace-ext": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-2.0.0.tgz", + "integrity": "sha512-UszKE5KVK6JvyD92nzMn9cDapSk6w/CaFZ96CnmDMUqH9oowfxF/ZjRITD25H4DnOQClLA4/j7jLGXXLVKxAug==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/replace-homedir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/replace-homedir/-/replace-homedir-1.0.0.tgz", + "integrity": "sha1-6H9tUTuSjd6AgmDBK+f+xv9ueYw=", + "dev": true, + "dependencies": { + "homedir-polyfill": "^1.0.1", + "is-absolute": "^1.0.0", + "remove-trailing-separator": "^1.1.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/replacestream": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/replacestream/-/replacestream-4.0.3.tgz", + "integrity": "sha512-AC0FiLS352pBBiZhd4VXB1Ab/lh0lEgpP+GGvZqbQh8a5cmXVoTe5EX/YeTFArnp4SRGTHh1qCHu9lGs1qG8sA==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^1.0.3", + "object-assign": "^4.0.1", + "readable-stream": "^2.0.2" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true + }, + "node_modules/resolve": { + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", + "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.8.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "dev": true, + "dependencies": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-options": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/resolve-options/-/resolve-options-1.1.0.tgz", + "integrity": "sha1-MrueOcBtZzONyTeMDW1gdFZq0TE=", + "dev": true, + "dependencies": { + "value-or-function": "^3.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "deprecated": "https://github.com/lydell/resolve-url#deprecated", + "dev": true + }, + "node_modules/resp-modifier": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/resp-modifier/-/resp-modifier-6.0.2.tgz", + "integrity": "sha1-sSTeXE+6/LpUH0j/pzlw9KpFa08=", + "dev": true, + "dependencies": { + "debug": "^2.2.0", + "minimatch": "^3.0.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", + "dev": true, + "dependencies": { + "lowercase-keys": "^1.0.0" + } + }, + "node_modules/ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rx": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/rx/-/rx-4.1.0.tgz", + "integrity": "sha1-pfE/957zt0D+MKqAP7CfmIBdR4I=", + "dev": true + }, + "node_modules/rxjs": { + "version": "5.5.12", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.12.tgz", + "integrity": "sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw==", + "dev": true, + "dependencies": { + "symbol-observable": "1.0.1" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "dependencies": { + "ret": "~0.1.10" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/sass": { + "version": "1.49.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.49.0.tgz", + "integrity": "sha512-TVwVdNDj6p6b4QymJtNtRS2YtLJ/CqZriGg0eIAbAKMlN8Xy6kbv33FsEZSF7FufFFM705SQviHjjThfaQ4VNw==", + "dev": true, + "dependencies": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/sass/node_modules/immutable": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.0.0.tgz", + "integrity": "sha512-zIE9hX70qew5qTUjSS7wi1iwj/l7+m54KWU247nhM3v806UdGj1yDndXj+IOYxxtW9zyLI+xqFNZjTuDaLUqFw==", + "dev": true + }, + "node_modules/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true, + "optional": true + }, + "node_modules/seek-bzip": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.6.tgz", + "integrity": "sha512-e1QtP3YL5tWww8uKaOCQ18UxIT2laNBXHjV/S2WYCiK4udiv8lkG89KRIoCjUagnAmCBurjF4zEVX2ByBbnCjQ==", + "dev": true, + "dependencies": { + "commander": "^2.8.1" + }, + "bin": { + "seek-bunzip": "bin/seek-bunzip", + "seek-table": "bin/seek-bzip-table" + } + }, + "node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/semver-greatest-satisfied-range": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-1.1.0.tgz", + "integrity": "sha1-E+jCZYq5aRywzXEJMkAoDTb3els=", + "dev": true, + "dependencies": { + "sver-compat": "^1.5.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/semver-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-2.0.0.tgz", + "integrity": "sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/semver-truncate": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/semver-truncate/-/semver-truncate-1.1.2.tgz", + "integrity": "sha1-V/Qd5pcHpicJp+AQS6IRcQnqR+g=", + "dev": true, + "dependencies": { + "semver": "^5.3.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/send": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", + "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.6.2", + "mime": "1.4.1", + "ms": "2.0.0", + "on-finished": "~2.3.0", + "range-parser": "~1.2.0", + "statuses": "~1.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "dev": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/send/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "node_modules/send/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "node_modules/send/node_modules/statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "dev": true, + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "dev": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "node_modules/serve-index/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-static": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", + "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", + "dev": true, + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.2", + "send": "0.16.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/server-destroy": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/server-destroy/-/server-destroy-1.0.1.tgz", + "integrity": "sha1-8Tv5KOQrnD55OD5hzDmYtdFObN0=", + "dev": true + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "node_modules/set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/set-value/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/set-value/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/set-value/node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true + }, + "node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "optional": true, + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/sigmund": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", + "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=", + "dev": true + }, + "node_modules/signal-exit": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz", + "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==", + "dev": true + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "dependencies": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "dependencies": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "dependencies": { + "kind-of": "^3.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", + "dev": true, + "dependencies": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "node_modules/socket.io": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.4.0.tgz", + "integrity": "sha512-9UPJ1UTvKayuQfVv2IQ3k7tCQC/fboDyIK62i99dAQIyHKaBsNdTpwHLgKJ6guRWxRtC9H+138UwpaGuQO9uWQ==", + "dev": true, + "dependencies": { + "debug": "~4.1.0", + "engine.io": "~3.5.0", + "has-binary2": "~1.0.2", + "socket.io-adapter": "~1.1.0", + "socket.io-client": "2.4.0", + "socket.io-parser": "~3.4.0" + } + }, + "node_modules/socket.io-adapter": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz", + "integrity": "sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g==", + "dev": true + }, + "node_modules/socket.io-client": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.4.0.tgz", + "integrity": "sha512-M6xhnKQHuuZd4Ba9vltCLT9oa+YvTsP8j9NcEiLElfIg8KeYPyhWOes6x4t+LTAC8enQbE/995AdTem2uNyKKQ==", + "dev": true, + "dependencies": { + "backo2": "1.0.2", + "component-bind": "1.0.0", + "component-emitter": "~1.3.0", + "debug": "~3.1.0", + "engine.io-client": "~3.5.0", + "has-binary2": "~1.0.2", + "indexof": "0.0.1", + "parseqs": "0.0.6", + "parseuri": "0.0.6", + "socket.io-parser": "~3.3.0", + "to-array": "0.1.4" + } + }, + "node_modules/socket.io-client/node_modules/debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/socket.io-client/node_modules/isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", + "dev": true + }, + "node_modules/socket.io-client/node_modules/socket.io-parser": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.2.tgz", + "integrity": "sha512-FJvDBuOALxdCI9qwRrO/Rfp9yfndRtc1jSgVgV8FDraihmSP/MLGD5PEuJrNfjALvcQ+vMDM/33AWOYP/JSjDg==", + "dev": true, + "dependencies": { + "component-emitter": "~1.3.0", + "debug": "~3.1.0", + "isarray": "2.0.1" + } + }, + "node_modules/socket.io-parser": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.4.1.tgz", + "integrity": "sha512-11hMgzL+WCLWf1uFtHSNvliI++tcRUWdoeYuwIl+Axvwy9z2gQM+7nJyN3STj1tLj5JyIUH8/gpDGxzAlDdi0A==", + "dev": true, + "dependencies": { + "component-emitter": "1.2.1", + "debug": "~4.1.0", + "isarray": "2.0.1" + } + }, + "node_modules/socket.io-parser/node_modules/component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "node_modules/socket.io-parser/node_modules/debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/socket.io-parser/node_modules/isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", + "dev": true + }, + "node_modules/socket.io-parser/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/socket.io/node_modules/debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/socket.io/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/sort-keys": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", + "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", + "dev": true, + "dependencies": { + "is-plain-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sort-keys-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sort-keys-length/-/sort-keys-length-1.0.1.tgz", + "integrity": "sha1-nLb09OnkgVWmqgZx7dM2/xR5oYg=", + "dev": true, + "dependencies": { + "sort-keys": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-resolve": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.6.0.tgz", + "integrity": "sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w==", + "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", + "dev": true, + "dependencies": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-url": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", + "deprecated": "See https://github.com/lydell/source-map-url#deprecated", + "dev": true + }, + "node_modules/sparkles": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.1.tgz", + "integrity": "sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dev": true, + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz", + "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==", + "dev": true + }, + "node_modules/split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "dependencies": { + "extend-shallow": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true, + "optional": true + }, + "node_modules/squeak": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/squeak/-/squeak-1.3.0.tgz", + "integrity": "sha1-MwRQN7ZDiLVnZ0uEMiplIQc5FsM=", + "dev": true, + "optional": true, + "dependencies": { + "chalk": "^1.0.0", + "console-stream": "^0.1.1", + "lpad-align": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/squeak/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/squeak/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/squeak/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "optional": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/squeak/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "optional": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/squeak/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "dev": true, + "optional": true + }, + "node_modules/stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "dependencies": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/stream-exhaust": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/stream-exhaust/-/stream-exhaust-1.0.2.tgz", + "integrity": "sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==", + "dev": true + }, + "node_modules/stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", + "dev": true + }, + "node_modules/stream-throttle": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/stream-throttle/-/stream-throttle-0.1.3.tgz", + "integrity": "sha1-rdV8jXzHOoFjDTHNVdOWHPr7qcM=", + "dev": true, + "dependencies": { + "commander": "^2.2.0", + "limiter": "^1.0.5" + }, + "bin": { + "throttleproxy": "bin/throttleproxy.js" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "dev": true, + "optional": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "dev": true, + "optional": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "dependencies": { + "is-utf8": "^0.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-bom-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", + "integrity": "sha1-5SEekiQ2n7uB1jOi8ABE3IztrZI=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-dirs": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-2.1.0.tgz", + "integrity": "sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==", + "dev": true, + "dependencies": { + "is-natural-number": "^4.0.1" + } + }, + "node_modules/strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "dev": true, + "optional": true, + "dependencies": { + "get-stdin": "^4.0.1" + }, + "bin": { + "strip-indent": "cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-outer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz", + "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^1.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strnum": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", + "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==", + "dev": true, + "optional": true + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/sver-compat": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/sver-compat/-/sver-compat-1.5.0.tgz", + "integrity": "sha1-PPh9/rTQe0o/FIJ7wYaz/QxkXNg=", + "dev": true, + "dependencies": { + "es6-iterator": "^2.0.1", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/svgo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", + "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", + "deprecated": "This SVGO version is no longer supported. Upgrade to v2.x.x.", + "dev": true, + "optional": true, + "dependencies": { + "chalk": "^2.4.1", + "coa": "^2.0.2", + "css-select": "^2.0.0", + "css-select-base-adapter": "^0.1.1", + "css-tree": "1.0.0-alpha.37", + "csso": "^4.0.2", + "js-yaml": "^3.13.1", + "mkdirp": "~0.5.1", + "object.values": "^1.1.0", + "sax": "~1.2.4", + "stable": "^0.1.8", + "unquote": "~1.1.1", + "util.promisify": "~1.0.0" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/svgo/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "optional": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/svgo/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "optional": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/svgo/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "optional": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/svgo/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true, + "optional": true + }, + "node_modules/svgo/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "optional": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/svgo/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "optional": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/symbol-observable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", + "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tar-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", + "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", + "dev": true, + "dependencies": { + "bl": "^1.0.0", + "buffer-alloc": "^1.2.0", + "end-of-stream": "^1.0.0", + "fs-constants": "^1.0.0", + "readable-stream": "^2.3.0", + "to-buffer": "^1.1.1", + "xtend": "^4.0.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/temp-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz", + "integrity": "sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/tempfile": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tempfile/-/tempfile-2.0.0.tgz", + "integrity": "sha1-awRGhWqbERTRhW/8vlCczLCXcmU=", + "dev": true, + "dependencies": { + "temp-dir": "^1.0.0", + "uuid": "^3.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/terser": { + "version": "3.17.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-3.17.0.tgz", + "integrity": "sha512-/FQzzPJmCpjAH9Xvk2paiWrFq+5M6aVOf+2KRbwhByISDX/EujxsK+BAvrhb6H+2rtrLCHK9N01wO014vrIwVQ==", + "dev": true, + "dependencies": { + "commander": "^2.19.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.10" + }, + "bin": { + "terser": "bin/uglifyjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/textextensions": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/textextensions/-/textextensions-3.3.0.tgz", + "integrity": "sha512-mk82dS8eRABNbeVJrEiN5/UMSCliINAuz8mkUwH4SwslkNP//gbEzlWNS5au0z5Dpx40SQxzqZevZkn+WYJ9Dw==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://bevry.me/fund" + } + }, + "node_modules/tfunk": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/tfunk/-/tfunk-4.0.0.tgz", + "integrity": "sha512-eJQ0dGfDIzWNiFNYFVjJ+Ezl/GmwHaFTBTjrtqNPW0S7cuVDBrZrmzUz6VkMeCR4DZFqhd4YtLwsw3i2wYHswQ==", + "dev": true, + "dependencies": { + "chalk": "^1.1.3", + "dlv": "^1.1.3" + } + }, + "node_modules/tfunk/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tfunk/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tfunk/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tfunk/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tfunk/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/through2-concurrent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/through2-concurrent/-/through2-concurrent-2.0.0.tgz", + "integrity": "sha512-R5/jLkfMvdmDD+seLwN7vB+mhbqzWop5fAjx5IX8/yQq7VhBhzDmhXgaHAOnhnWkCpRMM7gToYHycB0CS/pd+A==", + "dev": true, + "dependencies": { + "through2": "^2.0.0" + } + }, + "node_modules/through2-filter": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-3.0.0.tgz", + "integrity": "sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==", + "dev": true, + "dependencies": { + "through2": "~2.0.0", + "xtend": "~4.0.0" + } + }, + "node_modules/time-stamp": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", + "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/timed-out": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/timers-ext": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz", + "integrity": "sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==", + "dev": true, + "dependencies": { + "es5-ext": "~0.10.46", + "next-tick": "1" + } + }, + "node_modules/to-absolute-glob": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz", + "integrity": "sha1-GGX0PZ50sIItufFFt4z/fQ98hJs=", + "dev": true, + "dependencies": { + "is-absolute": "^1.0.0", + "is-negated-glob": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-array": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", + "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=", + "dev": true + }, + "node_modules/to-buffer": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", + "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==", + "dev": true + }, + "node_modules/to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-object-path/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "dependencies": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/to-through": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-through/-/to-through-2.0.0.tgz", + "integrity": "sha1-/JKtq6ByZHvAtn1rA2ZKoZUJOvY=", + "dev": true, + "dependencies": { + "through2": "^2.0.3" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/trim-repeated": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", + "integrity": "sha1-42RqLqTokTEr9+rObPsFOAvAHCE=", + "dev": true, + "dependencies": { + "escape-string-regexp": "^1.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", + "dev": true + }, + "node_modules/type-fest": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "node_modules/ua-parser-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.2.tgz", + "integrity": "sha512-00y/AXhx0/SsnI51fTc0rLRmafiGOM4/O+ny10Ps7f+j/b8p/ZY11ytMgznXkOVo4GQ+KwQG5UQLkLGirsACRg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/ua-parser-js" + }, + { + "type": "paypal", + "url": "https://paypal.me/faisalman" + } + ], + "engines": { + "node": "*" + } + }, + "node_modules/uglify-js": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.15.0.tgz", + "integrity": "sha512-x+xdeDWq7FiORDvyIJ0q/waWd4PhjBNOm5dQUOq2AKC0IEjxOS66Ha9tctiVDGcRQuh69K7fgU5oRuTK4cysSg==", + "dev": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "dev": true, + "optional": true, + "dependencies": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/unbzip2-stream": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", + "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", + "dev": true, + "dependencies": { + "buffer": "^5.2.1", + "through": "^2.3.8" + } + }, + "node_modules/unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/undertaker": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/undertaker/-/undertaker-1.3.0.tgz", + "integrity": "sha512-/RXwi5m/Mu3H6IHQGww3GNt1PNXlbeCuclF2QYR14L/2CHPz3DFZkvB5hZ0N/QUkiXWCACML2jXViIQEQc2MLg==", + "dev": true, + "dependencies": { + "arr-flatten": "^1.0.1", + "arr-map": "^2.0.0", + "bach": "^1.0.0", + "collection-map": "^1.0.0", + "es6-weak-map": "^2.0.1", + "fast-levenshtein": "^1.0.0", + "last-run": "^1.1.0", + "object.defaults": "^1.0.0", + "object.reduce": "^1.0.0", + "undertaker-registry": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/undertaker-registry": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/undertaker-registry/-/undertaker-registry-1.0.1.tgz", + "integrity": "sha1-XkvaMI5KiirlhPm5pDWaSZglzFA=", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "dependencies": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/union-value/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unique-stream": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.3.1.tgz", + "integrity": "sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==", + "dev": true, + "dependencies": { + "json-stable-stringify-without-jsonify": "^1.0.1", + "through2-filter": "^3.0.0" + } + }, + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/unquote": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", + "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=", + "dev": true, + "optional": true + }, + "node_modules/unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "dependencies": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "dependencies": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "dependencies": { + "isarray": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "dev": true, + "engines": { + "node": ">=4", + "yarn": "*" + } + }, + "node_modules/urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "deprecated": "Please see https://github.com/lydell/urix#deprecated", + "dev": true + }, + "node_modules/url-parse-lax": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", + "dev": true, + "dependencies": { + "prepend-http": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/url-to-options": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz", + "integrity": "sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "node_modules/util.promisify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", + "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", + "dev": true, + "optional": true, + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.2", + "has-symbols": "^1.0.1", + "object.getownpropertydescriptors": "^2.1.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "dev": true, + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/v8flags": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.2.0.tgz", + "integrity": "sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==", + "dev": true, + "dependencies": { + "homedir-polyfill": "^1.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/value-or-function": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/value-or-function/-/value-or-function-3.0.0.tgz", + "integrity": "sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM=", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vinyl": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.1.tgz", + "integrity": "sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==", + "dev": true, + "dependencies": { + "clone": "^2.1.1", + "clone-buffer": "^1.0.0", + "clone-stats": "^1.0.0", + "cloneable-readable": "^1.0.0", + "remove-trailing-separator": "^1.0.1", + "replace-ext": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vinyl-fs": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-3.0.3.tgz", + "integrity": "sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng==", + "dev": true, + "dependencies": { + "fs-mkdirp-stream": "^1.0.0", + "glob-stream": "^6.1.0", + "graceful-fs": "^4.0.0", + "is-valid-glob": "^1.0.0", + "lazystream": "^1.0.0", + "lead": "^1.0.0", + "object.assign": "^4.0.4", + "pumpify": "^1.3.5", + "readable-stream": "^2.3.3", + "remove-bom-buffer": "^3.0.0", + "remove-bom-stream": "^1.2.0", + "resolve-options": "^1.1.0", + "through2": "^2.0.0", + "to-through": "^2.0.0", + "value-or-function": "^3.0.0", + "vinyl": "^2.0.0", + "vinyl-sourcemap": "^1.1.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vinyl-sourcemap": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz", + "integrity": "sha1-kqgAWTo4cDqM2xHYswCtS+Y7PhY=", + "dev": true, + "dependencies": { + "append-buffer": "^1.0.2", + "convert-source-map": "^1.5.0", + "graceful-fs": "^4.1.6", + "normalize-path": "^2.1.1", + "now-and-later": "^2.0.0", + "remove-bom-buffer": "^3.0.0", + "vinyl": "^2.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vinyl-sourcemap/node_modules/normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/vinyl-sourcemaps-apply": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz", + "integrity": "sha1-q2VJ1h0XLCsbh75cUI0jnI74dwU=", + "dev": true, + "dependencies": { + "source-map": "^0.5.1" + } + }, + "node_modules/vinyl-sourcemaps-apply/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/vinyl/node_modules/replace-ext": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz", + "integrity": "sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "optional": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "node_modules/ws": { + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "dev": true, + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xmlhttprequest-ssl": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.6.3.tgz", + "integrity": "sha512-3XfeQE/wNkvrIktn2Kf0869fC0BN6UpydVasGIeSm2B1Llihf7/0UfZM+eCkOw3P7bP4+qPgqhm7ZoxuJtFU0Q==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "node_modules/yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + }, + "node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs-parser": { + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-z9kApYUOCwoeZ78rfRYYWdiU/iNL6mwwYlkkZfJoyMR1xps+NEBX5X7XmRpxkZHhXJ6+Ey00IwKxBBSW9FIjyA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", + "dev": true, + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "node_modules/yeast": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", + "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=", + "dev": true + } + }, + "dependencies": { + "@babel/runtime": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.16.7.tgz", + "integrity": "sha512-9E9FJowqAsytyOY6LG+1KuueckRL+aQW+mKvXRXnuFGyRAyepJPmEo9vgMfXUA6O9u3IeEdv9MAkppFcaQwogQ==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "@gulp-sourcemaps/identity-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@gulp-sourcemaps/identity-map/-/identity-map-2.0.1.tgz", + "integrity": "sha512-Tb+nSISZku+eQ4X1lAkevcQa+jknn/OVUgZ3XCxEKIsLsqYuPoJwJOPQeaOk75X3WPftb29GWY1eqE7GLsXb1Q==", + "dev": true, + "requires": { + "acorn": "^6.4.1", + "normalize-path": "^3.0.0", + "postcss": "^7.0.16", + "source-map": "^0.6.0", + "through2": "^3.0.1" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "through2": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.2.tgz", + "integrity": "sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==", + "dev": true, + "requires": { + "inherits": "^2.0.4", + "readable-stream": "2 || 3" + } + } + } + }, + "@gulp-sourcemaps/map-sources": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@gulp-sourcemaps/map-sources/-/map-sources-1.0.0.tgz", + "integrity": "sha1-iQrnxdjId/bThIYCFazp1+yUW9o=", + "dev": true, + "requires": { + "normalize-path": "^2.0.1", + "through2": "^2.0.3" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@popperjs/core": { + "version": "2.11.2", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.2.tgz", + "integrity": "sha512-92FRmppjjqz29VMJ2dn+xdyXZBrMlE42AV6Kq6BwjWV7CNUW1hs2FtxSNLQE+gJhaZ6AAmYuO9y8dshhcBl7vA==", + "dev": true + }, + "@sindresorhus/is": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.7.0.tgz", + "integrity": "sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow==", + "dev": true + }, + "@types/expect": { + "version": "1.20.4", + "resolved": "https://registry.npmjs.org/@types/expect/-/expect-1.20.4.tgz", + "integrity": "sha512-Q5Vn3yjTDyCMV50TB6VRIbQNxSE4OmZR86VSbGaNpfUolm0iePBB4KdEEHmxoY5sT2+2DIvXW0rvMDP2nHZ4Mg==", + "dev": true + }, + "@types/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", + "dev": true, + "requires": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "@types/minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", + "dev": true + }, + "@types/node": { + "version": "14.18.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.10.tgz", + "integrity": "sha512-6iihJ/Pp5fsFJ/aEDGyvT4pHGmCpq7ToQ/yf4bl5SbVAvwpspYJ+v3jO7n8UyjhQVHTy+KNszOozDdv+O6sovQ==", + "dev": true + }, + "@types/q": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.5.tgz", + "integrity": "sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ==", + "dev": true, + "optional": true + }, + "@types/vinyl": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/vinyl/-/vinyl-2.0.6.tgz", + "integrity": "sha512-ayJ0iOCDNHnKpKTgBG6Q6JOnHTj9zFta+3j2b8Ejza0e4cvRyMn0ZoLEmbPrTHe5YYRlDYPvPWVdV4cTaRyH7g==", + "dev": true, + "requires": { + "@types/expect": "^1.20.4", + "@types/node": "*" + } + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "dev": true, + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "acorn": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", + "dev": true + }, + "after": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", + "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=", + "dev": true + }, + "aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, + "ansi-colors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", + "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", + "dev": true, + "requires": { + "ansi-wrap": "^0.1.0" + } + }, + "ansi-cyan": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-cyan/-/ansi-cyan-0.1.1.tgz", + "integrity": "sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM=", + "dev": true, + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-gray": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", + "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=", + "dev": true, + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-red": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz", + "integrity": "sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw=", + "dev": true, + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "ansi-wrap": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", + "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", + "dev": true + }, + "anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "append-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/append-buffer/-/append-buffer-1.0.2.tgz", + "integrity": "sha1-2CIM9GYIFSXv6lBhTz3mUU36WPE=", + "dev": true, + "requires": { + "buffer-equal": "^1.0.0" + } + }, + "arch": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", + "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==", + "dev": true + }, + "archive-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/archive-type/-/archive-type-4.0.0.tgz", + "integrity": "sha1-+S5yIzBW38aWlHJ0nCZ72wRrHXA=", + "dev": true, + "requires": { + "file-type": "^4.2.0" + }, + "dependencies": { + "file-type": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-4.4.0.tgz", + "integrity": "sha1-G2AOX8ofvcboDApwxxyNul95BsU=", + "dev": true + } + } + }, + "archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", + "dev": true + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "optional": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "arr-filter": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/arr-filter/-/arr-filter-1.1.2.tgz", + "integrity": "sha1-Q/3d0JHo7xGqTEXZzcGOLf8XEe4=", + "dev": true, + "requires": { + "make-iterator": "^1.0.0" + } + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/arr-map/-/arr-map-2.0.2.tgz", + "integrity": "sha1-Onc0X/wc814qkYJWAfnljy4kysQ=", + "dev": true, + "requires": { + "make-iterator": "^1.0.0" + } + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-differ": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", + "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=", + "dev": true + }, + "array-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", + "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=", + "dev": true + }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "dev": true, + "optional": true + }, + "array-initial": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/array-initial/-/array-initial-1.1.0.tgz", + "integrity": "sha1-L6dLJnOTccOUe9enrcc74zSz15U=", + "dev": true, + "requires": { + "array-slice": "^1.0.0", + "is-number": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true + } + } + }, + "array-last": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/array-last/-/array-last-1.3.0.tgz", + "integrity": "sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg==", + "dev": true, + "requires": { + "is-number": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true + } + } + }, + "array-slice": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", + "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", + "dev": true + }, + "array-sort": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-sort/-/array-sort-1.0.0.tgz", + "integrity": "sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg==", + "dev": true, + "requires": { + "default-compare": "^1.0.0", + "get-value": "^2.0.6", + "kind-of": "^5.0.2" + } + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "arraybuffer.slice": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", + "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==", + "dev": true + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + }, + "async-done": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/async-done/-/async-done-1.3.2.tgz", + "integrity": "sha512-uYkTP8dw2og1tu1nmza1n1CMW0qb8gWWlwqMmLb7MhBVs4BXrFziT6HXUd+/RlRA/i4H9AkofYloUbs1fwMqlw==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.2", + "process-nextick-args": "^2.0.0", + "stream-exhaust": "^1.0.1" + } + }, + "async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", + "dev": true + }, + "async-each-series": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/async-each-series/-/async-each-series-0.1.1.tgz", + "integrity": "sha1-dhfBkXQB/Yykooqtzj266Yr+tDI=", + "dev": true + }, + "async-settle": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-settle/-/async-settle-1.0.0.tgz", + "integrity": "sha1-HQqRS7Aldb7IqPOnTlCA9yssDGs=", + "dev": true, + "requires": { + "async-done": "^1.2.2" + } + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, + "autoprefixer": { + "version": "10.4.2", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.2.tgz", + "integrity": "sha512-9fOPpHKuDW1w/0EKfRmVnxTDt8166MAnLI3mgZ1JCnhNtYWxcJ6Ud5CO/AVOZi/AvFa8DY9RTy3h3+tFBlrrdQ==", + "dev": true, + "requires": { + "browserslist": "^4.19.1", + "caniuse-lite": "^1.0.30001297", + "fraction.js": "^4.1.2", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + } + }, + "axios": { + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", + "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", + "dev": true, + "requires": { + "follow-redirects": "^1.14.0" + } + }, + "bach": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/bach/-/bach-1.2.0.tgz", + "integrity": "sha1-Szzpa/JxNPeaG0FKUcFONMO9mIA=", + "dev": true, + "requires": { + "arr-filter": "^1.1.1", + "arr-flatten": "^1.0.1", + "arr-map": "^2.0.0", + "array-each": "^1.0.0", + "array-initial": "^1.0.0", + "array-last": "^1.1.1", + "async-done": "^1.2.2", + "async-settle": "^1.0.0", + "now-and-later": "^2.0.0" + } + }, + "backo2": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", + "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=", + "dev": true + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + } + } + }, + "base64-arraybuffer": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz", + "integrity": "sha1-mBjHngWbE1X5fgQooBfIOOkLqBI=", + "dev": true + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true + }, + "base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", + "dev": true + }, + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", + "dev": true + }, + "beeper": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/beeper/-/beeper-1.1.1.tgz", + "integrity": "sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak=", + "dev": true + }, + "bin-build": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bin-build/-/bin-build-3.0.0.tgz", + "integrity": "sha512-jcUOof71/TNAI2uM5uoUaDq2ePcVBQ3R/qhxAz1rX7UfvduAL/RXD3jXzvn8cVcDJdGVkiR1shal3OH0ImpuhA==", + "dev": true, + "requires": { + "decompress": "^4.0.0", + "download": "^6.2.2", + "execa": "^0.7.0", + "p-map-series": "^1.0.0", + "tempfile": "^2.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "dev": true, + "requires": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + } + } + }, + "bin-check": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bin-check/-/bin-check-4.1.0.tgz", + "integrity": "sha512-b6weQyEUKsDGFlACWSIOfveEnImkJyK/FGW6FAG42loyoquvjdtOIqO6yBFzHyqyVVhNgNkQxxx09SFLK28YnA==", + "dev": true, + "requires": { + "execa": "^0.7.0", + "executable": "^4.1.0" + }, + "dependencies": { + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "dev": true, + "requires": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + } + } + }, + "bin-version": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bin-version/-/bin-version-3.1.0.tgz", + "integrity": "sha512-Mkfm4iE1VFt4xd4vH+gx+0/71esbfus2LsnCGe8Pi4mndSPyT+NGES/Eg99jx8/lUGWfu3z2yuB/bt5UB+iVbQ==", + "dev": true, + "requires": { + "execa": "^1.0.0", + "find-versions": "^3.0.0" + } + }, + "bin-version-check": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/bin-version-check/-/bin-version-check-4.0.0.tgz", + "integrity": "sha512-sR631OrhC+1f8Cvs8WyVWOA33Y8tgwjETNPyyD/myRBXLkfS/vl74FmH/lFcRl9KY3zwGh7jFhvyk9vV3/3ilQ==", + "dev": true, + "requires": { + "bin-version": "^3.0.0", + "semver": "^5.6.0", + "semver-truncate": "^1.1.2" + } + }, + "bin-wrapper": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bin-wrapper/-/bin-wrapper-4.1.0.tgz", + "integrity": "sha512-hfRmo7hWIXPkbpi0ZltboCMVrU+0ClXR/JgbCKKjlDjQf6igXa7OwdqNcFWQZPZTgiY7ZpzE3+LjjkLiTN2T7Q==", + "dev": true, + "requires": { + "bin-check": "^4.1.0", + "bin-version-check": "^4.0.0", + "download": "^7.1.0", + "import-lazy": "^3.1.0", + "os-filter-obj": "^2.0.0", + "pify": "^4.0.1" + }, + "dependencies": { + "download": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/download/-/download-7.1.0.tgz", + "integrity": "sha512-xqnBTVd/E+GxJVrX5/eUJiLYjCGPwMpdL+jGhGU57BvtcA7wwhtHVbXBeUk51kOpW3S7Jn3BQbN9Q1R1Km2qDQ==", + "dev": true, + "requires": { + "archive-type": "^4.0.0", + "caw": "^2.0.1", + "content-disposition": "^0.5.2", + "decompress": "^4.2.0", + "ext-name": "^5.0.0", + "file-type": "^8.1.0", + "filenamify": "^2.0.0", + "get-stream": "^3.0.0", + "got": "^8.3.1", + "make-dir": "^1.2.0", + "p-event": "^2.1.0", + "pify": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "file-type": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-8.1.0.tgz", + "integrity": "sha512-qyQ0pzAy78gVoJsmYeNgl8uH8yKhr1lVhW7JbzJmnlRi0I4R2eEDEJZVKG8agpDnLpacwNbDhLNG/LMdxHD2YQ==", + "dev": true + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, + "got": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/got/-/got-8.3.2.tgz", + "integrity": "sha512-qjUJ5U/hawxosMryILofZCkm3C84PLJS/0grRIpjAwu+Lkxxj5cxeCU25BG0/3mDSpXKTyZr8oh8wIgLaH0QCw==", + "dev": true, + "requires": { + "@sindresorhus/is": "^0.7.0", + "cacheable-request": "^2.1.1", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "into-stream": "^3.1.0", + "is-retry-allowed": "^1.1.0", + "isurl": "^1.0.0-alpha5", + "lowercase-keys": "^1.0.0", + "mimic-response": "^1.0.0", + "p-cancelable": "^0.4.0", + "p-timeout": "^2.0.1", + "pify": "^3.0.0", + "safe-buffer": "^5.1.1", + "timed-out": "^4.0.1", + "url-parse-lax": "^3.0.0", + "url-to-options": "^1.0.1" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dev": true, + "requires": { + "pify": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "p-cancelable": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.4.1.tgz", + "integrity": "sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ==", + "dev": true + }, + "p-event": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/p-event/-/p-event-2.3.1.tgz", + "integrity": "sha512-NQCqOFhbpVTMX4qMe8PF8lbGtzZ+LCiN7pcNrb/413Na7+TRoe1xkKUzuWa/YEJdGQ0FvKtj35EEbDoVPO2kbA==", + "dev": true, + "requires": { + "p-timeout": "^2.0.1" + } + }, + "p-timeout": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-2.0.1.tgz", + "integrity": "sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA==", + "dev": true, + "requires": { + "p-finally": "^1.0.0" + } + }, + "prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", + "dev": true + }, + "url-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", + "dev": true, + "requires": { + "prepend-http": "^2.0.0" + } + } + } + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true + }, + "binaryextensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binaryextensions/-/binaryextensions-2.3.0.tgz", + "integrity": "sha512-nAihlQsYGyc5Bwq6+EsubvANYGExeJKHDO3RjnvwU042fawQTQfM3Kxn7IHUXQOz4bzfwsGYYHGSvXyW4zOGLg==", + "dev": true + }, + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dev": true, + "optional": true, + "requires": { + "file-uri-to-path": "1.0.0" + } + }, + "bl": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz", + "integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==", + "dev": true, + "requires": { + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" + } + }, + "blob": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz", + "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==", + "dev": true + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "dev": true, + "optional": true + }, + "bootstrap": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.1.3.tgz", + "integrity": "sha512-fcQztozJ8jToQWXxVuEyXWW+dSo8AiXWKwiSSrKWsRB/Qt+Ewwza+JWoLKiTuQLaEPhdNAJ7+Dosc9DOIqNy7Q==", + "dev": true, + "requires": {} + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "browser-sync": { + "version": "2.27.7", + "resolved": "https://registry.npmjs.org/browser-sync/-/browser-sync-2.27.7.tgz", + "integrity": "sha512-9ElnnA/u+s2Jd+IgY+2SImB+sAEIteHsMG0NR96m7Ph/wztpvJCUpyC2on1KqmG9iAp941j+5jfmd34tEguGbg==", + "dev": true, + "requires": { + "browser-sync-client": "^2.27.7", + "browser-sync-ui": "^2.27.7", + "bs-recipes": "1.3.4", + "bs-snippet-injector": "^2.0.1", + "chokidar": "^3.5.1", + "connect": "3.6.6", + "connect-history-api-fallback": "^1", + "dev-ip": "^1.0.1", + "easy-extender": "^2.3.4", + "eazy-logger": "3.1.0", + "etag": "^1.8.1", + "fresh": "^0.5.2", + "fs-extra": "3.0.1", + "http-proxy": "^1.18.1", + "immutable": "^3", + "localtunnel": "^2.0.1", + "micromatch": "^4.0.2", + "opn": "5.3.0", + "portscanner": "2.1.1", + "qs": "6.2.3", + "raw-body": "^2.3.2", + "resp-modifier": "6.0.2", + "rx": "4.1.0", + "send": "0.16.2", + "serve-index": "1.9.1", + "serve-static": "1.13.2", + "server-destroy": "1.0.1", + "socket.io": "2.4.0", + "ua-parser-js": "1.0.2", + "yargs": "^15.4.1" + } + }, + "browser-sync-client": { + "version": "2.27.7", + "resolved": "https://registry.npmjs.org/browser-sync-client/-/browser-sync-client-2.27.7.tgz", + "integrity": "sha512-wKg9UP9a4sCIkBBAXUdbkdWFJzfSAQizGh+nC19W9y9zOo9s5jqeYRFUUbs7x5WKhjtspT+xetVp9AtBJ6BmWg==", + "dev": true, + "requires": { + "etag": "1.8.1", + "fresh": "0.5.2", + "mitt": "^1.1.3", + "rxjs": "^5.5.6" + } + }, + "browser-sync-ui": { + "version": "2.27.7", + "resolved": "https://registry.npmjs.org/browser-sync-ui/-/browser-sync-ui-2.27.7.tgz", + "integrity": "sha512-Bt4OQpx9p18OIzk0KKyu7jqlvmjacasUlk8ARY3uuIyiFWSBiRgr2i6XY8dEMF14DtbooaEBOpHEu9VCYvMcCw==", + "dev": true, + "requires": { + "async-each-series": "0.1.1", + "connect-history-api-fallback": "^1", + "immutable": "^3", + "server-destroy": "1.0.1", + "socket.io-client": "^2.4.0", + "stream-throttle": "^0.1.3" + } + }, + "browserslist": { + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.1.tgz", + "integrity": "sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001286", + "electron-to-chromium": "^1.4.17", + "escalade": "^3.1.1", + "node-releases": "^2.0.1", + "picocolors": "^1.0.0" + } + }, + "bs-recipes": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/bs-recipes/-/bs-recipes-1.3.4.tgz", + "integrity": "sha1-DS1NSKcYyMBEdp/cT4lZLci2lYU=", + "dev": true + }, + "bs-snippet-injector": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/bs-snippet-injector/-/bs-snippet-injector-2.0.1.tgz", + "integrity": "sha1-YbU5PxH1JVntEgaTEANDtu2wTdU=", + "dev": true + }, + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "buffer-alloc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", + "dev": true, + "requires": { + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" + } + }, + "buffer-alloc-unsafe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", + "dev": true + }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", + "dev": true + }, + "buffer-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz", + "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=", + "dev": true + }, + "buffer-fill": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=", + "dev": true + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "bytes": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.1.tgz", + "integrity": "sha512-dWe4nWO/ruEOY7HkUJ5gFt1DCFV9zPRoJr8pV0/ASQermOZjtq8jMjOprC0Kd10GLN+l7xaUPvxzJFWtxGu8Fg==", + "dev": true + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "cache-swap": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/cache-swap/-/cache-swap-0.3.0.tgz", + "integrity": "sha1-HFQaoQilAQb2ML3Zj+HeyLoTP1E=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "mkdirp": "^0.5.1", + "object-assign": "^4.0.1", + "rimraf": "^2.4.0" + }, + "dependencies": { + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "cacheable-request": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-2.1.4.tgz", + "integrity": "sha1-DYCIAbY0KtM8kd+dC0TcCbkeXD0=", + "dev": true, + "requires": { + "clone-response": "1.0.2", + "get-stream": "3.0.0", + "http-cache-semantics": "3.8.1", + "keyv": "3.0.0", + "lowercase-keys": "1.0.0", + "normalize-url": "2.0.1", + "responselike": "1.0.2" + }, + "dependencies": { + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, + "lowercase-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", + "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=", + "dev": true + }, + "normalize-url": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-2.0.1.tgz", + "integrity": "sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==", + "dev": true, + "requires": { + "prepend-http": "^2.0.0", + "query-string": "^5.0.1", + "sort-keys": "^2.0.0" + } + }, + "prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", + "dev": true + }, + "sort-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", + "integrity": "sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=", + "dev": true, + "requires": { + "is-plain-obj": "^1.0.0" + } + } + } + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "dev": true, + "optional": true + }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "dev": true, + "optional": true, + "requires": { + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" + } + }, + "caniuse-lite": { + "version": "1.0.30001304", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001304.tgz", + "integrity": "sha512-bdsfZd6K6ap87AGqSHJP/s1V+U6Z5lyrcbBu3ovbCCf8cSYpwTtGrCBObMpJqwxfTbLW6YTIdbb1jEeTelcpYQ==", + "dev": true + }, + "caw": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/caw/-/caw-2.0.1.tgz", + "integrity": "sha512-Cg8/ZSBEa8ZVY9HspcGUYaK63d/bN7rqS3CYCzEGUxuYv6UlmcjzDUz2fCFFHyTvUW5Pk0I+3hkA3iXlIj6guA==", + "dev": true, + "requires": { + "get-proxy": "^2.0.0", + "isurl": "^1.0.0-alpha5", + "tunnel-agent": "^0.6.0", + "url-to-options": "^1.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + } + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + } + } + }, + "clean-css": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz", + "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==", + "dev": true, + "requires": { + "source-map": "~0.6.0" + } + }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true + }, + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", + "dev": true + }, + "clone-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", + "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", + "dev": true + }, + "clone-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", + "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "dev": true, + "requires": { + "mimic-response": "^1.0.0" + } + }, + "clone-stats": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", + "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", + "dev": true + }, + "cloneable-readable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.3.tgz", + "integrity": "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "process-nextick-args": "^2.0.0", + "readable-stream": "^2.3.5" + } + }, + "coa": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", + "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", + "dev": true, + "optional": true, + "requires": { + "@types/q": "^1.5.1", + "chalk": "^2.4.1", + "q": "^1.1.2" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "optional": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "optional": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "optional": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true, + "optional": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "optional": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "optional": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "collection-map": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-map/-/collection-map-1.0.0.tgz", + "integrity": "sha1-rqDwb40mx4DCt1SUOFVEsiVa8Yw=", + "dev": true, + "requires": { + "arr-map": "^2.0.2", + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + } + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "component-bind": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", + "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=", + "dev": true + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "component-inherit": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", + "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "concat-with-sourcemaps": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/concat-with-sourcemaps/-/concat-with-sourcemaps-1.1.0.tgz", + "integrity": "sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg==", + "dev": true, + "requires": { + "source-map": "^0.6.1" + } + }, + "config-chain": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", + "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", + "dev": true, + "requires": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, + "connect": { + "version": "3.6.6", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.6.tgz", + "integrity": "sha1-Ce/2xVr3I24TcTWnJXSFi2eG9SQ=", + "dev": true, + "requires": { + "debug": "2.6.9", + "finalhandler": "1.1.0", + "parseurl": "~1.3.2", + "utils-merge": "1.0.1" + } + }, + "connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "dev": true + }, + "console-stream": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/console-stream/-/console-stream-0.1.1.tgz", + "integrity": "sha1-oJX+B7IEZZVfL6/Si11yvM2UnUQ=", + "dev": true, + "optional": true + }, + "content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dev": true, + "requires": { + "safe-buffer": "5.2.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + } + } + }, + "convert-source-map": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", + "dev": true + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "copy-props": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/copy-props/-/copy-props-2.0.5.tgz", + "integrity": "sha512-XBlx8HSqrT0ObQwmSzM7WE5k8FxTV75h1DX1Z3n6NhQ/UYYAvInWYmG06vFt7hQZArE2fuO62aihiWIVQwh1sw==", + "dev": true, + "requires": { + "each-props": "^1.3.2", + "is-plain-object": "^5.0.0" + } + }, + "core-js": { + "version": "3.20.3", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.20.3.tgz", + "integrity": "sha512-vVl8j8ph6tRS3B8qir40H7yw7voy17xL0piAjlbBUsH7WIfzoedL/ZOr1OV9FyZQLWXsayOJyV4tnRyXR85/ag==", + "dev": true + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "css": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/css/-/css-3.0.0.tgz", + "integrity": "sha512-DG9pFfwOrzc+hawpmqX/dHYHJG+Bsdb0klhyi1sDneOgGOXy9wQIC8hzyVp1e4NRYDBdxcylvywPkkXCHAzTyQ==", + "dev": true, + "requires": { + "inherits": "^2.0.4", + "source-map": "^0.6.1", + "source-map-resolve": "^0.6.0" + } + }, + "css-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", + "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", + "dev": true, + "optional": true, + "requires": { + "boolbase": "^1.0.0", + "css-what": "^3.2.1", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" + } + }, + "css-select-base-adapter": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", + "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==", + "dev": true, + "optional": true + }, + "css-tree": { + "version": "1.0.0-alpha.37", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", + "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", + "dev": true, + "optional": true, + "requires": { + "mdn-data": "2.0.4", + "source-map": "^0.6.1" + } + }, + "css-what": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", + "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", + "dev": true, + "optional": true + }, + "csso": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "dev": true, + "optional": true, + "requires": { + "css-tree": "^1.1.2" + }, + "dependencies": { + "css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "dev": true, + "optional": true, + "requires": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + } + }, + "mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "dev": true, + "optional": true + } + } + }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "dev": true, + "optional": true, + "requires": { + "array-find-index": "^1.0.1" + } + }, + "d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "dev": true, + "requires": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "dateformat": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.2.0.tgz", + "integrity": "sha1-QGXiATz5+5Ft39gu+1Bq1MZ2kGI=", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "debug-fabulous": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/debug-fabulous/-/debug-fabulous-1.1.0.tgz", + "integrity": "sha512-GZqvGIgKNlUnHUPQhepnUZFIMoi3dgZKQBzKDeL2g7oJF9SNAji/AAu36dusFUas0O+pae74lNeoIPHqXWDkLg==", + "dev": true, + "requires": { + "debug": "3.X", + "memoizee": "0.4.X", + "object-assign": "4.X" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + } + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "decompress": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/decompress/-/decompress-4.2.1.tgz", + "integrity": "sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ==", + "dev": true, + "requires": { + "decompress-tar": "^4.0.0", + "decompress-tarbz2": "^4.0.0", + "decompress-targz": "^4.0.0", + "decompress-unzip": "^4.0.1", + "graceful-fs": "^4.1.10", + "make-dir": "^1.0.0", + "pify": "^2.3.0", + "strip-dirs": "^2.0.0" + }, + "dependencies": { + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dev": true, + "requires": { + "pify": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "dev": true, + "requires": { + "mimic-response": "^1.0.0" + } + }, + "decompress-tar": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-4.1.1.tgz", + "integrity": "sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==", + "dev": true, + "requires": { + "file-type": "^5.2.0", + "is-stream": "^1.1.0", + "tar-stream": "^1.5.2" + }, + "dependencies": { + "file-type": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", + "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=", + "dev": true + } + } + }, + "decompress-tarbz2": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz", + "integrity": "sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==", + "dev": true, + "requires": { + "decompress-tar": "^4.1.0", + "file-type": "^6.1.0", + "is-stream": "^1.1.0", + "seek-bzip": "^1.0.5", + "unbzip2-stream": "^1.0.9" + }, + "dependencies": { + "file-type": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-6.2.0.tgz", + "integrity": "sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==", + "dev": true + } + } + }, + "decompress-targz": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/decompress-targz/-/decompress-targz-4.1.1.tgz", + "integrity": "sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==", + "dev": true, + "requires": { + "decompress-tar": "^4.1.1", + "file-type": "^5.2.0", + "is-stream": "^1.1.0" + }, + "dependencies": { + "file-type": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", + "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=", + "dev": true + } + } + }, + "decompress-unzip": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-4.0.1.tgz", + "integrity": "sha1-3qrM39FK6vhVePczroIQ+bSEj2k=", + "dev": true, + "requires": { + "file-type": "^3.8.0", + "get-stream": "^2.2.0", + "pify": "^2.3.0", + "yauzl": "^2.4.2" + }, + "dependencies": { + "file-type": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", + "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=", + "dev": true + }, + "get-stream": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz", + "integrity": "sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4=", + "dev": true, + "requires": { + "object-assign": "^4.0.1", + "pinkie-promise": "^2.0.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "default-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/default-compare/-/default-compare-1.0.0.tgz", + "integrity": "sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ==", + "dev": true, + "requires": { + "kind-of": "^5.0.2" + } + }, + "default-resolution": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/default-resolution/-/default-resolution-2.0.0.tgz", + "integrity": "sha1-vLgrqnKtebQmp2cy8aga1t8m1oQ=", + "dev": true + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + } + }, + "del": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/del/-/del-6.0.0.tgz", + "integrity": "sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ==", + "dev": true, + "requires": { + "globby": "^11.0.1", + "graceful-fs": "^4.2.4", + "is-glob": "^4.0.1", + "is-path-cwd": "^2.2.0", + "is-path-inside": "^3.0.2", + "p-map": "^4.0.0", + "rimraf": "^3.0.2", + "slash": "^3.0.0" + } + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "dev": true + }, + "detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", + "dev": true + }, + "detect-newline": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz", + "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=", + "dev": true + }, + "dev-ip": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dev-ip/-/dev-ip-1.0.1.tgz", + "integrity": "sha1-p2o+0YVb56ASu4rBbLgPPADcKPA=", + "dev": true + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "requires": { + "path-type": "^4.0.0" + } + }, + "dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true + }, + "dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "dev": true, + "optional": true, + "requires": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + }, + "dependencies": { + "domelementtype": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", + "dev": true, + "optional": true + } + } + }, + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "dev": true, + "optional": true + }, + "domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "dev": true, + "optional": true, + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "download": { + "version": "6.2.5", + "resolved": "https://registry.npmjs.org/download/-/download-6.2.5.tgz", + "integrity": "sha512-DpO9K1sXAST8Cpzb7kmEhogJxymyVUd5qz/vCOSyvwtp2Klj2XcDt5YUuasgxka44SxF0q5RriKIwJmQHG2AuA==", + "dev": true, + "requires": { + "caw": "^2.0.0", + "content-disposition": "^0.5.2", + "decompress": "^4.0.0", + "ext-name": "^5.0.0", + "file-type": "5.2.0", + "filenamify": "^2.0.0", + "get-stream": "^3.0.0", + "got": "^7.0.0", + "make-dir": "^1.0.0", + "p-event": "^1.0.0", + "pify": "^3.0.0" + }, + "dependencies": { + "file-type": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", + "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=", + "dev": true + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "duplexer2": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", + "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=", + "dev": true, + "requires": { + "readable-stream": "~1.1.9" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + }, + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", + "dev": true + }, + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dev": true, + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "each-props": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/each-props/-/each-props-1.3.2.tgz", + "integrity": "sha512-vV0Hem3zAGkJAyU7JSjixeU66rwdynTAa1vofCrSA5fEln+m67Az9CcnkVD776/fsN/UjIWmBDoNRS6t6G9RfA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.1", + "object.defaults": "^1.1.0" + }, + "dependencies": { + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + } + } + }, + "easy-extender": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/easy-extender/-/easy-extender-2.3.4.tgz", + "integrity": "sha512-8cAwm6md1YTiPpOvDULYJL4ZS6WfM5/cTeVVh4JsvyYZAoqlRVUpHL9Gr5Fy7HA6xcSZicUia3DeAgO3Us8E+Q==", + "dev": true, + "requires": { + "lodash": "^4.17.10" + } + }, + "eazy-logger": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/eazy-logger/-/eazy-logger-3.1.0.tgz", + "integrity": "sha512-/snsn2JqBtUSSstEl4R0RKjkisGHAhvYj89i7r3ytNUKW12y178KDZwXLXIgwDqLW6E/VRMT9qfld7wvFae8bQ==", + "dev": true, + "requires": { + "tfunk": "^4.0.0" + } + }, + "editorconfig": { + "version": "0.15.3", + "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-0.15.3.tgz", + "integrity": "sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g==", + "dev": true, + "requires": { + "commander": "^2.19.0", + "lru-cache": "^4.1.5", + "semver": "^5.6.0", + "sigmund": "^1.0.1" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, + "electron-to-chromium": { + "version": "1.4.59", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.59.tgz", + "integrity": "sha512-AOJ3cAE0TWxz4fQ9zkND5hWrQg16nsZKVz9INOot1oV//u4wWu5xrj9CQMmPTYskkZRunSRc9sAnr4EkexXokg==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "engine.io": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.5.0.tgz", + "integrity": "sha512-21HlvPUKaitDGE4GXNtQ7PLP0Sz4aWLddMPw2VTyFz1FVZqu/kZsJUO8WNpKuE/OCL7nkfRaOui2ZCJloGznGA==", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.4.1", + "debug": "~4.1.0", + "engine.io-parser": "~2.2.0", + "ws": "~7.4.2" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + } + } + }, + "engine.io-client": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.5.2.tgz", + "integrity": "sha512-QEqIp+gJ/kMHeUun7f5Vv3bteRHppHH/FMBQX/esFj/fuYfjyUKWGMo3VCvIP/V8bE9KcjHmRZrhIz2Z9oNsDA==", + "dev": true, + "requires": { + "component-emitter": "~1.3.0", + "component-inherit": "0.0.3", + "debug": "~3.1.0", + "engine.io-parser": "~2.2.0", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "parseqs": "0.0.6", + "parseuri": "0.0.6", + "ws": "~7.4.2", + "xmlhttprequest-ssl": "~1.6.2", + "yeast": "0.1.2" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "engine.io-parser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.2.1.tgz", + "integrity": "sha512-x+dN/fBH8Ro8TFwJ+rkB2AmuVw9Yu2mockR/p3W8f8YtExwFgDvBDi0GWyb4ZLkpahtDGZgtr3zLovanJghPqg==", + "dev": true, + "requires": { + "after": "0.8.2", + "arraybuffer.slice": "~0.0.7", + "base64-arraybuffer": "0.1.4", + "blob": "0.0.5", + "has-binary2": "~1.0.2" + } + }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "optional": true + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz", + "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==", + "dev": true, + "optional": true, + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "get-symbol-description": "^1.0.0", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.4", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.1", + "is-string": "^1.0.7", + "is-weakref": "^1.0.1", + "object-inspect": "^1.11.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.1" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "optional": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "es5-ext": { + "version": "0.10.53", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", + "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", + "dev": true, + "requires": { + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.3", + "next-tick": "~1.0.0" + }, + "dependencies": { + "next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", + "dev": true + } + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "dev": true, + "requires": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "es6-weak-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", + "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "^0.10.46", + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.1" + } + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "optional": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "dev": true + }, + "event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, + "exec-buffer": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/exec-buffer/-/exec-buffer-3.2.0.tgz", + "integrity": "sha512-wsiD+2Tp6BWHoVv3B+5Dcx6E7u5zky+hUwOHjuH2hKSLR3dvRmX8fk8UD8uqQixHs4Wk6eDmiegVrMPjKj7wpA==", + "dev": true, + "requires": { + "execa": "^0.7.0", + "p-finally": "^1.0.0", + "pify": "^3.0.0", + "rimraf": "^2.5.4", + "tempfile": "^2.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "dev": true, + "requires": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "executable": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz", + "integrity": "sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==", + "dev": true, + "requires": { + "pify": "^2.2.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + } + } + }, + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "ext": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.6.0.tgz", + "integrity": "sha512-sdBImtzkq2HpkdRLtlLWDa6w4DX22ijZLKx8BMPUuKe1c5lbN6xwQDQCxSfxBQnHZ13ls/FH0MQZx/q/gr6FQg==", + "dev": true, + "requires": { + "type": "^2.5.0" + }, + "dependencies": { + "type": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/type/-/type-2.5.0.tgz", + "integrity": "sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw==", + "dev": true + } + } + }, + "ext-list": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/ext-list/-/ext-list-2.2.2.tgz", + "integrity": "sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA==", + "dev": true, + "requires": { + "mime-db": "^1.28.0" + } + }, + "ext-name": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ext-name/-/ext-name-5.0.0.tgz", + "integrity": "sha512-yblEwXAbGv1VQDmow7s38W77hzAgJAO50ztBLMcUyUBfxv1HC+LGwtiEN+Co6LtlqT/5uwVOxsD4TNIilWhwdQ==", + "dev": true, + "requires": { + "ext-list": "^2.0.0", + "sort-keys-length": "^1.0.0" + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + } + } + }, + "fancy-log": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", + "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==", + "dev": true, + "requires": { + "ansi-gray": "^0.1.1", + "color-support": "^1.1.3", + "parse-node-version": "^1.0.0", + "time-stamp": "^1.0.0" + } + }, + "fast-glob": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", + "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + } + }, + "fast-levenshtein": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-1.1.4.tgz", + "integrity": "sha1-5qdUzI8V5YmHqpy9J69m/W9OWvk=", + "dev": true + }, + "fast-xml-parser": { + "version": "3.21.1", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-3.21.1.tgz", + "integrity": "sha512-FTFVjYoBOZTJekiUsawGsSYV9QL0A+zDYCRj7y34IO6Jg+2IMYEtQa+bbictpdpV8dHxXywqU7C0gRDEOFtBFg==", + "dev": true, + "optional": true, + "requires": { + "strnum": "^1.0.4" + } + }, + "fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", + "dev": true, + "requires": { + "pend": "~1.2.0" + } + }, + "figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "dev": true, + "optional": true, + "requires": { + "escape-string-regexp": "^1.0.5", + "object-assign": "^4.1.0" + } + }, + "file-type": { + "version": "12.4.2", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-12.4.2.tgz", + "integrity": "sha512-UssQP5ZgIOKelfsaB5CuGAL+Y+q7EmONuiwF3N5HAH0t27rvrttgi6Ra9k/+DVaY9UF6+ybxu5pOXLUdA8N7Vg==", + "dev": true + }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "dev": true, + "optional": true + }, + "filename-reserved-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz", + "integrity": "sha1-q/c9+rc10EVECr/qLZHzieu/oik=", + "dev": true + }, + "filenamify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-2.1.0.tgz", + "integrity": "sha512-ICw7NTT6RsDp2rnYKVd8Fu4cr6ITzGy3+u4vUujPkabyaz+03F24NWEX7fs5fp+kBonlaqPH8fAO2NM+SXt/JA==", + "dev": true, + "requires": { + "filename-reserved-regex": "^2.0.0", + "strip-outer": "^1.0.0", + "trim-repeated": "^1.0.0" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "finalhandler": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", + "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.1", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "statuses": "~1.3.1", + "unpipe": "~1.0.0" + } + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "find-versions": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-3.2.0.tgz", + "integrity": "sha512-P8WRou2S+oe222TOCHitLy8zj+SIsVJh52VP4lvXkaFVnOFFdoWv1H1Jjvel1aI6NCFOAaeAVm8qrI0odiLcww==", + "dev": true, + "requires": { + "semver-regex": "^2.0.0" + } + }, + "findup-sync": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", + "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", + "dev": true, + "requires": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + }, + "dependencies": { + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "fined": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz", + "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==", + "dev": true, + "requires": { + "expand-tilde": "^2.0.2", + "is-plain-object": "^2.0.3", + "object.defaults": "^1.1.0", + "object.pick": "^1.2.0", + "parse-filepath": "^1.0.1" + }, + "dependencies": { + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + } + } + }, + "flagged-respawn": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", + "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==", + "dev": true + }, + "flatnest": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/flatnest/-/flatnest-1.0.0.tgz", + "integrity": "sha1-IEIa0FtGxjytMO8UqOxiX4az8cU=", + "dev": true + }, + "flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "follow-redirects": { + "version": "1.14.7", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.7.tgz", + "integrity": "sha512-+hbxoLbFMbRKDwohX8GkTataGqO6Jb7jGwpAlwgy2bIz25XtRm7KEzJM76R1WiNT5SwZkX4Y75SwBolkpmE7iQ==", + "dev": true + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", + "dev": true, + "requires": { + "for-in": "^1.0.1" + } + }, + "fraction.js": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.1.2.tgz", + "integrity": "sha512-o2RiJQ6DZaR/5+Si0qJUIy637QMRudSi9kU/FFzx9EZazrIdnBgpU+3sEWCxAVhH2RtxW2Oz+T4p2o8uOPVcgA==", + "dev": true + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "dev": true + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true + }, + "fs-extra": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz", + "integrity": "sha1-N5TzeMWLNC6n27sjCVEJxLO2IpE=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^3.0.0", + "universalify": "^0.1.0" + } + }, + "fs-mkdirp-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz", + "integrity": "sha1-C3gV/DIBxqaeFNuYzgmMFpNSWes=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "through2": "^2.0.3" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "get-proxy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/get-proxy/-/get-proxy-2.1.0.tgz", + "integrity": "sha512-zmZIaQTWnNQb4R4fJUEp/FC51eZsc6EkErspy3xtIYStaq8EB/hDIWipxsal+E8rz0qD7f2sL/NA9Xee4RInJw==", + "dev": true, + "requires": { + "npm-conf": "^1.1.0" + } + }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "dev": true, + "optional": true + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "optional": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "gifsicle": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/gifsicle/-/gifsicle-5.3.0.tgz", + "integrity": "sha512-FJTpgdj1Ow/FITB7SVza5HlzXa+/lqEY0tHQazAJbuAdvyJtkH4wIdsR2K414oaTwRXHFLLF+tYbipj+OpYg+Q==", + "dev": true, + "optional": true, + "requires": { + "bin-build": "^3.0.0", + "bin-wrapper": "^4.0.0", + "execa": "^5.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "optional": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "optional": true, + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + } + }, + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "optional": true + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "optional": true + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "optional": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "optional": true + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "optional": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "optional": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "optional": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "glob-stream": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz", + "integrity": "sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ=", + "dev": true, + "requires": { + "extend": "^3.0.0", + "glob": "^7.1.1", + "glob-parent": "^3.1.0", + "is-negated-glob": "^1.0.0", + "ordered-read-streams": "^1.0.0", + "pumpify": "^1.3.5", + "readable-stream": "^2.1.5", + "remove-trailing-separator": "^1.0.1", + "to-absolute-glob": "^2.0.0", + "unique-stream": "^2.0.2" + }, + "dependencies": { + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + } + }, + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "glob-watcher": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-5.0.5.tgz", + "integrity": "sha512-zOZgGGEHPklZNjZQaZ9f41i7F2YwE+tS5ZHrDhbBCk3stwahn5vQxnFmBJZHoYdusR6R1bLSXeGUy/BhctwKzw==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-done": "^1.2.0", + "chokidar": "^2.0.0", + "is-negated-glob": "^1.0.0", + "just-debounce": "^1.0.0", + "normalize-path": "^3.0.0", + "object.defaults": "^1.1.0" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "dev": true, + "optional": true, + "requires": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + } + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "requires": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + } + }, + "global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + } + }, + "globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + } + }, + "glogg": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.2.tgz", + "integrity": "sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA==", + "dev": true, + "requires": { + "sparkles": "^1.0.0" + } + }, + "got": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/got/-/got-7.1.0.tgz", + "integrity": "sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==", + "dev": true, + "requires": { + "decompress-response": "^3.2.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "is-plain-obj": "^1.1.0", + "is-retry-allowed": "^1.0.0", + "is-stream": "^1.0.0", + "isurl": "^1.0.0-alpha5", + "lowercase-keys": "^1.0.0", + "p-cancelable": "^0.3.0", + "p-timeout": "^1.1.1", + "safe-buffer": "^5.0.1", + "timed-out": "^4.0.0", + "url-parse-lax": "^1.0.0", + "url-to-options": "^1.0.1" + }, + "dependencies": { + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + } + } + }, + "graceful-fs": { + "version": "4.2.9", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", + "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==", + "dev": true + }, + "gulp": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/gulp/-/gulp-4.0.2.tgz", + "integrity": "sha512-dvEs27SCZt2ibF29xYgmnwwCYZxdxhQ/+LFWlbAW8y7jt68L/65402Lz3+CKy0Ov4rOs+NERmDq7YlZaDqUIfA==", + "dev": true, + "requires": { + "glob-watcher": "^5.0.3", + "gulp-cli": "^2.2.0", + "undertaker": "^1.2.1", + "vinyl-fs": "^3.0.0" + } + }, + "gulp-autoprefixer": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/gulp-autoprefixer/-/gulp-autoprefixer-8.0.0.tgz", + "integrity": "sha512-sVR++PIaXpa81p52dmmA/jt50bw0egmylK5mjagfgOJ8uLDGaF9tHyzvetkY9Uo0gBZUS5sVqN3kX/GlUKOyog==", + "dev": true, + "requires": { + "autoprefixer": "^10.2.6", + "fancy-log": "^1.3.3", + "plugin-error": "^1.0.1", + "postcss": "^8.3.0", + "through2": "^4.0.2", + "vinyl-sourcemaps-apply": "^0.2.1" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "through2": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", + "dev": true, + "requires": { + "readable-stream": "3" + } + } + } + }, + "gulp-beautify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/gulp-beautify/-/gulp-beautify-3.0.0.tgz", + "integrity": "sha512-Srxzb7+AQjNm+NkEVpLBfnFtN93jofVc4d4qI+N4MTPRF/vZ14jC4QA6WUZsZZZxc/oYk4bjcqQOUhmopFWlXg==", + "dev": true, + "requires": { + "js-beautify": "^1.8.8", + "through2": "^2.0.0" + } + }, + "gulp-cache": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/gulp-cache/-/gulp-cache-1.1.3.tgz", + "integrity": "sha512-NE814LdX1NWQn2sMzn+Rf673o4mqlgg7OyLf92oQ4KEl6DdPfduEGLNH+HexLVcFZXH93DBuxFOvpv4/Js5VaA==", + "dev": true, + "requires": { + "@babel/runtime": "^7.5.5", + "cache-swap": "^0.3.0", + "core-js": "3", + "object.pick": "^1.3.0", + "plugin-error": "^1.0.1", + "through2": "3.0.1", + "vinyl": "^2.2.0" + }, + "dependencies": { + "through2": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.1.tgz", + "integrity": "sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww==", + "dev": true, + "requires": { + "readable-stream": "2 || 3" + } + } + } + }, + "gulp-clean-css": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/gulp-clean-css/-/gulp-clean-css-4.3.0.tgz", + "integrity": "sha512-mGyeT3qqFXTy61j0zOIciS4MkYziF2U594t2Vs9rUnpkEHqfu6aDITMp8xOvZcvdX61Uz3y1mVERRYmjzQF5fg==", + "dev": true, + "requires": { + "clean-css": "4.2.3", + "plugin-error": "1.0.1", + "through2": "3.0.1", + "vinyl-sourcemaps-apply": "0.2.1" + }, + "dependencies": { + "through2": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.1.tgz", + "integrity": "sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww==", + "dev": true, + "requires": { + "readable-stream": "2 || 3" + } + } + } + }, + "gulp-cli": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/gulp-cli/-/gulp-cli-2.3.0.tgz", + "integrity": "sha512-zzGBl5fHo0EKSXsHzjspp3y5CONegCm8ErO5Qh0UzFzk2y4tMvzLWhoDokADbarfZRL2pGpRp7yt6gfJX4ph7A==", + "dev": true, + "requires": { + "ansi-colors": "^1.0.1", + "archy": "^1.0.0", + "array-sort": "^1.0.0", + "color-support": "^1.1.3", + "concat-stream": "^1.6.0", + "copy-props": "^2.0.1", + "fancy-log": "^1.3.2", + "gulplog": "^1.0.0", + "interpret": "^1.4.0", + "isobject": "^3.0.1", + "liftoff": "^3.1.0", + "matchdep": "^2.0.0", + "mute-stdout": "^1.0.0", + "pretty-hrtime": "^1.0.0", + "replace-homedir": "^1.0.0", + "semver-greatest-satisfied-range": "^1.1.0", + "v8flags": "^3.2.0", + "yargs": "^7.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "dev": true + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "which-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", + "dev": true + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + } + }, + "y18n": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", + "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==", + "dev": true + }, + "yargs": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.2.tgz", + "integrity": "sha512-ZEjj/dQYQy0Zx0lgLMLR8QuaqTihnxirir7EwUHp1Axq4e3+k8jXU5K0VLbNvedv1f4EWtBonDIZm0NUr+jCcA==", + "dev": true, + "requires": { + "camelcase": "^3.0.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.2", + "which-module": "^1.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^5.0.1" + } + }, + "yargs-parser": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.1.tgz", + "integrity": "sha512-wpav5XYiddjXxirPoCTUPbqM0PXvJ9hiBMvuJgInvo4/lAOTZzUprArw17q2O1P2+GHhbBr18/iQwjL5Z9BqfA==", + "dev": true, + "requires": { + "camelcase": "^3.0.0", + "object.assign": "^4.1.0" + } + } + } + }, + "gulp-concat": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/gulp-concat/-/gulp-concat-2.6.1.tgz", + "integrity": "sha1-Yz0WyV2IUEYorQJmVmPO5aR5M1M=", + "dev": true, + "requires": { + "concat-with-sourcemaps": "^1.0.0", + "through2": "^2.0.0", + "vinyl": "^2.0.0" + } + }, + "gulp-file-include": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/gulp-file-include/-/gulp-file-include-2.3.0.tgz", + "integrity": "sha512-OoMq5QtXHYz6hu2dZm1OxravcqrPXGeCNvOtz+8/589zFKcdpKGGvFXz/Aw4hx8pKZqaS+oJusgKDVQ4dCzqSg==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-stream": "^2.0.0", + "extend": "^3.0.2", + "flatnest": "^1.0.0", + "json5": "^2.1.3", + "plugin-error": "^1.0.1", + "through2": "^4.0.2", + "vinyl": "^2.2.1" + }, + "dependencies": { + "concat-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", + "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.0.2", + "typedarray": "^0.0.6" + } + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "through2": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", + "dev": true, + "requires": { + "readable-stream": "3" + } + } + } + }, + "gulp-imagemin": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/gulp-imagemin/-/gulp-imagemin-7.1.0.tgz", + "integrity": "sha512-6xBTNybmPY2YrvrhhlS8Mxi0zn0ypusLon63p9XXxDtIf7U7c6KcViz94K7Skosucr3378A6IY2kJSjJyuwylQ==", + "dev": true, + "requires": { + "chalk": "^3.0.0", + "fancy-log": "^1.3.2", + "imagemin": "^7.0.0", + "imagemin-gifsicle": "^7.0.0", + "imagemin-mozjpeg": "^8.0.0", + "imagemin-optipng": "^7.0.0", + "imagemin-svgo": "^7.0.0", + "plugin-error": "^1.0.1", + "plur": "^3.0.1", + "pretty-bytes": "^5.3.0", + "through2-concurrent": "^2.0.0" + } + }, + "gulp-js-import": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/gulp-js-import/-/gulp-js-import-1.0.6.tgz", + "integrity": "sha1-aWrGuPp2qGapTgALDw4liF6DrCU=", + "dev": true, + "requires": { + "gulp-util": "^3.0.7", + "through2": "^2.0.1" + } + }, + "gulp-minify": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/gulp-minify/-/gulp-minify-3.1.0.tgz", + "integrity": "sha512-ixF41aYg+NQikI8hpoHdEclYcQkbGdXQu1CBdHaU7Epg8H6e8d2jWXw1+rBPgYwl/XpKgjHj7NI6gkhoSNSSAg==", + "dev": true, + "requires": { + "ansi-colors": "^1.0.1", + "minimatch": "^3.0.2", + "plugin-error": "^0.1.2", + "terser": "^3.7.6", + "through2": "^2.0.3", + "vinyl": "^2.1.0" + }, + "dependencies": { + "arr-diff": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-1.1.0.tgz", + "integrity": "sha1-aHwydYFjWI/vfeezb6vklesaOZo=", + "dev": true, + "requires": { + "arr-flatten": "^1.0.1", + "array-slice": "^0.2.3" + } + }, + "arr-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-2.1.0.tgz", + "integrity": "sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0=", + "dev": true + }, + "array-slice": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", + "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=", + "dev": true + }, + "extend-shallow": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-1.1.4.tgz", + "integrity": "sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=", + "dev": true, + "requires": { + "kind-of": "^1.1.0" + } + }, + "kind-of": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz", + "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=", + "dev": true + }, + "plugin-error": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-0.1.2.tgz", + "integrity": "sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4=", + "dev": true, + "requires": { + "ansi-cyan": "^0.1.1", + "ansi-red": "^0.1.1", + "arr-diff": "^1.0.1", + "arr-union": "^2.0.1", + "extend-shallow": "^1.1.2" + } + } + } + }, + "gulp-newer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/gulp-newer/-/gulp-newer-1.4.0.tgz", + "integrity": "sha512-h79fGO55S/P9eAADbLAP9aTtVYpLSR1ONj08VPaSdVVNVYhTS8p1CO1TW7kEMu+hC+sytmCqcUr5LesvZEtDoQ==", + "dev": true, + "requires": { + "glob": "^7.0.3", + "kew": "^0.7.0", + "plugin-error": "^0.1.2" + }, + "dependencies": { + "arr-diff": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-1.1.0.tgz", + "integrity": "sha1-aHwydYFjWI/vfeezb6vklesaOZo=", + "dev": true, + "requires": { + "arr-flatten": "^1.0.1", + "array-slice": "^0.2.3" + } + }, + "arr-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-2.1.0.tgz", + "integrity": "sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0=", + "dev": true + }, + "array-slice": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", + "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=", + "dev": true + }, + "extend-shallow": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-1.1.4.tgz", + "integrity": "sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=", + "dev": true, + "requires": { + "kind-of": "^1.1.0" + } + }, + "kind-of": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz", + "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=", + "dev": true + }, + "plugin-error": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-0.1.2.tgz", + "integrity": "sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4=", + "dev": true, + "requires": { + "ansi-cyan": "^0.1.1", + "ansi-red": "^0.1.1", + "arr-diff": "^1.0.1", + "arr-union": "^2.0.1", + "extend-shallow": "^1.1.2" + } + } + } + }, + "gulp-plumber": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/gulp-plumber/-/gulp-plumber-1.2.1.tgz", + "integrity": "sha512-mctAi9msEAG7XzW5ytDVZ9PxWMzzi1pS2rBH7lA095DhMa6KEXjm+St0GOCc567pJKJ/oCvosVAZEpAey0q2eQ==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "fancy-log": "^1.3.2", + "plugin-error": "^0.1.2", + "through2": "^2.0.3" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "arr-diff": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-1.1.0.tgz", + "integrity": "sha1-aHwydYFjWI/vfeezb6vklesaOZo=", + "dev": true, + "requires": { + "arr-flatten": "^1.0.1", + "array-slice": "^0.2.3" + } + }, + "arr-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-2.1.0.tgz", + "integrity": "sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0=", + "dev": true + }, + "array-slice": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", + "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "extend-shallow": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-1.1.4.tgz", + "integrity": "sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=", + "dev": true, + "requires": { + "kind-of": "^1.1.0" + } + }, + "kind-of": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz", + "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=", + "dev": true + }, + "plugin-error": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-0.1.2.tgz", + "integrity": "sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4=", + "dev": true, + "requires": { + "ansi-cyan": "^0.1.1", + "ansi-red": "^0.1.1", + "arr-diff": "^1.0.1", + "arr-union": "^2.0.1", + "extend-shallow": "^1.1.2" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "gulp-replace": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/gulp-replace/-/gulp-replace-1.1.3.tgz", + "integrity": "sha512-HcPHpWY4XdF8zxYkDODHnG2+7a3nD/Y8Mfu3aBgMiCFDW3X2GiOKXllsAmILcxe3KZT2BXoN18WrpEFm48KfLQ==", + "dev": true, + "requires": { + "@types/node": "^14.14.41", + "@types/vinyl": "^2.0.4", + "istextorbinary": "^3.0.0", + "replacestream": "^4.0.3", + "yargs-parser": ">=5.0.0-security.0" + } + }, + "gulp-sass": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/gulp-sass/-/gulp-sass-5.1.0.tgz", + "integrity": "sha512-7VT0uaF+VZCmkNBglfe1b34bxn/AfcssquLKVDYnCDJ3xNBaW7cUuI3p3BQmoKcoKFrs9jdzUxyb+u+NGfL4OQ==", + "dev": true, + "requires": { + "lodash.clonedeep": "^4.5.0", + "picocolors": "^1.0.0", + "plugin-error": "^1.0.1", + "replace-ext": "^2.0.0", + "strip-ansi": "^6.0.1", + "vinyl-sourcemaps-apply": "^0.2.1" + } + }, + "gulp-sass-unicode": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/gulp-sass-unicode/-/gulp-sass-unicode-1.0.5.tgz", + "integrity": "sha512-CiV9RpZWKbKKmgz+tw9a0xyCDljYkVqX3rmMV6mfsUpSyqMhP7I5lfoZaF4S81vJaqMxhORQmQWptB8kVBGxRA==", + "dev": true, + "requires": { + "gulp": "^4.0.0", + "plugin-error": "^1.0.1", + "through2": "^3.0.1" + }, + "dependencies": { + "through2": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.2.tgz", + "integrity": "sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==", + "dev": true, + "requires": { + "inherits": "^2.0.4", + "readable-stream": "2 || 3" + } + } + } + }, + "gulp-sourcemaps": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/gulp-sourcemaps/-/gulp-sourcemaps-3.0.0.tgz", + "integrity": "sha512-RqvUckJkuYqy4VaIH60RMal4ZtG0IbQ6PXMNkNsshEGJ9cldUPRb/YCgboYae+CLAs1HQNb4ADTKCx65HInquQ==", + "dev": true, + "requires": { + "@gulp-sourcemaps/identity-map": "^2.0.1", + "@gulp-sourcemaps/map-sources": "^1.0.0", + "acorn": "^6.4.1", + "convert-source-map": "^1.0.0", + "css": "^3.0.0", + "debug-fabulous": "^1.0.0", + "detect-newline": "^2.0.0", + "graceful-fs": "^4.0.0", + "source-map": "^0.6.0", + "strip-bom-string": "^1.0.0", + "through2": "^2.0.0" + } + }, + "gulp-touch-cmd": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/gulp-touch-cmd/-/gulp-touch-cmd-0.0.1.tgz", + "integrity": "sha1-c669BA9cv79Wegbj/beXbvD7iMw=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "through2": "^2.0.3" + } + }, + "gulp-uglify": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gulp-uglify/-/gulp-uglify-3.0.2.tgz", + "integrity": "sha512-gk1dhB74AkV2kzqPMQBLA3jPoIAPd/nlNzP2XMDSG8XZrqnlCiDGAqC+rZOumzFvB5zOphlFh6yr3lgcAb/OOg==", + "dev": true, + "requires": { + "array-each": "^1.0.1", + "extend-shallow": "^3.0.2", + "gulplog": "^1.0.0", + "has-gulplog": "^0.1.0", + "isobject": "^3.0.1", + "make-error-cause": "^1.1.1", + "safe-buffer": "^5.1.2", + "through2": "^2.0.0", + "uglify-js": "^3.0.5", + "vinyl-sourcemaps-apply": "^0.2.0" + } + }, + "gulp-util": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz", + "integrity": "sha1-AFTh50RQLifATBh8PsxQXdVLu08=", + "dev": true, + "requires": { + "array-differ": "^1.0.0", + "array-uniq": "^1.0.2", + "beeper": "^1.0.0", + "chalk": "^1.0.0", + "dateformat": "^2.0.0", + "fancy-log": "^1.1.0", + "gulplog": "^1.0.0", + "has-gulplog": "^0.1.0", + "lodash._reescape": "^3.0.0", + "lodash._reevaluate": "^3.0.0", + "lodash._reinterpolate": "^3.0.0", + "lodash.template": "^3.0.0", + "minimist": "^1.1.0", + "multipipe": "^0.1.2", + "object-assign": "^3.0.0", + "replace-ext": "0.0.1", + "through2": "^2.0.0", + "vinyl": "^0.5.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "dev": true + }, + "clone-stats": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", + "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=", + "dev": true + }, + "object-assign": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", + "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=", + "dev": true + }, + "replace-ext": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", + "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + }, + "vinyl": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz", + "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=", + "dev": true, + "requires": { + "clone": "^1.0.0", + "clone-stats": "^0.0.1", + "replace-ext": "0.0.1" + } + } + } + }, + "gulplog": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", + "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", + "dev": true, + "requires": { + "glogg": "^1.0.0" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + } + } + }, + "has-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "dev": true, + "optional": true + }, + "has-binary2": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", + "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==", + "dev": true, + "requires": { + "isarray": "2.0.1" + }, + "dependencies": { + "isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", + "dev": true + } + } + }, + "has-cors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", + "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "has-gulplog": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz", + "integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=", + "dev": true, + "requires": { + "sparkles": "^1.0.0" + } + }, + "has-symbol-support-x": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz", + "integrity": "sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==", + "dev": true + }, + "has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "dev": true + }, + "has-to-string-tag-x": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz", + "integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==", + "dev": true, + "requires": { + "has-symbol-support-x": "^1.4.1" + } + }, + "has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "optional": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "requires": { + "parse-passwd": "^1.0.0" + } + }, + "hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "http-cache-semantics": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz", + "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==", + "dev": true + }, + "http-errors": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.1" + }, + "dependencies": { + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true + } + } + }, + "http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "requires": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true + }, + "ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "dev": true + }, + "imagemin": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/imagemin/-/imagemin-7.0.1.tgz", + "integrity": "sha512-33AmZ+xjZhg2JMCe+vDf6a9mzWukE7l+wAtesjE7KyteqqKjzxv7aVQeWnul1Ve26mWvEQqyPwl0OctNBfSR9w==", + "dev": true, + "requires": { + "file-type": "^12.0.0", + "globby": "^10.0.0", + "graceful-fs": "^4.2.2", + "junk": "^3.1.0", + "make-dir": "^3.0.0", + "p-pipe": "^3.0.0", + "replace-ext": "^1.0.0" + }, + "dependencies": { + "globby": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz", + "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==", + "dev": true, + "requires": { + "@types/glob": "^7.1.1", + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.0.3", + "glob": "^7.1.3", + "ignore": "^5.1.1", + "merge2": "^1.2.3", + "slash": "^3.0.0" + } + }, + "replace-ext": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz", + "integrity": "sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==", + "dev": true + } + } + }, + "imagemin-gifsicle": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/imagemin-gifsicle/-/imagemin-gifsicle-7.0.0.tgz", + "integrity": "sha512-LaP38xhxAwS3W8PFh4y5iQ6feoTSF+dTAXFRUEYQWYst6Xd+9L/iPk34QGgK/VO/objmIlmq9TStGfVY2IcHIA==", + "dev": true, + "optional": true, + "requires": { + "execa": "^1.0.0", + "gifsicle": "^5.0.0", + "is-gif": "^3.0.0" + } + }, + "imagemin-jpeg-recompress": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/imagemin-jpeg-recompress/-/imagemin-jpeg-recompress-7.0.0.tgz", + "integrity": "sha512-8bO1I6Xncw82i1drrLL/IemZfdD8+oZImUFzMffHUP4YrvyJZpbS8QTC95yIQuuA0NLWDaGuB93sGN8z4T3DnA==", + "dev": true, + "requires": { + "exec-buffer": "^3.0.0", + "is-jpg": "^2.0.0", + "jpeg-recompress-bin": "^5.0.0" + } + }, + "imagemin-mozjpeg": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/imagemin-mozjpeg/-/imagemin-mozjpeg-8.0.0.tgz", + "integrity": "sha512-+EciPiIjCb8JWjQNr1q8sYWYf7GDCNDxPYnkD11TNIjjWNzaV+oTg4DpOPQjl5ZX/KRCPMEgS79zLYAQzLitIA==", + "dev": true, + "optional": true, + "requires": { + "execa": "^1.0.0", + "is-jpg": "^2.0.0", + "mozjpeg": "^6.0.0" + } + }, + "imagemin-optipng": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/imagemin-optipng/-/imagemin-optipng-7.1.0.tgz", + "integrity": "sha512-JNORTZ6j6untH7e5gF4aWdhDCxe3ODsSLKs/f7Grewy3ebZpl1ZsU+VUTPY4rzeHgaFA8GSWOoA8V2M3OixWZQ==", + "dev": true, + "optional": true, + "requires": { + "exec-buffer": "^3.0.0", + "is-png": "^2.0.0", + "optipng-bin": "^6.0.0" + } + }, + "imagemin-pngquant": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/imagemin-pngquant/-/imagemin-pngquant-9.0.2.tgz", + "integrity": "sha512-cj//bKo8+Frd/DM8l6Pg9pws1pnDUjgb7ae++sUX1kUVdv2nrngPykhiUOgFeE0LGY/LmUbCf4egCHC4YUcZSg==", + "dev": true, + "requires": { + "execa": "^4.0.0", + "is-png": "^2.0.0", + "is-stream": "^2.0.0", + "ow": "^0.17.0", + "pngquant-bin": "^6.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "execa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + } + }, + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "dev": true + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "imagemin-svgo": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/imagemin-svgo/-/imagemin-svgo-7.1.0.tgz", + "integrity": "sha512-0JlIZNWP0Luasn1HT82uB9nU9aa+vUj6kpT+MjPW11LbprXC+iC4HDwn1r4Q2/91qj4iy9tRZNsFySMlEpLdpg==", + "dev": true, + "optional": true, + "requires": { + "is-svg": "^4.2.1", + "svgo": "^1.3.2" + } + }, + "immutable": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.2.tgz", + "integrity": "sha1-wkOZUUVbs5kT2vKBN28VMOEErfM=", + "dev": true + }, + "import-lazy": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-3.1.0.tgz", + "integrity": "sha512-8/gvXvX2JMn0F+CDlSC4l6kOmVaLOO3XLkksI7CI3Ud95KDYJuYur2b9P/PUt/i/pDAMd/DulQsNbbbmRRsDIQ==", + "dev": true + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true + }, + "indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "dev": true, + "optional": true, + "requires": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + } + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "dev": true + }, + "into-stream": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-3.1.0.tgz", + "integrity": "sha1-lvsKk2wSur1v8XUqF9BWFqvQlMY=", + "dev": true, + "requires": { + "from2": "^2.1.1", + "p-is-promise": "^1.1.0" + } + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "dev": true + }, + "irregular-plurals": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-2.0.0.tgz", + "integrity": "sha512-Y75zBYLkh0lJ9qxeHlMjQ7bSbyiSqNW/UOPWDmzC7cXskL1hekSITh1Oc6JV0XCWWZ9DE8VYSB71xocLk3gmGw==", + "dev": true + }, + "is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "dev": true, + "requires": { + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + }, + "dependencies": { + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + } + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "optional": true, + "requires": { + "has-bigints": "^1.0.1" + } + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "optional": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-callable": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", + "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", + "dev": true, + "optional": true + }, + "is-core-module": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", + "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + }, + "dependencies": { + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + } + } + }, + "is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "optional": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "dependencies": { + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + } + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + }, + "dependencies": { + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + } + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-finite": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", + "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "is-gif": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-gif/-/is-gif-3.0.0.tgz", + "integrity": "sha512-IqJ/jlbw5WJSNfwQ/lHEDXF8rxhRgF6ythk2oiEvhpG29F704eX9NO6TvPfMiq9DrbwgcEDnETYNcZDPewQoVw==", + "dev": true, + "optional": true, + "requires": { + "file-type": "^10.4.0" + }, + "dependencies": { + "file-type": { + "version": "10.11.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-10.11.0.tgz", + "integrity": "sha512-uzk64HRpUZyTGZtVuvrjP0FYxzQrBf4rojot6J65YMEbwBLB0CWm0CLojVpwpmFmxcE/lkvYICgfcGozbBq6rw==", + "dev": true, + "optional": true + } + } + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-jpg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-jpg/-/is-jpg-2.0.0.tgz", + "integrity": "sha1-LhmX+m6RZuqsAkLarkQ0A+TvHZc=", + "dev": true + }, + "is-natural-number": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-4.0.1.tgz", + "integrity": "sha1-q5124dtM7VHjXeDHLr7PCfc0zeg=", + "dev": true + }, + "is-negated-glob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", + "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=", + "dev": true + }, + "is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true, + "optional": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-number-like": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/is-number-like/-/is-number-like-1.0.8.tgz", + "integrity": "sha512-6rZi3ezCyFcn5L71ywzz2bS5b2Igl1En3eTlZlvKjpz1n3IZLAYMbKYAIQgFmEu0GENg92ziU/faEOA/aixjbA==", + "dev": true, + "requires": { + "lodash.isfinite": "^3.3.2" + } + }, + "is-number-object": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz", + "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==", + "dev": true, + "optional": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.2.tgz", + "integrity": "sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA==", + "dev": true + }, + "is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "dev": true + }, + "is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true + }, + "is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "dev": true + }, + "is-png": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-png/-/is-png-2.0.0.tgz", + "integrity": "sha512-4KPGizaVGj2LK7xwJIz8o5B2ubu1D/vcQsgOGFEDlpcvgZHto4gBnyd0ig7Ws+67ixmwKoNmu0hYnpo6AaKb5g==", + "dev": true + }, + "is-promise": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", + "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", + "dev": true + }, + "is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "optional": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-relative": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "dev": true, + "requires": { + "is-unc-path": "^1.0.0" + } + }, + "is-retry-allowed": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", + "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==", + "dev": true + }, + "is-shared-array-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz", + "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==", + "dev": true, + "optional": true + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "optional": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-svg": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-4.3.2.tgz", + "integrity": "sha512-mM90duy00JGMyjqIVHu9gNTjywdZV+8qNasX8cm/EEYZ53PHDgajvbBwNVvty5dwSAxLUD3p3bdo+7sR/UMrpw==", + "dev": true, + "optional": true, + "requires": { + "fast-xml-parser": "^3.19.0" + } + }, + "is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "optional": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "is-unc-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "dev": true, + "requires": { + "unc-path-regex": "^0.1.2" + } + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "is-valid-glob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-1.0.0.tgz", + "integrity": "sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao=", + "dev": true + }, + "is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "optional": true, + "requires": { + "call-bind": "^1.0.2" + } + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "istextorbinary": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/istextorbinary/-/istextorbinary-3.3.0.tgz", + "integrity": "sha512-Tvq1W6NAcZeJ8op+Hq7tdZ434rqnMx4CCZ7H0ff83uEloDvVbqAwaMTZcafKGJT0VHkYzuXUiCY4hlXQg6WfoQ==", + "dev": true, + "requires": { + "binaryextensions": "^2.2.0", + "textextensions": "^3.2.0" + } + }, + "isurl": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz", + "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==", + "dev": true, + "requires": { + "has-to-string-tag-x": "^1.2.0", + "is-object": "^1.0.1" + } + }, + "jpeg-recompress-bin": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/jpeg-recompress-bin/-/jpeg-recompress-bin-5.1.2.tgz", + "integrity": "sha512-JjR7+gqmw1D1jYgicMpRi+t/Si13+xOMDuvYRSQFMkrKmnOwTqti+9U9ZHrbUnXjrulqK9Sjjq/Hn8E9UnOFpA==", + "dev": true, + "requires": { + "bin-build": "^3.0.0", + "bin-wrapper": "^4.1.0" + } + }, + "js-beautify": { + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.14.0.tgz", + "integrity": "sha512-yuck9KirNSCAwyNJbqW+BxJqJ0NLJ4PwBUzQQACl5O3qHMBXVkXb/rD0ilh/Lat/tn88zSZ+CAHOlk0DsY7GuQ==", + "dev": true, + "requires": { + "config-chain": "^1.1.12", + "editorconfig": "^0.15.3", + "glob": "^7.1.3", + "nopt": "^5.0.0" + } + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "optional": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", + "dev": true + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "jsonfile": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz", + "integrity": "sha1-pezG9l9T9mLEQVx2daAzHQmS7GY=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "junk": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/junk/-/junk-3.1.0.tgz", + "integrity": "sha512-pBxcB3LFc8QVgdggvZWyeys+hnrNWg4OcZIU/1X59k5jQdLBlCsYGRQaz234SqoRLTCgMH00fY0xRJH+F9METQ==", + "dev": true + }, + "just-debounce": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/just-debounce/-/just-debounce-1.1.0.tgz", + "integrity": "sha512-qpcRocdkUmf+UTNBYx5w6dexX5J31AKK1OmPwH630a83DdVVUIngk55RSAiIGpQyoH0dlr872VHfPjnQnK1qDQ==", + "dev": true + }, + "kew": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/kew/-/kew-0.7.0.tgz", + "integrity": "sha1-edk9LTM2PW/dKXCzNdkUGtWR15s=", + "dev": true + }, + "keyv": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.0.0.tgz", + "integrity": "sha512-eguHnq22OE3uVoSYG0LVWNP+4ppamWr9+zWBe1bsNcovIMy6huUJFPgy4mGwCd/rnl3vOLGW1MTlu4c57CT1xA==", + "dev": true, + "requires": { + "json-buffer": "3.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + }, + "last-run": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/last-run/-/last-run-1.1.1.tgz", + "integrity": "sha1-RblpQsF7HHnHchmCWbqUO+v4yls=", + "dev": true, + "requires": { + "default-resolution": "^2.0.0", + "es6-weak-map": "^2.0.1" + } + }, + "lazystream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", + "dev": true, + "requires": { + "readable-stream": "^2.0.5" + } + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "dev": true, + "requires": { + "invert-kv": "^1.0.0" + } + }, + "lead": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lead/-/lead-1.0.0.tgz", + "integrity": "sha1-bxT5mje+Op3XhPVJVpDlkDRm7kI=", + "dev": true, + "requires": { + "flush-write-stream": "^1.0.2" + } + }, + "liftoff": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-3.1.0.tgz", + "integrity": "sha512-DlIPlJUkCV0Ips2zf2pJP0unEoT1kwYhiiPUGF3s/jtxTCjziNLoiVVh+jqWOWeFi6mmwQ5fNxvAUyPad4Dfog==", + "dev": true, + "requires": { + "extend": "^3.0.0", + "findup-sync": "^3.0.0", + "fined": "^1.0.1", + "flagged-respawn": "^1.0.0", + "is-plain-object": "^2.0.4", + "object.map": "^1.0.0", + "rechoir": "^0.6.2", + "resolve": "^1.1.7" + }, + "dependencies": { + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + } + } + }, + "limiter": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.5.tgz", + "integrity": "sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==", + "dev": true + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "localtunnel": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/localtunnel/-/localtunnel-2.0.2.tgz", + "integrity": "sha512-n418Cn5ynvJd7m/N1d9WVJISLJF/ellZnfsLnx8WBWGzxv/ntNcFkJ1o6se5quUhCplfLGBNL5tYHiq5WF3Nug==", + "dev": true, + "requires": { + "axios": "0.21.4", + "debug": "4.3.2", + "openurl": "1.1.1", + "yargs": "17.1.1" + }, + "dependencies": { + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true + }, + "yargs": { + "version": "17.1.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.1.1.tgz", + "integrity": "sha512-c2k48R0PwKIqKhPMWjeiF6y2xY/gPMUlro0sgxqXpbOIohWiLNXWslsootttv7E1e73QPAMQSg5FeySbVcpsPQ==", + "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + }, + "yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true + } + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "lodash._basecopy": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", + "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", + "dev": true + }, + "lodash._basetostring": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz", + "integrity": "sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U=", + "dev": true + }, + "lodash._basevalues": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz", + "integrity": "sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc=", + "dev": true + }, + "lodash._getnative": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", + "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", + "dev": true + }, + "lodash._isiterateecall": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", + "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", + "dev": true + }, + "lodash._reescape": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reescape/-/lodash._reescape-3.0.0.tgz", + "integrity": "sha1-Kx1vXf4HyKNVdT5fJ/rH8c3hYWo=", + "dev": true + }, + "lodash._reevaluate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz", + "integrity": "sha1-WLx0xAZklTrgsSTYBpltrKQx4u0=", + "dev": true + }, + "lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", + "dev": true + }, + "lodash._root": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz", + "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=", + "dev": true + }, + "lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", + "dev": true + }, + "lodash.escape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz", + "integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=", + "dev": true, + "requires": { + "lodash._root": "^3.0.0" + } + }, + "lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", + "dev": true + }, + "lodash.isarray": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", + "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", + "dev": true + }, + "lodash.isfinite": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz", + "integrity": "sha1-+4m2WpqAKBgz8LdHizpRBPiY67M=", + "dev": true + }, + "lodash.keys": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", + "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", + "dev": true, + "requires": { + "lodash._getnative": "^3.0.0", + "lodash.isarguments": "^3.0.0", + "lodash.isarray": "^3.0.0" + } + }, + "lodash.restparam": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", + "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=", + "dev": true + }, + "lodash.template": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz", + "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=", + "dev": true, + "requires": { + "lodash._basecopy": "^3.0.0", + "lodash._basetostring": "^3.0.0", + "lodash._basevalues": "^3.0.0", + "lodash._isiterateecall": "^3.0.0", + "lodash._reinterpolate": "^3.0.0", + "lodash.escape": "^3.0.0", + "lodash.keys": "^3.0.0", + "lodash.restparam": "^3.0.0", + "lodash.templatesettings": "^3.0.0" + } + }, + "lodash.templatesettings": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz", + "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=", + "dev": true, + "requires": { + "lodash._reinterpolate": "^3.0.0", + "lodash.escape": "^3.0.0" + } + }, + "logalot": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/logalot/-/logalot-2.1.0.tgz", + "integrity": "sha1-X46MkNME7fElMJUaVVSruMXj9VI=", + "dev": true, + "optional": true, + "requires": { + "figures": "^1.3.5", + "squeak": "^1.0.0" + } + }, + "longest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", + "dev": true, + "optional": true + }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "dev": true, + "optional": true, + "requires": { + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" + } + }, + "lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true + }, + "lpad-align": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/lpad-align/-/lpad-align-1.1.2.tgz", + "integrity": "sha1-IfYArBwwlcPG5JfuZyce4ISB/p4=", + "dev": true, + "optional": true, + "requires": { + "get-stdin": "^4.0.1", + "indent-string": "^2.1.0", + "longest": "^1.0.0", + "meow": "^3.3.0" + }, + "dependencies": { + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "dev": true, + "optional": true, + "requires": { + "repeating": "^2.0.0" + } + } + } + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "lru-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz", + "integrity": "sha1-Jzi9nw089PhEkMVzbEhpmsYyzaM=", + "dev": true, + "requires": { + "es5-ext": "~0.10.2" + } + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "make-error-cause": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/make-error-cause/-/make-error-cause-1.2.2.tgz", + "integrity": "sha1-3wOI/NCzeBbf8KX7gQiTl3fcvJ0=", + "dev": true, + "requires": { + "make-error": "^1.2.0" + } + }, + "make-iterator": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", + "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", + "dev": true, + "requires": { + "kind-of": "^6.0.2" + }, + "dependencies": { + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + } + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true, + "optional": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "matchdep": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/matchdep/-/matchdep-2.0.0.tgz", + "integrity": "sha1-xvNINKDY28OzfCfui7yyfHd1WC4=", + "dev": true, + "requires": { + "findup-sync": "^2.0.0", + "micromatch": "^3.0.4", + "resolve": "^1.4.0", + "stack-trace": "0.0.10" + }, + "dependencies": { + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "findup-sync": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", + "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", + "dev": true, + "requires": { + "detect-file": "^1.0.0", + "is-glob": "^3.1.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "mdn-data": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", + "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==", + "dev": true, + "optional": true + }, + "memoizee": { + "version": "0.4.15", + "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.15.tgz", + "integrity": "sha512-UBWmJpLZd5STPm7PMUlOw/TSy972M+z8gcyQ5veOnSDRREz/0bmpyTfKt3/51DhEBqCZQn1udM/5flcSPYhkdQ==", + "dev": true, + "requires": { + "d": "^1.0.1", + "es5-ext": "^0.10.53", + "es6-weak-map": "^2.0.3", + "event-emitter": "^0.3.5", + "is-promise": "^2.2.2", + "lru-queue": "^0.1.0", + "next-tick": "^1.1.0", + "timers-ext": "^0.1.7" + } + }, + "meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "dev": true, + "optional": true, + "requires": { + "camelcase-keys": "^2.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" + } + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + } + }, + "mime": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", + "dev": true + }, + "mime-db": { + "version": "1.51.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", + "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", + "dev": true + }, + "mime-types": { + "version": "2.1.34", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", + "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", + "dev": true, + "requires": { + "mime-db": "1.51.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "mitt": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-1.2.0.tgz", + "integrity": "sha512-r6lj77KlwqLhIUku9UWYes7KJtsczvolZkzp8hbaDPPaE24OmWl5s539Mytlj22siEQKosZ26qCBgda2PKwoJw==", + "dev": true + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + } + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "mozjpeg": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/mozjpeg/-/mozjpeg-6.0.1.tgz", + "integrity": "sha512-9Z59pJMi8ni+IUvSH5xQwK5tNLw7p3dwDNCZ3o1xE+of3G5Hc/yOz6Ue/YuLiBXU3ZB5oaHPURyPdqfBX/QYJA==", + "dev": true, + "optional": true, + "requires": { + "bin-build": "^3.0.0", + "bin-wrapper": "^4.0.0", + "logalot": "^2.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "multipipe": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", + "integrity": "sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=", + "dev": true, + "requires": { + "duplexer2": "0.0.2" + } + }, + "mute-stdout": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mute-stdout/-/mute-stdout-1.0.1.tgz", + "integrity": "sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg==", + "dev": true + }, + "nan": { + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", + "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==", + "dev": true, + "optional": true + }, + "nanoid": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.2.0.tgz", + "integrity": "sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA==", + "dev": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + } + } + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "dev": true + }, + "next-tick": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", + "dev": true + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "node-releases": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz", + "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==", + "dev": true + }, + "nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dev": true, + "requires": { + "abbrev": "1" + } + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "dev": true + }, + "now-and-later": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-2.0.1.tgz", + "integrity": "sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ==", + "dev": true, + "requires": { + "once": "^1.3.2" + } + }, + "npm-conf": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/npm-conf/-/npm-conf-1.1.3.tgz", + "integrity": "sha512-Yic4bZHJOt9RCFbRP3GgpqhScOY4HH3V2P8yBj6CeYq118Qr+BLXqT2JvpJ00mryLESpgOxf5XlFv4ZjXxLScw==", + "dev": true, + "requires": { + "config-chain": "^1.1.11", + "pify": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "dev": true, + "optional": true, + "requires": { + "boolbase": "~1.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-inspect": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", + "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==", + "dev": true, + "optional": true + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "^3.0.0" + } + }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, + "object.defaults": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", + "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", + "dev": true, + "requires": { + "array-each": "^1.0.1", + "array-slice": "^1.0.0", + "for-own": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "object.getownpropertydescriptors": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.3.tgz", + "integrity": "sha512-VdDoCwvJI4QdC6ndjpqFmoL3/+HxffFBbcJzKi5hwLLqqx3mdbedRpfZDdK0SrOSauj8X4GzBvnDZl4vTN7dOw==", + "dev": true, + "optional": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + } + }, + "object.map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", + "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=", + "dev": true, + "requires": { + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "object.reduce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.reduce/-/object.reduce-1.0.1.tgz", + "integrity": "sha1-b+NI8qx/oPlcpiEiZZkJaCW7A60=", + "dev": true, + "requires": { + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + } + }, + "object.values": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", + "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", + "dev": true, + "optional": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + } + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "openurl": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/openurl/-/openurl-1.1.1.tgz", + "integrity": "sha1-OHW0sO96UsFW8NtB1GCduw+Us4c=", + "dev": true + }, + "opn": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.3.0.tgz", + "integrity": "sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g==", + "dev": true, + "requires": { + "is-wsl": "^1.1.0" + } + }, + "optipng-bin": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/optipng-bin/-/optipng-bin-6.0.0.tgz", + "integrity": "sha512-95bB4y8IaTsa/8x6QH4bLUuyvyOoGBCLDA7wOgDL8UFqJpSUh1Hob8JRJhit+wC1ZLN3tQ7mFt7KuBj0x8F2Wg==", + "dev": true, + "optional": true, + "requires": { + "bin-build": "^3.0.0", + "bin-wrapper": "^4.0.0", + "logalot": "^2.0.0" + } + }, + "ordered-read-streams": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz", + "integrity": "sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=", + "dev": true, + "requires": { + "readable-stream": "^2.0.1" + } + }, + "os-filter-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/os-filter-obj/-/os-filter-obj-2.0.0.tgz", + "integrity": "sha512-uksVLsqG3pVdzzPvmAHpBK0wKxYItuzZr7SziusRPoz67tGV8rL1szZ6IdeUrbqLjGDwApBtN29eEE3IqGHOjg==", + "dev": true, + "requires": { + "arch": "^2.1.0" + } + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "dev": true, + "requires": { + "lcid": "^1.0.0" + } + }, + "ow": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/ow/-/ow-0.17.0.tgz", + "integrity": "sha512-i3keDzDQP5lWIe4oODyDFey1qVrq2hXKTuTH2VpqwpYtzPiKZt2ziRI4NBQmgW40AnV5Euz17OyWweCb+bNEQA==", + "dev": true, + "requires": { + "type-fest": "^0.11.0" + } + }, + "p-cancelable": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz", + "integrity": "sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==", + "dev": true + }, + "p-event": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-event/-/p-event-1.3.0.tgz", + "integrity": "sha1-jmtPT2XHK8W2/ii3XtqHT5akoIU=", + "dev": true, + "requires": { + "p-timeout": "^1.1.1" + } + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-is-promise": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz", + "integrity": "sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4=", + "dev": true + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "p-map-series": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-map-series/-/p-map-series-1.0.0.tgz", + "integrity": "sha1-v5j+V1cFZYqeE1G++4WuTB8Hvco=", + "dev": true, + "requires": { + "p-reduce": "^1.0.0" + } + }, + "p-pipe": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-pipe/-/p-pipe-3.1.0.tgz", + "integrity": "sha512-08pj8ATpzMR0Y80x50yJHn37NF6vjrqHutASaX5LiH5npS9XPvrUmscd9MF5R4fuYRHOxQR1FfMIlF7AzwoPqw==", + "dev": true + }, + "p-reduce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-1.0.0.tgz", + "integrity": "sha1-GMKw3ZNqRpClKfgjH1ig/bakffo=", + "dev": true + }, + "p-timeout": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-1.2.1.tgz", + "integrity": "sha1-XrOzU7f86Z8QGhA4iAuwVOu+o4Y=", + "dev": true, + "requires": { + "p-finally": "^1.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "parse-filepath": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", + "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", + "dev": true, + "requires": { + "is-absolute": "^1.0.0", + "map-cache": "^0.2.0", + "path-root": "^0.1.1" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "^1.2.0" + } + }, + "parse-node-version": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", + "dev": true + }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "dev": true + }, + "parseqs": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.6.tgz", + "integrity": "sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w==", + "dev": true + }, + "parseuri": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.6.tgz", + "integrity": "sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow==", + "dev": true + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "path-root": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", + "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", + "dev": true, + "requires": { + "path-root-regex": "^0.1.0" + } + }, + "path-root-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", + "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=", + "dev": true + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, + "pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", + "dev": true + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "^2.0.0" + } + }, + "plugin-error": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz", + "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==", + "dev": true, + "requires": { + "ansi-colors": "^1.0.1", + "arr-diff": "^4.0.0", + "arr-union": "^3.1.0", + "extend-shallow": "^3.0.2" + } + }, + "plur": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/plur/-/plur-3.1.1.tgz", + "integrity": "sha512-t1Ax8KUvV3FFII8ltczPn2tJdjqbd1sIzu6t4JL7nQ3EyeL/lTrj5PWKb06ic5/6XYDr65rQ4uzQEGN70/6X5w==", + "dev": true, + "requires": { + "irregular-plurals": "^2.0.0" + } + }, + "pngquant-bin": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/pngquant-bin/-/pngquant-bin-6.0.1.tgz", + "integrity": "sha512-Q3PUyolfktf+hYio6wsg3SanQzEU/v8aICg/WpzxXcuCMRb7H2Q81okfpcEztbMvw25ILjd3a87doj2N9kvbpQ==", + "dev": true, + "requires": { + "bin-build": "^3.0.0", + "bin-wrapper": "^4.0.1", + "execa": "^4.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "execa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + } + }, + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "dev": true + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "portscanner": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/portscanner/-/portscanner-2.1.1.tgz", + "integrity": "sha1-6rtAnk3iSVD1oqUW01rnaTQ/u5Y=", + "dev": true, + "requires": { + "async": "1.5.2", + "is-number-like": "^1.0.3" + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "postcss": { + "version": "8.4.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.6.tgz", + "integrity": "sha512-OovjwIzs9Te46vlEx7+uXB0PLijpwjXGKXjVGGPIGubGpq7uh5Xgf6D6FiJ/SzJMBosHDp6a2hiXOS97iBXcaA==", + "dev": true, + "requires": { + "nanoid": "^3.2.0", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + } + }, + "postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "dev": true + }, + "pretty-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", + "dev": true + }, + "pretty-hrtime": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=", + "dev": true + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dev": true, + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + }, + "dependencies": { + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "dev": true, + "optional": true + }, + "qs": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.2.3.tgz", + "integrity": "sha1-HPyyXBCpsrSDBT/zn138kjOQjP4=", + "dev": true + }, + "query-string": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", + "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", + "dev": true, + "requires": { + "decode-uri-component": "^0.2.0", + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + } + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true + }, + "raw-body": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.2.tgz", + "integrity": "sha512-RPMAFUJP19WIet/99ngh6Iv8fzAbqum4Li7AD6DtGaW2RpMB/11xDoalPiJMTbu6I3hkbMVkATvZrqb9EEqeeQ==", + "dev": true, + "requires": { + "bytes": "3.1.1", + "http-errors": "1.8.1", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + }, + "dependencies": { + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "dev": true, + "requires": { + "resolve": "^1.1.6" + } + }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "dev": true, + "optional": true, + "requires": { + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" + }, + "dependencies": { + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "dev": true, + "optional": true, + "requires": { + "repeating": "^2.0.0" + } + } + } + }, + "regenerator-runtime": { + "version": "0.13.9", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", + "dev": true + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "remove-bom-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz", + "integrity": "sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5", + "is-utf8": "^0.2.1" + } + }, + "remove-bom-stream": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz", + "integrity": "sha1-BfGlk/FuQuH7kOv1nejlaVJflSM=", + "dev": true, + "requires": { + "remove-bom-buffer": "^3.0.0", + "safe-buffer": "^5.1.0", + "through2": "^2.0.3" + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "repeat-element": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "optional": true, + "requires": { + "is-finite": "^1.0.0" + } + }, + "replace-ext": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-2.0.0.tgz", + "integrity": "sha512-UszKE5KVK6JvyD92nzMn9cDapSk6w/CaFZ96CnmDMUqH9oowfxF/ZjRITD25H4DnOQClLA4/j7jLGXXLVKxAug==", + "dev": true + }, + "replace-homedir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/replace-homedir/-/replace-homedir-1.0.0.tgz", + "integrity": "sha1-6H9tUTuSjd6AgmDBK+f+xv9ueYw=", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.1", + "is-absolute": "^1.0.0", + "remove-trailing-separator": "^1.1.0" + } + }, + "replacestream": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/replacestream/-/replacestream-4.0.3.tgz", + "integrity": "sha512-AC0FiLS352pBBiZhd4VXB1Ab/lh0lEgpP+GGvZqbQh8a5cmXVoTe5EX/YeTFArnp4SRGTHh1qCHu9lGs1qG8sA==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.3", + "object-assign": "^4.0.1", + "readable-stream": "^2.0.2" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true + }, + "resolve": { + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", + "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", + "dev": true, + "requires": { + "is-core-module": "^2.8.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + } + }, + "resolve-options": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/resolve-options/-/resolve-options-1.1.0.tgz", + "integrity": "sha1-MrueOcBtZzONyTeMDW1gdFZq0TE=", + "dev": true, + "requires": { + "value-or-function": "^3.0.0" + } + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "resp-modifier": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/resp-modifier/-/resp-modifier-6.0.2.tgz", + "integrity": "sha1-sSTeXE+6/LpUH0j/pzlw9KpFa08=", + "dev": true, + "requires": { + "debug": "^2.2.0", + "minimatch": "^3.0.2" + } + }, + "responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", + "dev": true, + "requires": { + "lowercase-keys": "^1.0.0" + } + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "rx": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/rx/-/rx-4.1.0.tgz", + "integrity": "sha1-pfE/957zt0D+MKqAP7CfmIBdR4I=", + "dev": true + }, + "rxjs": { + "version": "5.5.12", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.12.tgz", + "integrity": "sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw==", + "dev": true, + "requires": { + "symbol-observable": "1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "sass": { + "version": "1.49.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.49.0.tgz", + "integrity": "sha512-TVwVdNDj6p6b4QymJtNtRS2YtLJ/CqZriGg0eIAbAKMlN8Xy6kbv33FsEZSF7FufFFM705SQviHjjThfaQ4VNw==", + "dev": true, + "requires": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "dependencies": { + "immutable": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.0.0.tgz", + "integrity": "sha512-zIE9hX70qew5qTUjSS7wi1iwj/l7+m54KWU247nhM3v806UdGj1yDndXj+IOYxxtW9zyLI+xqFNZjTuDaLUqFw==", + "dev": true + } + } + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true, + "optional": true + }, + "seek-bzip": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.6.tgz", + "integrity": "sha512-e1QtP3YL5tWww8uKaOCQ18UxIT2laNBXHjV/S2WYCiK4udiv8lkG89KRIoCjUagnAmCBurjF4zEVX2ByBbnCjQ==", + "dev": true, + "requires": { + "commander": "^2.8.1" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "semver-greatest-satisfied-range": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-1.1.0.tgz", + "integrity": "sha1-E+jCZYq5aRywzXEJMkAoDTb3els=", + "dev": true, + "requires": { + "sver-compat": "^1.5.0" + } + }, + "semver-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-2.0.0.tgz", + "integrity": "sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw==", + "dev": true + }, + "semver-truncate": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/semver-truncate/-/semver-truncate-1.1.2.tgz", + "integrity": "sha1-V/Qd5pcHpicJp+AQS6IRcQnqR+g=", + "dev": true, + "requires": { + "semver": "^5.3.0" + } + }, + "send": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", + "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.6.2", + "mime": "1.4.1", + "ms": "2.0.0", + "on-finished": "~2.3.0", + "range-parser": "~1.2.0", + "statuses": "~1.4.0" + }, + "dependencies": { + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", + "dev": true + } + } + }, + "serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "dependencies": { + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true + } + } + }, + "serve-static": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", + "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", + "dev": true, + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.2", + "send": "0.16.2" + } + }, + "server-destroy": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/server-destroy/-/server-destroy-1.0.1.tgz", + "integrity": "sha1-8Tv5KOQrnD55OD5hzDmYtdFObN0=", + "dev": true + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + } + } + }, + "setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "optional": true, + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "sigmund": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", + "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=", + "dev": true + }, + "signal-exit": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz", + "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==", + "dev": true + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "dev": true, + "requires": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "socket.io": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.4.0.tgz", + "integrity": "sha512-9UPJ1UTvKayuQfVv2IQ3k7tCQC/fboDyIK62i99dAQIyHKaBsNdTpwHLgKJ6guRWxRtC9H+138UwpaGuQO9uWQ==", + "dev": true, + "requires": { + "debug": "~4.1.0", + "engine.io": "~3.5.0", + "has-binary2": "~1.0.2", + "socket.io-adapter": "~1.1.0", + "socket.io-client": "2.4.0", + "socket.io-parser": "~3.4.0" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + } + } + }, + "socket.io-adapter": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz", + "integrity": "sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g==", + "dev": true + }, + "socket.io-client": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.4.0.tgz", + "integrity": "sha512-M6xhnKQHuuZd4Ba9vltCLT9oa+YvTsP8j9NcEiLElfIg8KeYPyhWOes6x4t+LTAC8enQbE/995AdTem2uNyKKQ==", + "dev": true, + "requires": { + "backo2": "1.0.2", + "component-bind": "1.0.0", + "component-emitter": "~1.3.0", + "debug": "~3.1.0", + "engine.io-client": "~3.5.0", + "has-binary2": "~1.0.2", + "indexof": "0.0.1", + "parseqs": "0.0.6", + "parseuri": "0.0.6", + "socket.io-parser": "~3.3.0", + "to-array": "0.1.4" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", + "dev": true + }, + "socket.io-parser": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.2.tgz", + "integrity": "sha512-FJvDBuOALxdCI9qwRrO/Rfp9yfndRtc1jSgVgV8FDraihmSP/MLGD5PEuJrNfjALvcQ+vMDM/33AWOYP/JSjDg==", + "dev": true, + "requires": { + "component-emitter": "~1.3.0", + "debug": "~3.1.0", + "isarray": "2.0.1" + } + } + } + }, + "socket.io-parser": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.4.1.tgz", + "integrity": "sha512-11hMgzL+WCLWf1uFtHSNvliI++tcRUWdoeYuwIl+Axvwy9z2gQM+7nJyN3STj1tLj5JyIUH8/gpDGxzAlDdi0A==", + "dev": true, + "requires": { + "component-emitter": "1.2.1", + "debug": "~4.1.0", + "isarray": "2.0.1" + }, + "dependencies": { + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", + "dev": true + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + } + } + }, + "sort-keys": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", + "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", + "dev": true, + "requires": { + "is-plain-obj": "^1.0.0" + } + }, + "sort-keys-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sort-keys-length/-/sort-keys-length-1.0.1.tgz", + "integrity": "sha1-nLb09OnkgVWmqgZx7dM2/xR5oYg=", + "dev": true, + "requires": { + "sort-keys": "^1.0.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true + }, + "source-map-resolve": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.6.0.tgz", + "integrity": "sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w==", + "dev": true, + "requires": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0" + } + }, + "source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "source-map-url": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", + "dev": true + }, + "sparkles": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.1.tgz", + "integrity": "sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==", + "dev": true + }, + "spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz", + "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==", + "dev": true + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true, + "optional": true + }, + "squeak": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/squeak/-/squeak-1.3.0.tgz", + "integrity": "sha1-MwRQN7ZDiLVnZ0uEMiplIQc5FsM=", + "dev": true, + "optional": true, + "requires": { + "chalk": "^1.0.0", + "console-stream": "^0.1.1", + "lpad-align": "^1.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true, + "optional": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true, + "optional": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "optional": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "optional": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true, + "optional": true + } + } + }, + "stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "dev": true, + "optional": true + }, + "stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=", + "dev": true + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + } + } + }, + "statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=", + "dev": true + }, + "stream-exhaust": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/stream-exhaust/-/stream-exhaust-1.0.2.tgz", + "integrity": "sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==", + "dev": true + }, + "stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", + "dev": true + }, + "stream-throttle": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/stream-throttle/-/stream-throttle-0.1.3.tgz", + "integrity": "sha1-rdV8jXzHOoFjDTHNVdOWHPr7qcM=", + "dev": true, + "requires": { + "commander": "^2.2.0", + "limiter": "^1.0.5" + } + }, + "strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "dev": true, + "optional": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "dev": true, + "optional": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "^0.2.0" + } + }, + "strip-bom-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", + "integrity": "sha1-5SEekiQ2n7uB1jOi8ABE3IztrZI=", + "dev": true + }, + "strip-dirs": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-2.1.0.tgz", + "integrity": "sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==", + "dev": true, + "requires": { + "is-natural-number": "^4.0.1" + } + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true + }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "dev": true, + "optional": true, + "requires": { + "get-stdin": "^4.0.1" + } + }, + "strip-outer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz", + "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.2" + } + }, + "strnum": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", + "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==", + "dev": true, + "optional": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true + }, + "sver-compat": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/sver-compat/-/sver-compat-1.5.0.tgz", + "integrity": "sha1-PPh9/rTQe0o/FIJ7wYaz/QxkXNg=", + "dev": true, + "requires": { + "es6-iterator": "^2.0.1", + "es6-symbol": "^3.1.1" + } + }, + "svgo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", + "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", + "dev": true, + "optional": true, + "requires": { + "chalk": "^2.4.1", + "coa": "^2.0.2", + "css-select": "^2.0.0", + "css-select-base-adapter": "^0.1.1", + "css-tree": "1.0.0-alpha.37", + "csso": "^4.0.2", + "js-yaml": "^3.13.1", + "mkdirp": "~0.5.1", + "object.values": "^1.1.0", + "sax": "~1.2.4", + "stable": "^0.1.8", + "unquote": "~1.1.1", + "util.promisify": "~1.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "optional": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "optional": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "optional": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true, + "optional": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "optional": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "optional": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "symbol-observable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", + "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=", + "dev": true + }, + "tar-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", + "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", + "dev": true, + "requires": { + "bl": "^1.0.0", + "buffer-alloc": "^1.2.0", + "end-of-stream": "^1.0.0", + "fs-constants": "^1.0.0", + "readable-stream": "^2.3.0", + "to-buffer": "^1.1.1", + "xtend": "^4.0.0" + } + }, + "temp-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz", + "integrity": "sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0=", + "dev": true + }, + "tempfile": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tempfile/-/tempfile-2.0.0.tgz", + "integrity": "sha1-awRGhWqbERTRhW/8vlCczLCXcmU=", + "dev": true, + "requires": { + "temp-dir": "^1.0.0", + "uuid": "^3.0.1" + } + }, + "terser": { + "version": "3.17.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-3.17.0.tgz", + "integrity": "sha512-/FQzzPJmCpjAH9Xvk2paiWrFq+5M6aVOf+2KRbwhByISDX/EujxsK+BAvrhb6H+2rtrLCHK9N01wO014vrIwVQ==", + "dev": true, + "requires": { + "commander": "^2.19.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.10" + } + }, + "textextensions": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/textextensions/-/textextensions-3.3.0.tgz", + "integrity": "sha512-mk82dS8eRABNbeVJrEiN5/UMSCliINAuz8mkUwH4SwslkNP//gbEzlWNS5au0z5Dpx40SQxzqZevZkn+WYJ9Dw==", + "dev": true + }, + "tfunk": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/tfunk/-/tfunk-4.0.0.tgz", + "integrity": "sha512-eJQ0dGfDIzWNiFNYFVjJ+Ezl/GmwHaFTBTjrtqNPW0S7cuVDBrZrmzUz6VkMeCR4DZFqhd4YtLwsw3i2wYHswQ==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "dlv": "^1.1.3" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "through2-concurrent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/through2-concurrent/-/through2-concurrent-2.0.0.tgz", + "integrity": "sha512-R5/jLkfMvdmDD+seLwN7vB+mhbqzWop5fAjx5IX8/yQq7VhBhzDmhXgaHAOnhnWkCpRMM7gToYHycB0CS/pd+A==", + "dev": true, + "requires": { + "through2": "^2.0.0" + } + }, + "through2-filter": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-3.0.0.tgz", + "integrity": "sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==", + "dev": true, + "requires": { + "through2": "~2.0.0", + "xtend": "~4.0.0" + } + }, + "time-stamp": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", + "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=", + "dev": true + }, + "timed-out": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", + "dev": true + }, + "timers-ext": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz", + "integrity": "sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==", + "dev": true, + "requires": { + "es5-ext": "~0.10.46", + "next-tick": "1" + } + }, + "to-absolute-glob": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz", + "integrity": "sha1-GGX0PZ50sIItufFFt4z/fQ98hJs=", + "dev": true, + "requires": { + "is-absolute": "^1.0.0", + "is-negated-glob": "^1.0.0" + } + }, + "to-array": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", + "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=", + "dev": true + }, + "to-buffer": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", + "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==", + "dev": true + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "to-through": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-through/-/to-through-2.0.0.tgz", + "integrity": "sha1-/JKtq6ByZHvAtn1rA2ZKoZUJOvY=", + "dev": true, + "requires": { + "through2": "^2.0.3" + } + }, + "toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true + }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", + "dev": true, + "optional": true + }, + "trim-repeated": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", + "integrity": "sha1-42RqLqTokTEr9+rObPsFOAvAHCE=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.2" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", + "dev": true + }, + "type-fest": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", + "dev": true + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "ua-parser-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.2.tgz", + "integrity": "sha512-00y/AXhx0/SsnI51fTc0rLRmafiGOM4/O+ny10Ps7f+j/b8p/ZY11ytMgznXkOVo4GQ+KwQG5UQLkLGirsACRg==", + "dev": true + }, + "uglify-js": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.15.0.tgz", + "integrity": "sha512-x+xdeDWq7FiORDvyIJ0q/waWd4PhjBNOm5dQUOq2AKC0IEjxOS66Ha9tctiVDGcRQuh69K7fgU5oRuTK4cysSg==", + "dev": true + }, + "unbox-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "dev": true, + "optional": true, + "requires": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + } + }, + "unbzip2-stream": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", + "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", + "dev": true, + "requires": { + "buffer": "^5.2.1", + "through": "^2.3.8" + } + }, + "unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", + "dev": true + }, + "undertaker": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/undertaker/-/undertaker-1.3.0.tgz", + "integrity": "sha512-/RXwi5m/Mu3H6IHQGww3GNt1PNXlbeCuclF2QYR14L/2CHPz3DFZkvB5hZ0N/QUkiXWCACML2jXViIQEQc2MLg==", + "dev": true, + "requires": { + "arr-flatten": "^1.0.1", + "arr-map": "^2.0.0", + "bach": "^1.0.0", + "collection-map": "^1.0.0", + "es6-weak-map": "^2.0.1", + "fast-levenshtein": "^1.0.0", + "last-run": "^1.1.0", + "object.defaults": "^1.0.0", + "object.reduce": "^1.0.0", + "undertaker-registry": "^1.0.0" + } + }, + "undertaker-registry": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/undertaker-registry/-/undertaker-registry-1.0.1.tgz", + "integrity": "sha1-XkvaMI5KiirlhPm5pDWaSZglzFA=", + "dev": true + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + } + } + }, + "unique-stream": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.3.1.tgz", + "integrity": "sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==", + "dev": true, + "requires": { + "json-stable-stringify-without-jsonify": "^1.0.1", + "through2-filter": "^3.0.0" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true + }, + "unquote": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", + "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=", + "dev": true, + "optional": true + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + } + } + }, + "upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "dev": true + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "url-parse-lax": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", + "dev": true, + "requires": { + "prepend-http": "^1.0.1" + } + }, + "url-to-options": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz", + "integrity": "sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=", + "dev": true + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "util.promisify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", + "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", + "dev": true, + "optional": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.2", + "has-symbols": "^1.0.1", + "object.getownpropertydescriptors": "^2.1.0" + } + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + }, + "v8flags": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.2.0.tgz", + "integrity": "sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "value-or-function": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/value-or-function/-/value-or-function-3.0.0.tgz", + "integrity": "sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM=", + "dev": true + }, + "vinyl": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.1.tgz", + "integrity": "sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==", + "dev": true, + "requires": { + "clone": "^2.1.1", + "clone-buffer": "^1.0.0", + "clone-stats": "^1.0.0", + "cloneable-readable": "^1.0.0", + "remove-trailing-separator": "^1.0.1", + "replace-ext": "^1.0.0" + }, + "dependencies": { + "replace-ext": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz", + "integrity": "sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==", + "dev": true + } + } + }, + "vinyl-fs": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-3.0.3.tgz", + "integrity": "sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng==", + "dev": true, + "requires": { + "fs-mkdirp-stream": "^1.0.0", + "glob-stream": "^6.1.0", + "graceful-fs": "^4.0.0", + "is-valid-glob": "^1.0.0", + "lazystream": "^1.0.0", + "lead": "^1.0.0", + "object.assign": "^4.0.4", + "pumpify": "^1.3.5", + "readable-stream": "^2.3.3", + "remove-bom-buffer": "^3.0.0", + "remove-bom-stream": "^1.2.0", + "resolve-options": "^1.1.0", + "through2": "^2.0.0", + "to-through": "^2.0.0", + "value-or-function": "^3.0.0", + "vinyl": "^2.0.0", + "vinyl-sourcemap": "^1.1.0" + } + }, + "vinyl-sourcemap": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz", + "integrity": "sha1-kqgAWTo4cDqM2xHYswCtS+Y7PhY=", + "dev": true, + "requires": { + "append-buffer": "^1.0.2", + "convert-source-map": "^1.5.0", + "graceful-fs": "^4.1.6", + "normalize-path": "^2.1.1", + "now-and-later": "^2.0.0", + "remove-bom-buffer": "^3.0.0", + "vinyl": "^2.0.0" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "vinyl-sourcemaps-apply": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz", + "integrity": "sha1-q2VJ1h0XLCsbh75cUI0jnI74dwU=", + "dev": true, + "requires": { + "source-map": "^0.5.1" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "optional": true, + "requires": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "ws": { + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "dev": true, + "requires": {} + }, + "xmlhttprequest-ssl": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.6.3.tgz", + "integrity": "sha512-3XfeQE/wNkvrIktn2Kf0869fC0BN6UpydVasGIeSm2B1Llihf7/0UfZM+eCkOw3P7bP4+qPgqhm7ZoxuJtFU0Q==", + "dev": true + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + }, + "y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + }, + "yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "requires": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "yargs-parser": { + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-z9kApYUOCwoeZ78rfRYYWdiU/iNL6mwwYlkkZfJoyMR1xps+NEBX5X7XmRpxkZHhXJ6+Ey00IwKxBBSW9FIjyA==", + "dev": true + }, + "yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", + "dev": true, + "requires": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "yeast": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", + "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=", + "dev": true + } + } +} diff --git a/sandbox310/package.json b/sandbox310/package.json new file mode 100644 index 0000000..8863831 --- /dev/null +++ b/sandbox310/package.json @@ -0,0 +1,39 @@ +{ + "name": "sandbox", + "version": "3.1.0", + "description": "Sandbox - Modern & Multipurpose Bootstrap 5 Template", + "homepage": "https://sandbox.elemisthemes.com/", + "author": "elemis", + "private": true, + "scripts": { + "start": "gulp serve", + "build": "gulp build:dist" + }, + "devDependencies": { + "@popperjs/core": "^2.11.2", + "bootstrap": "^5.1.3", + "browser-sync": "~2.27.7", + "del": "~6.0.0", + "gulp": "~4.0.2", + "gulp-autoprefixer": "^8.0.0", + "gulp-beautify": "^3.0.0", + "gulp-cache": "~1.1.3", + "gulp-clean-css": "^4.3.0", + "gulp-concat": "^2.6.1", + "gulp-file-include": "^2.3.0", + "gulp-imagemin": "~7.1.0", + "gulp-js-import": "^1.0.6", + "gulp-minify": "^3.1.0", + "gulp-newer": "^1.4.0", + "gulp-plumber": "~1.2.1", + "gulp-replace": "^1.1.3", + "gulp-sass": "^5.1.0", + "gulp-sass-unicode": "^1.0.5", + "gulp-sourcemaps": "~3.0.0", + "gulp-touch-cmd": "0.0.1", + "gulp-uglify": "~3.0.2", + "imagemin-jpeg-recompress": "~7.0.0", + "imagemin-pngquant": "~9.0.2", + "sass": "1.49.0" + } +} diff --git a/sandbox310/src/404.html b/sandbox310/src/404.html new file mode 100644 index 0000000..20b3e32 --- /dev/null +++ b/sandbox310/src/404.html @@ -0,0 +1,52 @@ + + + + @@include('_head.html') + + +
+
+ @@include('_navbar.html', { + "classList": "center-nav transparent navbar-light", + "otherClassList": "w-100 d-flex ms-auto", + "otherLanguageSelect": true, + "otherBtn": true, + "otherBtnClassList": "btn-sm btn-primary rounded-pill", + "otherBtnText": "Contact", + "otherBtnLink": "@@webRoot/contact.html" + }) +
+ +
+
+
+
+
+
+ +
+

Oops! Page Not Found.

+

The page you are looking for is not available or has been moved. Try a different page or go to homepage with the button below.

+ Go to Homepage +
+ +
+ +
+ +
+ +
+ +
+
+ @@include('_footer-widgets.html', { + "lightText": true + }) +
+ +
+ @@include('_page-progress.html') + @@include('_scripts.html') + + \ No newline at end of file diff --git a/sandbox310/src/about.html b/sandbox310/src/about.html new file mode 100644 index 0000000..1cecc11 --- /dev/null +++ b/sandbox310/src/about.html @@ -0,0 +1,468 @@ + + + + @@include('_head.html') + + +
+
+ @@include('_navbar.html', { + "classList": "center-nav transparent navbar-light", + "otherClassList": "w-100 d-flex ms-auto", + "otherLanguageSelect": true, + "otherBtn": true, + "otherBtnClassList": "btn-sm btn-primary rounded-pill", + "otherBtnText": "Contact", + "otherBtnLink": "@@webRoot/contact.html" + }) +
+ +
+
+
+
+

Hello! This is Sandbox

+

A company turning ideas into beautiful things.

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

Who Are We?

+

We are a digital and branding company that believes in the power of creative strategy and along with great design.

+

Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Praesent commodo cursus magna, vel scelerisque nisl consectetur et.

+
+
+
    +
  • Aenean eu leo quam ornare curabitur blandit tempus.
  • +
  • Nullam quis risus eget urna mollis ornare donec elit.
  • +
+
+ +
+
    +
  • Etiam porta sem malesuada magna mollis euismod.
  • +
  • Fermentum massa vivamus faucibus amet euismod.
  • +
+
+ +
+ +
+ +
+ +
+
+ +

Here are 3 working steps to organize our business projects.

+
+ +
+ +
+
+
+
+
+
+ 01 +
+
+

Collect Ideas

+

Nulla vitae elit libero pharetra augue dapibus.

+
+
+
+ +
+ +
+
+
+
+ 02 +
+
+

Data Analysis

+

Vivamus sagittis lacus vel augue laoreet.

+
+
+
+ +
+ +
+
+
+
+ 03 +
+
+

Finalize Product

+

Cras mattis consectetur purus sit amet.

+
+
+
+ +
+ +
+ +
+

How It Works?

+

Find out everything you need to know and more about how we create our business process models.

+

Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Etiam porta sem malesuada magna mollis euismod. Nullam id dolor id nibh ultricies vehicula ut id elit. Nullam quis risus eget urna mollis ornare.

+

Nullam id dolor id nibh ultricies vehicula ut id elit. Vestibulum id ligula porta felis euismod semper. Aenean lacinia bibendum nulla sed consectetur. Sed posuere consectetur est at lobortis. Vestibulum id ligula porta felis.

+ Learn More +
+ +
+ +
+ +
+ +
+
+
+
+
+
+
+ +
+
+
+
+
+
+

ā€œVivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Vestibulum ligula porta felis euismod semper. Cras justo odio consectetur nulla dapibus curabitur blandit.ā€

+
+
+
Coriss Ambady
+

Financial Analyst

+
+
+
+
+ +
+
+

ā€œVivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Vestibulum ligula porta felis euismod semper. Cras justo odio consectetur adipiscing dapibus curabitur blandit.ā€

+
+
+
Cory Zamora
+

Marketing Specialist

+
+
+
+
+ +
+
+

ā€œVivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Vestibulum ligula porta felis euismod semper. Cras justo odio consectetur adipiscing dapibus curabitur blandit.ā€

+
+
+
Nikolas Brooten
+

Sales Manager

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

Save your time and money by choosing our professional team.

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

Coriss Ambady

+
Financial Analyst
+

Fermentum massa justo sit amet risus morbi leo.

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

Cory Zamora

+
Marketing Specialist
+

Fermentum massa justo sit amet risus morbi leo.

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

Nikolas Brooten

+
Sales Manager
+

Fermentum massa justo sit amet risus morbi leo.

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

Jackie Sanders

+
Investment Planner
+

Fermentum massa justo sit amet risus morbi leo.

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

Laura Widerski

+
Sales Specialist
+

Fermentum massa justo sit amet risus morbi leo.

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

Tina Geller

+
Financial Analyst
+

Fermentum massa justo sit amet risus morbi leo.

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

7518

+

Completed Projects

+
+ +
+ +

3472

+

Satisfied Customers

+
+ +
+ +

2184

+

Expert Employees

+
+ +
+ +

4523

+

Awards Won

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

Convinced yet? Let's make something great together.

+
+
+
+
+
+
Address
+
Moonshine St. 14/05 Light City,
London, United Kingdom
+
+
+
+
+
+
+
+
Phone
+

00 (123) 456 78 90

+
+
+
+
+
+
+
+
E-mail
+

sandbox@email.com

+
+
+
+ +
+ +
+ +
+ +
+ +
+
+
+ @@include('_footer-widgets.html', { + "lightText": true + }) +
+ +
+ @@include('_page-progress.html') + @@include('_scripts.html') + + \ No newline at end of file diff --git a/sandbox310/src/about2.html b/sandbox310/src/about2.html new file mode 100644 index 0000000..de543bf --- /dev/null +++ b/sandbox310/src/about2.html @@ -0,0 +1,448 @@ + + + + @@include('_head.html') + + +
+
+ @@include('_navbar.html', { + "classList": "center-nav transparent navbar-light", + "otherClassList": "w-100 d-flex ms-auto", + "otherLanguageSelect": true, + "otherBtn": true, + "otherBtnClassList": "btn-sm btn-primary rounded-pill", + "otherBtnText": "Contact", + "otherBtnLink": "@@webRoot/contact.html" + }) +
+ +
+
+
+
+

About Us

+

A company turning ideas into beautiful things.

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

    Marketing

    +
    +
  • +
  • +

    Strategy

    +
    +
  • +
  • +

    Development

    +
    +
  • +
  • +

    Data Analysis

    +
    +
  • +
+ +
+ +
+

The full service we are offering is specifically designed to meet your business needs and projects.

+

Integer posuere erat a ante venenatis dapibus posuere velit aliquet. Morbi leo risus, porta ac consectetur ac, vestibulum at eros. Praesent commodo cursus magna, vel scelerisque nisl consectetur duis mollis commodo.

+
+ +
+ +
+
+ +

Marketing

+

Nulla vitae elit libero, a pharetra augue. Donec id elit non mi porta gravida at eget metus. Cras justo cum sociis natoque magnis.

+
+ +
+ +

Strategy

+

Nulla vitae elit libero, a pharetra augue. Donec id elit non mi porta gravida at eget metus. Cras justo cum sociis natoque magnis.

+
+ +
+ +

Development

+

Nulla vitae elit libero, a pharetra augue. Donec id elit non mi porta gravida at eget metus. Cras justo cum sociis natoque magnis.

+
+ +
+ +

Data Analysis

+

Nulla vitae elit libero, a pharetra augue. Donec id elit non mi porta gravida at eget metus. Cras justo cum sociis natoque magnis.

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

How It Works?

+

Everything you need on creating a business process.

+
+
+ +
+
+

Collect Ideas

+

Nulla vitae elit libero pharetra augue dapibus.

+
+
+
+
+ +
+
+

Data Analysis

+

Vivamus sagittis lacus augue laoreet vel.

+
+
+
+
+ +
+
+

Magic Touch

+

Cras mattis consectetur purus sit amet.

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

Why Choose Us?

+

A few reasons why our valued customers choose us.

+
+
+
+ +
+ +
+
+

Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Praesent commodo cursus magna, vel.

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

Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Praesent commodo cursus magna, vel.

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

Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Praesent commodo cursus magna, vel.

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

Meet the Team

+

Save your time and money by choosing our professional team.

+

Donec id elit non mi porta gravida at eget metus. Morbi leo risus, porta ac consectetur ac, vestibulum at eros tempus porttitor.

+ See All Members +
+ +
+
+
+
+
+ +

Cory Zamora

+
Marketing Specialist
+

Etiam porta sem magna malesuada mollis.

+ + +
+ +
+ +

Coriss Ambady

+
Financial Analyst
+

Aenean eu leo quam. Pellentesque ornare lacinia.

+ + +
+ +
+ +

Nikolas Brooten

+
Sales Manager
+

Donec ornare elit quam porta gravida at eget.

+ + +
+ +
+ +

Jackie Sanders

+
Investment Planner
+

Nullam risus eget urna mollis ornare vel eu leo.

+ + +
+ +
+ +

Tina Geller

+
Assistant Buyer
+

Vivamus sagittis lacus vel augue laoreet rutrum.

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

ā€œVivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Vestibulum ligula porta felis euismod semper. Cras justo odio consectetur.ā€

+
+
+
Coriss Ambady
+

Financial Analyst

+
+
+
+
+ +
+
+

ā€œVivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Vestibulum ligula porta felis euismod semper. Cras justo odio consectetur.ā€

+
+
+
Cory Zamora
+

Marketing Specialist

+
+
+
+
+ +
+
+

ā€œVivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Vestibulum ligula porta felis euismod semper. Cras justo odio consectetur.ā€

+
+
+
Nikolas Brooten
+

Sales Manager

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

Get In Touch

+

Got any questions? Don't hesitate to get in touch.

+
+
+
+
+
+
Address
+
Moonshine St. 14/05 Light City, London
+
+
+
+
+
+
+
+
Phone
+

00 (123) 456 78 90

+
+
+
+
+
+
+
+
E-mail
+

sandbox@email.com

+
+
+
+ +
+ +
+ +
+ +
+ +
+
+ @@include('_footer-widgets.html', { + "lightText": true + }) +
+ +
+ @@include('_page-progress.html') + @@include('_scripts.html') + + \ No newline at end of file diff --git a/sandbox310/src/assets/fonts/custom/Custom.woff b/sandbox310/src/assets/fonts/custom/Custom.woff new file mode 100644 index 0000000..77144a5 Binary files /dev/null and b/sandbox310/src/assets/fonts/custom/Custom.woff differ diff --git a/sandbox310/src/assets/fonts/custom/Custom.woff2 b/sandbox310/src/assets/fonts/custom/Custom.woff2 new file mode 100644 index 0000000..39300c0 Binary files /dev/null and b/sandbox310/src/assets/fonts/custom/Custom.woff2 differ diff --git a/sandbox310/src/assets/fonts/custom/selection.json b/sandbox310/src/assets/fonts/custom/selection.json new file mode 100644 index 0000000..ba7b4f2 --- /dev/null +++ b/sandbox310/src/assets/fonts/custom/selection.json @@ -0,0 +1 @@ +{"IcoMoonType":"selection","icons":[{"icon":{"paths":["M813.011 146.288h-230.951c-0.016 0-0.036 0-0.057 0-12.144 0-23.189 4.709-31.408 12.394l0.028-0.026c-8.31 7.653-13.629 18.454-14.044 30.501l-0.003 0.071c-0.015 0.45-0.028 0.986-0.028 1.518 0 24.569 19.913 44.482 44.482 44.482 0.022 0 0.044 0 0.065 0h144.931l-297.241 297.087c-8.050 8.050-13.028 19.168-13.028 31.448 0 24.561 19.91 44.47 44.47 44.47 12.281 0 23.398-4.977 31.448-13.028l297.087-297.087v143.813c0 0.023 0 0.050 0 0.073 0 12.144 4.71 23.189 12.394 31.408l-0.026-0.028c7.662 8.304 18.458 13.612 30.498 14.044l0.074 0.003c0.45 0.015 0.986 0.028 1.518 0.028 24.539 0 44.436-19.87 44.482-44.4v-232.073c-0.039-35.719-28.987-64.666-64.7-64.705h-0.005z","M864.069 641.245c-7.93-7.716-18.773-12.474-30.73-12.474-0.619 0-1.233 0.010-1.85 0.037l0.090-0.004c-23.638 0.848-42.86 21.224-42.86 45.411v114.55h-553.486v-553.535h114.467c24.292 0 44.708-19.27 45.5-42.965 0.015-0.45 0.027-0.971 0.027-1.502 0-24.565-19.91-44.475-44.47-44.482h-113.879c-50.007 0.058-90.529 40.58-90.587 90.58v550.265c0.058 50.007 40.58 90.529 90.58 90.587h550.265c50.007-0.058 90.529-40.58 90.587-90.58v-113.886c0-0.030 0-0.060 0-0.090 0-12.543-5.23-23.864-13.63-31.898l-0.015-0.014z"],"attrs":[{},{}],"isMulticolor":false,"isMulticolor2":false,"grid":28,"tags":["external"]},"attrs":[{},{}],"properties":{"order":13498,"id":6,"name":"external","prevSize":56,"code":59654},"setIdx":0,"setId":0,"iconIdx":0},{"icon":{"paths":["M219.476 731.552c-0.062 0.001-0.136 0.001-0.214 0.001-10.045 0-19.153-4.053-25.764-10.609l0.004 0.004c-6.683-6.632-10.819-15.819-10.819-25.972s4.138-19.344 10.815-25.972l0.004-0.004 193.868-193.504-193.868-193.504c-6.649-6.649-10.758-15.827-10.758-25.972 0-20.287 16.447-36.729 36.729-36.729 10.141 0 19.327 4.109 25.972 10.758l219.472 219.472c6.683 6.632 10.819 15.819 10.819 25.972s-4.138 19.344-10.815 25.972l-219.472 219.472c-6.607 6.555-15.711 10.605-25.762 10.605-0.072 0-0.152 0-0.222-0.001h0.008z","M804.737 804.709h-292.628c-20.202 0-36.58-16.378-36.58-36.58s16.378-36.58 36.58-36.58v0h292.628c20.202 0 36.58 16.378 36.58 36.58s-16.378 36.58-36.58 36.58v0z"],"attrs":[{},{}],"isMulticolor":false,"isMulticolor2":false,"tags":["terminal"],"grid":28},"attrs":[{},{}],"properties":{"order":13490,"id":0,"name":"terminal","prevSize":56,"code":59653},"setIdx":0,"setId":0,"iconIdx":1},{"icon":{"paths":["M771.161 1024h-353.975c-90.708-0.144-164.202-73.638-164.347-164.332v-859.668h25.284v859.654c0.144 76.744 62.318 138.918 139.048 139.061h353.989z"],"attrs":[{}],"isMulticolor":false,"isMulticolor2":false,"tags":["line"],"grid":28},"attrs":[{}],"properties":{"order":13491,"id":1,"name":"comment-line","prevSize":56,"code":59652},"setIdx":0,"setId":0,"iconIdx":2},{"icon":{"paths":["M554.673 644.419c-10.243 12.282-25.566 20.039-42.678 20.039s-32.426-7.747-42.603-19.943l-0.066-0.086-48.777-67.071-78.051-95.725-33.529-43.898c-6.165-8.070-9.861-18.305-9.861-29.416 0-26.936 21.832-48.777 48.777-48.777 1.323 0 2.639 0.046 3.935 0.163l-0.17-0.010h320.702c1.133-0.086 2.447-0.143 3.764-0.143 26.936 0 48.777 21.832 48.777 48.777 0 11.1-3.706 21.333-9.958 29.527l0.086-0.123-33.529 43.898-75 95.725z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["caret-down"],"defaultCode":59648,"grid":28},"attrs":[],"properties":{"id":2,"order":13492,"ligatures":"","prevSize":56,"code":59648,"name":"caret-down"},"setIdx":0,"setId":0,"iconIdx":3},{"icon":{"paths":["M376.259 555.751c-12.585-10.508-20.534-26.202-20.534-43.746s7.949-33.244 20.44-43.675l0.090-0.076 68.749-50 98.121-79.997 45-34.376c8.277-6.309 18.767-10.115 30.15-10.115 27.611 0 50 22.383 50 50 0 1.358-0.054 2.703-0.161 4.040l0.010-0.173v328.739c0.095 1.155 0.149 2.5 0.149 3.861 0 27.611-22.383 50-50 50-11.38 0-21.87-3.801-30.272-10.198l0.125 0.090-45-34.376-98.121-76.874z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["caret-left"],"defaultCode":59649,"grid":28},"attrs":[],"properties":{"id":3,"order":13493,"ligatures":"","prevSize":56,"code":59649,"name":"caret-left"},"setIdx":0,"setId":0,"iconIdx":4},{"icon":{"paths":["M647.971 467.921c12.607 10.525 20.566 26.238 20.566 43.818s-7.964 33.296-20.472 43.746l-0.090 0.076-68.853 53.206-98.276 76.991-44.44 34.425c-8.419 6.636-19.172 10.645-30.865 10.645-27.657 0-50.077-22.42-50.077-50.077 0-1.542 0.067-3.070 0.209-4.577l-0.017 0.197v-329.251c-0.095-1.155-0.15-2.507-0.15-3.871 0-27.657 22.42-50.077 50.077-50.077 11.399 0 21.905 3.808 30.319 10.214l-0.126-0.090 45.069 34.425 98.276 80.125z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["caret-right"],"defaultCode":59650,"grid":28},"attrs":[],"properties":{"id":4,"order":13494,"ligatures":"","prevSize":56,"code":59650,"name":"caret-right"},"setIdx":0,"setId":0,"iconIdx":5},{"icon":{"paths":["M467.671 375.254c10.583-12.678 26.392-20.684 44.063-20.684s33.484 8.005 43.994 20.589l0.073 0.088 53.509 69.25 77.429 98.834 34.625 44.696c6.673 8.463 10.704 19.281 10.704 31.041 0 27.811-22.552 50.361-50.361 50.361-1.554 0-3.086-0.069-4.601-0.203l0.193 0.013h-331.118c-1.164 0.093-2.52 0.15-3.887 0.15-27.811 0-50.361-22.552-50.361-50.361 0-11.463 3.827-22.027 10.271-30.49l-0.088 0.125 34.625-45.328 80.577-98.834z"],"attrs":[],"isMulticolor":false,"isMulticolor2":false,"tags":["caret-up"],"defaultCode":59651,"grid":28},"attrs":[],"properties":{"id":5,"order":13495,"ligatures":"","prevSize":56,"code":59651,"name":"caret-up"},"setIdx":0,"setId":0,"iconIdx":6}],"height":1024,"metadata":{"name":"Custom"},"preferences":{"showGlyphs":true,"showQuickUse":true,"showQuickUse2":true,"showSVGs":true,"fontPref":{"prefix":"icn-","metadata":{"fontFamily":"Custom","majorVersion":1,"minorVersion":0},"metrics":{"emSize":1024,"baseline":6.25,"whitespace":50},"embed":false,"showMetrics":true},"imagePref":{"prefix":"icon-","png":true,"useClassSelector":true,"color":0,"bgColor":16777215,"classSelector":".icon","name":"icomoon"},"historySize":50,"showCodes":false,"gridSize":16,"showLiga":false,"showGrid":true}} \ No newline at end of file diff --git a/sandbox310/src/assets/fonts/thicccboi/THICCCBOI-Bold.woff b/sandbox310/src/assets/fonts/thicccboi/THICCCBOI-Bold.woff new file mode 100644 index 0000000..c2d5542 Binary files /dev/null and b/sandbox310/src/assets/fonts/thicccboi/THICCCBOI-Bold.woff differ diff --git a/sandbox310/src/assets/fonts/thicccboi/THICCCBOI-Bold.woff2 b/sandbox310/src/assets/fonts/thicccboi/THICCCBOI-Bold.woff2 new file mode 100644 index 0000000..13f28a1 Binary files /dev/null and b/sandbox310/src/assets/fonts/thicccboi/THICCCBOI-Bold.woff2 differ diff --git a/sandbox310/src/assets/fonts/thicccboi/THICCCBOI-Medium.woff b/sandbox310/src/assets/fonts/thicccboi/THICCCBOI-Medium.woff new file mode 100644 index 0000000..f2c2266 Binary files /dev/null and b/sandbox310/src/assets/fonts/thicccboi/THICCCBOI-Medium.woff differ diff --git a/sandbox310/src/assets/fonts/thicccboi/THICCCBOI-Medium.woff2 b/sandbox310/src/assets/fonts/thicccboi/THICCCBOI-Medium.woff2 new file mode 100644 index 0000000..17238db Binary files /dev/null and b/sandbox310/src/assets/fonts/thicccboi/THICCCBOI-Medium.woff2 differ diff --git a/sandbox310/src/assets/fonts/thicccboi/THICCCBOI-Regular.woff b/sandbox310/src/assets/fonts/thicccboi/THICCCBOI-Regular.woff new file mode 100644 index 0000000..5c53528 Binary files /dev/null and b/sandbox310/src/assets/fonts/thicccboi/THICCCBOI-Regular.woff differ diff --git a/sandbox310/src/assets/fonts/thicccboi/THICCCBOI-Regular.woff2 b/sandbox310/src/assets/fonts/thicccboi/THICCCBOI-Regular.woff2 new file mode 100644 index 0000000..63b2527 Binary files /dev/null and b/sandbox310/src/assets/fonts/thicccboi/THICCCBOI-Regular.woff2 differ diff --git a/sandbox310/src/assets/fonts/thicccboi/thicccboi.css b/sandbox310/src/assets/fonts/thicccboi/thicccboi.css new file mode 100644 index 0000000..e7dcfcf --- /dev/null +++ b/sandbox310/src/assets/fonts/thicccboi/thicccboi.css @@ -0,0 +1,24 @@ +@font-face { + font-family: 'THICCCBOI'; + src: url('THICCCBOI-Regular.woff2') format('woff2'), + url('THICCCBOI-Regular.woff') format('woff'); + font-weight: normal; + font-style: normal; + font-display: block; +} +@font-face { + font-family: 'THICCCBOI'; + src: url('THICCCBOI-Medium.woff2') format('woff2'), + url('THICCCBOI-Medium.woff') format('woff'); + font-weight: 500; + font-style: normal; + font-display: block; +} +@font-face { + font-family: 'THICCCBOI'; + src: url('THICCCBOI-Bold.woff2') format('woff2'), + url('THICCCBOI-Bold.woff') format('woff'); + font-weight: bold; + font-style: normal; + font-display: block; +} \ No newline at end of file diff --git a/sandbox310/src/assets/fonts/unicons/Unicons.woff b/sandbox310/src/assets/fonts/unicons/Unicons.woff new file mode 100644 index 0000000..3de22f6 Binary files /dev/null and b/sandbox310/src/assets/fonts/unicons/Unicons.woff differ diff --git a/sandbox310/src/assets/fonts/unicons/Unicons.woff2 b/sandbox310/src/assets/fonts/unicons/Unicons.woff2 new file mode 100644 index 0000000..14fc4b5 Binary files /dev/null and b/sandbox310/src/assets/fonts/unicons/Unicons.woff2 differ diff --git a/sandbox310/src/assets/fonts/unicons/selection.json b/sandbox310/src/assets/fonts/unicons/selection.json new file mode 100644 index 0000000..31f124f --- /dev/null +++ b/sandbox310/src/assets/fonts/unicons/selection.json @@ -0,0 +1 @@ +{"IcoMoonType":"selection","icons":[{"icon":{"paths":["M768 213.333h42.667v42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-42.667v-42.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 42.667h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM533.333 256h-42.667c-70.692 0-128 57.308-128 128v0 256c0 70.692 57.308 128 128 128v0h42.667c70.692 0 128-57.308 128-128v0-256c0-70.692-57.308-128-128-128v0zM576 640c0 23.564-19.103 42.667-42.667 42.667v0h-42.667c-23.564 0-42.667-19.103-42.667-42.667v0-256c0-23.564 19.103-42.667 42.667-42.667v0h42.667c23.564 0 42.667 19.103 42.667 42.667v0zM921.6 384c-19.619 4.105-34.143 21.26-34.143 41.807 0 3.023 0.314 5.973 0.912 8.818l-0.049-0.278c5.017 23.281 7.89 50.026 7.89 77.443 0 212.077-171.923 384-384 384s-384-171.923-384-384c0-212.077 171.923-384 384-384 27.417 0 54.162 2.873 79.952 8.335l-2.509-0.445c2.565 0.537 5.513 0.845 8.533 0.845 24.031 0 43.512-19.481 43.512-43.512 0-21.011-14.892-38.544-34.697-42.618l-0.281-0.048c-25.377-4.959-54.558-7.796-84.401-7.796-3.629 0-7.247 0.042-10.856 0.125l0.537-0.010c-259.206 0-469.333 210.128-469.333 469.333s210.128 469.333 469.333 469.333c259.206 0 469.333-210.128 469.333-469.333v0c0.001-0.393 0.002-0.858 0.002-1.323 0-32.761-3.419-64.723-9.919-95.55l0.531 3.006c-3.773-20.022-21.125-34.965-41.966-34.965-2.966 0-5.861 0.303-8.657 0.879l0.276-0.047z"],"attrs":[],"grid":0,"tags":["plus"]},"attrs":[],"properties":{"order":4479,"id":1205,"name":"plus-0","prevSize":32,"code":59648},"setIdx":0,"setId":0,"iconIdx":0},{"icon":{"paths":["M768 213.333h42.667v42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-42.667v-42.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 42.667h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM661.333 384c0-70.692-57.308-128-128-128v0h-42.667c-70.692 0-128 57.308-128 128v0c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0c0-23.564 19.103-42.667 42.667-42.667v0h42.667c23.564 0 42.667 19.103 42.667 42.667v0 42.667c0 23.564-19.103 42.667-42.667 42.667v0h-21.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h21.333c23.564 0 42.667 19.103 42.667 42.667v0 42.667c0 23.564-19.103 42.667-42.667 42.667v0h-42.667c-23.564 0-42.667-19.103-42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0c0 70.692 57.308 128 128 128v0h42.667c70.692 0 128-57.308 128-128v0-42.667c-0.203-32.927-12.807-62.872-33.371-85.435l0.091 0.102c20.473-22.461 33.077-52.406 33.28-85.292l0-0.041zM921.6 384c-19.619 4.105-34.143 21.26-34.143 41.807 0 3.023 0.314 5.973 0.912 8.818l-0.049-0.278c5.017 23.281 7.89 50.026 7.89 77.443 0 212.077-171.923 384-384 384s-384-171.923-384-384c0-212.077 171.923-384 384-384 27.417 0 54.162 2.873 79.952 8.335l-2.509-0.445c2.565 0.537 5.513 0.845 8.533 0.845 24.031 0 43.512-19.481 43.512-43.512 0-21.011-14.892-38.544-34.697-42.618l-0.281-0.048c-25.377-4.959-54.558-7.796-84.401-7.796-3.629 0-7.247 0.042-10.856 0.125l0.537-0.010c-259.206 0-469.333 210.128-469.333 469.333s210.128 469.333 469.333 469.333c259.206 0 469.333-210.128 469.333-469.333v0c0.001-0.393 0.002-0.858 0.002-1.323 0-32.761-3.419-64.723-9.919-95.55l0.531 3.006c-3.773-20.022-21.125-34.965-41.966-34.965-2.966 0-5.861 0.303-8.657 0.879l0.276-0.047z"],"attrs":[],"grid":0,"tags":["plus"]},"attrs":[],"properties":{"order":4480,"id":1204,"name":"plus-1","prevSize":32,"code":59649},"setIdx":0,"setId":0,"iconIdx":1},{"icon":{"paths":["M768 213.333h42.667v42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-42.667v-42.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 42.667h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM490.667 341.333h42.667c23.564 0 42.667 19.103 42.667 42.667v0c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0c0-70.692-57.308-128-128-128v0h-42.667c-70.692 0-128 57.308-128 128v0 256c0 70.692 57.308 128 128 128v0h42.667c70.692 0 128-57.308 128-128v0-42.667c0-70.692-57.308-128-128-128v0h-85.333v-85.333c0-23.564 19.103-42.667 42.667-42.667v0zM533.333 554.667c23.564 0 42.667 19.103 42.667 42.667v0 42.667c0 23.564-19.103 42.667-42.667 42.667v0h-42.667c-23.564 0-42.667-19.103-42.667-42.667v0-85.333zM921.6 384c-19.619 4.105-34.143 21.26-34.143 41.807 0 3.023 0.314 5.973 0.912 8.818l-0.049-0.278c5.017 23.281 7.89 50.026 7.89 77.443 0 212.077-171.923 384-384 384s-384-171.923-384-384c0-212.077 171.923-384 384-384 27.417 0 54.162 2.873 79.952 8.335l-2.509-0.445c2.565 0.537 5.513 0.845 8.533 0.845 24.031 0 43.512-19.481 43.512-43.512 0-21.011-14.892-38.544-34.697-42.618l-0.281-0.048c-25.377-4.959-54.558-7.796-84.401-7.796-3.629 0-7.247 0.042-10.856 0.125l0.537-0.010c-259.206 0-469.333 210.128-469.333 469.333s210.128 469.333 469.333 469.333c259.206 0 469.333-210.128 469.333-469.333v0c0.001-0.393 0.002-0.858 0.002-1.323 0-32.761-3.419-64.723-9.919-95.55l0.531 3.006c-3.773-20.022-21.125-34.965-41.966-34.965-2.966 0-5.861 0.303-8.657 0.879l0.276-0.047z"],"attrs":[],"grid":0,"tags":["plus"]},"attrs":[],"properties":{"order":4481,"id":1203,"name":"plus-6","prevSize":32,"code":59650},"setIdx":0,"setId":0,"iconIdx":2},{"icon":{"paths":["M768 213.333h42.667v42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-42.667v-42.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 42.667h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM469.333 384v256c0 70.692 57.308 128 128 128v0h42.667c70.692 0 128-57.308 128-128v0-256c0-70.692-57.308-128-128-128v0h-42.667c-70.692 0-128 57.308-128 128v0zM682.667 384v256c0 23.564-19.103 42.667-42.667 42.667v0h-42.667c-23.564 0-42.667-19.103-42.667-42.667v0-256c0-23.564 19.103-42.667 42.667-42.667v0h42.667c23.564 0 42.667 19.103 42.667 42.667v0zM921.6 384c-19.619 4.105-34.143 21.26-34.143 41.807 0 3.023 0.314 5.973 0.912 8.818l-0.049-0.278c5.017 23.281 7.89 50.026 7.89 77.443 0 212.077-171.923 384-384 384s-384-171.923-384-384c0-212.077 171.923-384 384-384 27.417 0 54.162 2.873 79.952 8.335l-2.509-0.445c2.565 0.537 5.513 0.845 8.533 0.845 24.031 0 43.512-19.481 43.512-43.512 0-21.011-14.892-38.544-34.697-42.618l-0.281-0.048c-25.377-4.959-54.558-7.796-84.401-7.796-3.629 0-7.247 0.042-10.856 0.125l0.537-0.010c-259.206 0-469.333 210.128-469.333 469.333s210.128 469.333 469.333 469.333c259.206 0 469.333-210.128 469.333-469.333v0c0.001-0.393 0.002-0.858 0.002-1.323 0-32.761-3.419-64.723-9.919-95.55l0.531 3.006c-3.773-20.022-21.125-34.965-41.966-34.965-2.966 0-5.861 0.303-8.657 0.879l0.276-0.047zM298.667 298.667v426.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-426.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["plus"]},"attrs":[],"properties":{"order":4482,"id":1202,"name":"plus-10","prevSize":32,"code":59651},"setIdx":0,"setId":0,"iconIdx":3},{"icon":{"paths":["M469.333 384c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0c0-23.564 19.103-42.667 42.667-42.667v0h42.667c23.564 0 42.667 19.103 42.667 42.667v0 42.667c0 23.564-19.103 42.667-42.667 42.667v0h-42.667c-70.692 0-128 57.308-128 128v0 128c0 23.564 19.103 42.667 42.667 42.667v0h213.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-170.667v-85.333c0-23.564 19.103-42.667 42.667-42.667v0h42.667c70.692 0 128-57.308 128-128v0-42.667c0-70.692-57.308-128-128-128v0h-42.667c-70.692 0-128 57.308-128 128v0zM768 213.333h42.667v42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-42.667v-42.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 42.667h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM298.667 298.667v426.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-426.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0zM921.6 384c-19.619 4.105-34.143 21.26-34.143 41.807 0 3.023 0.314 5.973 0.912 8.818l-0.049-0.278c5.017 23.281 7.89 50.026 7.89 77.443 0 212.077-171.923 384-384 384s-384-171.923-384-384c0-212.077 171.923-384 384-384 27.417 0 54.162 2.873 79.952 8.335l-2.509-0.445c2.565 0.537 5.513 0.845 8.533 0.845 24.031 0 43.512-19.481 43.512-43.512 0-21.011-14.892-38.544-34.697-42.618l-0.281-0.048c-25.377-4.959-54.558-7.796-84.401-7.796-3.629 0-7.247 0.042-10.856 0.125l0.537-0.010c-259.206 0-469.333 210.128-469.333 469.333s210.128 469.333 469.333 469.333c259.206 0 469.333-210.128 469.333-469.333v0c0.001-0.393 0.002-0.858 0.002-1.323 0-32.761-3.419-64.723-9.919-95.55l0.531 3.006c-3.773-20.022-21.125-34.965-41.966-34.965-2.966 0-5.861 0.303-8.657 0.879l0.276-0.047z"],"attrs":[],"grid":0,"tags":["plus"]},"attrs":[],"properties":{"order":4483,"id":1201,"name":"plus-12","prevSize":32,"code":59652},"setIdx":0,"setId":0,"iconIdx":4},{"icon":{"paths":["M768 213.333h42.667v42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-42.667v-42.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 42.667h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM469.333 384c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0c0-23.564 19.103-42.667 42.667-42.667v0h42.667c23.564 0 42.667 19.103 42.667 42.667v0 42.667c0 23.564-19.103 42.667-42.667 42.667v0h-21.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h21.333c23.564 0 42.667 19.103 42.667 42.667v0 42.667c0 23.564-19.103 42.667-42.667 42.667v0h-42.667c-23.564 0-42.667-19.103-42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0c0 70.692 57.308 128 128 128v0h42.667c70.692 0 128-57.308 128-128v0-42.667c-0.203-32.927-12.807-62.872-33.371-85.435l0.091 0.102c20.473-22.461 33.077-52.406 33.28-85.292l0-0.041v-42.667c0-70.692-57.308-128-128-128v0h-42.667c-70.692 0-128 57.308-128 128v0zM298.667 298.667v426.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-426.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0zM921.6 384c-19.619 4.105-34.143 21.26-34.143 41.807 0 3.023 0.314 5.973 0.912 8.818l-0.049-0.278c5.017 23.281 7.89 50.026 7.89 77.443 0 212.077-171.923 384-384 384s-384-171.923-384-384c0-212.077 171.923-384 384-384 27.417 0 54.162 2.873 79.952 8.335l-2.509-0.445c2.565 0.537 5.513 0.845 8.533 0.845 24.031 0 43.512-19.481 43.512-43.512 0-21.011-14.892-38.544-34.697-42.618l-0.281-0.048c-25.377-4.959-54.558-7.796-84.401-7.796-3.629 0-7.247 0.042-10.856 0.125l0.537-0.010c-259.206 0-469.333 210.128-469.333 469.333s210.128 469.333 469.333 469.333c259.206 0 469.333-210.128 469.333-469.333v0c0.001-0.393 0.002-0.858 0.002-1.323 0-32.761-3.419-64.723-9.919-95.55l0.531 3.006c-3.773-20.022-21.125-34.965-41.966-34.965-2.966 0-5.861 0.303-8.657 0.879l0.276-0.047z"],"attrs":[],"grid":0,"tags":["plus"]},"attrs":[],"properties":{"order":4484,"id":1200,"name":"plus-13","prevSize":32,"code":59653},"setIdx":0,"setId":0,"iconIdx":5},{"icon":{"paths":["M768 213.333h42.667v42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-42.667v-42.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 42.667h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM921.6 384c-19.619 4.105-34.143 21.26-34.143 41.807 0 3.023 0.314 5.973 0.912 8.818l-0.049-0.278c5.017 23.281 7.89 50.026 7.89 77.443 0 212.077-171.923 384-384 384s-384-171.923-384-384c0-212.077 171.923-384 384-384 27.417 0 54.162 2.873 79.952 8.335l-2.509-0.445c2.565 0.537 5.513 0.845 8.533 0.845 24.031 0 43.512-19.481 43.512-43.512 0-21.011-14.892-38.544-34.697-42.618l-0.281-0.048c-25.377-4.959-54.558-7.796-84.401-7.796-3.629 0-7.247 0.042-10.856 0.125l0.537-0.010c-259.206 0-469.333 210.128-469.333 469.333s210.128 469.333 469.333 469.333c259.206 0 469.333-210.128 469.333-469.333v0c0.001-0.393 0.002-0.858 0.002-1.323 0-32.761-3.419-64.723-9.919-95.55l0.531 3.006c-3.773-20.022-21.125-34.965-41.966-34.965-2.966 0-5.861 0.303-8.657 0.879l0.276-0.047zM298.667 298.667v426.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-426.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0zM469.333 384v256c0 70.692 57.308 128 128 128v0h42.667c70.692 0 128-57.308 128-128v0-42.667c0-70.692-57.308-128-128-128v0h-85.333v-85.333c0-23.564 19.103-42.667 42.667-42.667v0h42.667c23.564 0 42.667 19.103 42.667 42.667v0c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0c0-70.692-57.308-128-128-128v0h-42.667c-70.692 0-128 57.308-128 128v0zM640 554.667c23.564 0 42.667 19.103 42.667 42.667v0 42.667c0 23.564-19.103 42.667-42.667 42.667v0h-42.667c-23.564 0-42.667-19.103-42.667-42.667v0-85.333z"],"attrs":[],"grid":0,"tags":["plus"]},"attrs":[],"properties":{"order":4485,"id":1199,"name":"plus-16","prevSize":32,"code":59654},"setIdx":0,"setId":0,"iconIdx":6},{"icon":{"paths":["M469.333 298.667v85.333c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667h118.613l-75.947 375.467c-0.638 2.766-1.004 5.942-1.004 9.203 0 20.903 15.032 38.295 34.875 41.957l0.263 0.040h8.533c0.256 0.006 0.558 0.009 0.86 0.009 20.547 0 37.701-14.523 41.758-33.864l0.049-0.278 85.333-426.667c0.512-2.48 0.805-5.33 0.805-8.249 0-10.354-3.688-19.846-9.822-27.235l0.057 0.070c-7.885-9.667-19.796-15.79-33.138-15.79-0.2 0-0.4 0.001-0.599 0.004l0.030-0h-213.333c-23.564 0-42.667 19.103-42.667 42.667v0zM768 213.333h42.667v42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-42.667v-42.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 42.667h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM298.667 298.667v426.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-426.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0zM921.6 384c-19.619 4.105-34.143 21.26-34.143 41.807 0 3.023 0.314 5.973 0.912 8.818l-0.049-0.278c5.017 23.281 7.89 50.026 7.89 77.443 0 212.077-171.923 384-384 384s-384-171.923-384-384c0-212.077 171.923-384 384-384 27.417 0 54.162 2.873 79.952 8.335l-2.509-0.445c2.565 0.537 5.513 0.845 8.533 0.845 24.031 0 43.512-19.481 43.512-43.512 0-21.011-14.892-38.544-34.697-42.618l-0.281-0.048c-25.377-4.959-54.558-7.796-84.401-7.796-3.629 0-7.247 0.042-10.856 0.125l0.537-0.010c-259.206 0-469.333 210.128-469.333 469.333s210.128 469.333 469.333 469.333c259.206 0 469.333-210.128 469.333-469.333v0c0.001-0.393 0.002-0.858 0.002-1.323 0-32.761-3.419-64.723-9.919-95.55l0.531 3.006c-3.773-20.022-21.125-34.965-41.966-34.965-2.966 0-5.861 0.303-8.657 0.879l0.276-0.047z"],"attrs":[],"grid":0,"tags":["plus"]},"attrs":[],"properties":{"order":4486,"id":1198,"name":"plus-17","prevSize":32,"code":59655},"setIdx":0,"setId":0,"iconIdx":7},{"icon":{"paths":["M768 213.333h42.667v42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-42.667v-42.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 42.667h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM298.667 298.667v426.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-426.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0zM921.6 384c-19.619 4.105-34.143 21.26-34.143 41.807 0 3.023 0.314 5.973 0.912 8.818l-0.049-0.278c5.017 23.281 7.89 50.026 7.89 77.443 0 212.077-171.923 384-384 384s-384-171.923-384-384c0-212.077 171.923-384 384-384 27.417 0 54.162 2.873 79.952 8.335l-2.509-0.445c2.565 0.537 5.513 0.845 8.533 0.845 24.031 0 43.512-19.481 43.512-43.512 0-21.011-14.892-38.544-34.697-42.618l-0.281-0.048c-25.377-4.959-54.558-7.796-84.401-7.796-3.629 0-7.247 0.042-10.856 0.125l0.537-0.010c-259.206 0-469.333 210.128-469.333 469.333s210.128 469.333 469.333 469.333c259.206 0 469.333-210.128 469.333-469.333v0c0.001-0.393 0.002-0.858 0.002-1.323 0-32.761-3.419-64.723-9.919-95.55l0.531 3.006c-3.773-20.022-21.125-34.965-41.966-34.965-2.966 0-5.861 0.303-8.657 0.879l0.276-0.047zM469.333 384v42.667c0.203 32.927 12.807 62.872 33.371 85.435l-0.091-0.102c-20.473 22.461-33.077 52.406-33.28 85.292l-0 0.041v42.667c0 70.692 57.308 128 128 128v0h42.667c70.692 0 128-57.308 128-128v0-42.667c-0.203-32.927-12.807-62.872-33.371-85.435l0.091 0.102c20.473-22.461 33.077-52.406 33.28-85.292l0-0.041v-42.667c0-70.692-57.308-128-128-128v0h-42.667c-70.692 0-128 57.308-128 128v0zM682.667 640c0 23.564-19.103 42.667-42.667 42.667v0h-42.667c-23.564 0-42.667-19.103-42.667-42.667v0-42.667c0-23.564 19.103-42.667 42.667-42.667v0h42.667c23.564 0 42.667 19.103 42.667 42.667v0zM682.667 384v42.667c0 23.564-19.103 42.667-42.667 42.667v0h-42.667c-23.564 0-42.667-19.103-42.667-42.667v0-42.667c0-23.564 19.103-42.667 42.667-42.667v0h42.667c23.564 0 42.667 19.103 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["plus"]},"attrs":[],"properties":{"order":4487,"id":1197,"name":"plus-18","prevSize":32,"code":59656},"setIdx":0,"setId":0,"iconIdx":8},{"icon":{"paths":["M725.333 768c23.564 0 42.667-19.103 42.667-42.667v0-426.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 426.667c0 23.564 19.103 42.667 42.667 42.667v0zM768 213.333h42.667v42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-42.667v-42.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 42.667h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM921.6 384c-19.619 4.105-34.143 21.26-34.143 41.807 0 3.023 0.314 5.973 0.912 8.818l-0.049-0.278c5.017 23.281 7.89 50.026 7.89 77.443 0 212.077-171.923 384-384 384s-384-171.923-384-384c0-212.077 171.923-384 384-384 27.417 0 54.162 2.873 79.952 8.335l-2.509-0.445c2.565 0.537 5.513 0.845 8.533 0.845 24.031 0 43.512-19.481 43.512-43.512 0-21.011-14.892-38.544-34.697-42.618l-0.281-0.048c-25.377-4.959-54.558-7.796-84.401-7.796-3.629 0-7.247 0.042-10.856 0.125l0.537-0.010c-259.206 0-469.333 210.128-469.333 469.333s210.128 469.333 469.333 469.333c259.206 0 469.333-210.128 469.333-469.333v0c0.001-0.393 0.002-0.858 0.002-1.323 0-32.761-3.419-64.723-9.919-95.55l0.531 3.006c-3.773-20.022-21.125-34.965-41.966-34.965-2.966 0-5.861 0.303-8.657 0.879l0.276-0.047zM426.667 554.667h42.667c70.692 0 128-57.308 128-128v0-42.667c0-70.692-57.308-128-128-128v0h-42.667c-70.692 0-128 57.308-128 128v0c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0c0-23.564 19.103-42.667 42.667-42.667v0h42.667c23.564 0 42.667 19.103 42.667 42.667v0 42.667c0 23.564-19.103 42.667-42.667 42.667v0h-42.667c-70.692 0-128 57.308-128 128v0 128c0 23.564 19.103 42.667 42.667 42.667v0h213.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-170.667v-85.333c0-23.564 19.103-42.667 42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["plus"]},"attrs":[],"properties":{"order":4488,"id":1196,"name":"plus-21","prevSize":32,"code":59657},"setIdx":0,"setId":0,"iconIdx":9},{"icon":{"paths":["M298.667 645.973c1.469 7.085 3.981 13.37 7.405 19.043l-0.151-0.27c14.373 34.575 34.427 64.071 59.289 88.729l0.018 0.018c24.986 24.722 54.563 44.863 87.328 59.024l1.845 0.71c31.26 14.026 67.755 22.196 106.157 22.196 0.779 0 1.558-0.003 2.335-0.010l-0.119 0.001c0.575 0.004 1.256 0.007 1.936 0.007 38.644 0 75.38-8.168 108.577-22.871l-1.713 0.677c34.459-14.875 63.895-35.014 88.759-59.746l-0.012 0.012c25.1-24.701 45.415-54.179 59.483-86.972l0.677-1.775c12.474-30.538 19.714-65.975 19.714-103.102 0-2.454-0.032-4.9-0.094-7.339l0.007 0.361c-0.096-39.42-8.085-76.949-22.469-111.124l0.709 1.898c-14.748-34.418-35.061-63.756-60.112-88.273l-0.048-0.047c-49.994-50.591-119.381-81.924-196.085-81.924-0.514 0-1.028 0.001-1.541 0.004l0.079-0c-39.892 0.401-77.674 8.998-111.883 24.181l1.803-0.715c-19.624 8.803-36.435 18.493-52.135 29.644l0.935-0.631c-18.246 12.202-34.162 25.407-48.603 40.069l-0.037 0.038v-229.973h386.133c9.387 0 14.507-8.96 14.507-26.453s-5.547-26.027-14.933-26.027h-417.707c-0.23-0.012-0.499-0.019-0.769-0.019-4.81 0-9.117 2.151-12.013 5.544l-0.018 0.022c-3.161 3.1-5.121 7.416-5.121 12.189 0 0.065 0 0.13 0.001 0.194l-0-0.010v323.413c0.316 5.325 3.092 9.941 7.197 12.763l0.056 0.037c4.96 3.583 10.832 6.253 17.187 7.625l0.306 0.055c2.744 0.876 5.899 1.382 9.173 1.382s6.43-0.505 9.394-1.442l-0.221 0.060c3.897-1.163 7.295-2.761 10.39-4.785l-0.15 0.092c2.208-2.149 4.177-4.524 5.874-7.094l0.099-0.159c11.295-15.897 23.351-29.849 36.595-42.573l0.098-0.094c39.972-41.099 95.8-66.599 157.583-66.599 1.45 0 2.896 0.014 4.339 0.042l-0.216-0.003c0.877-0.013 1.912-0.020 2.949-0.020 62.814 0 119.472 26.357 159.518 68.614l0.093 0.099c41.592 40.174 67.417 96.44 67.417 158.737 0 0.444-0.001 0.888-0.004 1.331l0-0.068c-0.279 30.86-6.684 60.149-18.054 86.813l0.561-1.48c-22.804 57.928-66.826 103.338-122.256 127.428l-1.477 0.572c-25.738 10.796-55.65 17.068-87.027 17.068-0.305 0-0.609-0.001-0.913-0.002l0.047 0c-0.511 0.004-1.116 0.007-1.72 0.007-41.982 0-81.182-11.912-114.404-32.542l0.925 0.535v-198.4c0.221-29.551 11.701-56.379 30.358-76.443l-0.064 0.070c19.923-23.325 49.363-38.018 82.234-38.018 1.090 0 2.176 0.016 3.258 0.048l-0.159-0.004c1.403-0.062 3.048-0.098 4.701-0.098 31.563 0 60.106 12.933 80.617 33.789l0.015 0.016c19.802 19.708 32.057 46.984 32.057 77.123 0 1.237-0.021 2.469-0.062 3.696l0.005-0.179c0.001 0.13 0.001 0.285 0.001 0.439 0 64.33-52.15 116.48-116.48 116.48-0.6 0-1.2-0.005-1.798-0.014l0.091 0.001h-14.507l-15.787-2.987h-6.4c-8.96-2.56-15.787 4.267-20.907 20.48s-2.987 25.6 5.973 29.013c15.799 4.874 33.961 7.681 52.779 7.681 0.195 0 0.39-0 0.585-0.001l-0.030 0c0.629 0.009 1.371 0.014 2.115 0.014 45.994 0 87.561-18.952 117.319-49.473l0.033-0.034c30.58-29.596 49.562-71.013 49.562-116.864 0-1.665-0.025-3.325-0.075-4.978l0.006 0.242c0.021-0.964 0.033-2.101 0.033-3.24 0-45.378-18.992-86.319-49.46-115.311l-0.066-0.063c-29.49-30.301-70.667-49.099-116.234-49.099-1.137 0-2.27 0.012-3.402 0.035l0.169-0.003c-0.897-0.018-1.954-0.028-3.014-0.028-45.903 0-87.42 18.78-117.287 49.075l-0.019 0.019c-29.703 27.653-48.319 66.875-48.64 110.448l-0 0.058v162.133c-19.616-22.353-35.284-48.74-45.56-77.68l-0.52-1.68c-3.413-8.96-12.8-10.667-28.587-5.547s-23.467 12.373-20.48 20.907zM565.333 176.64c-2.134-0.047-4.649-0.074-7.17-0.074-48.872 0-95.391 10.070-137.598 28.247l2.261-0.867c-5.113 0.386-9.198 4.324-9.808 9.335l-0.005 0.051c0.213 6.658 1.604 12.933 3.97 18.705l-0.13-0.358c5.973 14.933 12.8 20.48 21.333 17.493 37.067-14.842 80.033-23.455 125.009-23.467l0.005-0c0.789-0.007 1.721-0.011 2.654-0.011 46.576 0 90.841 9.898 130.805 27.705l-2.046-0.814c37.833 16.707 70.369 37.898 98.912 63.457l-0.352-0.31c1.922 2.069 4.645 3.372 7.672 3.413l0.008 0c3.84 0 10.24-4.267 18.347-12.373l8.107-8.107c1.607-2.432 2.564-5.416 2.564-8.624 0-0.118-0.001-0.236-0.004-0.354l0 0.018c-0.287-3.411-1.873-6.404-4.254-8.522l-0.013-0.011c-31.542-29.718-68.582-54.032-109.367-71.203l-2.42-0.904c-44.309-19.979-96.002-31.859-150.406-32.425l-0.207-0.002zM496.64 599.467c0.681 5.885 3.875 10.909 8.465 14.036l0.068 0.044c3.684 4.288 8.931 7.142 14.848 7.674l0.085 0.006c0.14 0.007 0.303 0.011 0.468 0.011 2.608 0 4.988-0.975 6.796-2.58l-0.011 0.009 31.147-31.147 29.867 29.013c2.097 2.732 5.303 4.522 8.933 4.692l0.027 0.001c6.148-0.806 11.489-3.765 15.339-8.082l0.021-0.024c8.533-8.96 9.813-16.64 2.987-23.467l-29.867-29.867 31.573-31.573c5.12-5.12 3.413-12.373-5.547-20.907s-17.067-11.52-22.613-5.973l-31.147 30.72-30.72-31.573c-1.805-1.22-4-1.997-6.366-2.132l-0.034-0.002c-5.896 1.049-10.935 4.134-14.472 8.489l-0.035 0.044c-9.813 9.387-11.947 16.213-6.827 21.333l31.573 31.573-31.573 30.72c-2.647 2.235-4.497 5.341-5.107 8.871l-0.013 0.089zM834.987 794.453c-4.449-4.362-9.676-7.95-15.451-10.533l-0.336-0.134c-1.044-0.331-2.245-0.521-3.49-0.521-3.303 0-6.294 1.341-8.456 3.508l-0 0-2.987 2.987c-29.988 29.84-65.51 54.151-104.887 71.253l-2.206 0.853c-38.788 16.767-83.954 26.52-131.397 26.52-93.252 0-177.704-37.678-238.963-98.64l0.013 0.013c-31.305-29.562-56.535-65.183-73.868-105.033l-0.798-2.061c-8.877-21.481-16.411-46.807-21.371-73.043l-0.389-2.477c0-8.96-10.667-12.373-26.88-9.813s-23.893 8.533-22.613 17.067c5.113 33.667 14.051 63.963 26.513 92.361l-0.913-2.334c21 47.956 49.793 88.777 85.203 122.756l0.13 0.124c34.312 35.43 75.252 64.205 120.852 84.365l2.455 0.968c44.471 19.154 96.24 30.294 150.611 30.294 0.151 0 0.302-0 0.452-0l-0.024 0c54.528-0.121 106.426-11.247 153.634-31.271l-2.594 0.977c48.054-21.128 88.994-49.903 123.208-85.231l0.099-0.103 2.56-2.56c3.84-9.387 0.853-18.773-10.24-30.293z"],"attrs":[],"grid":0,"tags":["px"]},"attrs":[],"properties":{"order":4489,"id":1195,"name":"500px","prevSize":32,"code":59658},"setIdx":0,"setId":0,"iconIdx":10},{"icon":{"paths":["M896 85.333c-23.564 0-42.667 19.103-42.667 42.667v0 128h-170.667v-42.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 42.667h-85.333v-42.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 42.667h-85.333v-42.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 42.667h-85.333v-128c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 682.667c0 70.692 57.308 128 128 128v0h597.333c70.692 0 128-57.308 128-128v0-682.667c0-23.564-19.103-42.667-42.667-42.667v0zM853.333 810.667c0 23.564-19.103 42.667-42.667 42.667v0h-597.333c-23.564 0-42.667-19.103-42.667-42.667v0-128h85.333v42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667h85.333v42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667h170.667v42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667h85.333zM853.333 597.333h-85.333v-42.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 42.667h-170.667v-42.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 42.667h-85.333v-42.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 42.667h-85.333v-256h85.333v42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667h85.333v42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667h85.333v42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667h170.667z"],"attrs":[],"grid":0,"tags":["abacus"]},"attrs":[],"properties":{"order":4490,"id":1194,"name":"abacus","prevSize":32,"code":59659},"setIdx":0,"setId":0,"iconIdx":11},{"icon":{"paths":["M682.667 298.667c47.128 0 85.333-38.205 85.333-85.333s-38.205-85.333-85.333-85.333c-47.128 0-85.333 38.205-85.333 85.333v0c0 47.128 38.205 85.333 85.333 85.333v0zM541.867 785.067c-31.499 40.949-80.515 67.079-135.634 67.079-94.257 0-170.667-76.41-170.667-170.667 0-87.174 65.358-159.082 149.745-169.397l0.823-0.082c21.6-2.445 38.231-20.614 38.231-42.667 0-23.706-19.218-42.924-42.924-42.924-1.653 0-3.285 0.093-4.89 0.275l0.197-0.018c-135.319 7.787-242.105 119.423-242.105 256 0 141.605 114.794 256.399 256.399 256.399 5.028 0 10.022-0.145 14.979-0.43l-0.686 0.032c83.464 0 157.6-39.943 204.333-101.756l0.467-0.644c5.327-7.042 8.533-15.947 8.533-25.6 0-23.564-19.103-42.667-42.667-42.667-13.911 0-26.267 6.657-34.056 16.959l-0.078 0.107zM832 853.333h-42.667v-213.333c0-23.564-19.103-42.667-42.667-42.667v0h-194.987l72.107-198.827s0-2.987 0-4.693v-8.533c0.1-1.15 0.157-2.488 0.157-3.84s-0.057-2.69-0.169-4.013l0.012 0.173c0.116-1.215 0.182-2.626 0.182-4.053s-0.066-2.839-0.195-4.232l0.013 0.179c-1.272-2.845-2.554-5.225-3.986-7.501l0.146 0.248c-1.355-2.436-2.912-4.537-4.704-6.412l0.011 0.012c-1.826-2.154-3.935-3.992-6.288-5.48l-0.112-0.066s0-2.56-3.413-3.413l-191.147-110.080h-5.12c-2.291-1.003-5-1.884-7.806-2.504l-0.3-0.056h-17.067c-3.221 0.677-6.074 1.708-8.724 3.076l0.191-0.090h-4.693l-114.773 66.987c-13.013 7.473-21.636 21.292-21.636 37.124 0 23.371 18.79 42.352 42.087 42.663l0.029 0c0.335 0.009 0.729 0.015 1.124 0.015 7.745 0 15.008-2.064 21.27-5.671l-0.207 0.11 95.147-55.467 138.24 80.213-80.64 222.293c-0.099 1.023-0.155 2.212-0.155 3.413s0.056 2.39 0.167 3.563l-0.011-0.15c-0.191 1.154-0.3 2.484-0.3 3.84s0.109 2.686 0.319 3.982l-0.019-0.142c0.914 6.297 2.105 11.778 3.635 17.116l-0.221-0.903 4.693 6.4c1.228 2.635 2.802 4.891 4.698 6.831l-0.005-0.005c1.734 1.457 3.696 2.737 5.804 3.765l0.169 0.075c2.358 1.83 5.013 3.531 7.817 4.983l0.29 0.137c4.314 1.616 9.3 2.554 14.504 2.56l213.336 0v213.333c0 23.564 19.103 42.667 42.667 42.667v0h85.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["accessible-icon-alt"]},"attrs":[],"properties":{"order":4491,"id":1193,"name":"accessible-icon-alt","prevSize":32,"code":59660},"setIdx":0,"setId":0,"iconIdx":12},{"icon":{"paths":["M888.747 312.32v0c0.11-0.513 0.172-1.103 0.172-1.707s-0.063-1.194-0.182-1.762l0.010 0.056c-35.031-63.954-83.784-116.393-142.572-154.729l-1.641-1.004c-64.776-42.538-144.17-67.851-229.475-67.851-1.075 0-2.149 0.004-3.223 0.012l0.165-0.001c-23.564 0-42.667 19.103-42.667 42.667v0 768c0 23.564 19.103 42.667 42.667 42.667v0h11.947c230.349-6.777 414.501-195.13 414.501-426.493 0-73.13-18.398-141.962-50.818-202.122l1.117 2.268zM554.667 173.227c39.517 5.109 75.372 16.22 108.236 32.465l-1.996-0.892-106.24 184.32zM554.667 559.787l177.92-308.053c26.136 22.321 48.47 48.047 66.597 76.699l0.816 1.381-245.333 424.96zM604.16 840.107l238.507-413.44c6.673 25.586 10.557 54.981 10.666 85.265l0 0.068c0.002 0.415 0.003 0.905 0.003 1.396 0 155.218-104.388 286.055-246.791 326.137l-2.385 0.574z"],"attrs":[],"grid":0,"tags":["adjust-alt"]},"attrs":[],"properties":{"order":4492,"id":1192,"name":"adjust-alt","prevSize":32,"code":59661},"setIdx":0,"setId":0,"iconIdx":13},{"icon":{"paths":["M725.333 298.667c-48.95-124.976-168.476-211.87-308.297-211.87-182.387 0-330.24 147.853-330.24 330.24 0 139.821 86.895 259.347 209.628 307.522l2.243 0.776c48.95 124.976 168.476 211.87 308.297 211.87 182.387 0 330.24-147.853 330.24-330.24 0-139.821-86.895-259.347-209.628-307.522l-2.243-0.776zM657.067 366.933c2.943 14.604 4.649 31.409 4.693 48.604l0 0.036c-0.097 20.329-2.58 40.031-7.183 58.902l0.356-1.729-104.107-103.253c17.142-4.247 36.844-6.73 57.11-6.826l0.063-0c17.231 0.044 34.036 1.751 50.299 4.967l-1.659-0.274zM616.96 554.667c-17.273 24.386-37.907 45.020-61.499 61.759l-0.794 0.535-147.627-147.627c17.273-24.386 37.907-45.020 61.499-61.759l0.794-0.535zM275.627 616.96c-64.256-44.872-105.765-118.471-105.765-201.765 0-135.494 109.839-245.333 245.333-245.333 83.294 0 156.893 41.51 201.239 104.971l0.526 0.794h-10.667c-181.939 1.208-328.963 148.978-328.963 331.086 0 0.452 0.001 0.904 0.003 1.356l-0-0.069c0 3.413 0.427 7.253 0.427 10.667zM365.227 654.933c-2.943-14.604-4.649-31.409-4.693-48.604l-0-0.036c0.097-20.329 2.58-40.031 7.183-58.902l-0.356 1.729 103.68 103.68c-17.142 4.247-36.844 6.73-57.11 6.826l-0.063 0c-1.961 0.053-4.27 0.083-6.585 0.083-14.091 0-27.922-1.116-41.409-3.265l1.487 0.195zM608 853.333c-83.819-0.162-157.788-42.187-202.131-106.274l-0.536-0.819h10.667c182.375-0.242 330.182-147.899 330.667-330.193l0-0.047c0-3.413 0-7.253 0-10.667 65.008 44.785 107.078 118.813 107.078 202.667 0 135.494-109.839 245.333-245.333 245.333-0.145 0-0.289-0-0.434-0l0.023 0z"],"attrs":[],"grid":0,"tags":["adjust-circle"]},"attrs":[],"properties":{"order":4493,"id":1191,"name":"adjust-circle","prevSize":32,"code":59662},"setIdx":0,"setId":0,"iconIdx":14},{"icon":{"paths":["M888.747 312.32v0c-35.469-65.418-85.126-119.034-145.111-158.131l-1.662-1.016c-65.234-42.538-145.083-67.839-230.84-67.839-235.641 0-426.667 191.025-426.667 426.667s191.025 426.667 426.667 426.667c0.305 0 0.609-0 0.914-0.001l-0.047 0h12.373c230.164-7.005 414.081-195.265 414.081-426.481 0-73.134-18.401-141.971-50.825-202.133l1.117 2.268zM469.333 850.347c-168.131-23.026-296.278-165.721-296.278-338.347s128.147-315.321 294.502-338.147l1.776-0.2zM554.667 173.653c39.525 5.168 75.373 16.273 108.26 32.473l-2.020-0.9-106.24 183.893zM554.667 557.653l177.92-305.92c26.011 22.424 48.326 48.131 66.579 76.685l0.834 1.395-245.333 424.96zM603.733 838.4l238.507-411.733c6.888 25.561 10.925 54.938 11.093 85.232l0 0.102c-0.114 155.76-104.54 287.099-247.192 327.943l-2.408 0.59z"],"attrs":[],"grid":0,"tags":["adjust-half"]},"attrs":[],"properties":{"order":4494,"id":1190,"name":"adjust-half","prevSize":32,"code":59663},"setIdx":0,"setId":0,"iconIdx":15},{"icon":{"paths":["M512 85.333c-235.641 0-426.667 191.025-426.667 426.667s191.025 426.667 426.667 426.667c235.641 0 426.667-191.025 426.667-426.667v0c0-235.641-191.025-426.667-426.667-426.667v0zM469.333 850.347c-168.131-23.026-296.278-165.721-296.278-338.347s128.147-315.321 294.502-338.147l1.776-0.2zM554.667 850.347v-676.693c168.131 23.026 296.278 165.721 296.278 338.347s-128.147 315.321-294.502 338.147l-1.776 0.2z"],"attrs":[],"grid":0,"tags":["adjust"]},"attrs":[],"properties":{"order":4495,"id":1189,"name":"adjust","prevSize":32,"code":59664},"setIdx":0,"setId":0,"iconIdx":16},{"icon":{"paths":["M437.208 102.519c-7.757-11.474-20.72-18.917-35.421-18.917-0.006 0-0.012 0-0.017 0l-316.791-0c-0.003-0-0.007-0-0.011-0-23.558 0-42.656 19.098-42.656 42.656 0 0.004 0 0.008 0 0.012l-0-0.001v771.499c0.003 23.565 19.107 42.667 42.673 42.667 17.72 0 32.917-10.8 39.368-26.178l0.105-0.281 316.792-771.499c2.017-4.786 3.189-10.351 3.189-16.189 0-8.864-2.702-17.097-7.327-23.92l0.096 0.15zM127.646 681.519v-512.583h210.479zM938.313 83.602h-320.75c-23.557 0.010-42.65 19.108-42.65 42.667 0 5.973 1.227 11.659 3.443 16.82l-0.106-0.278 320.75 761.583c6.618 15.475 21.711 26.122 39.291 26.125l0 0c2.998-0.010 5.92-0.312 8.745-0.881l-0.287 0.048c19.656-4.087 34.217-21.258 34.229-41.832l0-0.001v-761.583c0-0.003 0-0.007 0-0.011 0-23.558-19.098-42.656-42.656-42.656-0.004 0-0.008 0-0.012 0l0.001-0zM895.646 676.602l-213.812-507.667h213.812zM552.5 406.187c-6.219-16.132-21.521-27.405-39.478-27.583l-0.022-0h-0.417c-0.001-0-0.003-0-0.004-0-17.844 0-33.129 10.955-39.497 26.507l-0.103 0.285-130.521 325.582c-1.938 4.7-3.063 10.156-3.063 15.875 0 23.564 19.103 42.667 42.667 42.667 0 0 0-0 0.001-0l96.188 0 64.959 127.584c7.195 13.955 21.507 23.333 38.009 23.333 0.004 0 0.008-0 0.013-0l111.478 0c23.566-0.002 42.669-19.107 42.669-42.673 0-5.418-1.010-10.6-2.851-15.368l0.099 0.292zM607.396 855.103l-64.958-127.583c-7.195-13.956-21.508-23.334-38.010-23.334-0.004 0-0.007 0-0.011 0l-59.291-0 66.292-165.333 119.542 316.25z"],"attrs":[],"grid":0,"tags":["adobe-alt"]},"attrs":[],"properties":{"order":4496,"id":1188,"name":"adobe-alt","prevSize":32,"code":59665},"setIdx":0,"setId":0,"iconIdx":17},{"icon":{"paths":["M547.413 573.867c-7.771-11.447-20.725-18.869-35.413-18.869s-27.643 7.422-35.318 18.72l-0.095 0.149-170.667 256c-3.594 6.12-5.716 13.479-5.716 21.333s2.123 15.214 5.825 21.535l-0.109-0.201c6.758 13.277 19.908 22.442 35.285 23.46l0.128 0.007h341.333c16.18-0.045 30.237-9.088 37.435-22.388l0.112-0.226c2.969-5.664 4.711-12.373 4.711-19.489 0-8.615-2.553-16.634-6.944-23.341l0.1 0.163zM421.12 810.667l90.88-136.533 90.88 136.533zM810.667 128h-597.333c-70.692 0-128 57.308-128 128v0 384c0 70.692 57.308 128 128 128v0h36.267c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-36.267c-23.564 0-42.667-19.103-42.667-42.667v0-384c0-23.564 19.103-42.667 42.667-42.667v0h597.333c23.564 0 42.667 19.103 42.667 42.667v0 384c0 23.564-19.103 42.667-42.667 42.667v0h-36.267c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h36.267c70.692 0 128-57.308 128-128v0-384c0-70.692-57.308-128-128-128v0z"],"attrs":[],"grid":0,"tags":["airplay"]},"attrs":[],"properties":{"order":4497,"id":1187,"name":"airplay","prevSize":32,"code":59666},"setIdx":0,"setId":0,"iconIdx":18},{"icon":{"paths":["M386.987 737.28h118.613l74.667 146.773h108.373l-176.64-462.933zM85.333 128v768l316.587-768zM617.813 128l320.853 759.893v-759.893z"],"attrs":[],"grid":0,"tags":["adobe"]},"attrs":[],"properties":{"order":4498,"id":1186,"name":"adobe","prevSize":32,"code":59667},"setIdx":0,"setId":0,"iconIdx":19},{"icon":{"paths":["M426.667 469.333h-298.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h298.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM426.667 810.667h-298.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h298.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM597.333 213.333h298.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-298.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM426.667 298.667h-298.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h298.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM426.667 640h-298.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h298.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM426.667 128h-128c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h128c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM896 298.667h-298.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h298.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM896 469.333h-298.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h298.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM725.333 810.667h-128c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h128c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM896 640h-298.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h298.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["align-alt"]},"attrs":[],"properties":{"order":4499,"id":1185,"name":"align-alt","prevSize":32,"code":59668},"setIdx":0,"setId":0,"iconIdx":20},{"icon":{"paths":["M213.333 341.333h597.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-597.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM896 469.333h-768c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h768c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM810.667 682.667h-597.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h597.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["align-center-alt"]},"attrs":[],"properties":{"order":4500,"id":1184,"name":"align-center-alt","prevSize":32,"code":59669},"setIdx":0,"setId":0,"iconIdx":21},{"icon":{"paths":["M435.627 264.96l33.707-34.133v110.507c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-110.507l33.707 34.133c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003-106.667-106.667c-3.937-3.773-8.616-6.808-13.791-8.859l-0.289-0.101c-4.793-2.024-10.366-3.201-16.213-3.201s-11.42 1.176-16.495 3.305l0.281-0.105c-5.464 2.152-10.143 5.187-14.095 8.974l0.015-0.014-106.667 106.667c-7.753 7.753-12.548 18.463-12.548 30.293 0 23.661 19.181 42.841 42.841 42.841 11.83 0 22.541-4.795 30.293-12.548l-0 0zM682.667 469.333h-341.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h341.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM588.373 759.040l-33.707 34.133v-110.507c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 110.507l-33.707-34.133c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l106.667 106.667c3.937 3.773 8.616 6.808 13.791 8.859l0.289 0.101c4.771 2.163 10.345 3.423 16.213 3.423s11.443-1.26 16.466-3.525l-0.253 0.102c5.464-2.152 10.143-5.187 14.095-8.974l-0.015 0.014 106.667-106.667c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l0-0z"],"attrs":[],"grid":0,"tags":["align-center-v"]},"attrs":[],"properties":{"order":4501,"id":1183,"name":"align-center-v","prevSize":32,"code":59670},"setIdx":0,"setId":0,"iconIdx":22},{"icon":{"paths":["M128 298.667h768c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-768c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM298.667 384c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h426.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM896 554.667h-768c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h768c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM725.333 725.333h-426.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h426.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["align-center"]},"attrs":[],"properties":{"order":4502,"id":1182,"name":"align-center","prevSize":32,"code":59671},"setIdx":0,"setId":0,"iconIdx":23},{"icon":{"paths":["M935.253 495.787c-2.152-5.464-5.187-10.143-8.974-14.095l0.014 0.015-106.667-106.667c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l-0-0 34.133 33.707h-110.507c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h110.507l-34.133 33.707c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 106.667-106.667c3.773-3.937 6.808-8.616 8.859-13.791l0.101-0.289c2.024-4.793 3.201-10.366 3.201-16.213s-1.176-11.42-3.305-16.495l0.105 0.281zM341.333 469.333h-110.507l34.133-33.707c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l-106.667 106.667c-3.773 3.937-6.808 8.616-8.859 13.791l-0.101 0.289c-2.024 4.793-3.201 10.366-3.201 16.213s1.176 11.42 3.305 16.495l-0.105-0.281c2.152 5.464 5.187 10.143 8.974 14.095l-0.014-0.015 106.667 106.667c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003-34.133-33.707h110.507c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM512 298.667c-23.564 0-42.667 19.103-42.667 42.667v0 341.333c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-341.333c0-23.564-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["align-center-h"]},"attrs":[],"properties":{"order":4503,"id":1181,"name":"align-center-h","prevSize":32,"code":59672},"setIdx":0,"setId":0,"iconIdx":24},{"icon":{"paths":["M128 298.667h768c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-768c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM896 725.333h-768c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h768c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM896 554.667h-768c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h768c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM896 384h-768c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h768c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["align-justify"]},"attrs":[],"properties":{"order":4504,"id":1180,"name":"align-justify","prevSize":32,"code":59673},"setIdx":0,"setId":0,"iconIdx":25},{"icon":{"paths":["M128 298.667h768c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-768c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM128 469.333h597.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-597.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM896 554.667h-768c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h768c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM725.333 725.333h-597.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h597.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["align-left"]},"attrs":[],"properties":{"order":4505,"id":1179,"name":"align-left","prevSize":32,"code":59674},"setIdx":0,"setId":0,"iconIdx":26},{"icon":{"paths":["M128 213.333h768c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-768c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM640 810.667h-512c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h512c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM896 469.333h-768c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h768c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM896 298.667h-768c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h768c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM896 640h-768c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h768c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["align-left-justify"]},"attrs":[],"properties":{"order":4506,"id":1178,"name":"align-left-justify","prevSize":32,"code":59675},"setIdx":0,"setId":0,"iconIdx":27},{"icon":{"paths":["M896 640h-768c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h768c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM128 213.333h768c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-768c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM725.333 810.667h-426.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h426.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM896 298.667h-768c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h768c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM896 469.333h-768c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h768c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["align-center-justify"]},"attrs":[],"properties":{"order":4507,"id":1177,"name":"align-center-justify","prevSize":32,"code":59676},"setIdx":0,"setId":0,"iconIdx":28},{"icon":{"paths":["M426.667 170.667h469.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-469.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM896 853.333h-768c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h768c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM896 256h-768c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h768c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM896 682.667h-426.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h426.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM896 426.667h-768c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h768c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["align-letter-right"]},"attrs":[],"properties":{"order":4508,"id":1176,"name":"align-letter-right","prevSize":32,"code":59677},"setIdx":0,"setId":0,"iconIdx":29},{"icon":{"paths":["M128 213.333h768c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-768c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM896 810.667h-426.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h426.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM896 469.333h-768c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h768c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM896 640h-768c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h768c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM896 298.667h-768c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h768c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["align-right-justify"]},"attrs":[],"properties":{"order":4509,"id":1175,"name":"align-right-justify","prevSize":32,"code":59678},"setIdx":0,"setId":0,"iconIdx":30},{"icon":{"paths":["M128 298.667h768c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-768c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM896 725.333h-597.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h597.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM896 384h-597.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h597.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM896 554.667h-768c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h768c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["align-right"]},"attrs":[],"properties":{"order":4510,"id":1174,"name":"align-right","prevSize":32,"code":59679},"setIdx":0,"setId":0,"iconIdx":31},{"icon":{"paths":["M128 640h426.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-426.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM128 469.333h426.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-426.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM128 298.667h768c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-768c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM896 725.333h-768c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h768c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM837.973 408.32c-7.667-7.422-18.13-11.996-29.661-11.996-23.564 0-42.667 19.103-42.667 42.667 0 14.193 6.93 26.768 17.592 34.525l0.122 0.085 46.080 38.4-46.080 38.4c-9.459 7.882-15.435 19.666-15.435 32.846 0 10.422 3.736 19.971 9.943 27.38l-0.054-0.067c7.881 9.415 19.638 15.36 32.784 15.36 0.024 0 0.049-0 0.073-0l-0.004 0c10.462-0.108 20.003-3.964 27.363-10.288l-0.057 0.048 85.333-70.827c9.464-7.882 15.443-19.669 15.443-32.853s-5.98-24.971-15.375-32.798l-0.069-0.056z"],"attrs":[],"grid":0,"tags":["align"]},"attrs":[],"properties":{"order":4511,"id":1173,"name":"align","prevSize":32,"code":59680},"setIdx":0,"setId":0,"iconIdx":32},{"icon":{"paths":["M44.373 747.52q4.267-6.827 13.653-0.853c131.2 77.786 289.199 123.755 457.935 123.755 2.208 0 4.413-0.008 6.617-0.024l-0.339 0.002c118.88-0.299 232.34-23.139 336.45-64.468l-6.21 2.174q4.267-1.707 12.373-5.12t11.52-5.12c2.101-1.167 4.607-1.855 7.274-1.855 5.338 0 10.033 2.753 12.743 6.916l0.036 0.059q7.253 10.24-4.693 18.773-15.36 11.093-39.253 25.6c-47.154 28.109-101.671 51.193-159.381 66.414l-4.459 1c-52.894 14.871-113.684 23.572-176.455 23.893l-0.185 0.001c-1.161 0.007-2.535 0.011-3.91 0.011-89.166 0-174.344-17.077-252.441-48.138l4.618 1.62c-81.959-32.407-152.396-76.67-213.081-131.522l0.601 0.535c-2.827-1.908-4.755-4.964-5.116-8.484l-0.004-0.050c0.046-1.926 0.679-3.696 1.725-5.147l-0.019 0.027zM301.227 504.32c-0.045-1.467-0.070-3.194-0.070-4.926 0-35.705 10.866-68.872 29.471-96.375l-0.388 0.608c19.791-27.976 46.724-49.694 78.172-62.711l1.188-0.436c33.098-13.635 71.501-23.567 111.565-27.987l1.928-0.173q23.040-2.56 75.093-6.827v-14.507c0.356-3.9 0.559-8.436 0.559-13.019 0-21.827-4.602-42.579-12.888-61.339l0.383 0.972c-11.787-15.727-30.382-25.795-51.328-25.795-1.757 0-3.497 0.071-5.219 0.21l0.226-0.015h-6.827c-18.433 1.362-35.118 7.879-48.891 18.098l0.251-0.178c-13.486 10.3-23.040 25.15-26.381 42.224l-0.072 0.442c-0.72 9.697-7.724 17.572-16.923 19.6l-0.144 0.027-98.133-11.947q-14.507-3.413-14.507-15.36c0.047-2.143 0.355-4.194 0.895-6.149l-0.041 0.176c7.050-47.232 33.423-87.209 70.669-112.269l0.585-0.371c37.691-24.081 83.262-39.088 132.2-40.945l0.494-0.015h21.333c3.868-0.247 8.386-0.388 12.938-0.388 53.088 0 101.696 19.183 139.27 50.995l-0.315-0.26c5.579 5.583 10.755 11.571 15.479 17.915l0.307 0.432c3.84 5.040 7.648 10.752 11.096 16.7l0.424 0.793c3.286 6.394 5.938 13.812 7.577 21.603l0.103 0.584q3.413 14.507 5.12 20.053c1.561 7.153 2.49 15.395 2.56 23.841l0 0.052q0.853 18.347 0.853 21.76v206.507c-0.005 0.431-0.009 0.94-0.009 1.449 0 13.987 2.346 27.426 6.667 39.944l-0.258-0.86c3.149 10.075 7.354 18.843 12.62 26.852l-0.246-0.399q5.973 8.107 19.627 26.027c2.883 3.774 4.75 8.465 5.115 13.571l0.005 0.082c-0.178 5.015-2.831 9.374-6.768 11.911l-0.058 0.035q-70.827 61.44-76.8 66.56c-3.826 2.748-8.605 4.394-13.768 4.394-4.012 0-7.793-0.994-11.108-2.75l0.129 0.062q-11.947-10.24-20.907-19.627t-12.8-13.653c-4.095-4.889-8.163-10.314-11.939-15.951l-0.434-0.689q-8.533-12.373-11.947-16.64c-24.354 29.331-56.097 51.722-92.397 64.406l-1.47 0.447c-19.796 5.459-42.528 8.596-65.992 8.596-2 0-3.995-0.023-5.984-0.068l0.296 0.005c-1.632 0.064-3.549 0.1-5.474 0.1-39.694 0-75.776-15.467-102.547-40.703l0.074 0.070c-26.319-27.231-42.537-64.37-42.537-105.296 0-3.334 0.108-6.644 0.32-9.924l-0.023 0.447zM448 487.253c-0.065 1.215-0.102 2.637-0.102 4.068 0 18.626 6.298 35.781 16.881 49.451l-0.138-0.186c10.199 12.312 25.491 20.097 42.601 20.097 0.773 0 1.543-0.016 2.309-0.047l-0.11 0.004c2.623-0.090 5.117-0.396 7.537-0.903l-0.284 0.050c1.848-0.408 4.040-0.712 6.279-0.847l0.121-0.006c24.63-6.822 44.454-23.577 55.24-45.569l0.226-0.511c5.975-10.199 10.811-22.002 13.889-34.497l0.191-0.917c2.533-9.090 4.354-19.722 5.093-30.65l0.027-0.497q0.427-11.947 0.427-39.253v-21.333c-2.863-0.095-6.228-0.148-9.606-0.148-23.199 0-45.804 2.541-67.553 7.359l2.066-0.384c-43.049 7.989-75.214 45.25-75.214 90.024 0 1.652 0.044 3.294 0.13 4.924l-0.010-0.228zM806.4 762.027c1.396-2.629 3.102-4.88 5.112-6.819l0.008-0.008c11.716-8.409 25.345-15.12 40.013-19.391l0.947-0.236c18.727-5.246 40.374-8.624 62.687-9.374l0.46-0.012c1.639-0.187 3.538-0.294 5.462-0.294 3.809 0 7.52 0.418 11.090 1.21l-0.339-0.063q38.4 3.413 46.080 12.8c2.187 3.892 3.476 8.543 3.476 13.495 0 0.656-0.023 1.307-0.067 1.953l0.005-0.087v5.973c-1.047 25.679-6.91 49.728-16.706 71.634l0.493-1.234c-9.966 25.941-25.422 47.843-45.046 65.124l-0.181 0.156c-2.031 1.898-4.689 3.148-7.631 3.41l-0.049 0.004c-1.25-0.013-2.423-0.327-3.454-0.873l0.041 0.020q-5.12-2.56-2.56-9.387c15.323-29.966 26.426-64.797 31.388-101.576l0.185-1.677c0.047-0.54 0.074-1.168 0.074-1.803 0-4.403-1.301-8.503-3.539-11.935l0.051 0.084q-8.533-10.24-47.787-10.24-14.507 0-34.133 1.707-21.333 2.56-39.253 5.12c-0.352 0.044-0.76 0.070-1.173 0.070-2.116 0-4.077-0.665-5.685-1.797l0.031 0.021c-0.681-0.514-1.117-1.321-1.117-2.231 0-0.429 0.097-0.836 0.271-1.199l-0.007 0.017c0.112-0.957 0.415-1.824 0.87-2.59l-0.017 0.030z"],"attrs":[],"grid":0,"tags":["amazon"]},"attrs":[],"properties":{"order":4512,"id":1172,"name":"amazon","prevSize":32,"code":59681},"setIdx":0,"setId":0,"iconIdx":33},{"icon":{"paths":["M448 405.333h-42.667v-42.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 42.667h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h42.667v42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM978.347 497.067l-2.56-4.693c-0.804-2.28-1.813-4.253-3.045-6.064l0.058 0.091-102.4-136.533c-23.6-31.229-60.668-51.2-102.4-51.2v0h-85.333v-42.667c0-70.692-57.308-128-128-128v0h-384c-70.692 0-128 57.308-128 128v0 469.333c0 23.564 19.103 42.667 42.667 42.667v0h42.667c0 70.692 57.308 128 128 128s128-57.308 128-128v0h256c0 70.692 57.308 128 128 128s128-57.308 128-128v0h42.667c23.564 0 42.667-19.103 42.667-42.667v0-213.333c-0.1-5.4-1.188-10.518-3.089-15.22l0.102 0.286zM256 810.667c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667c23.564 0 42.667 19.103 42.667 42.667v0c0 23.564-19.103 42.667-42.667 42.667v0zM597.333 682.667h-246.613c-23.501-25.787-57.228-41.906-94.72-41.906s-71.219 16.119-94.629 41.805l-0.091 0.102h-33.28v-426.667c0-23.564 19.103-42.667 42.667-42.667v0h384c23.564 0 42.667 19.103 42.667 42.667v0zM682.667 384h85.333c13.911 0 26.267 6.657 34.056 16.959l0.078 0.107 51.2 68.267h-170.667zM768 810.667c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667c23.564 0 42.667 19.103 42.667 42.667v0c0 23.564-19.103 42.667-42.667 42.667v0zM896 682.667h-33.28c-23.504-25.812-57.246-41.948-94.757-41.948-32.823 0-62.761 12.355-85.416 32.667l0.12-0.106v-118.613h213.333z"],"attrs":[],"grid":0,"tags":["ambulance"]},"attrs":[],"properties":{"order":4513,"id":1171,"name":"ambulance","prevSize":32,"code":59682},"setIdx":0,"setId":0,"iconIdx":34},{"icon":{"paths":["M926.293 311.040c-7.733-7.795-18.45-12.621-30.293-12.621s-22.56 4.826-30.291 12.618l-0.003 0.003-268.373 268.8-183.040-183.467c-7.733-7.795-18.45-12.621-30.293-12.621s-22.56 4.826-30.291 12.618l-0.003 0.003-256 256c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 225.707-226.133 183.040 183.467c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 298.667-298.667c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003z"],"attrs":[],"grid":0,"tags":["analysis"]},"attrs":[],"properties":{"order":4514,"id":1170,"name":"analysis","prevSize":32,"code":59683},"setIdx":0,"setId":0,"iconIdx":35},{"icon":{"paths":["M213.333 512c-23.564 0-42.667 19.103-42.667 42.667v0 341.333c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-341.333c0-23.564-19.103-42.667-42.667-42.667v0zM426.667 85.333c-23.564 0-42.667 19.103-42.667 42.667v0 768c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-768c0-23.564-19.103-42.667-42.667-42.667v0zM853.333 682.667c-23.564 0-42.667 19.103-42.667 42.667v0 170.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-170.667c0-23.564-19.103-42.667-42.667-42.667v0zM640 341.333c-23.564 0-42.667 19.103-42.667 42.667v0 512c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-512c0-23.564-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["analytics"]},"attrs":[],"properties":{"order":4515,"id":1169,"name":"analytics","prevSize":32,"code":59684},"setIdx":0,"setId":0,"iconIdx":36},{"icon":{"paths":["M810.667 554.667h-85.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h38.827c-18.729 107.317-102.177 190.764-207.96 209.271l-1.534 0.222v-380.16h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-42.667v-50.347c50.14-18.103 85.333-65.281 85.333-120.68 0-70.692-57.308-128-128-128s-128 57.308-128 128c0 55.398 35.193 102.577 84.442 120.398l0.891 0.282v50.347h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h42.667v380.16c-107.317-18.729-190.764-102.177-209.271-207.96l-0.222-1.534h38.827c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-85.333c-23.564 0-42.667 19.103-42.667 42.667v0c0 188.513 152.82 341.333 341.333 341.333s341.333-152.82 341.333-341.333v0c0-23.564-19.103-42.667-42.667-42.667v0zM512 256c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667c23.564 0 42.667 19.103 42.667 42.667v0c0 23.564-19.103 42.667-42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["anchor"]},"attrs":[],"properties":{"order":4516,"id":1168,"name":"anchor","prevSize":32,"code":59685},"setIdx":0,"setId":0,"iconIdx":37},{"icon":{"paths":["M127.646 384.019c-0.003-0-0.007-0-0.012-0-23.558 0-42.655 19.097-42.655 42.655 0 0.004 0 0.008 0 0.012l-0-0.001v170.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-170.667c0-0.003 0-0.007 0-0.012 0-23.558-19.097-42.655-42.655-42.655-0.004 0-0.008 0-0.012 0l0.001-0zM895.646 384.019c-0.003-0-0.007-0-0.012-0-23.558 0-42.655 19.097-42.655 42.655 0 0.004 0 0.008 0 0.012l-0-0.001v170.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-170.667c0-0.003 0-0.007 0-0.012 0-23.558-19.097-42.655-42.655-42.655-0.004 0-0.008 0-0.012 0l0.001-0zM719.25 149.352c3.635-6.146 5.782-13.544 5.782-21.444 0-23.558-19.098-42.656-42.656-42.656-15.748 0-29.503 8.534-36.892 21.229l-0.109 0.203-26.203 45.328c-31.496-15.146-68.477-23.995-107.526-23.995s-76.030 8.849-109.049 24.651l1.523-0.657-26.203-45.328c-7.499-12.899-21.253-21.433-37.001-21.433-23.558 0-42.656 19.098-42.656 42.656 0 7.9 2.148 15.298 5.891 21.643l-0.109-0.199 29.547 51.112c-48.086 46.457-77.943 111.518-77.943 183.552 0 0.001 0 0.002 0 0.003l0 0v341.333c-0 0.003-0 0.007-0 0.011 0 23.558 19.098 42.656 42.656 42.656 0.004 0 0.008-0 0.012-0l85.333 0v128c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-128h85.333v128c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-128h85.333c0.003 0 0.007 0 0.011 0 23.558 0 42.656-19.098 42.656-42.656 0-0.004-0-0.008-0-0.012l0 0.001v-341.333c0-0.001 0-0.002 0-0.003 0-72.034-29.856-137.094-77.869-183.481l-0.073-0.071zM682.313 682.685h-341.333v-213.333h341.333zM340.979 384.019c0-94.257 76.41-170.667 170.667-170.667s170.667 76.41 170.667 170.667v0z"],"attrs":[],"grid":0,"tags":["android-alt"]},"attrs":[],"properties":{"order":4517,"id":1167,"name":"android-alt","prevSize":32,"code":59686},"setIdx":0,"setId":0,"iconIdx":38},{"icon":{"paths":["M481.707 755.627c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c3.646-4.001 6.662-8.658 8.838-13.76l0.122-0.32c2.163-4.771 3.423-10.345 3.423-16.213s-1.26-11.443-3.525-16.466l0.102 0.253c-2.298-5.422-5.314-10.079-8.995-14.119l0.035 0.039c-7.733-7.795-18.45-12.621-30.293-12.621s-22.56 4.826-30.291 12.618l-0.003 0.003c-3.646 4.001-6.662 8.658-8.838 13.76l-0.122 0.32c-2.163 4.771-3.423 10.345-3.423 16.213s1.26 11.443 3.525 16.466l-0.102-0.253c2.298 5.422 5.314 10.079 8.995 14.119l-0.035-0.039zM369.493 170.667h313.173c23.564 0 42.667 19.103 42.667 42.667v0 313.173c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-313.173c0-70.692-57.308-128-128-128v0h-313.173c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM926.293 865.707l-768-768c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293v0l115.627 115.2v537.173c0 70.692 57.308 128 128 128v0h341.333c52.621-0.044 97.806-31.834 117.441-77.25l0.319-0.83 65.28 65.707c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003zM725.333 810.667c0 23.564-19.103 42.667-42.667 42.667v0h-341.333c-23.564 0-42.667-19.103-42.667-42.667v0-451.84l426.667 426.667z"],"attrs":[],"grid":0,"tags":["android-phone-slash"]},"attrs":[],"properties":{"order":4518,"id":1166,"name":"android-phone-slash","prevSize":32,"code":59687},"setIdx":0,"setId":0,"iconIdx":39},{"icon":{"paths":["M638.948 128.805l40.952-73.881c0.651-1.153 1.035-2.533 1.035-4.001 0-4.558-3.695-8.253-8.253-8.253-3.089 0-5.782 1.697-7.196 4.21l-0.021 0.041-41.406 74.7c-32.992-14.839-71.516-23.484-112.059-23.484s-79.067 8.645-113.829 24.191l1.77-0.707-41.407-74.7c-1.436-2.554-4.129-4.251-7.218-4.251-4.558 0-8.253 3.695-8.253 8.253 0 1.469 0.384 2.848 1.056 4.043l-0.021-0.041 40.954 73.882c-77.605 38.877-130.313 117.121-131.972 207.837l-0.003 0.22h517.845c-1.662-90.937-54.37-169.181-130.612-207.438l-1.364-0.62zM392.495 242.11c-11.942 0-21.623-9.681-21.623-21.623s9.681-21.623 21.623-21.623c11.942 0 21.623 9.681 21.623 21.623h-0c-0.014 11.937-9.687 21.61-21.622 21.623l-0.001 0zM631.505 242.11c-11.942 0-21.623-9.681-21.623-21.623s9.681-21.623 21.623-21.623c11.942 0 21.623 9.681 21.623 21.623v0c-0.014 11.937-9.687 21.61-21.622 21.623l-0.001 0zM253.074 732.649c0 34.572 28.026 62.598 62.598 62.598v-0h41.54v128.041c-0 0.047-0 0.102-0 0.157 0 32.058 25.988 58.046 58.046 58.046s58.046-25.988 58.046-58.046c0-0.055-0-0.111-0-0.166l0 0.009v-128.041h77.391v128.041c-0 0.047-0 0.102-0 0.157 0 32.058 25.988 58.046 58.046 58.046s58.046-25.988 58.046-58.046c0-0.055-0-0.111-0-0.166l0 0.009v-128.041h41.542c34.572 0 62.598-28.026 62.598-62.598l-0-0v-375.302h-517.853zM173.404 347.388c-32.043 0.038-58.009 26.003-58.046 58.043l-0 0.004v241.854c-0 0.047-0 0.102-0 0.157 0 32.058 25.988 58.046 58.046 58.046s58.046-25.988 58.046-58.046c0-0.055-0-0.111-0-0.166l0 0.009v-241.854c-0.037-32.043-26.003-58.009-58.043-58.046l-0.004-0zM850.596 347.388c-32.043 0.037-58.009 26.003-58.046 58.043l-0 0.004v241.854c-0 0.047-0 0.102-0 0.157 0 32.058 25.988 58.046 58.046 58.046s58.046-25.988 58.046-58.046c0-0.055-0-0.111-0-0.166l0 0.009v-241.854c-0.037-32.043-26.003-58.009-58.042-58.046l-0.004-0z"],"attrs":[],"grid":0,"tags":["android"]},"attrs":[],"properties":{"order":4519,"id":1165,"name":"android","prevSize":32,"code":59688},"setIdx":0,"setId":0,"iconIdx":40},{"icon":{"paths":["M481.707 488.96c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 128-128c8.119-7.903 13.155-18.936 13.155-31.147 0-23.996-19.453-43.449-43.449-43.449-11.786 0-22.476 4.693-30.303 12.312l0.010-0.009-97.707 99.84-97.707-99.84c-7.818-7.609-18.507-12.302-30.293-12.302-23.996 0-43.449 19.453-43.449 43.449 0 12.21 5.037 23.244 13.146 31.137l0.010 0.009zM609.707 535.040l-97.707 98.133-97.707-98.133c-7.818-7.609-18.507-12.302-30.293-12.302-23.996 0-43.449 19.453-43.449 43.449 0 12.21 5.037 23.244 13.146 31.137l0.010 0.009 128 128c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 128-128c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l0-0z"],"attrs":[],"grid":0,"tags":["angle-double-down"]},"attrs":[],"properties":{"order":4520,"id":1164,"name":"angle-double-down","prevSize":32,"code":59689},"setIdx":0,"setId":0,"iconIdx":41},{"icon":{"paths":["M488.96 353.707c-7.733-7.795-18.45-12.621-30.293-12.621s-22.56 4.826-30.291 12.618l-0.003 0.003-128 128c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003 128 128c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003-98.133-97.707 98.133-97.707c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003zM625.493 512l99.84-97.707c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l-128 128c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003 128 128c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003z"],"attrs":[],"grid":0,"tags":["angle-double-left"]},"attrs":[],"properties":{"order":4521,"id":1163,"name":"angle-double-left","prevSize":32,"code":59690},"setIdx":0,"setId":0,"iconIdx":42},{"icon":{"paths":["M360.96 353.707c-7.903-8.119-18.936-13.155-31.147-13.155-23.996 0-43.449 19.453-43.449 43.449 0 11.786 4.693 22.476 12.312 30.303l-0.009-0.010 99.84 97.707-99.84 97.707c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 128-128c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003zM723.627 481.707l-128-128c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l-0-0 98.133 97.707-98.133 97.707c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 128-128c8.317-7.805 13.498-18.867 13.498-31.139 0-11.427-4.492-21.805-11.807-29.464l0.016 0.016z"],"attrs":[],"grid":0,"tags":["angle-double-right"]},"attrs":[],"properties":{"order":4522,"id":1162,"name":"angle-double-right","prevSize":32,"code":59691},"setIdx":0,"setId":0,"iconIdx":43},{"icon":{"paths":["M542.293 535.040c-7.733-7.795-18.45-12.621-30.293-12.621s-22.56 4.826-30.291 12.618l-0.003 0.003-128 128c-8.119 7.903-13.155 18.936-13.155 31.147 0 23.996 19.453 43.449 43.449 43.449 11.786 0 22.476-4.693 30.303-12.312l-0.010 0.009 97.707-99.84 97.707 99.84c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003zM414.293 488.96l97.707-98.133 97.707 98.133c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003-128-128c-7.733-7.795-18.45-12.621-30.293-12.621s-22.56 4.826-30.291 12.618l-0.003 0.003-128 128c-7.753 7.753-12.548 18.463-12.548 30.293 0 23.661 19.181 42.841 42.841 42.841 11.83 0 22.541-4.795 30.293-12.548l-0 0z"],"attrs":[],"grid":0,"tags":["angle-double-up"]},"attrs":[],"properties":{"order":4523,"id":1161,"name":"angle-double-up","prevSize":32,"code":59692},"setIdx":0,"setId":0,"iconIdx":44},{"icon":{"paths":["M725.333 391.253c-7.712-7.668-18.343-12.407-30.080-12.407s-22.368 4.74-30.082 12.409l0.002-0.002-153.173 151.040-151.040-151.040c-7.712-7.668-18.343-12.407-30.080-12.407s-22.368 4.74-30.082 12.409l0.002-0.002c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003 180.907 180.907c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 183.040-180.907c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003z"],"attrs":[],"grid":0,"tags":["angle-down"]},"attrs":[],"properties":{"order":4524,"id":1160,"name":"angle-down","prevSize":32,"code":59693},"setIdx":0,"setId":0,"iconIdx":45},{"icon":{"paths":["M362.667 546.133l243.2 238.933c17.067 17.067 42.667 17.067 59.733 0 0 0 0 0 0 0 17.067-17.067 17.067-42.667 0-59.733l-209.067-213.333 209.067-213.333c17.067-17.067 17.067-42.667 0-59.733-8.533-8.533-17.067-12.8-29.867-12.8s-21.333 4.267-29.867 12.8l-243.2 238.933c-17.067 21.333-17.067 46.933 0 68.267 0-4.267 0-4.267 0 0z"],"attrs":[],"grid":0,"tags":["angle-left-b"]},"attrs":[],"properties":{"order":4525,"id":1159,"name":"angle-left-b","prevSize":32,"code":59694},"setIdx":0,"setId":0,"iconIdx":46},{"icon":{"paths":["M481.707 512l151.040-151.040c7.668-7.712 12.407-18.343 12.407-30.080s-4.74-22.368-12.409-30.082l0.002 0.002c-7.733-7.795-18.45-12.621-30.293-12.621s-22.56 4.826-30.291 12.618l-0.003 0.003-180.907 180.907c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003 180.907 183.040c7.709 7.648 18.326 12.374 30.047 12.374 0.087 0 0.173-0 0.26-0.001l-0.013 0c0.073 0 0.16 0.001 0.247 0.001 11.721 0 22.338-4.726 30.049-12.377l-0.003 0.003c7.668-7.712 12.407-18.343 12.407-30.080s-4.74-22.368-12.409-30.082l0.002 0.002z"],"attrs":[],"grid":0,"tags":["angle-left"]},"attrs":[],"properties":{"order":4526,"id":1158,"name":"angle-left","prevSize":32,"code":59695},"setIdx":0,"setId":0,"iconIdx":47},{"icon":{"paths":["M663.040 481.707l-241.493-241.067c-7.733-7.795-18.45-12.621-30.293-12.621s-22.56 4.826-30.291 12.618l-0.003 0.003c-7.668 7.712-12.407 18.343-12.407 30.080s4.74 22.368 12.409 30.082l-0.002-0.002 211.2 213.333-211.2 211.2c-7.668 7.712-12.407 18.343-12.407 30.080s4.74 22.368 12.409 30.082l-0.002-0.002c7.709 7.861 18.426 12.749 30.284 12.8l0.010 0c11.868-0.051 22.584-4.939 30.287-12.793l0.007-0.007 241.493-241.067c8.458-7.82 13.736-18.974 13.736-31.36s-5.278-23.54-13.707-31.334l-0.028-0.026z"],"attrs":[],"grid":0,"tags":["angle-right-b"]},"attrs":[],"properties":{"order":4527,"id":1157,"name":"angle-right-b","prevSize":32,"code":59696},"setIdx":0,"setId":0,"iconIdx":48},{"icon":{"paths":["M632.747 481.707l-180.907-180.907c-7.733-7.795-18.45-12.621-30.293-12.621s-22.56 4.826-30.291 12.618l-0.003 0.003c-7.668 7.712-12.407 18.343-12.407 30.080s4.74 22.368 12.409 30.082l-0.002-0.002 151.040 151.040-151.040 151.040c-7.668 7.712-12.407 18.343-12.407 30.080s4.74 22.368 12.409 30.082l-0.002-0.002c7.709 7.648 18.326 12.374 30.047 12.374 0.087 0 0.173-0 0.26-0.001l-0.013 0c0.073 0 0.16 0.001 0.247 0.001 11.721 0 22.338-4.726 30.049-12.377l-0.003 0.003 180.907-180.907c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003z"],"attrs":[],"grid":0,"tags":["angle-right"]},"attrs":[],"properties":{"order":4528,"id":1156,"name":"angle-right","prevSize":32,"code":59697},"setIdx":0,"setId":0,"iconIdx":49},{"icon":{"paths":["M725.333 572.16l-183.040-180.907c-7.733-7.795-18.45-12.621-30.293-12.621s-22.56 4.826-30.291 12.618l-0.003 0.003-180.907 180.907c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003c7.712 7.668 18.343 12.407 30.080 12.407s22.368-4.74 30.082-12.409l-0.002 0.002 151.040-151.040 151.040 151.040c7.667 7.606 18.211 12.323 29.857 12.373l0.010 0c0.073 0 0.16 0.001 0.247 0.001 11.721 0 22.338-4.726 30.049-12.377l-0.003 0.003c8.451-7.82 13.725-18.969 13.725-31.35 0-11.325-4.412-21.619-11.611-29.258l0.020 0.021z"],"attrs":[],"grid":0,"tags":["angle-up"]},"attrs":[],"properties":{"order":4529,"id":1155,"name":"angle-up","prevSize":32,"code":59698},"setIdx":0,"setId":0,"iconIdx":50},{"icon":{"paths":["M426.667 469.333c16.512-0.052 30.81-9.474 37.861-23.226l0.112-0.24c2.861-5.577 4.539-12.167 4.539-19.149 0-16.501-9.367-30.814-23.074-37.912l-0.238-0.112-85.333-42.667c-6.277-3.836-13.872-6.108-21.998-6.108-23.564 0-42.667 19.103-42.667 42.667 0 17.645 10.711 32.788 25.986 39.283l0.279 0.105 85.333 42.667c5.419 2.957 11.869 4.696 18.725 4.696 0.167 0 0.334-0.001 0.5-0.003l-0.025 0zM512 85.333c-235.641 0-426.667 191.025-426.667 426.667s191.025 426.667 426.667 426.667c235.641 0 426.667-191.025 426.667-426.667v0c0-235.641-191.025-426.667-426.667-426.667v0zM512 853.333c-188.513 0-341.333-152.82-341.333-341.333s152.82-341.333 341.333-341.333c188.513 0 341.333 152.82 341.333 341.333v0c0 188.513-152.82 341.333-341.333 341.333v0zM356.693 654.080c-9.337 7.879-15.226 19.588-15.226 32.672 0 10.306 3.654 19.759 9.738 27.134l-0.058-0.073c7.882 9.459 19.666 15.435 32.846 15.435 10.422 0 19.971-3.736 27.38-9.943l-0.067 0.054c27.277-22.134 62.42-35.536 100.693-35.536s73.416 13.403 100.992 35.771l-0.298-0.234c7.328 6.107 16.843 9.813 27.223 9.813 0.029 0 0.059-0 0.088-0l-0.005 0c23.382-0.238 42.246-19.248 42.246-42.665 0-12.952-5.771-24.556-14.882-32.381l-0.057-0.048c-42.1-34.061-96.295-54.681-155.307-54.681s-113.207 20.62-155.775 55.047l0.468-0.366zM663.467 346.027l-85.333 42.667c-13.945 7.21-23.312 21.523-23.312 38.024 0 6.982 1.677 13.573 4.65 19.39l-0.112-0.241c7.163 13.992 21.462 23.415 37.966 23.467l0.007 0c0.141 0.002 0.308 0.003 0.475 0.003 6.856 0 13.307-1.739 18.934-4.8l-0.208 0.104 85.333-42.667c12.469-7.597 20.669-21.12 20.669-36.559 0-23.564-19.103-42.667-42.667-42.667-5.919 0-11.557 1.205-16.681 3.384l0.279-0.105z"],"attrs":[],"grid":0,"tags":["angry"]},"attrs":[],"properties":{"order":4530,"id":1154,"name":"angry","prevSize":32,"code":59699},"setIdx":0,"setId":0,"iconIdx":51},{"icon":{"paths":["M768 512h-131.84c54.3-54.864 88.162-130.048 89.171-213.14l0.002-0.194c0-117.821-95.513-213.333-213.333-213.333s-213.333 95.513-213.333 213.333v0c1.012 83.285 34.873 158.469 89.199 213.36l-0.026-0.026h-131.84c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h213.333v298.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-298.667h213.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM512 505.173c-39.68-26.453-128-96.427-128-206.507 0-70.692 57.308-128 128-128s128 57.308 128 128v0c0 110.080-88.32 180.48-128 206.507z"],"attrs":[],"grid":0,"tags":["ankh"]},"attrs":[],"properties":{"order":4531,"id":1153,"name":"ankh","prevSize":32,"code":59700},"setIdx":0,"setId":0,"iconIdx":52},{"icon":{"paths":["M625.493 578.56l-178.773 64c-16.541 6.125-28.117 21.765-28.117 40.109 0 23.399 18.836 42.399 42.172 42.664l0.025 0c5.207-0.006 10.192-0.944 14.802-2.656l-0.295 0.096 179.2-64c17.159-5.787 29.295-21.735 29.295-40.517 0-23.564-19.103-42.667-42.667-42.667-5.631 0-11.007 1.091-15.928 3.072l0.287-0.102zM454.827 365.227c-7.712-7.668-18.343-12.407-30.080-12.407s-22.368 4.74-30.082 12.409l0.002-0.002c-7.733 7.795-18.45 12.621-30.293 12.621s-22.56-4.826-30.291-12.618l-0.003-0.003c-7.712-7.668-18.343-12.407-30.080-12.407s-22.368 4.74-30.082 12.409l0.002-0.002c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003c23.158 23.13 55.135 37.434 90.453 37.434s67.296-14.304 90.455-37.435l-0.001 0.001c7.56-7.693 12.227-18.251 12.227-29.898 0-12.481-5.359-23.71-13.901-31.512l-0.033-0.030zM753.493 365.227c-7.712-7.668-18.343-12.407-30.080-12.407s-22.368 4.74-30.082 12.409l0.002-0.002c-7.733 7.795-18.45 12.621-30.293 12.621s-22.56-4.826-30.291-12.618l-0.003-0.003c-7.712-7.668-18.343-12.407-30.080-12.407s-22.368 4.74-30.082 12.409l0.002-0.002c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003c23.158 23.13 55.135 37.434 90.453 37.434s67.296-14.304 90.455-37.435l-0.001 0.001c7.56-7.693 12.227-18.251 12.227-29.898 0-12.481-5.359-23.71-13.901-31.512l-0.033-0.030zM512 85.333c-235.641 0-426.667 191.025-426.667 426.667s191.025 426.667 426.667 426.667c235.641 0 426.667-191.025 426.667-426.667v0c0-235.641-191.025-426.667-426.667-426.667v0zM512 853.333c-188.513 0-341.333-152.82-341.333-341.333s152.82-341.333 341.333-341.333c188.513 0 341.333 152.82 341.333 341.333v0c0 188.513-152.82 341.333-341.333 341.333v0z"],"attrs":[],"grid":0,"tags":["annoyed-alt"]},"attrs":[],"properties":{"order":4532,"id":1152,"name":"annoyed-alt","prevSize":32,"code":59701},"setIdx":0,"setId":0,"iconIdx":53},{"icon":{"paths":["M384 384c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM640 554.667c-0.003-0-0.006-0-0.009-0-79.754 0-149.286 43.765-185.891 108.588l-0.553 1.065c-3.499 6.055-5.563 13.32-5.563 21.067 0 15.716 8.497 29.448 21.148 36.851l0.202 0.109c6.011 3.467 13.216 5.522 20.9 5.547l0.007 0c15.854-0.028 29.676-8.699 37.010-21.55l0.11-0.21c22.245-39.725 64.066-66.135 112.057-66.135 0.205 0 0.41 0 0.615 0.001l-0.032-0c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM640 384c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM512 85.333c-235.641 0-426.667 191.025-426.667 426.667s191.025 426.667 426.667 426.667c235.641 0 426.667-191.025 426.667-426.667v0c0-235.641-191.025-426.667-426.667-426.667v0zM512 853.333c-188.513 0-341.333-152.82-341.333-341.333s152.82-341.333 341.333-341.333c188.513 0 341.333 152.82 341.333 341.333v0c0 188.513-152.82 341.333-341.333 341.333v0z"],"attrs":[],"grid":0,"tags":["annoyed"]},"attrs":[],"properties":{"order":4533,"id":1151,"name":"annoyed","prevSize":32,"code":59702},"setIdx":0,"setId":0,"iconIdx":54},{"icon":{"paths":["M874.854 671.727c-51.985-22.648-87.667-73.58-87.667-132.846 0-0.201 0-0.403 0.001-0.604l-0 0.031c0.73-53.115 29.099-99.445 71.348-125.337l0.652-0.371c12.225-7.645 20.236-21.034 20.236-36.294 0-8.996-2.784-17.342-7.538-24.222l0.093 0.142c-38.866-55.982-100.002-94.16-170.308-101.7l-1.046-0.091c26.465-41.409 42.184-91.906 42.184-146.075 0-8.305-0.37-16.524-1.093-24.641l0.075 1.049c-2.053-21.457-19.987-38.103-41.809-38.103-0.8 0-1.595 0.022-2.384 0.067l0.11-0.005c-75.961 6.962-142.439 42.729-189.305 96.134l-0.279 0.324c-29.63 34.182-51.593 75.829-62.716 121.713l-0.409 1.996c-20.57-7.2-44.291-11.506-68.973-11.832l-0.152-0.002c-91.11 2.663-169.857 53.134-212.286 127.1l-0.652 1.233c-80.542 139.833-31.271 349.375 55.979 475.5 35 50.542 87.521 126.417 166.75 126.417 1.562 0 3.146 0 4.729-0.085 28.099-1.638 54.168-8.765 77.668-20.32l-1.188 0.528c17.941-9.289 39.128-14.836 61.587-15.082l0.080-0.001c21.195 0.266 41.092 5.567 58.631 14.758l-0.714-0.341c24.492 11.864 53.212 18.991 83.549 19.456l0.16 0.002c81.625-1.542 129.835-71.958 165.042-123.417 26.263-38.138 48.173-82.079 63.514-128.992l1.028-3.633c1.23-3.809 1.94-8.192 1.94-12.74 0-17.887-10.971-33.211-26.55-39.611l-0.285-0.104zM572.729 194.894c22.022-24.558 49.456-43.805 80.462-55.923l1.434-0.493c-7.362 35.426-22.862 66.429-44.486 92.104l0.257-0.313c-14.951 17.854-32.824 32.678-52.982 43.889l-0.955 0.488-0.125 0.043c-1.208 0.5-2.417 0.958-3.627 1.458-7.958 3.125-17.792 7-25.375 9.5 7.833-35.137 23.701-65.765 45.613-91.006l-0.216 0.254zM764.791 808.644c-34.292 50.083-61.269 85.625-96.187 86.25-17.715-0.058-34.341-4.668-48.784-12.721l0.513 0.263c-26.801-13.355-58.355-21.243-91.733-21.418l-0.059-0c-34.604 0.18-67.284 8.233-96.399 22.455l1.315-0.58c-13.459 7.022-29.207 11.703-45.896 13.055l-0.437 0.028h-1.271c-34.688 0-72-53.875-96.771-89.667-61.979-89.583-119.146-268.083-52.187-384.333 28.247-49.908 80.175-83.523 140.115-85.573l0.281-0.008 1.437-0.043c25.84 2.252 49.605 9.007 71.23 19.487l-1.209-0.529c5.604 2.208 11.125 4.416 16.604 6.458 1.396 0.584 2.833 1.125 4.291 1.583 14.056 5.82 30.346 9.48 47.409 10.118l0.258 0.008c24.607-2.006 47.274-8.418 67.852-18.452l-1.121 0.493c26.973-13.389 58.739-21.223 92.336-21.223 0.878 0 1.755 0.005 2.631 0.016l-0.133-0.001c36.699 1.479 69.984 14.979 96.3 36.639l-0.279-0.223c-44.977 41.535-73.048 100.804-73.048 166.628 0 0.6 0.002 1.198 0.007 1.797l-0.001-0.092v0.043c-0.003 0.424-0.005 0.925-0.005 1.427 0 79.775 41.306 149.902 103.697 190.16l0.89 0.538c-12.41 29.689-26.364 55.146-42.612 78.911l0.965-1.494z"],"attrs":[],"grid":0,"tags":["apple-alt"]},"attrs":[],"properties":{"order":4534,"id":1150,"name":"apple-alt","prevSize":32,"code":59703},"setIdx":0,"setId":0,"iconIdx":55},{"icon":{"paths":["M637.44 221.44c28.406-32.603 45.725-75.515 45.725-122.472 0-4.798-0.181-9.554-0.536-14.261l0.038 0.626c-51.341 4.263-96.334 28.41-127.803 64.622l-0.197 0.232c-26.928 31.007-43.34 71.776-43.34 116.377 0 5.443 0.244 10.83 0.723 16.149l-0.050-0.686c0.39 0.003 0.851 0.005 1.312 0.005 50.275 0 95.047-23.565 123.871-60.252l0.257-0.34zM744.96 538.88c0.619-68.547 36.984-128.466 91.335-162.085l0.825-0.475c-35.034-50.008-91.515-82.925-155.799-85.323l-0.361-0.011c-66.56-6.827-128 38.827-163.413 38.827s-85.333-37.973-140.8-37.12c-75.838 2.576-141.214 44.999-176.096 106.896l-0.544 1.051c-75.093 130.56-19.2 324.693 55.893 430.080 34.133 51.627 76.8 110.080 133.12 107.947s74.667-34.987 139.947-34.987 85.333 34.987 140.8 33.707 94.72-52.907 130.56-104.533c24-34.965 43.996-75.261 57.949-118.279l0.931-3.321c-67.582-29.359-114.049-95.403-114.347-172.335l-0-0.038z"],"attrs":[],"grid":0,"tags":["apple"]},"attrs":[],"properties":{"order":4535,"id":1149,"name":"apple","prevSize":32,"code":59704},"setIdx":0,"setId":0,"iconIdx":56},{"icon":{"paths":["M426.667 554.667h-298.667c-23.564 0-42.667 19.103-42.667 42.667v0 298.667c0 23.564 19.103 42.667 42.667 42.667v0h298.667c23.564 0 42.667-19.103 42.667-42.667v0-298.667c0-23.564-19.103-42.667-42.667-42.667v0zM384 853.333h-213.333v-213.333h213.333zM896 85.333h-298.667c-23.564 0-42.667 19.103-42.667 42.667v0 298.667c0 23.564 19.103 42.667 42.667 42.667v0h298.667c23.564 0 42.667-19.103 42.667-42.667v0-298.667c0-23.564-19.103-42.667-42.667-42.667v0zM853.333 384h-213.333v-213.333h213.333zM896 554.667h-298.667c-23.564 0-42.667 19.103-42.667 42.667v0 298.667c0 23.564 19.103 42.667 42.667 42.667v0h298.667c23.564 0 42.667-19.103 42.667-42.667v0-298.667c0-23.564-19.103-42.667-42.667-42.667v0zM853.333 853.333h-213.333v-213.333h213.333zM426.667 85.333h-298.667c-23.564 0-42.667 19.103-42.667 42.667v0 298.667c0 23.564 19.103 42.667 42.667 42.667v0h298.667c23.564 0 42.667-19.103 42.667-42.667v0-298.667c0-23.564-19.103-42.667-42.667-42.667v0zM384 384h-213.333v-213.333h213.333z"],"attrs":[],"grid":0,"tags":["apps"]},"attrs":[],"properties":{"order":4536,"id":1148,"name":"apps","prevSize":32,"code":59705},"setIdx":0,"setId":0,"iconIdx":57},{"icon":{"paths":["M426.667 554.667h170.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-170.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM810.667 128h-597.333c-70.264 0.563-127.007 57.653-127.007 127.996 0 55.027 34.724 101.945 83.455 120.036l0.886 0.288v391.68c0 70.692 57.308 128 128 128v0h426.667c70.692 0 128-57.308 128-128v0-391.68c49.617-18.379 84.34-65.296 84.34-120.324 0-70.343-56.743-127.434-126.954-127.996l-0.053-0zM768 768c0 23.564-19.103 42.667-42.667 42.667v0h-426.667c-23.564 0-42.667-19.103-42.667-42.667v0-384h512zM810.667 298.667h-597.333c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667v0h597.333c23.564 0 42.667 19.103 42.667 42.667s-19.103 42.667-42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["archive-alt"]},"attrs":[],"properties":{"order":4537,"id":1147,"name":"archive-alt","prevSize":32,"code":59706},"setIdx":0,"setId":0,"iconIdx":58},{"icon":{"paths":["M426.667 597.333h170.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-170.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM810.667 128h-597.333c-70.692 0-128 57.308-128 128v0 128c0 23.564 19.103 42.667 42.667 42.667v0h42.667v341.333c0 70.692 57.308 128 128 128v0h426.667c70.692 0 128-57.308 128-128v0-341.333h42.667c23.564 0 42.667-19.103 42.667-42.667v0-128c0-70.692-57.308-128-128-128v0zM768 768c0 23.564-19.103 42.667-42.667 42.667v0h-426.667c-23.564 0-42.667-19.103-42.667-42.667v0-341.333h512zM853.333 341.333h-682.667v-85.333c0-23.564 19.103-42.667 42.667-42.667v0h597.333c23.564 0 42.667 19.103 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["archive"]},"attrs":[],"properties":{"order":4538,"id":1146,"name":"archive","prevSize":32,"code":59707},"setIdx":0,"setId":0,"iconIdx":59},{"icon":{"paths":["M938.667 853.333h-42.667v-512h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-42.667v-128c0-23.564-19.103-42.667-42.667-42.667v0h-682.667c-23.564 0-42.667 19.103-42.667 42.667v0 128h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h42.667v512h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h853.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM640 853.333h-256v-150.613c-0-0.177-0.001-0.387-0.001-0.596 0-95.726 50.764-179.596 126.841-226.157l1.16-0.66c77.236 47.221 128.001 131.090 128.001 226.817 0 0.21-0 0.419-0.001 0.629l0-0.032zM810.667 853.333h-85.333v-150.613c0.002-0.453 0.003-0.988 0.003-1.524 0-136.26-78.181-254.26-192.134-311.589l-2.003-0.913c-5.59-2.877-12.198-4.564-19.2-4.564s-13.61 1.687-19.44 4.676l0.24-0.112c-115.955 58.242-194.137 176.242-194.137 312.503 0 0.536 0.001 1.071 0.004 1.607l-0-0.083v150.613h-85.333v-512h597.333zM810.667 256h-597.333v-85.333h597.333z"],"attrs":[],"grid":0,"tags":["archway"]},"attrs":[],"properties":{"order":4539,"id":1145,"name":"archway","prevSize":32,"code":59708},"setIdx":0,"setId":0,"iconIdx":60},{"icon":{"paths":["M298.667 469.333h426.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-170.667v-153.173l33.707 34.133c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003-106.667-106.667c-3.937-3.773-8.616-6.808-13.791-8.859l-0.289-0.101c-4.793-2.024-10.366-3.201-16.213-3.201s-11.42 1.176-16.495 3.305l0.281-0.105c-5.464 2.152-10.143 5.187-14.095 8.974l0.015-0.014-106.667 106.667c-7.753 7.753-12.548 18.463-12.548 30.293 0 23.661 19.181 42.841 42.841 42.841 11.83 0 22.541-4.795 30.293-12.548l-0 0 33.707-34.133v153.173h-170.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM725.333 554.667h-426.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h170.667v153.173l-33.707-34.133c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l106.667 106.667c3.937 3.773 8.616 6.808 13.791 8.859l0.289 0.101c4.771 2.163 10.345 3.423 16.213 3.423s11.443-1.26 16.466-3.525l-0.253 0.102c5.464-2.152 10.143-5.187 14.095-8.974l-0.015 0.014 106.667-106.667c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l0-0-33.707 34.133v-153.173h170.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["arrow-break"]},"attrs":[],"properties":{"order":4540,"id":1144,"name":"arrow-break","prevSize":32,"code":59709},"setIdx":0,"setId":0,"iconIdx":61},{"icon":{"paths":["M481.707 670.293c3.937 3.773 8.616 6.808 13.791 8.859l0.289 0.101c4.793 2.024 10.366 3.201 16.213 3.201s11.42-1.176 16.495-3.305l-0.281 0.105c5.464-2.152 10.143-5.187 14.095-8.974l-0.015 0.014 128-128c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l0-0-55.040 55.467v-153.173c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 153.173l-55.040-55.467c-7.733-7.795-18.45-12.621-30.293-12.621s-22.56 4.826-30.291 12.618l-0.003 0.003c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003zM512 938.667c235.641 0 426.667-191.025 426.667-426.667s-191.025-426.667-426.667-426.667c-235.641 0-426.667 191.025-426.667 426.667v0c0 235.641 191.025 426.667 426.667 426.667v0zM512 170.667c188.513 0 341.333 152.82 341.333 341.333s-152.82 341.333-341.333 341.333c-188.513 0-341.333-152.82-341.333-341.333v0c0-188.513 152.82-341.333 341.333-341.333v0z"],"attrs":[],"grid":0,"tags":["arrow-circle-down"]},"attrs":[],"properties":{"order":4541,"id":1143,"name":"arrow-circle-down","prevSize":32,"code":59710},"setIdx":0,"setId":0,"iconIdx":62},{"icon":{"paths":["M353.707 481.707c-3.773 3.937-6.808 8.616-8.859 13.791l-0.101 0.289c-2.024 4.793-3.201 10.366-3.201 16.213s1.176 11.42 3.305 16.495l-0.105-0.281c2.152 5.464 5.187 10.143 8.974 14.095l-0.014-0.015 128 128c7.753 7.753 18.463 12.548 30.293 12.548 23.661 0 42.841-19.181 42.841-42.841 0-11.83-4.795-22.541-12.548-30.293l0 0-55.467-55.040h153.173c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-153.173l55.467-55.040c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003c-7.733-7.795-18.45-12.621-30.293-12.621s-22.56 4.826-30.291 12.618l-0.003 0.003zM85.333 512c0 235.641 191.025 426.667 426.667 426.667s426.667-191.025 426.667-426.667c0-235.641-191.025-426.667-426.667-426.667v0c-235.641 0-426.667 191.025-426.667 426.667v0zM853.333 512c0 188.513-152.82 341.333-341.333 341.333s-341.333-152.82-341.333-341.333c0-188.513 152.82-341.333 341.333-341.333v0c188.513 0 341.333 152.82 341.333 341.333v0z"],"attrs":[],"grid":0,"tags":["arrow-circle-left"]},"attrs":[],"properties":{"order":4542,"id":1142,"name":"arrow-circle-left","prevSize":32,"code":59711},"setIdx":0,"setId":0,"iconIdx":63},{"icon":{"paths":["M670.293 542.293c3.773-3.937 6.808-8.616 8.859-13.791l0.101-0.289c2.024-4.793 3.201-10.366 3.201-16.213s-1.176-11.42-3.305-16.495l0.105 0.281c-2.152-5.464-5.187-10.143-8.974-14.095l0.014 0.015-128-128c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l-0-0 55.467 55.040h-153.173c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h153.173l-55.467 55.040c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003zM938.667 512c0-235.641-191.025-426.667-426.667-426.667s-426.667 191.025-426.667 426.667c0 235.641 191.025 426.667 426.667 426.667v0c235.641 0 426.667-191.025 426.667-426.667v0zM170.667 512c0-188.513 152.82-341.333 341.333-341.333s341.333 152.82 341.333 341.333c0 188.513-152.82 341.333-341.333 341.333v0c-188.513 0-341.333-152.82-341.333-341.333v0z"],"attrs":[],"grid":0,"tags":["arrow-circle-right"]},"attrs":[],"properties":{"order":4543,"id":1141,"name":"arrow-circle-right","prevSize":32,"code":59712},"setIdx":0,"setId":0,"iconIdx":64},{"icon":{"paths":["M542.293 353.707c-3.937-3.773-8.616-6.808-13.791-8.859l-0.289-0.101c-4.793-2.024-10.366-3.201-16.213-3.201s-11.42 1.176-16.495 3.305l0.281-0.105c-5.464 2.152-10.143 5.187-14.095 8.974l0.015-0.014-128 128c-7.753 7.753-12.548 18.463-12.548 30.293 0 23.661 19.181 42.841 42.841 42.841 11.83 0 22.541-4.795 30.293-12.548l-0 0 55.040-55.467v153.173c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-153.173l55.040 55.467c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003zM512 85.333c-235.641 0-426.667 191.025-426.667 426.667s191.025 426.667 426.667 426.667c235.641 0 426.667-191.025 426.667-426.667v0c0-235.641-191.025-426.667-426.667-426.667v0zM512 853.333c-188.513 0-341.333-152.82-341.333-341.333s152.82-341.333 341.333-341.333c188.513 0 341.333 152.82 341.333 341.333v0c0 188.513-152.82 341.333-341.333 341.333v0z"],"attrs":[],"grid":0,"tags":["arrow-circle-up"]},"attrs":[],"properties":{"order":4544,"id":1140,"name":"arrow-circle-up","prevSize":32,"code":59713},"setIdx":0,"setId":0,"iconIdx":65},{"icon":{"paths":["M512 213.333c-23.564 0-42.667 19.103-42.667 42.667v0 512c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-512c0-23.564-19.103-42.667-42.667-42.667v0zM456.96 481.707l-106.667-106.667c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l0 0 34.133 33.707h-195.84c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h195.84l-34.133 33.707c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 106.667-106.667c3.773-3.937 6.808-8.616 8.859-13.791l0.101-0.289c2.163-4.771 3.423-10.345 3.423-16.213s-1.26-11.443-3.525-16.466l0.102 0.253c-2.152-5.464-5.187-10.143-8.974-14.095l0.014 0.015zM896 469.333h-195.84l34.133-33.707c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l-106.667 106.667c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003 106.667 106.667c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003-34.133-33.707h195.84c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["arrow-compress-h"]},"attrs":[],"properties":{"order":4545,"id":1139,"name":"arrow-compress-h","prevSize":32,"code":59714},"setIdx":0,"setId":0,"iconIdx":66},{"icon":{"paths":["M725.333 682.667h-323.84l354.133-353.707c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l-0 0-353.707 354.133v-323.84c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 426.667c0.073 5.873 1.322 11.435 3.52 16.489l-0.107-0.275c4.422 10.46 12.58 18.618 22.76 22.935l0.28 0.105c4.778 2.092 10.34 3.34 16.186 3.413l0.027 0h426.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["arrow-down-left"]},"attrs":[],"properties":{"order":4546,"id":1138,"name":"arrow-down-left","prevSize":32,"code":59715},"setIdx":0,"setId":0,"iconIdx":67},{"icon":{"paths":["M725.333 256c-23.564 0-42.667 19.103-42.667 42.667v0 323.84l-353.707-354.133c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l-0-0 354.133 353.707h-323.84c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h426.667c5.873-0.073 11.435-1.322 16.489-3.52l-0.275 0.107c10.46-4.422 18.618-12.58 22.935-22.76l0.105-0.28c2.092-4.778 3.34-10.34 3.413-16.186l0-0.027v-426.667c0-23.564-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["arrow-down-right"]},"attrs":[],"properties":{"order":4547,"id":1137,"name":"arrow-down-right","prevSize":32,"code":59716},"setIdx":0,"setId":0,"iconIdx":68},{"icon":{"paths":["M755.627 481.707c-7.733-7.795-18.45-12.621-30.293-12.621s-22.56 4.826-30.291 12.618l-0.003 0.003-140.373 140.8v-323.84c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 323.84l-140.373-140.8c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l213.333 213.333c3.937 3.773 8.616 6.808 13.791 8.859l0.289 0.101c4.771 2.163 10.345 3.423 16.213 3.423s11.443-1.26 16.466-3.525l-0.253 0.102c5.464-2.152 10.143-5.187 14.095-8.974l-0.015 0.014 213.333-213.333c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003z"],"attrs":[],"grid":0,"tags":["arrow-down"]},"attrs":[],"properties":{"order":4548,"id":1136,"name":"arrow-down","prevSize":32,"code":59717},"setIdx":0,"setId":0,"iconIdx":69},{"icon":{"paths":["M128 170.667c-23.564 0-42.667 19.103-42.667 42.667v0 597.333c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-597.333c0-23.564-19.103-42.667-42.667-42.667v0zM935.253 495.787c-2.152-5.464-5.187-10.143-8.974-14.095l0.014 0.015-170.667-170.667c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l0 0 98.133 97.707h-494.507c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h494.507l-98.133 97.707c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 170.667-170.667c3.773-3.937 6.808-8.616 8.859-13.791l0.101-0.289c2.024-4.793 3.201-10.366 3.201-16.213s-1.176-11.42-3.305-16.495l0.105 0.281z"],"attrs":[],"grid":0,"tags":["arrow-from-right"]},"attrs":[],"properties":{"order":4549,"id":1135,"name":"arrow-from-right","prevSize":32,"code":59718},"setIdx":0,"setId":0,"iconIdx":70},{"icon":{"paths":["M652.373 695.040l-97.707 98.133v-494.507c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 494.507l-97.707-98.133c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l170.667 170.667c3.937 3.773 8.616 6.808 13.791 8.859l0.289 0.101c4.771 2.163 10.345 3.423 16.213 3.423s11.443-1.26 16.466-3.525l-0.253 0.102c5.464-2.152 10.143-5.187 14.095-8.974l-0.015 0.014 170.667-170.667c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l0-0zM810.667 85.333h-597.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h597.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["arrow-from-top"]},"attrs":[],"properties":{"order":4550,"id":1134,"name":"arrow-from-top","prevSize":32,"code":59719},"setIdx":0,"setId":0,"iconIdx":71},{"icon":{"paths":["M935.253 282.453c-4.422-10.46-12.58-18.618-22.76-22.935l-0.28-0.105c-4.778-2.092-10.34-3.34-16.186-3.413l-0.027-0h-213.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h110.507l-238.507 238.507-140.373-140.8c-7.733-7.795-18.45-12.621-30.293-12.621s-22.56 4.826-30.291 12.618l-0.003 0.003-256 256c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 225.707-226.133 140.373 140.8c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 268.373-268.8v110.507c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-213.333c-0.073-5.873-1.322-11.435-3.52-16.489l0.107 0.275z"],"attrs":[],"grid":0,"tags":["arrow-growth"]},"attrs":[],"properties":{"order":4551,"id":1133,"name":"arrow-growth","prevSize":32,"code":59720},"setIdx":0,"setId":0,"iconIdx":72},{"icon":{"paths":["M725.333 469.333h-323.84l140.8-140.373c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l-213.333 213.333c-3.773 3.937-6.808 8.616-8.859 13.791l-0.101 0.289c-2.024 4.793-3.201 10.366-3.201 16.213s1.176 11.42 3.305 16.495l-0.105-0.281c2.152 5.464 5.187 10.143 8.974 14.095l-0.014-0.015 213.333 213.333c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003-140.8-140.373h323.84c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["arrow-left"]},"attrs":[],"properties":{"order":4552,"id":1132,"name":"arrow-left","prevSize":32,"code":59721},"setIdx":0,"setId":0,"iconIdx":73},{"icon":{"paths":["M371.2 426.667c7.712 7.668 18.343 12.407 30.080 12.407s22.368-4.74 30.082-12.409l-0.002 0.002c7.668-7.712 12.407-18.343 12.407-30.080s-4.74-22.368-12.409-30.082l0.002 0.002-267.52-268.8c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l-0-0zM896 597.333c-23.564 0-42.667 19.103-42.667 42.667v0 153.173l-194.56-195.84c-7.862-7.862-18.723-12.725-30.72-12.725-23.994 0-43.445 19.451-43.445 43.445 0 11.997 4.863 22.858 12.725 30.72l-0-0 195.84 194.56h-153.173c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h256c5.873-0.073 11.435-1.322 16.489-3.52l-0.275 0.107c10.46-4.422 18.618-12.58 22.935-22.76l0.105-0.28c2.092-4.778 3.34-10.34 3.413-16.186l0-0.027v-256c0-23.564-19.103-42.667-42.667-42.667v0zM935.253 111.787c-4.422-10.46-12.58-18.618-22.76-22.935l-0.28-0.105c-4.778-2.092-10.34-3.34-16.186-3.413l-0.027-0h-256c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h153.173l-695.467 695.040c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 695.040-695.467v153.173c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-256c-0.073-5.873-1.322-11.435-3.52-16.489l0.107 0.275z"],"attrs":[],"grid":0,"tags":["arrow-random"]},"attrs":[],"properties":{"order":4553,"id":1131,"name":"arrow-random","prevSize":32,"code":59722},"setIdx":0,"setId":0,"iconIdx":74},{"icon":{"paths":["M935.253 111.787c-4.422-10.46-12.58-18.618-22.76-22.935l-0.28-0.105c-4.778-2.092-10.34-3.34-16.186-3.413l-0.027-0h-256c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h153.173l-622.507 622.507v-153.173c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 256c0.073 5.873 1.322 11.435 3.52 16.489l-0.107-0.275c4.422 10.46 12.58 18.618 22.76 22.935l0.28 0.105c4.778 2.092 10.34 3.34 16.186 3.413l0.027 0h256c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-153.173l622.507-622.507v153.173c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-256c-0.073-5.873-1.322-11.435-3.52-16.489l0.107 0.275z"],"attrs":[],"grid":0,"tags":["arrow-resize-diagonal"]},"attrs":[],"properties":{"order":4554,"id":1130,"name":"arrow-resize-diagonal","prevSize":32,"code":59723},"setIdx":0,"setId":0,"iconIdx":75},{"icon":{"paths":["M764.587 495.787c-2.152-5.464-5.187-10.143-8.974-14.095l0.014 0.015-213.333-213.333c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l-0-0 140.8 140.373h-323.84c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h323.84l-140.8 140.373c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 213.333-213.333c3.773-3.937 6.808-8.616 8.859-13.791l0.101-0.289c2.024-4.793 3.201-10.366 3.201-16.213s-1.176-11.42-3.305-16.495l0.105 0.281z"],"attrs":[],"grid":0,"tags":["arrow-right"]},"attrs":[],"properties":{"order":4555,"id":1129,"name":"arrow-right","prevSize":32,"code":59724},"setIdx":0,"setId":0,"iconIdx":76},{"icon":{"paths":["M810.667 853.333h-597.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h597.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM481.707 755.627c3.937 3.773 8.616 6.808 13.791 8.859l0.289 0.101c4.771 2.163 10.345 3.423 16.213 3.423s11.443-1.26 16.466-3.525l-0.253 0.102c5.464-2.152 10.143-5.187 14.095-8.974l-0.015 0.014 170.667-170.667c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l0-0-97.707 98.133v-494.507c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 494.507l-97.707-98.133c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l0 0z"],"attrs":[],"grid":0,"tags":["arrow-to-bottom"]},"attrs":[],"properties":{"order":4556,"id":1128,"name":"arrow-to-bottom","prevSize":32,"code":59725},"setIdx":0,"setId":0,"iconIdx":77},{"icon":{"paths":["M755.627 481.707l-170.667-170.667c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l0 0 98.133 97.707h-494.507c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h494.507l-98.133 97.707c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 170.667-170.667c3.773-3.937 6.808-8.616 8.859-13.791l0.101-0.289c2.024-4.793 3.201-10.366 3.201-16.213s-1.176-11.42-3.305-16.495l0.105 0.281c-2.152-5.464-5.187-10.143-8.974-14.095l0.014 0.015zM896 170.667c-23.564 0-42.667 19.103-42.667 42.667v0 597.333c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-597.333c0-23.564-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["arrow-to-right"]},"attrs":[],"properties":{"order":4557,"id":1127,"name":"arrow-to-right","prevSize":32,"code":59726},"setIdx":0,"setId":0,"iconIdx":78},{"icon":{"paths":["M401.493 341.333h323.84c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-426.667c-5.873 0.073-11.435 1.322-16.489 3.52l0.275-0.107c-10.46 4.422-18.618 12.58-22.935 22.76l-0.105 0.28c-2.092 4.778-3.34 10.34-3.413 16.186l-0 0.027v426.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-323.84l353.707 354.133c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003z"],"attrs":[],"grid":0,"tags":["arrow-up-left"]},"attrs":[],"properties":{"order":4558,"id":1126,"name":"arrow-up-left","prevSize":32,"code":59727},"setIdx":0,"setId":0,"iconIdx":79},{"icon":{"paths":["M764.587 282.453c-4.422-10.46-12.58-18.618-22.76-22.935l-0.28-0.105c-4.778-2.092-10.34-3.34-16.186-3.413l-0.027-0h-426.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h323.84l-354.133 353.707c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 353.707-354.133v323.84c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-426.667c-0.073-5.873-1.322-11.435-3.52-16.489l0.107 0.275z"],"attrs":[],"grid":0,"tags":["arrow-up-right"]},"attrs":[],"properties":{"order":4559,"id":1125,"name":"arrow-up-right","prevSize":32,"code":59728},"setIdx":0,"setId":0,"iconIdx":80},{"icon":{"paths":["M755.627 481.707l-213.333-213.333c-3.937-3.773-8.616-6.808-13.791-8.859l-0.289-0.101c-4.793-2.024-10.366-3.201-16.213-3.201s-11.42 1.176-16.495 3.305l0.281-0.105c-5.464 2.152-10.143 5.187-14.095 8.974l0.015-0.014-213.333 213.333c-7.753 7.753-12.548 18.463-12.548 30.293 0 23.661 19.181 42.841 42.841 42.841 11.83 0 22.541-4.795 30.293-12.548l-0 0 140.373-140.8v323.84c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-323.84l140.373 140.8c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003z"],"attrs":[],"grid":0,"tags":["arrow-up"]},"attrs":[],"properties":{"order":4560,"id":1124,"name":"arrow-up","prevSize":32,"code":59729},"setIdx":0,"setId":0,"iconIdx":81},{"icon":{"paths":["M414.293 268.373c-7.733-7.795-18.45-12.621-30.293-12.621s-22.56 4.826-30.291 12.618l-0.003 0.003-213.333 213.333c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003 213.333 213.333c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003-183.467-183.040 183.467-183.040c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003zM883.627 481.707l-213.333-213.333c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l-0-0 183.467 183.040-183.467 183.040c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 213.333-213.333c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003z"],"attrs":[],"grid":0,"tags":["arrow"]},"attrs":[],"properties":{"order":4561,"id":1123,"name":"arrow","prevSize":32,"code":59730},"setIdx":0,"setId":0,"iconIdx":82},{"icon":{"paths":["M935.253 495.787c-2.152-5.464-5.187-10.143-8.974-14.095l0.014 0.015-106.667-106.667c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l-0-0 34.133 33.707h-195.84c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h195.84l-34.133 33.707c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 106.667-106.667c3.773-3.937 6.808-8.616 8.859-13.791l0.101-0.289c2.024-4.793 3.201-10.366 3.201-16.213s-1.176-11.42-3.305-16.495l0.105 0.281zM426.667 469.333h-195.84l34.133-33.707c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l-106.667 106.667c-3.773 3.937-6.808 8.616-8.859 13.791l-0.101 0.289c-2.024 4.793-3.201 10.366-3.201 16.213s1.176 11.42 3.305 16.495l-0.105-0.281c2.152 5.464 5.187 10.143 8.974 14.095l-0.014-0.015 106.667 106.667c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003-34.133-33.707h195.84c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["arrows-h-alt"]},"attrs":[],"properties":{"order":4562,"id":1122,"name":"arrows-h-alt","prevSize":32,"code":59731},"setIdx":0,"setId":0,"iconIdx":83},{"icon":{"paths":["M935.253 495.787c-2.152-5.464-5.187-10.143-8.974-14.095l0.014 0.015-170.667-170.667c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l0 0 98.133 97.707h-562.347l98.133-97.707c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l-170.667 170.667c-3.773 3.937-6.808 8.616-8.859 13.791l-0.101 0.289c-2.024 4.793-3.201 10.366-3.201 16.213s1.176 11.42 3.305 16.495l-0.105-0.281c2.152 5.464 5.187 10.143 8.974 14.095l-0.014-0.015 170.667 170.667c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003-98.133-97.707h562.347l-98.133 97.707c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 170.667-170.667c3.773-3.937 6.808-8.616 8.859-13.791l0.101-0.289c2.024-4.793 3.201-10.366 3.201-16.213s-1.176-11.42-3.305-16.495l0.105 0.281z"],"attrs":[],"grid":0,"tags":["arrows-h"]},"attrs":[],"properties":{"order":4563,"id":1121,"name":"arrows-h","prevSize":32,"code":59732},"setIdx":0,"setId":0,"iconIdx":84},{"icon":{"paths":["M926.293 695.040c-7.733-7.795-18.45-12.621-30.293-12.621s-22.56 4.826-30.291 12.618l-0.003 0.003-97.707 98.133v-409.173c0-70.692-57.308-128-128-128v0h-409.173l98.133-97.707c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l-170.667 170.667c-3.773 3.937-6.808 8.616-8.859 13.791l-0.101 0.289c-2.024 4.793-3.201 10.366-3.201 16.213s1.176 11.42 3.305 16.495l-0.105-0.281c2.152 5.464 5.187 10.143 8.974 14.095l-0.014-0.015 170.667 170.667c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003-98.133-97.707h409.173c23.564 0 42.667 19.103 42.667 42.667v0 409.173l-97.707-98.133c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l170.667 170.667c3.937 3.773 8.616 6.808 13.791 8.859l0.289 0.101c4.771 2.163 10.345 3.423 16.213 3.423s11.443-1.26 16.466-3.525l-0.253 0.102c5.464-2.152 10.143-5.187 14.095-8.974l-0.015 0.014 170.667-170.667c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003z"],"attrs":[],"grid":0,"tags":["arrows-left-down"]},"attrs":[],"properties":{"order":4564,"id":1120,"name":"arrows-left-down","prevSize":32,"code":59733},"setIdx":0,"setId":0,"iconIdx":85},{"icon":{"paths":["M896 597.333c-23.564 0-42.667 19.103-42.667 42.667v0 153.173l-622.507-622.507h153.173c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-256c-5.873 0.073-11.435 1.322-16.489 3.52l0.275-0.107c-10.46 4.422-18.618 12.58-22.935 22.76l-0.105 0.28c-2.092 4.778-3.34 10.34-3.413 16.186l-0 0.027v256c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-153.173l622.507 622.507h-153.173c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h256c5.873-0.073 11.435-1.322 16.489-3.52l-0.275 0.107c10.46-4.422 18.618-12.58 22.935-22.76l0.105-0.28c2.092-4.778 3.34-10.34 3.413-16.186l0-0.027v-256c0-23.564-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["arrows-maximize"]},"attrs":[],"properties":{"order":4565,"id":1119,"name":"arrows-maximize","prevSize":32,"code":59734},"setIdx":0,"setId":0,"iconIdx":86},{"icon":{"paths":["M456.96 481.707l-106.667-106.667c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l0 0 34.133 33.707h-153.173v-170.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 426.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-170.667h153.173l-34.133 33.707c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 106.667-106.667c3.773-3.937 6.808-8.616 8.859-13.791l0.101-0.289c2.024-4.793 3.201-10.366 3.201-16.213s-1.176-11.42-3.305-16.495l0.105 0.281c-2.152-5.464-5.187-10.143-8.974-14.095l0.014 0.015zM896 256c-23.564 0-42.667 19.103-42.667 42.667v0 170.667h-153.173l34.133-33.707c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l-106.667 106.667c-3.773 3.937-6.808 8.616-8.859 13.791l-0.101 0.289c-2.024 4.793-3.201 10.366-3.201 16.213s1.176 11.42 3.305 16.495l-0.105-0.281c2.152 5.464 5.187 10.143 8.974 14.095l-0.014-0.015 106.667 106.667c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003-34.133-33.707h153.173v170.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-426.667c0-23.564-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["arrows-merge"]},"attrs":[],"properties":{"order":4566,"id":1118,"name":"arrows-merge","prevSize":32,"code":59735},"setIdx":0,"setId":0,"iconIdx":87},{"icon":{"paths":["M426.667 256c-23.564 0-42.667 19.103-42.667 42.667v0 170.667h-153.173l34.133-33.707c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l-106.667 106.667c-3.773 3.937-6.808 8.616-8.859 13.791l-0.101 0.289c-2.024 4.793-3.201 10.366-3.201 16.213s1.176 11.42 3.305 16.495l-0.105-0.281c2.152 5.464 5.187 10.143 8.974 14.095l-0.014-0.015 106.667 106.667c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003-34.133-33.707h153.173v170.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-426.667c0-23.564-19.103-42.667-42.667-42.667v0zM935.253 495.787c-2.152-5.464-5.187-10.143-8.974-14.095l0.014 0.015-106.667-106.667c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l-0-0 34.133 33.707h-153.173v-170.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 426.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-170.667h153.173l-34.133 33.707c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 106.667-106.667c3.773-3.937 6.808-8.616 8.859-13.791l0.101-0.289c2.024-4.793 3.201-10.366 3.201-16.213s-1.176-11.42-3.305-16.495l0.105 0.281z"],"attrs":[],"grid":0,"tags":["arrows-resize-h"]},"attrs":[],"properties":{"order":4567,"id":1117,"name":"arrows-resize-h","prevSize":32,"code":59736},"setIdx":0,"setId":0,"iconIdx":88},{"icon":{"paths":["M682.667 469.333h-128v-238.507l33.707 34.133c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003-106.667-106.667c-3.937-3.773-8.616-6.808-13.791-8.859l-0.289-0.101c-4.793-2.024-10.366-3.201-16.213-3.201s-11.42 1.176-16.495 3.305l0.281-0.105c-5.464 2.152-10.143 5.187-14.095 8.974l0.015-0.014-106.667 106.667c-7.753 7.753-12.548 18.463-12.548 30.293 0 23.661 19.181 42.841 42.841 42.841 11.83 0 22.541-4.795 30.293-12.548l-0 0 33.707-34.133v238.507h-128c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h128v238.507l-33.707-34.133c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l106.667 106.667c3.937 3.773 8.616 6.808 13.791 8.859l0.289 0.101c4.771 2.163 10.345 3.423 16.213 3.423s11.443-1.26 16.466-3.525l-0.253 0.102c5.464-2.152 10.143-5.187 14.095-8.974l-0.015 0.014 106.667-106.667c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l0-0-33.707 34.133v-238.507h128c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["arrows-resize-v"]},"attrs":[],"properties":{"order":4568,"id":1116,"name":"arrows-resize-v","prevSize":32,"code":59737},"setIdx":0,"setId":0,"iconIdx":89},{"icon":{"paths":["M935.253 495.787c-2.152-5.464-5.187-10.143-8.974-14.095l0.014 0.015-106.667-106.667c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l-0-0 34.133 33.707h-238.507v-128c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 128h-238.507l34.133-33.707c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l-106.667 106.667c-3.773 3.937-6.808 8.616-8.859 13.791l-0.101 0.289c-2.024 4.793-3.201 10.366-3.201 16.213s1.176 11.42 3.305 16.495l-0.105-0.281c2.152 5.464 5.187 10.143 8.974 14.095l-0.014-0.015 106.667 106.667c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003-34.133-33.707h238.507v128c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-128h238.507l-34.133 33.707c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 106.667-106.667c3.773-3.937 6.808-8.616 8.859-13.791l0.101-0.289c2.024-4.793 3.201-10.366 3.201-16.213s-1.176-11.42-3.305-16.495l0.105 0.281z"],"attrs":[],"grid":0,"tags":["arrows-resize"]},"attrs":[],"properties":{"order":4569,"id":1115,"name":"arrows-resize","prevSize":32,"code":59738},"setIdx":0,"setId":0,"iconIdx":90},{"icon":{"paths":["M755.627 481.707l-106.667-106.667c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l-0-0 34.133 33.707h-221.013l34.133-33.707c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548v0l-106.667 106.667c-3.773 3.937-6.808 8.616-8.859 13.791l-0.101 0.289c-2.024 4.793-3.201 10.366-3.201 16.213s1.176 11.42 3.305 16.495l-0.105-0.281c2.152 5.464 5.187 10.143 8.974 14.095l-0.014-0.015 106.667 106.667c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003-34.133-33.707h221.013l-34.133 33.707c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 106.667-106.667c3.773-3.937 6.808-8.616 8.859-13.791l0.101-0.289c2.024-4.793 3.201-10.366 3.201-16.213s-1.176-11.42-3.305-16.495l0.105 0.281c-2.152-5.464-5.187-10.143-8.974-14.095l0.014 0.015zM128 256c-23.564 0-42.667 19.103-42.667 42.667v0 426.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-426.667c0-23.564-19.103-42.667-42.667-42.667v0zM896 256c-23.564 0-42.667 19.103-42.667 42.667v0 426.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-426.667c0-23.564-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["arrows-shrink-h"]},"attrs":[],"properties":{"order":4570,"id":1114,"name":"arrows-shrink-h","prevSize":32,"code":59739},"setIdx":0,"setId":0,"iconIdx":91},{"icon":{"paths":["M892.587 282.453c-2.152-5.464-5.187-10.143-8.974-14.095l0.014 0.015-128-128c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l-0-0 55.467 55.040h-366.507c-70.692 0-128 57.308-128 128v0 366.507l-55.040-55.467c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l128 128c3.937 3.773 8.616 6.808 13.791 8.859l0.289 0.101c4.771 2.163 10.345 3.423 16.213 3.423s11.443-1.26 16.466-3.525l-0.253 0.102c5.464-2.152 10.143-5.187 14.095-8.974l-0.015 0.014 128-128c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l0-0-55.040 55.467v-366.507c0-23.564 19.103-42.667 42.667-42.667v0h366.507l-55.467 55.040c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 128-128c3.773-3.937 6.808-8.616 8.859-13.791l0.101-0.289c2.024-4.793 3.201-10.366 3.201-16.213s-1.176-11.42-3.305-16.495l0.105 0.281z"],"attrs":[],"grid":0,"tags":["arrows-right-down"]},"attrs":[],"properties":{"order":4571,"id":1113,"name":"arrows-right-down","prevSize":32,"code":59740},"setIdx":0,"setId":0,"iconIdx":92},{"icon":{"paths":["M588.373 435.627c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003-106.667-106.667c-3.937-3.773-8.616-6.808-13.791-8.859l-0.289-0.101c-4.793-2.024-10.366-3.201-16.213-3.201s-11.42 1.176-16.495 3.305l0.281-0.105c-5.464 2.152-10.143 5.187-14.095 8.974l0.015-0.014-106.667 106.667c-7.753 7.753-12.548 18.463-12.548 30.293 0 23.661 19.181 42.841 42.841 42.841 11.83 0 22.541-4.795 30.293-12.548l-0 0 33.707-34.133v221.013l-33.707-34.133c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l106.667 106.667c3.937 3.773 8.616 6.808 13.791 8.859l0.289 0.101c4.771 2.163 10.345 3.423 16.213 3.423s11.443-1.26 16.466-3.525l-0.253 0.102c5.464-2.152 10.143-5.187 14.095-8.974l-0.015 0.014 106.667-106.667c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l0-0-33.707 34.133v-221.013zM298.667 170.667h426.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-426.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM725.333 853.333h-426.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h426.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["arrows-shrink-v"]},"attrs":[],"properties":{"order":4572,"id":1112,"name":"arrows-shrink-v","prevSize":32,"code":59741},"setIdx":0,"setId":0,"iconIdx":93},{"icon":{"paths":["M892.587 709.12c-2.152-5.464-5.187-10.143-8.974-14.095l0.014 0.015-128-128c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l-0-0 55.467 55.040h-366.507c-23.564 0-42.667-19.103-42.667-42.667v0-366.507l55.040 55.467c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003-128-128c-3.937-3.773-8.616-6.808-13.791-8.859l-0.289-0.101c-4.793-2.024-10.366-3.201-16.213-3.201s-11.42 1.176-16.495 3.305l0.281-0.105c-5.464 2.152-10.143 5.187-14.095 8.974l0.015-0.014-128 128c-7.753 7.753-12.548 18.463-12.548 30.293 0 23.661 19.181 42.841 42.841 42.841 11.83 0 22.541-4.795 30.293-12.548l-0 0 55.040-55.467v366.507c0 70.692 57.308 128 128 128v0h366.507l-55.467 55.040c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 128-128c3.773-3.937 6.808-8.616 8.859-13.791l0.101-0.289c2.024-4.793 3.201-10.366 3.201-16.213s-1.176-11.42-3.305-16.495l0.105 0.281z"],"attrs":[],"grid":0,"tags":["arrows-up-right"]},"attrs":[],"properties":{"order":4573,"id":1111,"name":"arrows-up-right","prevSize":32,"code":59742},"setIdx":0,"setId":0,"iconIdx":94},{"icon":{"paths":["M435.627 264.96l33.707-34.133v195.84c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-195.84l33.707 34.133c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003-106.667-106.667c-3.937-3.773-8.616-6.808-13.791-8.859l-0.289-0.101c-4.793-2.024-10.366-3.201-16.213-3.201s-11.42 1.176-16.495 3.305l0.281-0.105c-5.464 2.152-10.143 5.187-14.095 8.974l0.015-0.014-106.667 106.667c-7.753 7.753-12.548 18.463-12.548 30.293 0 23.661 19.181 42.841 42.841 42.841 11.83 0 22.541-4.795 30.293-12.548l-0 0zM588.373 759.040l-33.707 34.133v-195.84c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 195.84l-33.707-34.133c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l106.667 106.667c3.937 3.773 8.616 6.808 13.791 8.859l0.289 0.101c4.771 2.163 10.345 3.423 16.213 3.423s11.443-1.26 16.466-3.525l-0.253 0.102c5.464-2.152 10.143-5.187 14.095-8.974l-0.015 0.014 106.667-106.667c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l0-0z"],"attrs":[],"grid":0,"tags":["arrows-v-alt"]},"attrs":[],"properties":{"order":4574,"id":1110,"name":"arrows-v-alt","prevSize":32,"code":59743},"setIdx":0,"setId":0,"iconIdx":95},{"icon":{"paths":["M652.373 695.040l-97.707 98.133v-562.347l97.707 98.133c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003-170.667-170.667c-3.937-3.773-8.616-6.808-13.791-8.859l-0.289-0.101c-4.793-2.024-10.366-3.201-16.213-3.201s-11.42 1.176-16.495 3.305l0.281-0.105c-5.464 2.152-10.143 5.187-14.095 8.974l0.015-0.014-170.667 170.667c-7.753 7.753-12.548 18.463-12.548 30.293 0 23.661 19.181 42.841 42.841 42.841 11.83 0 22.541-4.795 30.293-12.548l0-0 97.707-98.133v562.347l-97.707-98.133c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l170.667 170.667c3.937 3.773 8.616 6.808 13.791 8.859l0.289 0.101c4.771 2.163 10.345 3.423 16.213 3.423s11.443-1.26 16.466-3.525l-0.253 0.102c5.464-2.152 10.143-5.187 14.095-8.974l-0.015 0.014 170.667-170.667c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l0-0z"],"attrs":[],"grid":0,"tags":["arrows-v"]},"attrs":[],"properties":{"order":4575,"id":1109,"name":"arrows-v","prevSize":32,"code":59744},"setIdx":0,"setId":0,"iconIdx":96},{"icon":{"paths":["M469.333 128c-164.949 0-298.667 133.718-298.667 298.667v0c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0c0-117.821 95.513-213.333 213.333-213.333s213.333 95.513 213.333 213.333v0c-0.145 40.481-11.386 78.306-30.838 110.629l0.545-0.976-151.893 317.013c-15.015 25.662-42.428 42.633-73.809 42.667l-0.005 0c-47.128 0-85.333-38.205-85.333-85.333v0c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0c0 94.257 76.41 170.667 170.667 170.667v0c63.984-0.059 119.719-35.319 148.89-87.457l0.444-0.863 151.893-317.013c25.211-42.612 40.107-93.913 40.107-148.692 0-0.226-0-0.451-0.001-0.676l0 0.035c0-164.949-133.718-298.667-298.667-298.667v0zM170.667 640c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM750.507 51.2c-7.042-5.327-15.947-8.533-25.6-8.533-23.564 0-42.667 19.103-42.667 42.667 0 13.911 6.657 26.267 16.959 34.056l0.107 0.078c93.85 70.724 153.919 181.936 154.027 307.182l0 0.018c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0c-0.536-152.989-73.791-288.759-186.987-374.614l-1.173-0.853zM469.333 384c23.564 0 42.667 19.103 42.667 42.667v0c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0c0-70.692-57.308-128-128-128s-128 57.308-128 128v0c-0 0.085-0 0.185-0 0.286 0 26.629 8.131 51.358 22.047 71.841l-0.286-0.447c6.105 8.605 12.697 16.145 19.972 22.964l0.082 0.076 8.533 9.387c4.494 6.653 7.174 14.854 7.174 23.68s-2.68 17.027-7.271 23.832l0.096-0.152c-4.756 6.785-7.6 15.213-7.6 24.306 0 14.431 7.165 27.189 18.131 34.911l0.135 0.090c6.782 4.786 15.213 7.658 24.314 7.68l0.006 0c14.439-0.025 27.193-7.218 34.896-18.21l0.091-0.137c14.015-20.232 22.388-45.298 22.388-72.32s-8.373-52.088-22.667-72.746l0.279 0.426c-4.724-6.66-9.627-12.511-14.956-17.943l0.022 0.023-5.973-5.973c-2.465-2.329-4.704-4.839-6.717-7.528l-0.109-0.152c-4.543-6.679-7.253-14.922-7.253-23.798 0-0.034 0-0.067 0-0.101l-0 0.005c0-23.564 19.103-42.667 42.667-42.667v0zM298.667 640c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667c-23.564 0-42.667 19.103-42.667 42.667v0c0 23.564 19.103 42.667 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["assistive-listening-systems"]},"attrs":[],"properties":{"order":4576,"id":1108,"name":"assistive-listening-systems","prevSize":32,"code":59745},"setIdx":0,"setId":0,"iconIdx":97},{"icon":{"paths":["M791.979 624.375l-194.632-112.375 194.632-112.375c12.837-7.518 21.321-21.242 21.321-36.947 0-23.568-19.106-42.673-42.673-42.673-7.847 0-15.199 2.118-21.516 5.813l0.202-0.109-194.645 112.383v-224.758c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 224.758l-194.645-112.384c-6.115-3.586-13.468-5.704-21.314-5.704-23.568 0-42.673 19.106-42.673 42.673 0 15.706 8.485 29.43 21.12 36.838l0.201 0.109 194.632 112.376-194.632 112.375c-12.837 7.518-21.321 21.242-21.321 36.947 0 23.568 19.106 42.673 42.673 42.673 7.847 0 15.199-2.118 21.516-5.813l-0.202 0.109 194.645-112.383v224.758c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-224.758l194.645 112.384c6.115 3.586 13.468 5.704 21.314 5.704 23.568 0 42.673-19.106 42.673-42.673 0-15.706-8.485-29.43-21.12-36.838l-0.201-0.109z"],"attrs":[],"grid":0,"tags":["asterisk"]},"attrs":[],"properties":{"order":4577,"id":1107,"name":"asterisk","prevSize":32,"code":59746},"setIdx":0,"setId":0,"iconIdx":98},{"icon":{"paths":["M512 85.333c-0.006-0-0.012-0-0.019-0-235.641 0-426.667 191.025-426.667 426.667s191.025 426.667 426.667 426.667c78.555 0 152.151-21.229 215.365-58.263l-2.013 1.090c13.711-7.282 22.89-21.472 22.89-37.806 0-23.564-19.103-42.667-42.667-42.667-8.495 0-16.409 2.482-23.059 6.761l0.169-0.102c-48.957 28.75-107.829 45.73-170.667 45.73-188.513 0-341.333-152.82-341.333-341.333s152.82-341.333 341.333-341.333c188.486 0 341.29 152.776 341.333 341.252l0 0.004v32c0 41.237-33.429 74.667-74.667 74.667s-74.667-33.429-74.667-74.667v0-181.333c0-23.564-19.103-42.667-42.667-42.667v0c-0.283-0.007-0.615-0.011-0.949-0.011-20.394 0-37.446 14.308-41.665 33.434l-0.052 0.283c-29.804-20.847-66.739-33.416-106.595-33.706l-0.072-0c-0.683-0.009-1.489-0.014-2.296-0.014-106.039 0-192 85.961-192 192s85.961 192 192 192c56.771 0 107.787-24.639 142.938-63.807l0.158-0.179c29.466 37.896 75.063 62.045 126.301 62.045 87.593 0 158.701-70.575 159.565-157.963l0.001-0.082v-32c0-235.641-191.025-426.667-426.667-426.667v0zM512 618.667c-58.91 0-106.667-47.756-106.667-106.667s47.756-106.667 106.667-106.667c58.91 0 106.667 47.756 106.667 106.667v0c0 58.91-47.756 106.667-106.667 106.667v0z"],"attrs":[],"grid":0,"tags":["at"]},"attrs":[],"properties":{"order":4578,"id":1106,"name":"at","prevSize":32,"code":59747},"setIdx":0,"setId":0,"iconIdx":99},{"icon":{"paths":["M512 469.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM837.12 512l4.693-5.973c57.6-79.36 71.253-152.32 39.68-207.36s-102.4-79.36-198.827-69.547h-7.68c-38.827-88.32-96.427-143.787-162.987-143.787s-124.16 55.467-162.56 145.067l-8.107-1.28c-96.427-9.813-167.253 14.507-198.827 69.547s-17.92 128 39.68 207.36l4.693 5.973-4.693 5.973c-57.6 79.36-71.253 152.32-39.68 207.36 28.16 46.933 82.347 71.68 156.16 71.68 13.227 0 26.88 0 42.667-2.133h7.68c38.827 88.32 96.427 143.787 162.987 143.787s124.16-55.467 162.56-145.067h7.68c14.507 0 28.16 2.133 42.667 2.133 75.52 0 130.987-24.747 157.867-71.68 31.573-55.040 17.92-128-39.68-207.36zM216.32 341.333c10.667-18.773 42.667-29.013 85.333-29.013h20.907c-5.93 22.006-11.168 49.076-14.619 76.7l-0.314 3.086c-22.777 17.316-42.953 34.786-61.97 53.434l0.103-0.101c-32.427-42.667-41.813-82.773-29.44-104.107zM216.32 682.667c-12.373-21.333 0-61.44 28.587-105.387 18.913 18.546 39.089 36.017 60.306 52.192l1.561 1.142c3.767 30.882 9.006 58.099 15.912 84.644l-0.979-4.431c-52.907 3.413-93.013-6.827-105.387-28.16zM512 170.667c23.893 0 52.48 28.16 76.8 78.080-31.413 9.128-56.917 18.279-81.742 28.726l4.942-1.846c-19.884-8.602-45.388-17.752-71.486-25.522l-5.314-1.358c24.32-49.92 52.907-78.080 76.8-78.080zM512 853.333c-23.893 0-52.48-28.16-76.8-78.080 31.413-9.128 56.917-18.279 81.742-28.726l-4.942 1.846c19.884 8.602 45.388 17.752 71.486 25.522l5.314 1.358c-24.32 49.92-52.907 78.080-76.8 78.080zM637.013 584.107c-19.627 13.653-39.68 26.453-61.013 38.827s-42.667 23.467-64 33.28q-32-14.933-64-33.28c-21.333-12.373-42.667-25.173-61.013-38.827-2.987-23.040-2.987-46.933-2.987-72.107s0-49.067 2.987-72.107c19.627-13.653 39.68-26.453 61.013-38.827s42.667-23.467 64-33.28q32 14.933 64 33.28c21.333 12.373 42.667 25.173 61.013 38.827 0 23.040 2.987 46.933 2.987 72.107s0 49.067-2.987 72.107zM807.68 682.667c-12.373 21.333-52.48 32-105.387 28.16 5.928-22.114 11.166-49.332 14.618-77.104l0.315-3.11c22.777-17.316 42.953-34.786 61.97-53.434l-0.103 0.101c31.573 43.947 40.96 84.053 28.587 105.387zM779.093 446.72c-18.913-18.546-39.089-36.017-60.306-52.192l-1.561-1.142c-3.766-30.712-9.004-57.781-15.909-84.176l0.976 4.389h20.907c42.667 0 73.813 10.24 85.333 29.013s2.133 60.16-29.44 104.107z"],"attrs":[],"grid":0,"tags":["atom"]},"attrs":[],"properties":{"order":4579,"id":1105,"name":"atom","prevSize":32,"code":59748},"setIdx":0,"setId":0,"iconIdx":100},{"icon":{"paths":["M762.453 366.933c-6.474-14.615-20.517-24.795-37.022-25.596l-0.098-0.004h-195.413l54.187-202.24c0.954-3.366 1.503-7.231 1.503-11.225 0-9.783-3.293-18.798-8.831-25.995l0.074 0.1c-7.877-10.163-20.087-16.641-33.81-16.641-0.114 0-0.227 0-0.341 0.001l0.017-0h-298.667c-0.435-0.016-0.947-0.025-1.461-0.025-19.628 0-36.16 13.253-41.136 31.299l-0.070 0.3-114.347 426.667c-0.936 3.335-1.474 7.164-1.474 11.119 0 23.564 19.103 42.667 42.667 42.667 0.518 0 1.035-0.009 1.549-0.028l-0.074 0.002h164.267l-77.227 287.573c-0.955 3.368-1.505 7.235-1.505 11.231 0 23.564 19.103 42.667 42.667 42.667 12.615 0 23.952-5.475 31.763-14.178l0.035-0.040 465.067-512c6.921-7.558 11.161-17.67 11.161-28.773 0-6.102-1.281-11.905-3.589-17.154l0.107 0.274zM344.747 737.28l46.080-170.667c1.14-3.667 1.797-7.883 1.797-12.253 0-9.706-3.241-18.656-8.7-25.825l0.076 0.104c-7.877-10.166-20.089-16.647-33.814-16.647-0.262 0-0.524 0.002-0.785 0.007l0.039-0.001h-163.84l91.307-341.333h210.347l-54.187 202.24c-0.936 3.335-1.474 7.164-1.474 11.119 0 23.564 19.103 42.667 42.667 42.667 0.518 0 1.035-0.009 1.549-0.028l-0.074 0.002h152.32zM810.667 554.667h-42.667c-70.692 0-128 57.308-128 128v0 213.333c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-85.333h128v85.333c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-213.333c0-70.692-57.308-128-128-128v0zM853.333 725.333h-128v-42.667c0-23.564 19.103-42.667 42.667-42.667v0h42.667c23.564 0 42.667 19.103 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["auto-flash"]},"attrs":[],"properties":{"order":4580,"id":1104,"name":"auto-flash","prevSize":32,"code":59749},"setIdx":0,"setId":0,"iconIdx":101},{"icon":{"paths":["M512 42.667c-164.788 0.213-298.292 133.849-298.292 298.666 0 81.214 32.416 154.858 85.015 208.698l-0.056-0.057v388.693c0.073 23.509 19.148 42.538 42.666 42.538 7.002 0 13.61-1.687 19.441-4.676l-0.24 0.112 151.467-75.52 151.467 75.52c5.581 2.92 12.183 4.65 19.186 4.693l0.014 0c0.041 0 0.089 0 0.137 0 8.323 0 16.090-2.383 22.654-6.504l-0.178 0.104c12.121-7.665 20.053-20.997 20.053-36.181 0-0.030-0-0.060-0-0.090l0 0.005v-388.693c52.543-53.782 84.959-127.426 84.959-208.64 0-164.817-133.504-298.453-298.271-298.666l-0.021-0zM640 869.547l-108.8-54.187c-5.59-2.877-12.198-4.564-19.2-4.564s-13.61 1.687-19.44 4.676l0.24-0.112-108.8 54.187v-258.56c24.766 12 53.503 20.963 83.71 25.404l1.623 0.196v46.080c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-46.080c31.83-4.637 60.567-13.6 87.123-26.376l-1.79 0.776zM512 554.667c-117.821 0-213.333-95.513-213.333-213.333s95.513-213.333 213.333-213.333c117.821 0 213.333 95.513 213.333 213.333v0c0 117.821-95.513 213.333-213.333 213.333v0z"],"attrs":[],"grid":0,"tags":["award-alt"]},"attrs":[],"properties":{"order":4581,"id":1103,"name":"award-alt","prevSize":32,"code":59750},"setIdx":0,"setId":0,"iconIdx":102},{"icon":{"paths":["M890.453 736l-115.627-199.68c22.562-40.663 35.841-89.17 35.841-140.779 0-0.307-0-0.615-0.001-0.922l0 0.048c0-164.949-133.718-298.667-298.667-298.667s-298.667 133.718-298.667 298.667v0c-0.001 0.26-0.001 0.567-0.001 0.874 0 51.609 13.28 100.117 36.609 142.292l-0.768-1.513-115.627 199.68c-3.594 6.12-5.716 13.479-5.716 21.334 0 23.564 19.103 42.667 42.667 42.667 0.060 0 0.119-0 0.179-0l-0.009 0h122.453l62.293 104.96c2.187 3.587 4.731 6.674 7.65 9.359l0.030 0.028c7.622 7.354 17.995 11.9 29.431 11.947l0.009 0h5.973c13.371-1.879 24.591-9.723 31.038-20.706l0.109-0.201 82.347-141.653 82.347 142.933c6.641 11.014 17.845 18.699 30.928 20.456l0.219 0.024h5.973c0.076 0 0.166 0.001 0.256 0.001 11.506 0 21.949-4.555 29.623-11.96l-0.013 0.012c2.828-2.56 5.237-5.513 7.159-8.785l0.095-0.175 62.293-104.96h122.453c0.050 0 0.11 0 0.169 0 15.71 0 29.436-8.49 36.842-21.132l0.109-0.201c3.827-6.271 6.093-13.857 6.093-21.973s-2.266-15.702-6.2-22.162l0.107 0.188zM392.107 801.28l-37.973-63.573c-7.495-12.482-20.898-20.745-36.243-20.906l-0.023-0h-73.813l61.013-105.813c40.673 39.234 92.588 67.068 150.446 78.206l1.874 0.3zM512 608c-117.821 0-213.333-95.513-213.333-213.333s95.513-213.333 213.333-213.333c117.821 0 213.333 95.513 213.333 213.333v0c0 117.821-95.513 213.333-213.333 213.333v0zM706.133 716.8c-15.368 0.162-28.772 8.424-36.159 20.714l-0.107 0.193-37.973 63.573-64.853-113.067c59.533-11.672 111.256-39.463 151.994-78.603l-0.1 0.096 61.013 105.813z"],"attrs":[],"grid":0,"tags":["award"]},"attrs":[],"properties":{"order":4582,"id":1102,"name":"award","prevSize":32,"code":59751},"setIdx":0,"setId":0,"iconIdx":103},{"icon":{"paths":["M810.667 682.667c-70.692 0-128 57.308-128 128s57.308 128 128 128c70.692 0 128-57.308 128-128v0c0-70.692-57.308-128-128-128v0zM810.667 853.333c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667c23.564 0 42.667 19.103 42.667 42.667v0c0 23.564-19.103 42.667-42.667 42.667v0zM384 682.667c-70.692 0-128 57.308-128 128s57.308 128 128 128c70.692 0 128-57.308 128-128v0c0-70.692-57.308-128-128-128v0zM384 853.333c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667c23.564 0 42.667 19.103 42.667 42.667v0c0 23.564-19.103 42.667-42.667 42.667v0zM938.667 362.667c-0.242-153.069-124.264-277.091-277.31-277.333l-0.024-0h-21.333c-23.564 0-42.667 19.103-42.667 42.667v0 213.333h-276.48l-53.333-142.933c-6.229-16.338-21.768-27.734-39.968-27.734-0.049 0-0.097 0-0.146 0l0.008-0h-99.413c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h69.973l53.333 143.787 21.76 58.453v3.84c40.294 104.863 140.186 177.938 257.144 177.938 1.098 0 2.194-0.006 3.289-0.019l-0.167 0.002h128c0.127 0 0.277 0 0.427 0 152.931 0 276.907-123.975 276.907-276.907 0-0.15-0-0.3-0-0.45l0 0.023zM797.013 498.347c-34.559 34.788-82.424 56.32-135.318 56.32-0.127 0-0.255-0-0.382-0l0.020 0h-128c-0.173 0.001-0.378 0.001-0.583 0.001-79.657 0-147.908-48.835-176.448-118.198l-0.462-1.269c-0.088-0.385-0.139-0.826-0.139-1.28s0.051-0.895 0.146-1.32l-0.008 0.040-3.413-5.973h489.813c-9.836 28.132-25.314 52.13-45.199 71.653l-0.028 0.027zM682.667 341.333v-170.667c90.098 9.671 160.995 80.569 170.593 169.822l0.074 0.844z"],"attrs":[],"grid":0,"tags":["baby-carriage"]},"attrs":[],"properties":{"order":4583,"id":1101,"name":"baby-carriage","prevSize":32,"code":59752},"setIdx":0,"setId":0,"iconIdx":104},{"icon":{"paths":["M554.667 426.667h-85.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h85.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM768 426.667c-0.264-78.868-53.984-145.116-126.809-164.425l-1.191-0.268v-48.64c0-70.692-57.308-128-128-128s-128 57.308-128 128v0 48.64c-74.016 19.577-127.736 85.825-128 164.663l-0 0.030c-94.257 0-170.667 76.41-170.667 170.667v0 128c0 70.692 57.308 128 128 128v0h50.347c18.062 50.028 65.066 85.173 120.3 85.333l0.020 0h256c55.254-0.16 102.258-35.305 120.038-84.442l0.282-0.891h50.347c70.692 0 128-57.308 128-128v0-128c0-94.257-76.41-170.667-170.667-170.667v0zM256 768h-42.667c-23.564 0-42.667-19.103-42.667-42.667v0-128c0-47.128 38.205-85.333 85.333-85.333v0zM469.333 213.333c0-23.564 19.103-42.667 42.667-42.667s42.667 19.103 42.667 42.667v0 42.667h-85.333zM682.667 810.667c0 23.564-19.103 42.667-42.667 42.667v0h-256c-23.564 0-42.667-19.103-42.667-42.667v0-42.667c0-47.128 38.205-85.333 85.333-85.333v0h170.667c47.128 0 85.333 38.205 85.333 85.333v0zM682.667 621.227c-24.351-14.889-53.792-23.757-85.295-23.893l-0.038-0h-170.667c-31.541 0.136-60.983 9.005-86.067 24.31l0.734-0.416v-194.56c0-47.128 38.205-85.333 85.333-85.333v0h170.667c47.128 0 85.333 38.205 85.333 85.333v0zM853.333 725.333c0 23.564-19.103 42.667-42.667 42.667v0h-42.667v-256c47.128 0 85.333 38.205 85.333 85.333v0z"],"attrs":[],"grid":0,"tags":["backpack"]},"attrs":[],"properties":{"order":4584,"id":1100,"name":"backpack","prevSize":32,"code":59753},"setIdx":0,"setId":0,"iconIdx":105},{"icon":{"paths":["M810.667 213.333h-391.253c-35.333 0.032-67.31 14.375-90.452 37.545l-0.001 0.001-231.253 230.827c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003 231.253 230.827c23.143 23.171 55.12 37.515 90.447 37.547l391.26 0c70.692 0 128-57.308 128-128v0-341.333c0-70.692-57.308-128-128-128v0zM853.333 682.667c0 23.564-19.103 42.667-42.667 42.667v0h-391.253c-11.771-0.169-22.416-4.851-30.311-12.39l0.017 0.016-200.96-200.96 200.96-200.96c7.877-7.522 18.523-12.204 30.26-12.373l0.033-0h391.253c23.564 0 42.667 19.103 42.667 42.667v0zM712.96 396.373c-7.733-7.795-18.45-12.621-30.293-12.621s-22.56 4.826-30.291 12.618l-0.003 0.003-55.040 55.467-55.040-55.467c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l-0-0 55.467 55.040-55.467 55.040c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 55.040-55.467 55.040 55.467c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003-55.467-55.040 55.467-55.040c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003z"],"attrs":[],"grid":0,"tags":["backspace"]},"attrs":[],"properties":{"order":4585,"id":1099,"name":"backspace","prevSize":32,"code":59754},"setIdx":0,"setId":0,"iconIdx":106},{"icon":{"paths":["M881.92 249.6c-16.298-9.76-35.955-15.531-56.96-15.531s-40.662 5.771-57.472 15.815l0.512-0.284-170.667 98.133c-0.125-62.821-51.081-113.7-113.92-113.7-20.886 0-40.459 5.62-57.289 15.431l0.542-0.292-284.587 164.267c-34.197 20.086-56.791 56.684-56.791 98.56s22.594 78.474 56.257 98.269l0.534 0.291 284.587 164.267c16.329 9.636 35.98 15.329 56.96 15.329s40.631-5.693 57.491-15.618l-0.531 0.289c34.155-19.885 56.748-56.325 56.748-98.042 0-0.182-0-0.364-0.001-0.546l0 0.028 170.667 98.56c16.282 9.556 35.838 15.245 56.713 15.36l0.033 0c0.005 0 0.011 0 0.018 0 21.103 0 40.834-5.87 57.651-16.066l-0.496 0.279c34.138-19.677 56.748-55.971 56.748-97.547 0-0.206-0.001-0.412-0.002-0.618l0 0.032v-328.533c0.001-0.174 0.002-0.38 0.002-0.586 0-41.576-22.611-77.871-56.206-97.259l-0.542-0.289zM512 676.267c0.001 0.106 0.002 0.232 0.002 0.358 0 10.369-5.604 19.429-13.949 24.317l-0.133 0.072c-4.119 2.33-9.046 3.703-14.293 3.703s-10.174-1.373-14.441-3.779l0.147 0.076-284.587-164.267c-8.595-5.037-14.276-14.228-14.276-24.747s5.681-19.71 14.141-24.674l0.135-0.073 284.587-164.267c4.1-2.408 9.031-3.83 14.293-3.83s10.193 1.422 14.428 3.903l-0.135-0.073c8.478 4.959 14.082 14.019 14.082 24.389 0 0.126-0.001 0.252-0.002 0.377l0-0.019zM853.333 676.267c-0.312 15.547-12.989 28.031-28.581 28.031-5.178 0-10.035-1.377-14.224-3.785l0.139 0.074-213.333-122.88v-131.413l213.333-122.88c4.050-2.334 8.907-3.711 14.085-3.711 15.593 0 28.269 12.484 28.581 28.002l0 0.029z"],"attrs":[],"grid":0,"tags":["backward"]},"attrs":[],"properties":{"order":4586,"id":1098,"name":"backward","prevSize":32,"code":59755},"setIdx":0,"setId":0,"iconIdx":107},{"icon":{"paths":["M810.667 277.333h-128v-42.667c0-70.692-57.308-128-128-128v0h-85.333c-70.692 0-128 57.308-128 128v0 42.667h-128c-70.692 0-128 57.308-128 128v0 384c0 70.692 57.308 128 128 128v0h597.333c70.692 0 128-57.308 128-128v0-384c0-70.692-57.308-128-128-128v0zM426.667 234.667c0-23.564 19.103-42.667 42.667-42.667v0h85.333c23.564 0 42.667 19.103 42.667 42.667v0 42.667h-170.667zM853.333 789.333c0 23.564-19.103 42.667-42.667 42.667v0h-597.333c-23.564 0-42.667-19.103-42.667-42.667v0-234.667c101.102 41.276 218.414 65.247 341.32 65.28l0.013 0c122.924-0.078 240.23-24.044 347.555-67.507l-6.222 2.227zM853.333 461.227c-100.48 45.287-217.825 71.671-341.333 71.671s-240.854-26.384-346.709-73.824l5.376 2.153v-55.893c0-23.564 19.103-42.667 42.667-42.667v0h597.333c23.564 0 42.667 19.103 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["bag-alt"]},"attrs":[],"properties":{"order":4587,"id":1097,"name":"bag-alt","prevSize":32,"code":59756},"setIdx":0,"setId":0,"iconIdx":108},{"icon":{"paths":["M810.667 256h-128v-42.667c0-47.128-38.205-85.333-85.333-85.333v0h-170.667c-0.105-0.001-0.229-0.001-0.353-0.001-9.192 0-18.019 1.563-26.23 4.437l0.556-0.17c-17.281 5.717-29.53 21.725-29.53 40.594 0 4.864 0.814 9.538 2.313 13.893l-0.090-0.3c5.906 16.949 21.749 28.893 40.382 28.893 4.627 0 9.081-0.736 13.253-2.098l-0.302 0.085h170.667v42.667h-57.173c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h270.507c23.564 0 42.667 19.103 42.667 42.667v0 54.613l-109.653 36.693c-17.081 5.832-29.146 21.741-29.146 40.468 0 4.911 0.83 9.628 2.356 14.019l-0.091-0.3c5.871 17.012 21.745 29.013 40.423 29.013 0.039 0 0.077-0 0.116-0l-0.006 0c4.901-0.093 9.586-0.866 14.013-2.229l-0.36 0.095 82.347-27.733v125.867c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-270.507c0-70.692-57.308-128-128-128v0zM158.293 97.707c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l-0-0 99.413 97.707c-63.374 8.322-111.791 61.991-111.791 126.97 0 0.362 0.002 0.724 0.005 1.086l-0-0.055v384c0 70.692 57.308 128 128 128v0h597.333c8.134-0.215 15.918-1.137 23.463-2.708l-0.85 0.148 32.427 32.853c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003zM170.667 384c0-23.564 19.103-42.667 42.667-42.667v0h67.84l170.667 170.667h-61.013l-220.16-73.387zM213.333 810.667c-23.564 0-42.667-19.103-42.667-42.667v0-239.36l199.68 68.693c2.051 0.293 4.419 0.461 6.827 0.461s4.776-0.168 7.094-0.492l-0.268 0.031h153.173l213.333 213.333z"],"attrs":[],"grid":0,"tags":["bag-slash"]},"attrs":[],"properties":{"order":4588,"id":1096,"name":"bag-slash","prevSize":32,"code":59757},"setIdx":0,"setId":0,"iconIdx":109},{"icon":{"paths":["M810.667 256h-128v-42.667c0-47.128-38.205-85.333-85.333-85.333v0h-170.667c-47.128 0-85.333 38.205-85.333 85.333v0 42.667h-128c-70.692 0-128 57.308-128 128v0 384c0 70.692 57.308 128 128 128v0h597.333c70.692 0 128-57.308 128-128v0-384c0-70.692-57.308-128-128-128v0zM426.667 213.333h170.667v42.667h-170.667zM853.333 768c0 23.564-19.103 42.667-42.667 42.667v0h-597.333c-23.564 0-42.667-19.103-42.667-42.667v0-239.36l199.68 68.693c2.051 0.293 4.419 0.461 6.827 0.461s4.776-0.168 7.094-0.492l-0.268 0.031h256c4.901-0.093 9.586-0.866 14.013-2.229l-0.36 0.095 199.68-66.56zM853.333 438.613l-220.16 73.387h-242.347l-220.16-73.387v-54.613c0-23.564 19.103-42.667 42.667-42.667v0h597.333c23.564 0 42.667 19.103 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["bag"]},"attrs":[],"properties":{"order":4589,"id":1095,"name":"bag","prevSize":32,"code":59758},"setIdx":0,"setId":0,"iconIdx":110},{"icon":{"paths":["M979.807 589.766c-0.188-2.732-0.616-5.269-1.267-7.714l0.064 0.282-98.333-261.849c35.313-23.093 58.335-62.427 58.396-107.142l0-0.009c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0c-0.009 23.566-19.115 42.667-42.682 42.667-16.182 0-30.26-9.005-37.498-22.277l-0.112-0.223c-21.588-37.795-61.646-62.858-107.558-62.858-0.859 0-1.716 0.009-2.571 0.026l0.128-0.002h-108.373v-42.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 42.667h-108.373c-0.727-0.015-1.584-0.024-2.444-0.024-45.912 0-85.97 25.063-107.239 62.253l-0.319 0.605c-7.349 13.495-21.428 22.5-37.609 22.5-23.567 0-42.674-19.101-42.682-42.666l-0-0.001c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0c0.061 44.724 23.083 84.058 57.908 106.851l0.488 0.299-98.332 261.849c-0.587 2.164-1.015 4.701-1.196 7.305l-0.007 0.127c-0.691 2.179-1.229 4.746-1.512 7.39l-0.016 0.178c0 0.396 0.115 0.76 0.117 1.156 0.013 0.562 0.128 1.081 0.166 1.641 1.425 93.016 77.162 167.872 170.383 167.872s168.958-74.856 170.381-167.739l0.002-0.134c0.036-0.56 0.154-1.078 0.166-1.641 0.003-0.396 0.117-0.76 0.117-1.156-0.298-2.821-0.836-5.388-1.603-7.855l0.077 0.287c-0.188-2.732-0.616-5.269-1.267-7.714l0.064 0.282-98.448-262.154c18.096-11.669 32.714-27.248 42.929-45.613l0.332-0.65c7.070-10.875 19.162-17.966 32.91-17.966 0.692 0 1.379 0.018 2.062 0.053l-0.096-0.004h108.373v597.333h-128c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h341.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-128v-597.333h108.373c0.587-0.031 1.274-0.049 1.965-0.049 13.748 0 25.84 7.091 32.818 17.815l0.092 0.151c10.547 19.015 25.165 34.594 42.76 45.96l0.501 0.303-98.445 262.154c-0.587 2.164-1.015 4.701-1.196 7.305l-0.007 0.127c-0.691 2.179-1.229 4.746-1.512 7.39l-0.016 0.178c0 0.396 0.115 0.76 0.117 1.156 0.013 0.562 0.128 1.081 0.166 1.641 1.425 93.016 77.162 167.872 170.383 167.872s168.958-74.856 170.381-167.739l0.002-0.134c0.036-0.56 0.154-1.078 0.166-1.641 0.003-0.396 0.117-0.76 0.117-1.156-0.298-2.821-0.836-5.388-1.603-7.855l0.077 0.287zM213.333 377.836l66.406 176.831h-132.813zM286.833 640c-15.103 25.436-42.292 42.305-73.448 42.666l-0.052 0c-31.408-0.012-58.849-16.989-73.657-42.264l-0.218-0.403zM810.667 377.836l66.406 176.831h-132.813zM810.667 682.667c-31.408-0.012-58.849-16.989-73.657-42.264l-0.218-0.403h147.375c-15.103 25.436-42.292 42.305-73.448 42.666l-0.052 0z"],"attrs":[],"grid":0,"tags":["balance-scale"]},"attrs":[],"properties":{"order":4590,"id":1094,"name":"balance-scale","prevSize":32,"code":59759},"setIdx":0,"setId":0,"iconIdx":111},{"icon":{"paths":["M512 85.333c-235.641 0-426.667 191.025-426.667 426.667s191.025 426.667 426.667 426.667c235.641 0 426.667-191.025 426.667-426.667v0c0-235.641-191.025-426.667-426.667-426.667v0zM512 853.333c-188.513 0-341.333-152.82-341.333-341.333v0c-0-0.125-0-0.272-0-0.42 0-79.067 27.155-151.792 72.648-209.357l-0.541 0.71 478.293 478.293c-56.854 44.951-129.579 72.107-208.646 72.107-0.148 0-0.295-0-0.443-0l0.023 0zM781.227 721.067l-478.293-478.293c56.854-44.951 129.579-72.107 208.646-72.107 0.148 0 0.295 0 0.443 0l-0.023-0c188.513 0 341.333 152.82 341.333 341.333v0c0 0.125 0 0.272 0 0.42 0 79.067-27.155 151.792-72.648 209.357l0.541-0.71z"],"attrs":[],"grid":0,"tags":["ban"]},"attrs":[],"properties":{"order":4591,"id":1093,"name":"ban","prevSize":32,"code":59760},"setIdx":0,"setId":0,"iconIdx":112},{"icon":{"paths":["M376.32 481.707c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003c7.712 7.668 18.343 12.407 30.080 12.407s22.368-4.74 30.082-12.409l-0.002 0.002c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003c-7.712-7.668-18.343-12.407-30.080-12.407s-22.368 4.74-30.082 12.409l0.002-0.002zM481.707 587.52c-7.668 7.712-12.407 18.343-12.407 30.080s4.74 22.368 12.409 30.082l-0.002-0.002c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.668-7.712 12.407-18.343 12.407-30.080s-4.74-22.368-12.409-30.082l0.002 0.002c-7.733-7.795-18.45-12.621-30.293-12.621s-22.56 4.826-30.291 12.618l-0.003 0.003zM865.707 160.853c-46.4-46.772-110.7-75.726-181.762-75.726-66.286 0-126.689 25.193-172.154 66.527l0.209-0.187c-45.164-40.781-105.304-65.732-171.272-65.732-70.336 0-134.047 28.366-180.317 74.281l0.016-0.016c-45.887 46.252-74.244 109.954-74.244 180.279 0 66.18 25.113 126.495 66.328 171.935l-0.191-0.214c-40.457 45.082-65.194 104.988-65.194 170.673 0 140.755 113.596 254.978 254.111 255.993l0.097 0.001c0.080 0 0.175 0 0.269 0 65.757 0 125.645-25.127 170.586-66.304l-0.189 0.171c45.195 40.902 105.422 65.934 171.496 65.934 70.437 0 134.229-28.447 180.516-74.479l-0.012 0.012c45.754-46.229 74.021-109.84 74.021-180.054 0-66.287-25.194-126.689-66.528-172.155l0.187 0.209c41.147-45.256 66.341-105.659 66.341-171.946 0-70.214-28.267-133.825-74.042-180.076l0.021 0.022zM803.413 220.587c29.872 30.704 48.292 72.681 48.292 118.961 0 42.496-15.532 81.364-41.228 111.238l0.189-0.225-237.227-237.227c29.841-24.897 68.598-40.013 110.886-40.013 46.138 0 88.073 17.993 119.172 47.345l-0.084-0.079zM220.587 803.413c-29.872-30.704-48.292-72.681-48.292-118.961 0-42.496 15.532-81.364 41.228-111.238l-0.189 0.225 238.933 238.933c-29.859 24.789-68.584 39.832-110.821 39.832-46.97 0-89.595-18.602-120.909-48.841l0.051 0.049zM803.413 803.413c-31.202 29.88-73.613 48.275-120.32 48.275s-89.118-18.395-120.383-48.335l0.063 0.060-341.333-341.333c-30.671-30.848-49.629-73.37-49.629-120.32s18.958-89.472 49.637-120.328l-0.008 0.008c30.848-30.671 73.37-49.629 120.32-49.629s89.472 18.958 120.328 49.637l-0.008-0.008 341.333 341.333c30.671 30.848 49.629 73.37 49.629 120.32s-18.958 89.472-49.637 120.328l0.008-0.008zM587.52 481.707c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003c7.712 7.668 18.343 12.407 30.080 12.407s22.368-4.74 30.082-12.409l-0.002 0.002c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003c-7.712-7.668-18.343-12.407-30.080-12.407s-22.368 4.74-30.082 12.409l0.002-0.002zM481.707 376.32c-7.668 7.712-12.407 18.343-12.407 30.080s4.74 22.368 12.409 30.082l-0.002-0.002c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.668-7.712 12.407-18.343 12.407-30.080s-4.74-22.368-12.409-30.082l0.002 0.002c-7.733-7.795-18.45-12.621-30.293-12.621s-22.56 4.826-30.291 12.618l-0.003 0.003z"],"attrs":[],"grid":0,"tags":["band-aid"]},"attrs":[],"properties":{"order":4592,"id":1092,"name":"band-aid","prevSize":32,"code":59761},"setIdx":0,"setId":0,"iconIdx":113},{"icon":{"paths":["M128 341.333h768c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-768c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM896 682.667h-768c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h768c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM896 469.333h-768c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h768c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["bars"]},"attrs":[],"properties":{"order":4593,"id":1091,"name":"bars","prevSize":32,"code":59762},"setIdx":0,"setId":0,"iconIdx":114},{"icon":{"paths":["M594 274.792c-7.65-12.208-21.030-20.207-36.279-20.207-23.566 0-42.671 19.104-42.671 42.671 0 8.244 2.338 15.943 6.388 22.468l-0.105-0.182q11.313 18.313 24.125 36c7.849 10.677 20.362 17.53 34.474 17.53 23.563 0 42.664-19.101 42.664-42.664 0-9.369-3.020-18.033-8.14-25.072l0.085 0.123q-10.936-15.062-20.541-30.667zM477.542 668.25c-7.858-10.565-20.305-17.335-34.333-17.335-23.565 0-42.668 19.103-42.668 42.668 0 9.537 3.129 18.342 8.415 25.447l-0.081-0.114c7.25 9.792 13.958 19.917 20.291 30.251 7.637 12.29 21.065 20.351 36.375 20.351 23.574 0 42.684-19.11 42.684-42.684 0-8.264-2.348-15.979-6.414-22.514l0.105 0.181c-7.583-12.334-15.708-24.459-24.375-36.251zM319.376 521.958c-6.344-3.947-14.045-6.287-22.292-6.287-23.562 0-42.662 19.101-42.662 42.662 0 15.315 8.070 28.745 20.189 36.27l0.182 0.105q15.5 9.499 30.417 20.416c6.972 5.159 15.741 8.258 25.233 8.258 23.571 0 42.679-19.108 42.679-42.679 0-14.173-6.909-26.733-17.542-34.495l-0.121-0.084q-17.687-12.877-36.083-24.166zM748.626 429.5q-15.563-9.563-30.542-20.459c-6.934-5.072-15.631-8.116-25.038-8.116-23.571 0-42.679 19.108-42.679 42.679 0 14.088 6.826 26.582 17.351 34.355l0.117 0.082q17.688 12.875 36.125 24.208c6.355 3.961 14.070 6.309 22.333 6.309 23.574 0 42.684-19.11 42.684-42.684 0-15.31-8.061-28.737-20.169-36.27l-0.181-0.105zM810.333 213.376c-76.448-76.458-182.066-123.75-298.729-123.75-233.306 0-422.438 189.132-422.438 422.438s189.132 422.438 422.438 422.438c116.663 0 222.281-47.291 298.728-123.749l0.001-0.001c76.313-76.5 123.501-182.083 123.501-298.688s-47.188-222.188-123.509-298.696l0.008 0.008zM756 756.417c-50.503 50.636-116.749 85.55-190.771 96.776l-1.896 0.236c-7.13-13.101-20.794-21.843-36.5-21.843-16.927 0-31.482 10.154-37.906 24.703l-0.104 0.265c-172.775-11.29-310.123-148.587-321.439-320.315l-0.054-1.031c14.705-6.63 24.756-21.161 24.756-38.039 0-15.66-8.652-29.298-21.436-36.397l-0.213-0.108c22.524-150.006 139.52-267.103 287.587-289.544l1.898-0.237c7.446 12.71 20.995 21.136 36.521 21.242l0.015 0c3.476-0.007 6.852-0.416 10.090-1.185l-0.298 0.060c12.608-3.169 22.756-11.732 28.015-23.031l0.108-0.258c172.981 11.112 310.52 148.665 321.558 320.643l0.052 1.008c-14.644 6.621-24.65 21.102-24.65 37.919 0 15.581 8.588 29.156 21.289 36.249l0.21 0.108c-11.438 75.928-46.283 142.202-96.831 192.78l0.002-0.002z"],"attrs":[],"grid":0,"tags":["baseball-ball"]},"attrs":[],"properties":{"order":4594,"id":1090,"name":"baseball-ball","prevSize":32,"code":59763},"setIdx":0,"setId":0,"iconIdx":115},{"icon":{"paths":["M768 426.667h-512c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h42.667v384c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667h85.333v42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667h85.333v42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-384h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM469.333 768h-85.333v-85.333h85.333zM469.333 597.333h-85.333v-85.333h85.333zM640 768h-85.333v-85.333h85.333zM640 597.333h-85.333v-85.333h85.333zM853.333 85.333h-682.667c-70.692 0-128 57.308-128 128v0 341.333c0 70.692 57.308 128 128 128v0c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0c-23.564 0-42.667-19.103-42.667-42.667v0-341.333c0-23.564 19.103-42.667 42.667-42.667v0h682.667c23.564 0 42.667 19.103 42.667 42.667v0 341.333c0 23.564-19.103 42.667-42.667 42.667v0c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0c70.692 0 128-57.308 128-128v0-341.333c0-70.692-57.308-128-128-128v0zM597.333 341.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-170.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["basketball-hoop"]},"attrs":[],"properties":{"order":4595,"id":1089,"name":"basketball-hoop","prevSize":32,"code":59764},"setIdx":0,"setId":0,"iconIdx":116},{"icon":{"paths":["M512 85.333c-149.723 0.158-281.369 77.411-357.394 194.192l-1.006 1.648c-41.967 64.913-66.912 144.239-66.912 229.392 0 235.641 191.025 426.667 426.667 426.667 100.862 0 193.549-34.998 266.581-93.512l-0.843 0.653c97.389-78.849 159.137-198.4 159.137-332.374 0-235.488-190.776-426.417-426.206-426.666l-0.024-0zM597.333 181.76c120.238 31.866 213.041 124.669 244.368 242.524l0.539 2.383c-74.948 2.175-144.417 23.782-204.101 59.926l1.861-1.046c-30.736-34.757-64.266-65.715-100.672-93.051l-1.728-1.242c36.059-59.951 58.040-131.984 59.725-209.019l0.008-0.474zM512 170.667c-0.152 64.194-18.225 124.135-49.478 175.124l0.838-1.471c-6.4-3.413-12.373-7.253-18.773-10.24-50.333-27.163-108.669-48.822-170.167-61.944l-4.34-0.776c61.804-62.162 147.363-100.649 241.912-100.693l0.008-0zM213.333 348.16c71.516 10.155 136.092 31.734 194.737 62.978l-3.164-1.538 5.547 3.413c-61.218 61.162-145.759 98.987-239.135 98.987-0.229 0-0.458-0-0.687-0.001l0.036 0c0.257-60.171 16.043-116.599 43.553-165.556l-0.886 1.716zM426.667 842.24c-120.238-31.866-213.041-124.669-244.368-242.524l-0.539-2.383c119.673-2.74 226.661-54.838 301.802-136.654l0.278-0.306c31.678 23.564 59.591 48.77 84.941 76.367l0.392 0.433c-84.494 75.577-138.576 183.641-142.489 304.385l-0.018 0.682zM512 853.333c0.2-98.528 42.114-187.227 109.015-249.405l0.212-0.195c2.56 3.413 5.12 6.4 7.253 9.813 33.909 51.191 60.849 110.616 77.576 174.184l0.931 4.162c-54.153 38.434-121.603 61.44-194.426 61.44-0.197 0-0.394-0-0.591-0.001l0.030 0zM776.96 725.333c-20.305-61.022-46.322-113.96-78.385-162.557l1.585 2.557-8.96-10.667c46.722-26.471 102.541-42.239 162.007-42.666l0.127-0.001c-0.456 81.203-29.197 155.606-76.858 213.946l0.485-0.612z"],"attrs":[],"grid":0,"tags":["basketball"]},"attrs":[],"properties":{"order":4596,"id":1088,"name":"basketball","prevSize":32,"code":59765},"setIdx":0,"setId":0,"iconIdx":117},{"icon":{"paths":["M938.667 512h-725.333v-238.5c-0.003-0.244-0.004-0.532-0.004-0.821 0-31.928 17.759-59.707 43.937-74.001l0.44-0.22c11.719-6.473 25.69-10.282 40.551-10.282 2.963 0 5.892 0.151 8.777 0.447l-0.362-0.030c-4.762 13.941-7.511 30.002-7.511 46.704 0 40.946 16.522 78.034 43.262 104.96l-0.008-0.008 45.252 45.25c7.719 7.723 18.385 12.5 30.167 12.5s22.447-4.777 30.166-12.5l150.834-150.834c7.723-7.719 12.5-18.385 12.5-30.167s-4.777-22.447-12.5-30.166l-45.25-45.25c-26.954-26.836-64.127-43.426-105.176-43.426-33.136 0-63.748 10.811-88.499 29.099l0.407-0.287c-18.371-7.387-39.67-11.672-61.97-11.672-94.079 0-170.345 76.266-170.345 170.345 0 0.126 0 0.252 0 0.377l-0-0.019v238.5h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h42.667v128c0.176 55.201 35.325 102.147 84.443 119.855l0.891 0.28v50.531c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667h426.667v42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-50.529c50.009-17.989 85.158-64.936 85.333-120.117l0-0.021v-128h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM402.75 189.417c11.59-11.56 27.585-18.708 45.25-18.708s33.66 7.148 45.251 18.709l-0.001-0.001 15.083 15.084-90.499 90.5-15.084-15.083c-11.567-11.587-18.719-27.584-18.719-45.251s7.152-33.663 18.719-45.251l-0.001 0.001zM810.667 725.333c-0.016 23.558-19.109 42.65-42.665 42.667l-512.002 0c-23.558-0.016-42.65-19.109-42.667-42.665l-0-0.002v-128h597.333z"],"attrs":[],"grid":0,"tags":["bath"]},"attrs":[],"properties":{"order":4597,"id":1087,"name":"bath","prevSize":32,"code":59766},"setIdx":0,"setId":0,"iconIdx":118},{"icon":{"paths":["M285.44 640h-114.773v-256h98.56c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-98.56c-47.128 0-85.333 38.205-85.333 85.333v0 256c0 47.128 38.205 85.333 85.333 85.333v0h114.773c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM592.64 530.773c0.919-2.11 1.795-4.668 2.477-7.304l0.083-0.376c0.096-1.277 0.15-2.765 0.15-4.267s-0.055-2.99-0.162-4.464l0.012 0.197s0 0 0-2.56 0-3.413 0-5.12c-0.277-3.142-1.035-6.037-2.203-8.712l0.070 0.179c-0.977-2.782-2.129-5.177-3.508-7.418l0.094 0.165c-1.265-2.602-2.686-4.842-4.324-6.902l0.058 0.075-6.827-5.547-3.84-3.84h-2.56l-7.68-2.56h-149.333l61.867-106.667c3.58-6.123 5.694-13.481 5.694-21.333 0-23.645-19.168-42.814-42.814-42.814-15.793 0-29.589 8.552-37.010 21.277l-0.11 0.203-98.56 170.667s0 0 0 2.56c-0.919 2.11-1.795 4.668-2.477 7.304l-0.083 0.376c-0.096 1.277-0.15 2.765-0.15 4.267s0.055 2.99 0.162 4.464l-0.012-0.197s-2.987-0.427-2.987-0.427 0 3.413 0 5.12c0.277 3.142 1.035 6.037 2.203 8.712l-0.070-0.179c0.977 2.782 2.129 5.177 3.508 7.418l-0.094-0.165c1.265 2.602 2.686 4.842 4.324 6.902l-0.058-0.075 6.827 5.547c1.186 1.398 2.442 2.654 3.793 3.801l0.047 0.039h6.827c4.414 2.685 9.588 4.631 15.117 5.515l0.243 0.032h139.52l-61.867 106.667c-3.58 6.123-5.694 13.481-5.694 21.333 0 23.645 19.168 42.814 42.814 42.814 15.793 0 29.589-8.552 37.010-21.277l0.11-0.203 98.56-170.667s0.427-1.707 0.853-2.56zM896 426.667c-23.564 0-42.667 19.103-42.667 42.667v0 85.333c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-85.333c0-23.564-19.103-42.667-42.667-42.667v0zM725.333 298.667h-114.773c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h114.773v256h-98.56c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h98.56c47.128 0 85.333-38.205 85.333-85.333v0-256c0-47.128-38.205-85.333-85.333-85.333v0z"],"attrs":[],"grid":0,"tags":["battery-bolt"]},"attrs":[],"properties":{"order":4598,"id":1086,"name":"battery-bolt","prevSize":32,"code":59767},"setIdx":0,"setId":0,"iconIdx":119},{"icon":{"paths":["M725.333 298.667h-554.667c-47.128 0-85.333 38.205-85.333 85.333v0 256c0 47.128 38.205 85.333 85.333 85.333v0h554.667c47.128 0 85.333-38.205 85.333-85.333v0-256c0-47.128-38.205-85.333-85.333-85.333v0zM725.333 640h-554.667v-256h554.667zM896 426.667c-23.564 0-42.667 19.103-42.667 42.667v0 85.333c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-85.333c0-23.564-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["battery-empty"]},"attrs":[],"properties":{"order":4599,"id":1085,"name":"battery-empty","prevSize":32,"code":59768},"setIdx":0,"setId":0,"iconIdx":120},{"icon":{"paths":["M853.333 149.333h-682.667c-70.692 0-128 57.308-128 128v0 554.667c0 23.564 19.103 42.667 42.667 42.667v0h170.667c14.744-0.079 27.709-7.624 35.315-19.044l0.098-0.156 72.96-108.8h295.253l72.96 108.8c7.705 11.576 20.669 19.121 35.401 19.2l0.012 0h170.667c23.564 0 42.667-19.103 42.667-42.667v0-554.667c0-70.692-57.308-128-128-128v0zM896 789.333h-104.96l-72.96-106.667c-7.254-12.419-20.299-20.766-35.335-21.331l-0.078-0.002h-341.333c-14.744 0.079-27.709 7.624-35.315 19.044l-0.098 0.156-72.96 108.8h-104.96v-213.333h768zM298.667 490.667v-42.667c0-23.564 19.103-42.667 42.667-42.667v0h85.333c23.564 0 42.667 19.103 42.667 42.667v0 42.667zM554.667 490.667v-42.667c0-23.564 19.103-42.667 42.667-42.667v0h85.333c23.564 0 42.667 19.103 42.667 42.667v0 42.667zM896 490.667h-85.333v-42.667c0-70.692-57.308-128-128-128v0h-85.333c-32.927 0.203-62.872 12.807-85.435 33.371l0.102-0.091c-22.461-20.473-52.406-33.077-85.292-33.28l-0.041-0h-85.333c-70.692 0-128 57.308-128 128v0 42.667h-85.333v-213.333c0-23.564 19.103-42.667 42.667-42.667v0h682.667c23.564 0 42.667 19.103 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["bed-double"]},"attrs":[],"properties":{"order":4600,"id":1084,"name":"bed-double","prevSize":32,"code":59769},"setIdx":0,"setId":0,"iconIdx":121},{"icon":{"paths":["M298.667 533.333c70.692 0 128-57.308 128-128s-57.308-128-128-128c-70.692 0-128 57.308-128 128v0c0 70.692 57.308 128 128 128v0zM298.667 362.667c23.564 0 42.667 19.103 42.667 42.667s-19.103 42.667-42.667 42.667c-23.564 0-42.667-19.103-42.667-42.667v0c0-23.564 19.103-42.667 42.667-42.667v0zM853.333 277.333h-341.333c-23.564 0-42.667 19.103-42.667 42.667v0 256h-341.333v-341.333c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 554.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-128h768v128c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-384c0-70.692-57.308-128-128-128v0zM896 576h-341.333v-213.333h298.667c23.564 0 42.667 19.103 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["bed"]},"attrs":[],"properties":{"order":4601,"id":1083,"name":"bed","prevSize":32,"code":59770},"setIdx":0,"setId":0,"iconIdx":122},{"icon":{"paths":["M943.292 641.352c-3.182-0.852-6.835-1.342-10.602-1.342-19.816 0-36.47 13.544-41.208 31.879l-0.065 0.295c-14.751 55.559-64.592 95.835-123.84 95.835-70.655 0-127.931-57.277-127.931-127.931 0-0.025 0-0.049 0-0.074l-0 0.004v-42.667h298.667c0.003 0 0.007 0 0.011 0 23.558 0 42.656-19.098 42.656-42.656 0-0.004-0-0.008-0-0.012l0 0.001c0-117.821-95.513-213.333-213.333-213.333s-213.333 95.513-213.333 213.333v0 85.333c-0 0.021-0 0.046-0 0.071 0 117.782 95.481 213.264 213.264 213.264 98.916 0 182.103-67.342 206.215-158.681l0.334-1.487c0.837-3.156 1.318-6.78 1.318-10.516 0-19.82-13.528-36.481-31.854-41.252l-0.296-0.065zM767.646 426.685c35.25 0.014 67.179 14.222 90.384 37.218l-0.009-0.009c12.983 13.267 23.158 29.339 29.528 47.217l0.282 0.908h-240.321c17.989-50.008 64.935-85.157 120.115-85.333l0.021-0zM682.313 298.685h170.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-170.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM422.814 499.951c28.595-30.361 46.168-71.382 46.168-116.508 0-93.939-76.153-170.092-170.092-170.092-0.203 0-0.406 0-0.609 0.001l0.032-0h-213.333c-0.003-0-0.007-0-0.012-0-23.558 0-42.655 19.097-42.655 42.655 0 0.004 0 0.008 0 0.012l-0-0.001v554.667c-0 0.003-0 0.007-0 0.011 0 23.558 19.098 42.656 42.656 42.656 0.004 0 0.008-0 0.012-0l234.666 0c0.103 0 0.225 0 0.346 0 105.85 0 191.659-85.809 191.659-191.659 0-67.692-35.093-127.187-88.078-161.286l-0.759-0.457zM127.646 298.685h170.667c47.128 0 85.333 38.205 85.333 85.333s-38.205 85.333-85.333 85.333v0h-170.667zM319.646 768.019h-192v-213.333h192c58.91 0 106.667 47.756 106.667 106.667s-47.756 106.667-106.667 106.667v0z"],"attrs":[],"grid":0,"tags":["behance-alt"]},"attrs":[],"properties":{"order":4602,"id":1082,"name":"behance-alt","prevSize":32,"code":59771},"setIdx":0,"setId":0,"iconIdx":123},{"icon":{"paths":["M856.32 270.933h-216.32v60.16h217.173zM810.667 684.8c-14.783 9.919-32.978 15.831-52.554 15.831-1.024 0-2.045-0.016-3.061-0.048l0.149 0.004c-2.959 0.327-6.391 0.513-9.866 0.513-24.053 0-46.022-8.925-62.774-23.645l0.107 0.092c-16.492-18.63-26.563-43.276-26.563-70.274 0-1.695 0.040-3.381 0.118-5.056l-0.009 0.237h282.453c0.442-5.856 0.695-12.683 0.695-19.569 0-23.347-2.898-46.017-8.355-67.669l0.407 1.905c-7.15-28.138-18.909-52.797-34.57-74.447l0.436 0.634c-16.055-21.429-36.3-38.811-59.62-51.16l-0.966-0.467c-24.053-12.123-52.424-19.222-82.454-19.222-1.012 0-2.023 0.008-3.032 0.024l0.152-0.002c-0.453-0.004-0.989-0.006-1.525-0.006-28.696 0-56.036 5.805-80.909 16.305l1.368-0.512c-24.439 10.458-45.273 24.865-62.689 42.635l-0.031 0.032c-17.306 18.050-31.078 39.641-40.105 63.561l-0.428 1.293c-8.924 23.589-14.090 50.859-14.090 79.336 0 0.759 0.004 1.516 0.011 2.273l-0.001-0.116c-0.018 1.091-0.029 2.379-0.029 3.669 0 28.364 5.014 55.557 14.204 80.741l-0.522-1.636c8.579 25.219 21.376 46.957 37.725 65.486l-0.179-0.206c16.98 18.291 37.778 32.788 61.149 42.257l1.144 0.41c23.446 9.204 50.597 14.539 78.994 14.539 1.329 0 2.655-0.012 3.979-0.035l-0.199 0.003c1.89 0.063 4.112 0.099 6.342 0.099 39.323 0 76.042-11.152 107.165-30.467l-0.867 0.501c33.586-24.074 58.256-58.719 69.254-99.007l0.293-1.26h-94.293c-5.23 13.634-14.437 24.769-26.188 32.269l-0.265 0.158zM664.32 509.013c6.932-21.74 22.31-39.067 42.18-48.434l0.487-0.206c11.734-5.414 25.462-8.572 39.928-8.572 0.963 0 1.923 0.014 2.879 0.042l-0.14-0.003c1.882-0.171 4.070-0.268 6.282-0.268 20.161 0 38.434 8.083 51.755 21.184l-0.010-0.010c13.971 16.998 23.574 38.085 26.805 61.213l0.075 0.654h-177.067c0.768-9.436 2.431-18.15 4.925-26.506l-0.232 0.906zM438.613 488.533c22.204-9.4 40.64-23.999 54.37-42.327l0.243-0.339c11.563-17.739 18.44-39.451 18.44-62.769 0-1.633-0.034-3.259-0.101-4.876l0.008 0.232c0.066-1.606 0.104-3.49 0.104-5.384 0-20.935-4.597-40.796-12.836-58.63l0.359 0.867c-7.806-17.483-19.766-31.908-34.667-42.452l-0.32-0.215c-15.384-10.697-33.634-18.467-53.341-22.059l-0.845-0.128c-19.851-4.356-42.653-6.851-66.037-6.851-1.384 0-2.766 0.009-4.145 0.026l0.209-0.002h-254.72v536.747h260.267c0.060 0 0.131 0 0.202 0 24.949 0 49.134-3.269 72.15-9.402l-1.952 0.442c23.211-6.112 43.552-15.635 61.66-28.157l-0.647 0.423c17.925-12.533 32.349-28.869 42.316-47.905l0.35-0.735c9.992-19.207 15.852-41.94 15.852-66.041 0-1.533-0.024-3.060-0.071-4.581l0.005 0.223c0.034-1.177 0.053-2.562 0.053-3.952 0-30.295-9.099-58.464-24.713-81.925l0.34 0.543c-17.729-24.973-43.651-43.119-73.787-50.589l-0.88-0.185zM203.52 335.36h110.507c0.065-0 0.142-0 0.219-0 10.625 0 21.032 0.931 31.145 2.717l-1.071-0.157c9.78 1.482 18.558 4.783 26.33 9.56l-0.304-0.174c7.709 4.417 13.839 10.821 17.802 18.522l0.118 0.251c4.338 8.138 6.885 17.798 6.885 28.052 0 0.938-0.021 1.872-0.064 2.8l0.005-0.132c0.138 1.499 0.216 3.243 0.216 5.004 0 17.593-7.829 33.357-20.193 43.998l-0.076 0.064c-13.515 9.398-30.273 15.014-48.342 15.014-1.305 0-2.604-0.029-3.894-0.087l0.183 0.007h-119.467zM410.027 652.8c-4.504 8.809-11.028 16.017-18.99 21.205l-0.21 0.129c-7.964 5.032-17.25 8.876-27.174 10.993l-0.559 0.1c-9.326 2.181-20.035 3.431-31.035 3.431-0.789 0-1.577-0.006-2.363-0.019l0.119 0.002h-128v-147.2h128c1.337-0.062 2.904-0.098 4.48-0.098 21.418 0 41.3 6.576 57.738 17.818l-0.351-0.227c14.379 12.943 23.38 31.618 23.38 52.395 0 2.434-0.124 4.839-0.365 7.209l0.025-0.298c0.231 2.216 0.363 4.789 0.363 7.392 0 9.771-1.856 19.109-5.234 27.68l0.178-0.512z"],"attrs":[],"grid":0,"tags":["behance"]},"attrs":[],"properties":{"order":4603,"id":1081,"name":"behance","prevSize":32,"code":59772},"setIdx":0,"setId":0,"iconIdx":124},{"icon":{"paths":["M896 341.333c-0.442-46.791-38.476-84.552-85.33-84.552-47.128 0-85.333 38.205-85.333 85.333 0 43.064 31.9 78.678 73.359 84.5l0.451 0.052c7.256 19.411 11.455 41.841 11.455 65.252 0 87.245-58.32 160.868-138.102 184.011l-1.353 0.336c-11.562-26.169-30.794-47.19-54.822-60.681l-0.644-0.332c41.191-50.776 66.133-116.19 66.133-187.43 0-164.949-133.718-298.667-298.667-298.667s-298.667 133.718-298.667 298.667c0 71.24 24.942 136.654 66.57 187.987l-0.437-0.556c-38.823 22.122-64.709 63.014-65.279 110l-0.001 0.080v42.667c0 70.692 57.308 128 128 128v0h341.333c70.692 0 128-57.308 128-128v0-8.107c123.148-29.485 213.275-138.628 213.275-268.82 0-35.107-6.553-68.683-18.503-99.572l0.641 1.885c11.122-14.223 17.857-32.346 17.92-52.039l0-0.014zM597.333 768c0 23.564-19.103 42.667-42.667 42.667v0h-341.333c-23.564 0-42.667-19.103-42.667-42.667v0-42.667c0-23.564 19.103-42.667 42.667-42.667v0h17.493c43.677 26.814 96.571 42.696 153.173 42.696s109.496-15.882 154.467-43.432l-1.293 0.737h17.493c23.564 0 42.667 19.103 42.667 42.667v0zM384 640c-117.821 0-213.333-95.513-213.333-213.333s95.513-213.333 213.333-213.333c117.821 0 213.333 95.513 213.333 213.333v0c0 117.821-95.513 213.333-213.333 213.333v0zM384 384c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["bell-school"]},"attrs":[],"properties":{"order":4604,"id":1080,"name":"bell-school","prevSize":32,"code":59773},"setIdx":0,"setId":0,"iconIdx":125},{"icon":{"paths":["M472.32 261.12c11.597-3.253 24.914-5.123 38.668-5.123 0.356 0 0.711 0.001 1.067 0.004l-0.054-0c94.257 0 170.667 76.41 170.667 170.667v0 57.173c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-57.173c-0.132-126.205-91.568-231.016-211.804-251.94l-1.529-0.22v-46.507c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 46.933l-19.2 3.413c-18.434 5.060-31.754 21.668-31.754 41.387 0 23.664 19.184 42.848 42.848 42.848 3.945 0 7.766-0.533 11.394-1.532l-0.301 0.071zM926.293 865.707l-768-768c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293v0l175.787 175.36c-11.071 27.574-17.493 59.541-17.493 93.008 0 0.002 0 0.003 0 0.005l-0-0v135.68c-50.028 18.062-85.173 65.066-85.333 120.3l-0 0.020v85.333c0 23.564 19.103 42.667 42.667 42.667v0h133.973c20.352 73.135 86.359 125.909 164.693 125.909s144.342-52.775 164.407-124.709l0.286-1.2h73.813l115.2 115.627c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003zM341.333 426.667c-0.311-3.514-0.488-7.603-0.488-11.733s0.177-8.219 0.525-12.259l-0.036 0.526 153.173 151.467h-153.173zM512 853.333c-31.22-0.194-58.443-17.125-73.169-42.264l-0.218-0.403h146.773c-14.943 25.542-42.166 42.472-73.359 42.667l-0.028 0zM256 725.333v-42.667c0-23.564 19.103-42.667 42.667-42.667v0h281.173l85.333 85.333z"],"attrs":[],"grid":0,"tags":["bell-slash"]},"attrs":[],"properties":{"order":4605,"id":1079,"name":"bell-slash","prevSize":32,"code":59774},"setIdx":0,"setId":0,"iconIdx":126},{"icon":{"paths":["M768 562.347v-135.68c-0.132-126.205-91.568-231.016-211.804-251.94l-1.529-0.22v-46.507c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 46.507c-121.765 21.144-213.201 125.955-213.333 252.146l-0 0.014v135.68c-50.028 18.062-85.173 65.066-85.333 120.3l-0 0.020v85.333c0 23.564 19.103 42.667 42.667 42.667v0h133.973c20.352 73.135 86.359 125.909 164.693 125.909s144.342-52.775 164.407-124.709l0.286-1.2h133.973c23.564 0 42.667-19.103 42.667-42.667v0-85.333c-0.16-55.254-35.305-102.258-84.442-120.038l-0.891-0.282zM341.333 426.667c0-94.257 76.41-170.667 170.667-170.667s170.667 76.41 170.667 170.667v0 128h-341.333zM512 853.333c-31.22-0.194-58.443-17.125-73.169-42.264l-0.218-0.403h146.773c-14.943 25.542-42.166 42.472-73.359 42.667l-0.028 0zM768 725.333h-512v-42.667c0-23.564 19.103-42.667 42.667-42.667v0h426.667c23.564 0 42.667 19.103 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["bell"]},"attrs":[],"properties":{"order":4606,"id":1078,"name":"bell","prevSize":32,"code":59775},"setIdx":0,"setId":0,"iconIdx":127},{"icon":{"paths":["M405.333 448h106.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-42.667v-21.333c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 23.467c-49.089 10.229-85.441 53.136-85.441 104.533 0 58.91 47.756 106.667 106.667 106.667 0.038 0 0.075-0 0.113-0l42.661 0c11.782 0 21.333 9.551 21.333 21.333s-9.551 21.333-21.333 21.333v0h-106.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h42.667v21.333c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-23.467c49.089-10.229 85.441-53.136 85.441-104.533 0-58.91-47.756-106.667-106.667-106.667-0.038 0-0.075 0-0.113 0l-42.661-0c-11.782 0-21.333-9.551-21.333-21.333s9.551-21.333 21.333-21.333v0zM896 512h-128v-384c0-0.050 0-0.11 0-0.169 0-15.71-8.49-29.436-21.132-36.842l-0.201-0.109c-6.12-3.594-13.479-5.716-21.333-5.716s-15.214 2.123-21.535 5.825l0.201-0.109-128 73.387-128-73.387c-6.12-3.594-13.479-5.716-21.333-5.716s-15.214 2.123-21.535 5.825l0.201-0.109-128 73.387-128-73.387c-6.12-3.594-13.479-5.716-21.333-5.716s-15.214 2.123-21.535 5.825l0.201-0.109c-12.844 7.514-21.334 21.241-21.334 36.951 0 0.060 0 0.119 0 0.179l-0-0.009v682.667c0 70.692 57.308 128 128 128v0h597.333c70.692 0 128-57.308 128-128v0-256c0-23.564-19.103-42.667-42.667-42.667v0zM213.333 853.333c-23.564 0-42.667-19.103-42.667-42.667v0-608.853l85.333 48.64c6.189 3.299 13.535 5.236 21.333 5.236s15.144-1.937 21.583-5.357l-0.249 0.121 128-73.387 128 73.387c6.189 3.299 13.535 5.236 21.333 5.236s15.144-1.937 21.583-5.357l-0.249 0.121 85.333-48.64v608.853c0.125 15.341 2.93 29.989 7.968 43.552l-0.288-0.885zM853.333 810.667c0 23.564-19.103 42.667-42.667 42.667s-42.667-19.103-42.667-42.667v0-213.333h85.333z"],"attrs":[],"grid":0,"tags":["bill"]},"attrs":[],"properties":{"order":4607,"id":1077,"name":"bill","prevSize":32,"code":59776},"setIdx":0,"setId":0,"iconIdx":128},{"icon":{"paths":["M430.933 366.933l72.533 183.467 119.467 55.467-238.933 140.8v-601.6l-170.667-59.733v759.467l170.667 93.867 426.667-247.467v-192l-379.733-132.267z"],"attrs":[],"grid":0,"tags":["bing"]},"attrs":[],"properties":{"order":4608,"id":1076,"name":"bing","prevSize":32,"code":59777},"setIdx":0,"setId":0,"iconIdx":129},{"icon":{"paths":["M695.648 479.622c18.366-26.804 29.329-59.938 29.329-95.631 0-94.205-76.368-170.572-170.572-170.572-0.033 0-0.065 0-0.098 0l0.005-0v-42.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 42.667h-85.333v-42.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 42.667h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h42.667v426.667h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h42.667v42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667h85.333v42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667h85.333c0.131 0 0.286 0.001 0.441 0.001 94.013 0 170.225-76.213 170.225-170.225 0-74.113-47.363-137.164-113.473-160.535l-1.191-0.367zM383.646 298.752h170.667c47.128 0 85.333 38.205 85.333 85.333s-38.205 85.333-85.333 85.333h-170.667zM639.646 725.419h-256v-170.667h256c47.128 0 85.333 38.205 85.333 85.333s-38.205 85.333-85.333 85.333v0z"],"attrs":[],"grid":0,"tags":["bitcoin-alt"]},"attrs":[],"properties":{"order":4609,"id":1075,"name":"bitcoin-alt","prevSize":32,"code":59778},"setIdx":0,"setId":0,"iconIdx":130},{"icon":{"paths":["M512 42.667c-259.206 0-469.333 210.128-469.333 469.333s210.128 469.333 469.333 469.333c259.206 0 469.333-210.128 469.333-469.333v0c0-259.206-210.128-469.333-469.333-469.333v0zM512 896c-212.077 0-384-171.923-384-384s171.923-384 384-384c212.077 0 384 171.923 384 384v0c0 212.077-171.923 384-384 384v0zM597.333 298.667v-42.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 42.667h-42.667v-42.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 42.667h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h42.667v256h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h42.667v42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667h42.667v42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667c70.692 0 128-57.308 128-128v0c-0.077-32.873-12.534-62.823-32.953-85.446l0.1 0.113c20.32-22.51 32.777-52.46 32.853-85.317l0-0.016c0-70.692-57.308-128-128-128v0zM597.333 640h-128v-85.333h128c23.564 0 42.667 19.103 42.667 42.667s-19.103 42.667-42.667 42.667v0zM597.333 469.333h-128v-85.333h128c23.564 0 42.667 19.103 42.667 42.667s-19.103 42.667-42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["bitcoin-circle"]},"attrs":[],"properties":{"order":4610,"id":1074,"name":"bitcoin-circle","prevSize":32,"code":59779},"setIdx":0,"setId":0,"iconIdx":131},{"icon":{"paths":["M810.667 384c0-94.257-76.41-170.667-170.667-170.667v0-85.333c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 85.333h-85.333v-85.333c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 85.333h-128c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h42.667v426.667h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h128v85.333c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-85.333h85.333v85.333c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-85.333c93.785-0.621 169.572-76.791 169.572-170.663 0-50.89-22.274-96.578-57.605-127.847l-0.181-0.157c35.921-31.259 58.583-76.953 58.88-127.948l0-0.052zM640 725.333h-256v-170.667h256c47.128 0 85.333 38.205 85.333 85.333s-38.205 85.333-85.333 85.333v0zM640 469.333h-256v-170.667h256c47.128 0 85.333 38.205 85.333 85.333s-38.205 85.333-85.333 85.333v0z"],"attrs":[],"grid":0,"tags":["bitcoin-sign"]},"attrs":[],"properties":{"order":4611,"id":1073,"name":"bitcoin-sign","prevSize":32,"code":59780},"setIdx":0,"setId":0,"iconIdx":132},{"icon":{"paths":["M475.136 516.977l-25.42 103.052c31.378 7.88 128.159 39.308 142.461-18.825 14.953-60.628-85.664-76.307-117.041-84.227zM509.808 376.338l-23.044 93.464c26.13 6.589 106.679 33.453 119.732-19.424 13.596-55.159-70.555-67.453-96.685-74.039zM512 85.333c-235.641 0-426.667 191.025-426.667 426.667s191.025 426.667 426.667 426.667c235.641 0 426.667-191.025 426.667-426.667v0c0-235.641-191.025-426.667-426.667-426.667v0zM697.941 451.216c-1.919 33.993-26.399 61.755-58.616 68.649l-0.488 0.087c30.389 12.611 51.373 42.045 51.373 76.381 0 13.55-3.268 26.336-9.058 37.614l0.216-0.464c-24.982 72.198-84.336 78.293-163.265 63.185l-19.157 77.641-46.287-11.667 18.906-76.599c-11.997-3.013-24.258-6.214-36.888-9.68l-18.972 76.957-46.234-11.666 19.157-77.786c-10.813-2.8-21.794-5.774-33-8.612l-60.234-15.187 22.979-53.586s34.104 9.173 33.644 8.495c1.529 0.505 3.289 0.797 5.116 0.797 7.542 0 13.925-4.961 16.065-11.797l0.032-0.119 51.943-210.679c0.084-0.766 0.132-1.655 0.132-2.555 0-12.619-9.396-23.042-21.573-24.657l-0.127-0.014c0.725-0.492-33.621-8.453-33.621-8.453l12.315-50 63.834 16.12-0.052 0.242c9.596 2.412 19.484 4.706 29.557 7.026l18.971-76.88 46.26 11.666-18.586 75.373c12.419 2.867 24.917 5.76 37.086 8.828l18.455-74.88 46.289 11.667-18.958 76.906c58.44 20.359 101.181 50.88 92.786 107.651z"],"attrs":[],"grid":0,"tags":["bitcoin"]},"attrs":[],"properties":{"order":4612,"id":1072,"name":"bitcoin","prevSize":32,"code":59781},"setIdx":0,"setId":0,"iconIdx":133},{"icon":{"paths":["M512 85.333c-235.641 0-426.667 191.025-426.667 426.667s191.025 426.667 426.667 426.667c235.641 0 426.667-191.025 426.667-426.667v0c0-235.641-191.025-426.667-426.667-426.667v0zM306.773 569.6h-81.92l22.187-102.827h78.507c51.2 0 63.147 24.747 63.147 44.8 0 27.733-18.347 58.027-81.92 58.027zM334.933 414.293h-81.493l22.187-102.827h78.507c50.773 0 62.72 25.173 62.72 42.667-0 29.867-17.92 60.16-81.92 60.16zM494.933 731.307h-81.92l22.613-103.253h78.507c50.773 0 62.72 25.173 62.72 45.227 0 27.733-17.92 58.027-81.92 58.027zM525.227 569.6h-81.493l22.187-102.827h78.507c50.773 0 62.72 24.747 62.72 44.8 0 27.733-17.92 58.027-81.92 58.027zM554.667 414.293h-82.773l22.187-102.827h78.507c51.2 0 63.147 25.173 63.147 42.667 0 29.867-18.347 60.16-81.067 60.16zM714.24 653.653h-82.347l22.187-103.253h78.507c50.773 0 63.147 25.173 63.147 45.227-0 27.733-18.347 58.027-82.347 58.027zM744.96 506.88h-82.773l20.48-103.253h78.507c51.2 0 63.147 25.173 63.147 42.667 1.707 30.293-16.64 60.587-80.213 60.587z"],"attrs":[],"grid":0,"tags":["black-berry"]},"attrs":[],"properties":{"order":4613,"id":1071,"name":"black-berry","prevSize":32,"code":59782},"setIdx":0,"setId":0,"iconIdx":134},{"icon":{"paths":["M596.958 554.685h-170.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h170.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM426.292 469.352h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM682.292 426.643v-42.624c-0.097-94.218-76.449-170.57-170.657-170.667l-85.343-0c-117.763 0.143-213.19 95.57-213.333 213.32l-0 0.014v170.667c0.143 117.763 95.57 213.19 213.32 213.333l170.68 0c117.763-0.143 213.19-95.57 213.333-213.32l0-0.014v-42.667c-0.091-70.664-57.339-127.927-127.989-128.042l-0.011-0zM682.292 426.685v0.043l-42.667-0.043zM724.958 597.352c-0.080 70.66-57.339 127.92-127.992 128l-170.674 0c-70.66-0.080-127.92-57.339-128-127.992l-0-0.008v-170.667c0.080-70.66 57.339-127.92 127.992-128l85.341-0c47.103 0.063 85.27 38.23 85.333 85.327l0 0.006v42.667c0.063 47.103 38.23 85.27 85.327 85.333l0.006 0c23.558 0.016 42.65 19.109 42.667 42.665l0 0.002zM852.958 42.685h-682.667c-70.66 0.080-127.92 57.339-128 127.992l-0 0.008v682.667c0.080 70.66 57.339 127.92 127.992 128l682.674 0c70.66-0.080 127.92-57.339 128-127.992l0-0.008v-682.667c-0.080-70.66-57.339-127.92-127.992-128l-0.008-0zM895.625 853.352c-0.016 23.558-19.109 42.65-42.665 42.667l-682.668 0c-23.558-0.016-42.65-19.109-42.667-42.665l-0-0.002v-682.667c0.016-23.558 19.109-42.65 42.665-42.667l682.668-0c23.558 0.016 42.65 19.109 42.667 42.665l0 0.002z"],"attrs":[],"grid":0,"tags":["blogger-alt"]},"attrs":[],"properties":{"order":4614,"id":1070,"name":"blogger-alt","prevSize":32,"code":59783},"setIdx":0,"setId":0,"iconIdx":135},{"icon":{"paths":["M414.297 446.297h95.523c18.164 0 32.889-14.725 32.889-32.889s-14.725-32.889-32.889-32.889h-95.523c-18.164 0-32.889 14.725-32.889 32.889s14.725 32.889 32.889 32.889h0zM828.943 85.406h-634.596c-60.311 0.229-109.14 49.059-109.367 109.348l-0 0.022v634.591c0.226 60.312 49.056 109.144 109.346 109.373l0.022 0h634.591c60.314-0.222 109.148-49.054 109.375-109.345l0-0.022v-634.597c-0.225-60.313-49.057-109.145-109.348-109.37l-0.022-0zM783.18 498.325l-0.838 114.151c-0.716 94.732-77.523 171.287-172.283 171.596l-0.030 0h-197.931c-94.917-0.177-171.863-76.87-172.45-171.673l-0-0.056v-200.292c0.527-94.934 77.478-171.719 172.424-171.979l0.025-0h120.479c57.445 10.221 105.162 45.028 132.642 92.927l0.49 0.927c9.088 16.916 14.717 36.9 15.432 58.131l0.006 0.223c2.875 21.571 4.388 37.599 14.083 46.482 13.625 12.352 64.31 4.031 74.333 11.88l7.63 5.966 4.646 9.458 1.536 7.575zM608.374 577.852h-194.077c-0.291-0.010-0.634-0.015-0.978-0.015-17.681 0-32.015 14.334-32.015 32.015s14.334 32.015 32.015 32.015c0.344 0 0.686-0.005 1.028-0.016l-0.050 0.001h194.078c0.241 0.007 0.525 0.010 0.81 0.010 17.679 0 32.010-14.331 32.010-32.010s-14.331-32.010-32.010-32.010c-0.285 0-0.569 0.004-0.851 0.011l0.042-0.001z"],"attrs":[],"grid":0,"tags":["blogger"]},"attrs":[],"properties":{"order":4615,"id":1069,"name":"blogger","prevSize":32,"code":59784},"setIdx":0,"setId":0,"iconIdx":136},{"icon":{"paths":["M572.16 512l162.133-161.707c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003-192-192c-3.937-3.773-8.616-6.808-13.791-8.859l-0.289-0.101c-4.793-2.024-10.366-3.201-16.213-3.201s-11.42 1.176-16.495 3.305l0.281-0.105c-10.46 4.422-18.618 12.58-22.935 22.76l-0.105 0.28c-2.092 4.778-3.34 10.34-3.413 16.186l-0 0.027v281.173l-119.040-119.467c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293v0l162.133 161.707-162.133 161.707c-7.753 7.753-12.548 18.463-12.548 30.293 0 23.661 19.181 42.841 42.841 42.841 11.83 0 22.541-4.795 30.293-12.548l0-0 119.040-119.467v281.173c0.073 5.873 1.322 11.435 3.52 16.489l-0.107-0.275c4.422 10.46 12.58 18.618 22.76 22.935l0.28 0.105c4.771 2.163 10.345 3.423 16.213 3.423s11.443-1.26 16.466-3.525l-0.253 0.102c5.464-2.152 10.143-5.187 14.095-8.974l-0.015 0.014 192-192c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003zM554.667 230.827l89.173 89.173-89.173 89.173zM554.667 793.173v-178.347l89.173 89.173z"],"attrs":[],"grid":0,"tags":["bluetooth-b"]},"attrs":[],"properties":{"order":4616,"id":1068,"name":"bluetooth-b","prevSize":32,"code":59785},"setIdx":0,"setId":0,"iconIdx":137},{"icon":{"paths":["M704 405.333c0-82.475-66.859-149.333-149.333-149.333v0h-192c-23.564 0-42.667 19.103-42.667 42.667v0 426.667c0 23.564 19.103 42.667 42.667 42.667v0h192c0.192 0.001 0.42 0.001 0.647 0.001 82.239 0 148.907-66.668 148.907-148.907 0-42.023-17.408-79.981-45.405-107.055l-0.041-0.040c27.819-27.072 45.112-64.839 45.227-106.645l0-0.022zM554.667 682.667h-149.333v-128h149.333c35.346 0 64 28.654 64 64s-28.654 64-64 64v0zM554.667 469.333h-149.333v-128h149.333c35.346 0 64 28.654 64 64s-28.654 64-64 64v0z"],"attrs":[],"grid":0,"tags":["bold"]},"attrs":[],"properties":{"order":4617,"id":1067,"name":"bold","prevSize":32,"code":59786},"setIdx":0,"setId":0,"iconIdx":138},{"icon":{"paths":["M848.64 407.467c-7.163-13.992-21.462-23.415-37.966-23.467l-0.007-0h-213.333v-256c0.032-0.623 0.051-1.352 0.051-2.085 0-18.855-12.23-34.853-29.19-40.495l-0.301-0.087c-3.981-1.355-8.566-2.137-13.335-2.137-14.099 0-26.601 6.839-34.369 17.38l-0.083 0.117-341.333 469.333c-4.744 6.779-7.58 15.197-7.58 24.277 0 6.685 1.537 13.011 4.278 18.643l-0.111-0.253c6.107 15.562 20.667 26.533 37.882 27.303l0.091 0.003h213.333v256c0.014 18.823 12.215 34.793 29.139 40.446l0.301 0.087c3.938 1.266 8.475 2.039 13.178 2.133l0.048 0.001c0.033 0 0.072 0 0.111 0 14.097 0 26.598-6.837 34.367-17.376l0.083-0.117 341.333-469.333c5.048-6.922 8.076-15.597 8.076-24.979 0-7.079-1.724-13.755-4.775-19.632l0.112 0.237zM512 764.587v-167.253c0-23.564-19.103-42.667-42.667-42.667v0h-170.667l213.333-295.253v167.253c0 23.564 19.103 42.667 42.667 42.667v0h170.667z"],"attrs":[],"grid":0,"tags":["bolt-alt"]},"attrs":[],"properties":{"order":4618,"id":1066,"name":"bolt-alt","prevSize":32,"code":59787},"setIdx":0,"setId":0,"iconIdx":139},{"icon":{"paths":["M369.92 180.48c3.255 0.891 6.992 1.402 10.848 1.402 11.131 0 21.266-4.262 28.862-11.243l-0.031 0.028h217.6l-54.187 202.24c-0.954 3.366-1.503 7.231-1.503 11.225 0 9.783 3.293 18.798 8.831 25.995l-0.074-0.1c7.857 10.136 20.023 16.606 33.701 16.64l0.006 0h154.027l-48.213 52.907c-6.816 7.532-10.988 17.57-10.988 28.581 0 12.5 5.375 23.744 13.941 31.548l0.034 0.031c7.521 6.855 17.56 11.064 28.581 11.093l0.006 0c12.513-0.031 23.756-5.443 31.541-14.043l0.033-0.037 113.067-124.16c6.828-7.535 11.008-17.581 11.008-28.603 0-23.564-19.103-42.667-42.667-42.667-0.42 0-0.839 0.006-1.256 0.018l0.061-0.001h-193.707l55.893-202.24c0.885-3.245 1.393-6.971 1.393-10.815 0-9.966-3.417-19.133-9.142-26.395l0.069 0.091c-7.877-10.171-20.092-16.656-33.821-16.656-0.41 0-0.818 0.006-1.225 0.017l0.060-0.001h-298.667c-0.435-0.016-0.947-0.025-1.461-0.025-19.628 0-36.16 13.253-41.136 31.299l-0.070 0.3v11.093c-1.033 3.497-1.627 7.515-1.627 11.671 0 19.121 12.578 35.305 29.912 40.727l0.302 0.082zM924.587 865.707l-768-768c-6.952-5.117-15.685-8.189-25.135-8.189-23.564 0-42.667 19.103-42.667 42.667 0 9.878 3.357 18.973 8.993 26.204l-0.071-0.095 184.32 183.040-53.76 202.24c-0.885 3.245-1.393 6.971-1.393 10.815 0 9.966 3.417 19.133 9.142 26.395l-0.069-0.091c7.857 10.136 20.023 16.606 33.701 16.64l0.006 0h163.84l-77.227 287.573c-0.934 3.331-1.471 7.156-1.471 11.106 0 16.13 8.951 30.169 22.156 37.423l0.221 0.111c5.859 3.224 12.841 5.121 20.267 5.121 0.075 0 0.15-0 0.225-0.001l-0.012 0c12.513-0.031 23.756-5.443 31.541-14.043l0.033-0.037 206.933-227.84 229.547 229.547c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003zM325.12 512l26.88-99.84 99.84 99.84zM484.267 737.28l42.667-151.893 51.2 50.773z"],"attrs":[],"grid":0,"tags":["bolt-slash"]},"attrs":[],"properties":{"order":4619,"id":1065,"name":"bolt-slash","prevSize":32,"code":59788},"setIdx":0,"setId":0,"iconIdx":140},{"icon":{"paths":["M847.787 366.933c-6.474-14.615-20.517-24.795-37.022-25.596l-0.098-0.004h-195.413l54.187-202.24c0.954-3.366 1.503-7.231 1.503-11.225 0-9.783-3.293-18.798-8.831-25.995l0.074 0.1c-7.857-10.136-20.023-16.606-33.701-16.64l-0.006-0h-298.667c-0.435-0.016-0.947-0.025-1.461-0.025-19.628 0-36.16 13.253-41.136 31.299l-0.070 0.3-114.347 426.667c-0.954 3.366-1.503 7.231-1.503 11.225 0 9.783 3.293 18.798 8.831 25.995l-0.074-0.1c7.877 10.163 20.087 16.641 33.81 16.641 0.114 0 0.227-0 0.341-0.001l-0.017 0h165.12l-77.227 287.573c-0.955 3.368-1.505 7.235-1.505 11.231 0 23.564 19.103 42.667 42.667 42.667 12.615 0 23.952-5.475 31.763-14.178l0.035-0.040 465.067-512c6.921-7.558 11.161-17.67 11.161-28.773 0-6.102-1.281-11.905-3.589-17.154l0.107 0.274zM430.080 737.28l45.653-170.667c0.954-3.366 1.503-7.231 1.503-11.225 0-9.783-3.293-18.798-8.831-25.995l0.074 0.1c-7.857-10.136-20.023-16.606-33.701-16.64l-0.006-0h-163.84l91.307-342.187h210.347l-54.187 202.24c-0.936 3.335-1.474 7.164-1.474 11.119 0 23.564 19.103 42.667 42.667 42.667 0.518 0 1.035-0.009 1.549-0.028l-0.074 0.002h152.32z"],"attrs":[],"grid":0,"tags":["bolt"]},"attrs":[],"properties":{"order":4620,"id":1064,"name":"bolt","prevSize":32,"code":59789},"setIdx":0,"setId":0,"iconIdx":141},{"icon":{"paths":["M768 85.333h-426.667c-94.257 0-170.667 76.41-170.667 170.667v0 512c0 94.257 76.41 170.667 170.667 170.667v0h426.667c47.128 0 85.333-38.205 85.333-85.333v0-682.667c0-47.128-38.205-85.333-85.333-85.333v0zM256 256c0-47.128 38.205-85.333 85.333-85.333v0h426.667v426.667h-426.667c-31.541 0.136-60.983 9.005-86.067 24.31l0.734-0.416zM341.333 853.333c-47.128 0-85.333-38.205-85.333-85.333s38.205-85.333 85.333-85.333v0h426.667v170.667zM426.667 341.333h170.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-170.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["book-alt"]},"attrs":[],"properties":{"order":4621,"id":1063,"name":"book-alt","prevSize":32,"code":59790},"setIdx":0,"setId":0,"iconIdx":142},{"icon":{"paths":["M554.667 384h-85.333v-85.333c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 85.333h-85.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h85.333v85.333c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-85.333h85.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM768 640v-426.667c0-70.692-57.308-128-128-128v0h-426.667c-70.692 0-128 57.308-128 128v0 426.667c0 70.692 57.308 128 128 128v0h426.667c70.692 0 128-57.308 128-128v0zM170.667 640v-426.667c0-23.564 19.103-42.667 42.667-42.667v0h426.667c23.564 0 42.667 19.103 42.667 42.667v0 426.667c0 23.564-19.103 42.667-42.667 42.667v0h-426.667c-23.564 0-42.667-19.103-42.667-42.667v0zM896 256c-23.564 0-42.667 19.103-42.667 42.667v0 426.667c0 70.692-57.308 128-128 128v0h-426.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h426.667c117.821 0 213.333-95.513 213.333-213.333v0-426.667c0-23.564-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["book-medical"]},"attrs":[],"properties":{"order":4622,"id":1062,"name":"book-medical","prevSize":32,"code":59791},"setIdx":0,"setId":0,"iconIdx":143},{"icon":{"paths":["M903.253 87.893c-27.758-5.025-59.779-7.968-92.462-8.106l-0.125-0c-0.134-0-0.293-0-0.453-0-110.764 0-213.91 32.617-300.356 88.771l2.142-1.304c-83.56-53.541-185.508-85.346-294.884-85.346-1.33 0-2.658 0.005-3.986 0.014l0.203-0.001c-32.807 0.139-64.828 3.082-95.959 8.602l3.372-0.495c-20.242 3.585-35.418 21.043-35.418 42.046 0 0.218 0.002 0.436 0.005 0.653l-0-0.033v512c-0.003 0.185-0.005 0.403-0.005 0.622 0 23.564 19.103 42.667 42.667 42.667 2.564 0 5.076-0.226 7.516-0.66l-0.258 0.038c23.855-4.338 51.309-6.818 79.342-6.818 102.435 0 197.135 33.118 273.978 89.23l-1.319-0.919 5.12 2.987h4.693c4.411 1.889 9.544 2.987 14.933 2.987s10.522-1.098 15.187-3.083l-0.254 0.096h4.693l5.12-2.987c76.534-57.532 173.158-92.134 277.863-92.134 26.178 0 51.85 2.163 76.849 6.32l-2.712-0.372c2.182 0.396 4.694 0.622 7.258 0.622 23.564 0 42.667-19.103 42.667-42.667 0-0.219-0.002-0.437-0.005-0.655l0 0.033v-512c-0.951-20.194-15.804-36.654-35.157-40.069l-0.257-0.038zM469.333 654.933c-74.116-39.777-162.16-63.147-255.661-63.147-0.119 0-0.238 0-0.357 0l0.018-0c-14.080 0-28.16 0-42.667 0v-426.667c6.376-0.391 13.828-0.614 21.333-0.614s14.957 0.223 22.352 0.663l-1.018-0.048c0.152-0 0.332-0 0.512-0 95.146 0 183.593 28.677 257.171 77.859l-1.683-1.059zM853.333 593.493c-14.507 0-28.587 0-42.667 0-0.101-0-0.22-0-0.339-0-93.502 0-181.545 23.369-258.608 64.586l2.947-1.439v-414.72c71.895-48.123 160.342-76.8 255.488-76.8 0.18 0 0.36 0 0.54 0l-0.028-0c6.376-0.391 13.828-0.614 21.333-0.614s14.957 0.223 22.352 0.663l-1.018-0.048zM903.253 770.56c-27.758-5.025-59.779-7.968-92.462-8.106l-0.125-0c-0.134-0-0.293-0-0.453-0-110.764 0-213.91 32.617-300.356 88.771l2.142-1.304c-84.304-54.849-187.45-87.467-298.214-87.467-0.159 0-0.318 0-0.477 0l0.024-0c-32.807 0.139-64.828 3.082-95.959 8.602l3.372-0.495c-20.513 3.345-35.979 20.936-35.979 42.139 0 2.446 0.206 4.845 0.601 7.179l-0.035-0.251c3.974 19.781 21.207 34.472 41.872 34.472 2.847 0 5.628-0.279 8.319-0.81l-0.271 0.045c23.855-4.338 51.309-6.818 79.342-6.818 102.435 0 197.135 33.118 273.978 89.23l-1.319-0.919c6.875 4.946 15.465 7.91 24.747 7.91s17.871-2.964 24.874-7.997l-0.127 0.087c75.523-55.194 170.223-88.311 272.658-88.311 28.033 0 55.487 2.48 82.155 7.234l-2.813-0.416c2.42 0.487 5.201 0.766 8.048 0.766 20.665 0 37.899-14.691 41.827-34.199l0.046-0.273c0.36-2.083 0.566-4.481 0.566-6.927 0-21.203-15.466-38.794-35.733-42.106l-0.246-0.033z"],"attrs":[],"grid":0,"tags":["book-open"]},"attrs":[],"properties":{"order":4623,"id":1061,"name":"book-open","prevSize":32,"code":59792},"setIdx":0,"setId":0,"iconIdx":144},{"icon":{"paths":["M861.013 434.773c-27.182-5.161-58.449-8.113-90.405-8.113-0.917 0-1.834 0.002-2.75 0.007l0.142-0.001c-17.92 0-35.413 0-52.907 3.413-21.815-28.904-48.986-52.532-80.192-69.742l-1.301-0.658c26.426-28.787 42.633-67.324 42.667-109.646l0-0.007c0-90.958-73.736-164.693-164.693-164.693s-164.693 73.736-164.693 164.693v-0c0.034 42.329 16.241 80.867 42.774 109.772l-0.108-0.119c-32.346 17.974-59.469 41.42-81.044 69.368l-0.449 0.605c-16.64-2.987-34.133-2.987-52.053-2.987-32.977 0.132-65.11 3.387-96.225 9.484l3.212-0.524c-20.035 3.762-34.992 21.12-34.992 41.971 0 0.245 0.002 0.489 0.006 0.733l-0-0.037v352c-0 0.021-0 0.045-0 0.069 0 13.146 5.945 24.903 15.293 32.73l0.067 0.054c7.373 6.249 16.995 10.048 27.504 10.048 2.645 0 5.233-0.241 7.744-0.701l-0.262 0.040c23.025-5.255 49.73-8.636 77.093-9.375l0.56-0.012c0.137-0 0.3-0 0.462-0 86.396 0 166.728 25.964 233.618 70.516l-1.547-0.969 5.547 2.133c5.275 2.35 11.423 3.755 17.889 3.84l0.031 0c4.298-0.055 8.397-0.833 12.205-2.215l-0.258 0.082h2.987l5.547-2.133c65.899-44.633 147.162-71.254 234.644-71.254 0.308 0 0.616 0 0.924 0.001l-0.048-0c27.55 0.132 54.367 2.922 80.311 8.125l-2.658-0.445c2.25 0.421 4.838 0.661 7.483 0.661 10.509 0 20.13-3.799 27.566-10.099l-0.062 0.051c9.415-7.881 15.36-19.638 15.36-32.784 0-0.024-0-0.049-0-0.073l0 0.004v-352c-0.079-20.784-15.006-38.059-34.722-41.772l-0.265-0.041zM512 170.667c41.255 3.123 73.545 37.364 73.545 79.147s-32.29 76.024-73.278 79.13l-0.267 0.016c-41.255-3.123-73.545-37.364-73.545-79.147s32.29-76.024 73.278-79.13l0.267-0.016zM469.333 824.747c-62.567-29.624-135.929-46.924-213.33-46.933l-0.003-0c-14.080 0-28.16 0-42.667 2.133v-267.947c13.708-1.622 29.585-2.547 45.679-2.547 21.826 0 43.254 1.702 64.16 4.98l-2.319-0.3h4.693c54.197 10.166 102.46 29.185 145.646 55.674l-1.859-1.061zM512 494.933c-16.217-9.597-35.569-19.317-55.584-27.776l-3.296-1.237h-2.56c-14.080-5.547-28.16-11.093-42.667-15.36 28.32-22.695 64.54-36.599 103.991-37.119l0.116-0.001c39.466 0.258 75.703 13.872 104.47 36.543l-0.363-0.276c-39.9 12.605-74.359 27.943-106.668 46.59l2.562-1.364zM810.667 779.947c-14.838-1.579-32.054-2.48-49.48-2.48-74.903 0-145.92 16.639-209.556 46.423l3.036-1.277v-256c41.379-24.784 89.745-42.992 141.336-51.711l2.45-0.342h8.533c18.53-3.036 39.885-4.771 61.646-4.771 14.806 0 29.425 0.803 43.815 2.368l-1.781-0.157z"],"attrs":[],"grid":0,"tags":["book-reader"]},"attrs":[],"properties":{"order":4624,"id":1060,"name":"book-reader","prevSize":32,"code":59793},"setIdx":0,"setId":0,"iconIdx":145},{"icon":{"paths":["M640 256h-256c-23.564 0-42.667 19.103-42.667 42.667v0 170.667c0 23.564 19.103 42.667 42.667 42.667v0h256c23.564 0 42.667-19.103 42.667-42.667v0-170.667c0-23.564-19.103-42.667-42.667-42.667v0zM597.333 426.667h-170.667v-85.333h170.667zM725.333 85.333h-512c-23.564 0-42.667 19.103-42.667 42.667v0 768c0 23.564 19.103 42.667 42.667 42.667v0h512c70.692 0 128-57.308 128-128v0-597.333c0-70.692-57.308-128-128-128v0zM768 810.667c0 23.564-19.103 42.667-42.667 42.667v0h-469.333v-682.667h469.333c23.564 0 42.667 19.103 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["book"]},"attrs":[],"properties":{"order":4625,"id":1059,"name":"book","prevSize":32,"code":59794},"setIdx":0,"setId":0,"iconIdx":146},{"icon":{"paths":["M768 85.333h-512c-23.564 0-42.667 19.103-42.667 42.667v0 768c-0 0.001-0 0.002-0 0.003 0 23.564 19.103 42.667 42.667 42.667 10.615 0 20.324-3.876 27.79-10.29l228.21-191.526 225.707 189.44c7.709 7.648 18.326 12.374 30.047 12.374 0.087 0 0.173-0 0.26-0.001l-0.013 0c0.275 0.008 0.599 0.012 0.923 0.012 5.554 0 10.813-1.263 15.505-3.518l-0.215 0.093c15.59-6.527 26.363-21.621 26.453-39.242l0-0.012v-768c0-23.564-19.103-42.667-42.667-42.667v0zM725.333 804.693l-186.027-156.16c-7.342-6.149-16.888-9.883-27.307-9.883s-19.965 3.734-27.373 9.937l0.067-0.054-186.027 156.16v-634.027h426.667z"],"attrs":[],"grid":0,"tags":["bookmark-full"]},"attrs":[],"properties":{"order":4626,"id":1058,"name":"bookmark-full","prevSize":32,"code":59795},"setIdx":0,"setId":0,"iconIdx":147},{"icon":{"paths":["M682.667 85.333h-341.333c-70.692 0-128 57.308-128 128v0 682.667c-0 0.050-0 0.11-0 0.169 0 15.71 8.49 29.436 21.132 36.842l0.201 0.109c6.12 3.594 13.479 5.716 21.333 5.716s15.214-2.123 21.535-5.825l-0.201 0.109 234.667-135.68 234.667 135.68c6.049 3.489 13.303 5.548 21.039 5.548 0.104 0 0.207-0 0.311-0.001l-0.016 0c0.088 0.001 0.191 0.001 0.295 0.001 7.735 0 14.99-2.058 21.246-5.658l-0.207 0.11c12.844-7.514 21.334-21.241 21.334-36.951 0-0.060-0-0.119-0-0.179l0 0.009v-682.667c0-70.692-57.308-128-128-128v0zM725.333 822.187l-192-110.933c-6.12-3.594-13.479-5.716-21.333-5.716s-15.214 2.123-21.535 5.825l0.201-0.109-192 110.933v-608.853c0-23.564 19.103-42.667 42.667-42.667v0h341.333c23.564 0 42.667 19.103 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["bookmark"]},"attrs":[],"properties":{"order":4627,"id":1057,"name":"bookmark","prevSize":32,"code":59796},"setIdx":0,"setId":0,"iconIdx":148},{"icon":{"paths":["M958.72 802.987l-42.667-164.693-134.4-494.507c-5.015-18.391-21.57-31.689-41.23-31.689-3.847 0-7.576 0.509-11.122 1.464l0.298-0.068-165.12 42.667c-7.724-8.535-18.791-13.922-31.118-14.080l-0.028-0h-426.667c-23.564 0-42.667 19.103-42.667 42.667v0 682.667c0 23.564 19.103 42.667 42.667 42.667v0h426.667c23.564 0 42.667-19.103 42.667-42.667v0-341.333l93.867 350.72c5.046 18.345 21.578 31.598 41.206 31.598 0.514 0 1.025-0.009 1.534-0.027l-0.074 0.002c1.665 0.2 3.592 0.315 5.547 0.315s3.882-0.114 5.777-0.336l-0.23 0.022 206.080-55.040c11.207-3.064 20.368-10.279 25.917-19.849l0.11-0.205c2.752-5.641 4.361-12.273 4.361-19.281 0-3.912-0.501-7.707-1.444-11.324l0.069 0.311zM276.053 826.453h-128v-85.333h128zM276.053 655.787h-128v-256h128zM276.053 314.453h-128v-85.333h128zM489.387 826.453h-128v-85.333h128zM489.387 655.787h-128v-256h128zM489.387 314.453h-128v-85.333h128zM585.387 240.213l123.733-33.28 22.187 82.347-123.733 33.28zM695.893 652.373l-66.133-247.467 123.733-33.28 66.133 247.467zM738.56 817.067l-22.187-82.347 123.733-33.28 22.187 82.347z"],"attrs":[],"grid":0,"tags":["books"]},"attrs":[],"properties":{"order":4628,"id":1056,"name":"books","prevSize":32,"code":59797},"setIdx":0,"setId":0,"iconIdx":149},{"icon":{"paths":["M725.333 85.333h-426.667c-70.692 0-128 57.308-128 128v0 597.333c0 70.692 57.308 128 128 128v0h426.667c70.692 0 128-57.308 128-128v0-597.333c0-70.692-57.308-128-128-128v0zM768 810.667c0 23.564-19.103 42.667-42.667 42.667v0h-426.667c-23.564 0-42.667-19.103-42.667-42.667v0-597.333c0-23.564 19.103-42.667 42.667-42.667v0h426.667c23.564 0 42.667 19.103 42.667 42.667v0zM613.547 460.8c16.28-21.044 26.188-47.74 26.453-76.739l0-0.061c0-70.692-57.308-128-128-128s-128 57.308-128 128v0c0.265 29.060 10.173 55.755 26.673 77.095l-0.219-0.295c-42.132 31.438-69.12 81.152-69.12 137.169 0 94.257 76.41 170.667 170.667 170.667s170.667-76.41 170.667-170.667c0-56.017-26.988-105.731-68.67-136.848l-0.45-0.321zM512 341.333c23.564 0 42.667 19.103 42.667 42.667s-19.103 42.667-42.667 42.667c-23.564 0-42.667-19.103-42.667-42.667v0c0-23.564 19.103-42.667 42.667-42.667v0zM512 682.667c-47.128 0-85.333-38.205-85.333-85.333s38.205-85.333 85.333-85.333c47.128 0 85.333 38.205 85.333 85.333v0c0 47.128-38.205 85.333-85.333 85.333v0z"],"attrs":[],"grid":0,"tags":["boombox"]},"attrs":[],"properties":{"order":4629,"id":1055,"name":"boombox","prevSize":32,"code":59798},"setIdx":0,"setId":0,"iconIdx":150},{"icon":{"paths":["M490.667 789.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM874.667 149.333c0-23.564-19.103-42.667-42.667-42.667v0h-682.667c-23.564 0-42.667 19.103-42.667 42.667v0 682.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-640h640c23.564 0 42.667-19.103 42.667-42.667v0zM661.333 789.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM320 789.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM832 277.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM832 448c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM832 618.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM832 789.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["border-alt"]},"attrs":[],"properties":{"order":4630,"id":1054,"name":"border-alt","prevSize":32,"code":59799},"setIdx":0,"setId":0,"iconIdx":151},{"icon":{"paths":["M512 576c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667c-23.564 0-42.667 19.103-42.667 42.667v0c0 23.564 19.103 42.667 42.667 42.667v0zM512 746.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667c-23.564 0-42.667 19.103-42.667 42.667v0c0 23.564 19.103 42.667 42.667 42.667v0zM512 405.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667c-23.564 0-42.667 19.103-42.667 42.667v0c0 23.564 19.103 42.667 42.667 42.667v0zM341.333 234.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667c-23.564 0-42.667 19.103-42.667 42.667v0c0 23.564 19.103 42.667 42.667 42.667v0zM341.333 576c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667c-23.564 0-42.667 19.103-42.667 42.667v0c0 23.564 19.103 42.667 42.667 42.667v0zM853.333 234.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667c-23.564 0-42.667 19.103-42.667 42.667v0c0 23.564 19.103 42.667 42.667 42.667v0zM682.667 576c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667c-23.564 0-42.667 19.103-42.667 42.667v0c0 23.564 19.103 42.667 42.667 42.667v0zM512 234.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667c-23.564 0-42.667 19.103-42.667 42.667v0c0 23.564 19.103 42.667 42.667 42.667v0zM682.667 234.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667c-23.564 0-42.667 19.103-42.667 42.667v0c0 23.564 19.103 42.667 42.667 42.667v0zM853.333 661.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM853.333 490.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM853.333 832h-682.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h682.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM853.333 320c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM170.667 576c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667c-23.564 0-42.667 19.103-42.667 42.667v0c0 23.564 19.103 42.667 42.667 42.667v0zM170.667 405.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667c-23.564 0-42.667 19.103-42.667 42.667v0c0 23.564 19.103 42.667 42.667 42.667v0zM170.667 746.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667c-23.564 0-42.667 19.103-42.667 42.667v0c0 23.564 19.103 42.667 42.667 42.667v0zM170.667 234.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667c-23.564 0-42.667 19.103-42.667 42.667v0c0 23.564 19.103 42.667 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["border-bottom"]},"attrs":[],"properties":{"order":4631,"id":1053,"name":"border-bottom","prevSize":32,"code":59800},"setIdx":0,"setId":0,"iconIdx":152},{"icon":{"paths":["M341.333 469.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM341.333 810.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM512 810.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM170.667 128c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM170.667 469.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM853.333 213.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667c-23.564 0-42.667 19.103-42.667 42.667v0c0 23.564 19.103 42.667 42.667 42.667v0zM170.667 810.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM512 640c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM170.667 640c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM170.667 298.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM341.333 128c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM853.333 640c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM853.333 810.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM853.333 298.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM512 469.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM853.333 469.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM682.667 128c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM512 128c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM512 298.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM682.667 810.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM682.667 469.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["border-clear"]},"attrs":[],"properties":{"order":4632,"id":1052,"name":"border-clear","prevSize":32,"code":59801},"setIdx":0,"setId":0,"iconIdx":153},{"icon":{"paths":["M341.333 213.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667c-23.564 0-42.667 19.103-42.667 42.667v0c0 23.564 19.103 42.667 42.667 42.667v0zM170.667 384c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667c-23.564 0-42.667 19.103-42.667 42.667v0c0 23.564 19.103 42.667 42.667 42.667v0zM512 384c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667c-23.564 0-42.667 19.103-42.667 42.667v0c0 23.564 19.103 42.667 42.667 42.667v0zM170.667 213.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667c-23.564 0-42.667 19.103-42.667 42.667v0c0 23.564 19.103 42.667 42.667 42.667v0zM682.667 213.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667c-23.564 0-42.667 19.103-42.667 42.667v0c0 23.564 19.103 42.667 42.667 42.667v0zM512 213.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667c-23.564 0-42.667 19.103-42.667 42.667v0c0 23.564 19.103 42.667 42.667 42.667v0zM853.333 213.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667c-23.564 0-42.667 19.103-42.667 42.667v0c0 23.564 19.103 42.667 42.667 42.667v0zM170.667 810.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM853.333 810.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM853.333 640c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM853.333 469.333h-682.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h682.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM682.667 810.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM170.667 640c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM853.333 298.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM341.333 810.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM512 810.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM512 640c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["border-horizontal"]},"attrs":[],"properties":{"order":4633,"id":1051,"name":"border-horizontal","prevSize":32,"code":59802},"setIdx":0,"setId":0,"iconIdx":154},{"icon":{"paths":["M341.333 213.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667c-23.564 0-42.667 19.103-42.667 42.667v0c0 23.564 19.103 42.667 42.667 42.667v0zM170.667 384c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667c-23.564 0-42.667 19.103-42.667 42.667v0c0 23.564 19.103 42.667 42.667 42.667v0zM170.667 213.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667c-23.564 0-42.667 19.103-42.667 42.667v0c0 23.564 19.103 42.667 42.667 42.667v0zM170.667 810.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM853.333 213.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667c-23.564 0-42.667 19.103-42.667 42.667v0c0 23.564 19.103 42.667 42.667 42.667v0zM853.333 384c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667c-23.564 0-42.667 19.103-42.667 42.667v0c0 23.564 19.103 42.667 42.667 42.667v0zM682.667 213.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667c-23.564 0-42.667 19.103-42.667 42.667v0c0 23.564 19.103 42.667 42.667 42.667v0zM853.333 810.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM170.667 640c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM853.333 640c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM682.667 810.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM896 512c0-23.564-19.103-42.667-42.667-42.667v0h-298.667v-298.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 298.667h-298.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h298.667v298.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-298.667h298.667c23.564 0 42.667-19.103 42.667-42.667v0zM341.333 810.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["border-inner"]},"attrs":[],"properties":{"order":4634,"id":1050,"name":"border-inner","prevSize":32,"code":59803},"setIdx":0,"setId":0,"iconIdx":155},{"icon":{"paths":["M490.667 810.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM490.667 640c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM490.667 469.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM149.333 128c-23.564 0-42.667 19.103-42.667 42.667v0 682.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-682.667c0-23.564-19.103-42.667-42.667-42.667v0zM832 213.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667c-23.564 0-42.667 19.103-42.667 42.667v0c0 23.564 19.103 42.667 42.667 42.667v0zM490.667 298.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM320 469.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM320 810.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM320 128c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM832 469.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM832 640c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM490.667 128c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM832 810.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM832 298.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM661.333 128c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM661.333 810.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM661.333 469.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["border-left"]},"attrs":[],"properties":{"order":4635,"id":1049,"name":"border-left","prevSize":32,"code":59804},"setIdx":0,"setId":0,"iconIdx":156},{"icon":{"paths":["M512 384c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667c-23.564 0-42.667 19.103-42.667 42.667v0c0 23.564 19.103 42.667 42.667 42.667v0zM512 554.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667c-23.564 0-42.667 19.103-42.667 42.667v0c0 23.564 19.103 42.667 42.667 42.667v0zM682.667 554.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667c-23.564 0-42.667 19.103-42.667 42.667v0c0 23.564 19.103 42.667 42.667 42.667v0zM512 725.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667c-23.564 0-42.667 19.103-42.667 42.667v0c0 23.564 19.103 42.667 42.667 42.667v0zM853.333 128h-682.667c-23.564 0-42.667 19.103-42.667 42.667v0 682.667c0 23.564 19.103 42.667 42.667 42.667v0h682.667c23.564 0 42.667-19.103 42.667-42.667v0-682.667c0-23.564-19.103-42.667-42.667-42.667v0zM810.667 810.667h-597.333v-597.333h597.333zM341.333 554.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667c-23.564 0-42.667 19.103-42.667 42.667v0c0 23.564 19.103 42.667 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["border-out"]},"attrs":[],"properties":{"order":4636,"id":1048,"name":"border-out","prevSize":32,"code":59805},"setIdx":0,"setId":0,"iconIdx":157},{"icon":{"paths":["M192 298.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM192 128c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM362.667 810.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM192 810.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM362.667 469.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM362.667 128c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM192 469.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM192 640c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM704 128c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM704 469.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM533.333 810.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM533.333 128c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM874.667 128c-23.564 0-42.667 19.103-42.667 42.667v0 682.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-682.667c0-23.564-19.103-42.667-42.667-42.667v0zM704 810.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM533.333 298.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM533.333 640c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM533.333 469.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["border-right"]},"attrs":[],"properties":{"order":4637,"id":1047,"name":"border-right","prevSize":32,"code":59806},"setIdx":0,"setId":0,"iconIdx":158},{"icon":{"paths":["M341.333 789.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM341.333 448c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM512 789.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM170.667 277.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM170.667 789.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM170.667 192h682.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-682.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM170.667 618.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM170.667 448c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM512 277.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM853.333 618.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM853.333 789.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM512 618.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM853.333 277.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM853.333 448c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM512 448c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM682.667 448c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM682.667 789.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["border-top"]},"attrs":[],"properties":{"order":4638,"id":1046,"name":"border-top","prevSize":32,"code":59807},"setIdx":0,"setId":0,"iconIdx":159},{"icon":{"paths":["M128 128c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM128 298.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM810.667 213.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667c-23.564 0-42.667 19.103-42.667 42.667v0c0 23.564 19.103 42.667 42.667 42.667v0zM298.667 469.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM298.667 810.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM298.667 128c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM128 640c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM128 469.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM128 810.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM810.667 640c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM810.667 469.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM810.667 810.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM810.667 298.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM640 128c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM469.333 128c-23.564 0-42.667 19.103-42.667 42.667v0 682.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-682.667c0-23.564-19.103-42.667-42.667-42.667v0zM640 810.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM640 469.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["border-vertical"]},"attrs":[],"properties":{"order":4639,"id":1045,"name":"border-vertical","prevSize":32,"code":59808},"setIdx":0,"setId":0,"iconIdx":160},{"icon":{"paths":["M340.979 341.406c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM511.625 85.419c-235.641-0-426.667 191.025-426.667 426.667s191.025 426.667 426.667 426.667c235.641 0 426.667-191.025 426.667-426.667v0c-0.286-235.527-191.14-426.381-426.639-426.667l-0.027-0zM511.625 853.419c-188.513 0-341.333-152.82-341.333-341.333s152.82-341.333 341.333-341.333c188.513 0 341.333 152.82 341.333 341.333v0c-0.222 188.424-152.91 341.111-341.312 341.333l-0.021 0zM468.979 426.74c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM468.979 256.073c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["bowling-ball"]},"attrs":[],"properties":{"order":4640,"id":1044,"name":"bowling-ball","prevSize":32,"code":59809},"setIdx":0,"setId":0,"iconIdx":161},{"icon":{"paths":["M874.24 320.853c-0.116-0.513-0.182-1.102-0.182-1.707s0.066-1.194 0.192-1.761l-0.010 0.054c-0.099-0.449-0.155-0.965-0.155-1.493s0.057-1.044 0.164-1.541l-0.009 0.048v-3.84l-2.56-6.4c-1.082-1.799-2.356-3.344-3.823-4.678l-0.017-0.015-3.84-3.413h-2.133l-168.107-106.24-158.72-98.133c-3.501-2.797-7.626-4.989-12.117-6.334l-0.257-0.066h-3.413c-1.732-0.304-3.726-0.477-5.76-0.477s-4.028 0.174-5.968 0.507l0.208-0.030h-4.267c-5.322 1.198-10.025 3.112-14.3 5.668l0.22-0.122-318.72 198.4-3.84 2.987-3.84 3.413-4.267 2.987-2.133 2.56-2.56 6.4v6.4c-0.198 1.282-0.311 2.761-0.311 4.267s0.113 2.984 0.331 4.429l-0.020-0.162v372.48c-0 0.025-0 0.055-0 0.085 0 15.184 7.932 28.516 19.878 36.078l0.175 0.103 320 197.973 6.4 2.56h3.413c3.315 1.089 7.131 1.717 11.093 1.717s7.778-0.628 11.353-1.79l-0.26 0.073h3.413l6.4-2.56 317.44-194.987c12.121-7.665 20.053-20.997 20.053-36.181 0-0.030-0-0.060-0-0.090l0 0.005v-372.48s0.853-2.987 0.853-4.693zM512 177.92l75.947 46.933-238.507 147.627-76.373-46.933zM469.333 817.92l-234.667-143.36v-272.64l234.667 145.067zM512 471.893l-81.493-49.067 238.507-148.053 81.92 50.773zM789.333 673.28l-234.667 145.92v-272.213l234.667-145.067z"],"attrs":[],"grid":0,"tags":["box"]},"attrs":[],"properties":{"order":4641,"id":1043,"name":"box","prevSize":32,"code":59810},"setIdx":0,"setId":0,"iconIdx":162},{"icon":{"paths":["M256 256c0-47.128 38.205-85.333 85.333-85.333v0c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0c-94.257 0-170.667 76.41-170.667 170.667v0 128c0 47.128-38.205 85.333-85.333 85.333v0c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0c47.128 0 85.333 38.205 85.333 85.333v0 128c0 94.257 76.41 170.667 170.667 170.667v0c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0c-47.128 0-85.333-38.205-85.333-85.333v0-128c-0.297-51.047-22.959-96.741-58.674-127.824l-0.206-0.176c35.921-31.259 58.583-76.953 58.88-127.948l0-0.052zM938.667 469.333c-47.128 0-85.333-38.205-85.333-85.333v0-128c0-94.257-76.41-170.667-170.667-170.667v0c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0c47.128 0 85.333 38.205 85.333 85.333v0 128c0.297 51.047 22.959 96.741 58.674 127.824l0.206 0.176c-35.921 31.259-58.583 76.953-58.88 127.948l-0 0.052v128c0 47.128-38.205 85.333-85.333 85.333v0c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0c94.257 0 170.667-76.41 170.667-170.667v0-128c0-47.128 38.205-85.333 85.333-85.333v0c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["brackets-curly"]},"attrs":[],"properties":{"order":4642,"id":1042,"name":"brackets-curly","prevSize":32,"code":59811},"setIdx":0,"setId":0,"iconIdx":163},{"icon":{"paths":["M938.667 469.333c0.001-0.201 0.001-0.439 0.001-0.678 0-62.838-33.961-117.745-84.529-147.366l-0.805-0.436c0.307-3.324 0.482-7.188 0.482-11.093s-0.175-7.77-0.517-11.586l0.036 0.492c0-70.692-57.308-128-128-128v0h-7.68c-18.316-49.738-65.294-84.57-120.407-84.57-32.8 0-62.718 12.337-85.368 32.624l0.122-0.107c-22.528-20.18-52.447-32.517-85.246-32.517-55.113 0-102.091 34.832-120.12 83.683l-0.287 0.887h-7.68c-70.692 0-128 57.308-128 128v0c-0.307 3.324-0.482 7.188-0.482 11.093s0.175 7.77 0.517 11.586l-0.036-0.492c-52.132 29.874-86.687 85.189-86.687 148.575 0 53.393 24.518 101.059 62.91 132.354l0.31 0.245c-12.754 23.332-20.255 51.112-20.255 80.643 0 94.257 76.41 170.667 170.667 170.667 0.371 0 0.741-0.001 1.112-0.004l-0.057 0h7.68c18.316 49.738 65.294 84.57 120.407 84.57 32.8 0 62.718-12.337 85.368-32.624l-0.122 0.107c22.528 20.18 52.447 32.517 85.246 32.517 55.113 0 102.091-34.832 120.12-83.683l0.287-0.887h7.68c93.792-0.612 169.588-76.786 169.588-170.663 0-29.532-7.501-57.311-20.701-81.538l0.446 0.895c39.022-31.43 63.827-79.147 64-132.664l0-0.029zM469.333 364.8c-8.141-4.768-17.698-9.36-27.636-13.187l-1.377-0.466c-4.073-1.418-8.767-2.238-13.653-2.238-23.622 0-42.771 19.149-42.771 42.771 0 18.736 12.047 34.658 28.817 40.443l0.301 0.090c32.983 12.173 56.115 43.252 56.32 79.762l0 0.025v66.133c-8.141-4.768-17.698-9.36-27.636-13.187l-1.377-0.466c-4.073-1.418-8.767-2.238-13.653-2.238-23.622 0-42.771 19.149-42.771 42.771 0 18.736 12.047 34.658 28.817 40.443l0.301 0.090c32.983 12.173 56.115 43.252 56.32 79.762l0 0.025v85.333c0 23.564-19.103 42.667-42.667 42.667v0c-17.281-0.116-32.111-10.488-38.719-25.329l-0.108-0.271c7.805-4.61 14.493-9.259 20.818-14.343l-0.338 0.263c9.447-7.891 15.413-19.676 15.413-32.853 0-23.594-19.126-42.72-42.72-42.72-10.416 0-19.961 3.728-27.374 9.922l0.068-0.055c-14.739 12.472-33.963 20.053-54.957 20.053-0.029 0-0.058-0-0.087-0l0.005 0c-47.128 0-85.333-38.205-85.333-85.333v0c0.221-16.835 5.283-32.445 13.854-45.553l-0.2 0.326c8.652 1.629 18.604 2.56 28.775 2.56 0.084 0 0.168-0 0.251-0l-0.013 0c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0c-0.134 0.001-0.293 0.001-0.452 0.001-10.439 0-20.403-2.038-29.514-5.737l0.526 0.189c-33.16-12.21-56.383-43.529-56.383-80.272 0-31.617 17.195-59.218 42.743-73.962l0.412-0.22c5.826 5.374 12.242 10.298 19.081 14.612l0.546 0.321c6.123 3.58 13.481 5.694 21.333 5.694 23.645 0 42.814-19.168 42.814-42.814 0-15.793-8.552-29.589-21.277-37.010l-0.203-0.11c-6.052-3.382-10.962-8.155-14.41-13.906l-0.097-0.174c-3.292-5.621-5.237-12.377-5.237-19.588 0-1.065 0.042-2.12 0.126-3.163l-0.009 0.138c0-23.564 19.103-42.667 42.667-42.667v0c1.346-0.198 2.9-0.311 4.48-0.311s3.134 0.113 4.654 0.331l-0.174-0.020c2.645 7.99 5.388 14.621 8.536 21.018l-0.429-0.965c7.488 12.956 21.275 21.534 37.066 21.534 7.877 0 15.255-2.134 21.588-5.856l-0.2 0.109c12.47-7.597 20.67-21.121 20.67-36.559 0-7.564-1.968-14.669-5.421-20.829l0.111 0.215c-3.433-6.159-5.48-13.5-5.547-21.313l-0-0.020c0-23.564 19.103-42.667 42.667-42.667s42.667 19.103 42.667 42.667v0zM797.44 549.12c-8.586 3.51-18.549 5.548-28.988 5.548-0.159 0-0.317-0-0.476-0.001l0.024 0c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0c0.071 0 0.155 0 0.238 0 10.17 0 20.123-0.932 29.778-2.714l-1.003 0.154c8.37 12.782 13.433 28.391 13.653 45.169l0.001 0.058c0 47.128-38.205 85.333-85.333 85.333v0c-0.025 0-0.054 0-0.083 0-20.995 0-40.218-7.582-55.083-20.157l0.126 0.103c-7.346-6.139-16.891-9.867-27.307-9.867-23.594 0-42.72 19.126-42.72 42.72 0 13.178 5.967 24.962 15.346 32.798l0.068 0.055c5.987 4.821 12.675 9.47 19.682 13.64l0.798 0.44c-6.716 15.112-21.546 25.484-38.812 25.6l-0.015 0c-23.564 0-42.667-19.103-42.667-42.667v0-85.333c0.205-36.534 23.337-67.613 55.729-79.595l0.591-0.191c17.071-5.875 29.118-21.797 29.118-40.533 0-23.622-19.149-42.771-42.771-42.771-4.886 0-9.581 0.819-13.954 2.328l0.301-0.090c-11.315 4.293-20.872 8.885-29.978 14.17l0.965-0.517v-66.133c0.205-36.534 23.337-67.613 55.729-79.595l0.591-0.191c17.071-5.875 29.118-21.797 29.118-40.533 0-23.622-19.149-42.771-42.771-42.771-4.886 0-9.581 0.819-13.954 2.328l0.301-0.090c-11.315 4.293-20.872 8.885-29.978 14.17l0.965-0.517v-151.467c0-23.564 19.103-42.667 42.667-42.667s42.667 19.103 42.667 42.667v0c-0.066 7.833-2.114 15.174-5.664 21.564l0.118-0.231c-3.68 6.176-5.855 13.62-5.855 21.572 0 15.661 8.438 29.352 21.016 36.773l0.199 0.109c6.133 3.613 13.511 5.748 21.388 5.748 15.791 0 29.578-8.578 36.956-21.329l0.11-0.205c2.783-5.811 5.536-12.882 7.796-20.17l0.311-1.164c1.346-0.198 2.9-0.311 4.48-0.311s3.134 0.113 4.654 0.331l-0.174-0.020c23.564 0 42.667 19.103 42.667 42.667v0c-0.071 8.761-2.771 16.878-7.349 23.616l0.095-0.149c-3.531 5.543-8.277 10.016-13.883 13.127l-0.197 0.1c-12.929 7.531-21.48 21.327-21.48 37.12 0 23.645 19.168 42.814 42.814 42.814 7.852 0 15.21-2.114 21.537-5.803l-0.203 0.11c8.1-4.424 15.094-9.377 21.447-15.033l-0.114 0.1c26.338 14.868 43.831 42.671 43.831 74.561 0 36.357-22.737 67.403-54.766 79.695l-0.584 0.197z"],"attrs":[],"grid":0,"tags":["brain"]},"attrs":[],"properties":{"order":4643,"id":1041,"name":"brain","prevSize":32,"code":59812},"setIdx":0,"setId":0,"iconIdx":164},{"icon":{"paths":["M810.667 277.333h-128v-42.667c0-70.692-57.308-128-128-128v0h-85.333c-70.692 0-128 57.308-128 128v0 42.667h-128c-70.692 0-128 57.308-128 128v0 384c0 70.692 57.308 128 128 128v0h597.333c70.692 0 128-57.308 128-128v0-384c0-70.692-57.308-128-128-128v0zM426.667 234.667c0-23.564 19.103-42.667 42.667-42.667v0h85.333c23.564 0 42.667 19.103 42.667 42.667v0 42.667h-170.667zM853.333 789.333c0 23.564-19.103 42.667-42.667 42.667v0h-597.333c-23.564 0-42.667-19.103-42.667-42.667v0-234.667c35.13 14.525 77.848 28.288 121.812 38.851l6.188 1.255v25.173c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-8.96c38.285 5.502 82.664 8.751 127.762 8.959l0.238 0.001c45.336-0.209 89.715-3.458 133.18-9.555l-5.18 0.595v8.96c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-25.173c50.15-11.818 92.868-25.582 134.081-42.285l-6.081 2.178zM853.333 461.227c-35.358 15.502-77.995 30.106-121.974 41.359l-6.026 1.308v-13.227c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 31.573c-38.469 6.11-82.827 9.601-128 9.601s-89.531-3.491-132.818-10.218l4.818 0.616v-31.573c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 14.080c-50.005-12.561-92.642-27.165-133.649-44.832l5.649 2.166v-56.747c0-23.564 19.103-42.667 42.667-42.667v0h597.333c23.564 0 42.667 19.103 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["briefcase-alt"]},"attrs":[],"properties":{"order":4644,"id":1040,"name":"briefcase-alt","prevSize":32,"code":59813},"setIdx":0,"setId":0,"iconIdx":165},{"icon":{"paths":["M896 256h-170.667v-42.667c0-70.692-57.308-128-128-128v0h-170.667c-70.692 0-128 57.308-128 128v0 42.667h-170.667c-23.564 0-42.667 19.103-42.667 42.667v0 170.667c0.208 37.599 16.596 71.33 42.547 94.615l0.12 0.105v246.613c0 70.692 57.308 128 128 128v0h512c70.692 0 128-57.308 128-128v0-246.613c26.071-23.39 42.458-57.121 42.667-94.683l0-0.037v-170.667c0-23.564-19.103-42.667-42.667-42.667v0zM384 213.333c0-23.564 19.103-42.667 42.667-42.667v0h170.667c23.564 0 42.667 19.103 42.667 42.667v0 42.667h-256zM810.667 810.667c0 23.564-19.103 42.667-42.667 42.667v0h-512c-23.564 0-42.667-19.103-42.667-42.667v0-213.333h85.333v42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667h256v42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667h85.333zM853.333 469.333c0 23.564-19.103 42.667-42.667 42.667v0h-85.333v-42.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 42.667h-256v-42.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 42.667h-85.333c-23.564 0-42.667-19.103-42.667-42.667v0-128h682.667z"],"attrs":[],"grid":0,"tags":["briefcase"]},"attrs":[],"properties":{"order":4645,"id":1039,"name":"briefcase","prevSize":32,"code":59814},"setIdx":0,"setId":0,"iconIdx":166},{"icon":{"paths":["M512 341.333c-94.257 0-170.667 76.41-170.667 170.667s76.41 170.667 170.667 170.667c94.257 0 170.667-76.41 170.667-170.667v0c0-94.257-76.41-170.667-170.667-170.667v0zM512 597.333c-47.128 0-85.333-38.205-85.333-85.333s38.205-85.333 85.333-85.333c47.128 0 85.333 38.205 85.333 85.333v0c0 47.128-38.205 85.333-85.333 85.333v0zM926.293 481.707l-100.267-97.707v-143.36c0-23.564-19.103-42.667-42.667-42.667v0h-141.227l-99.84-100.267c-7.733-7.795-18.45-12.621-30.293-12.621s-22.56 4.826-30.291 12.618l-0.003 0.003-97.707 100.267h-143.36c-23.564 0-42.667 19.103-42.667 42.667v0 143.36l-100.267 97.707c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003 100.267 99.84v141.227c0 23.564 19.103 42.667 42.667 42.667v0h143.36l99.84 100.267c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 99.84-100.267h141.227c23.564 0 42.667-19.103 42.667-42.667v0-141.227l100.267-99.84c7.179-7.617 11.592-17.912 11.592-29.237 0-12.381-5.273-23.53-13.697-31.324l-0.028-0.026zM753.493 594.347c-7.861 7.709-12.749 18.426-12.8 30.284l-0 0.010v116.053h-116.053c-11.868 0.051-22.584 4.939-30.287 12.793l-0.007 0.007-82.347 82.347-82.347-82.347c-7.709-7.861-18.426-12.749-30.284-12.8l-0.010-0h-116.053v-116.053c-0.051-11.868-4.939-22.584-12.793-30.287l-0.007-0.007-82.347-82.347 82.347-82.347c7.861-7.709 12.749-18.426 12.8-30.284l0-0.010v-116.053h116.053c11.868-0.051 22.584-4.939 30.287-12.793l0.007-0.007 82.347-82.347 82.347 82.347c7.709 7.861 18.426 12.749 30.284 12.8l0.010 0h116.053v116.053c0.051 11.868 4.939 22.584 12.793 30.287l0.007 0.007 82.347 82.347z"],"attrs":[],"grid":0,"tags":["bright"]},"attrs":[],"properties":{"order":4646,"id":1038,"name":"bright","prevSize":32,"code":59815},"setIdx":0,"setId":0,"iconIdx":167},{"icon":{"paths":["M926.293 481.707l-100.267-97.707v-143.36c0-23.564-19.103-42.667-42.667-42.667v0h-141.227l-99.84-100.267c-7.733-7.795-18.45-12.621-30.293-12.621s-22.56 4.826-30.291 12.618l-0.003 0.003-97.707 100.267h-143.36c-23.564 0-42.667 19.103-42.667 42.667v0 143.36l-100.267 97.707c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003 100.267 99.84v141.227c0 23.564 19.103 42.667 42.667 42.667v0h143.36l99.84 100.267c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 99.84-100.267h141.227c23.564 0 42.667-19.103 42.667-42.667v0-141.227l100.267-99.84c7.179-7.617 11.592-17.912 11.592-29.237 0-12.381-5.273-23.53-13.697-31.324l-0.028-0.026zM753.493 594.347c-7.861 7.709-12.749 18.426-12.8 30.284l-0 0.010v116.053h-116.053c-11.868 0.051-22.584 4.939-30.287 12.793l-0.007 0.007-82.347 82.347-82.347-82.347c-7.709-7.861-18.426-12.749-30.284-12.8l-0.010-0h-116.053v-116.053c-0.051-11.868-4.939-22.584-12.793-30.287l-0.007-0.007-82.347-82.347 82.347-82.347c7.861-7.709 12.749-18.426 12.8-30.284l0-0.010v-116.053h116.053c11.868-0.051 22.584-4.939 30.287-12.793l0.007-0.007 82.347-82.347 82.347 82.347c7.709 7.861 18.426 12.749 30.284 12.8l0.010 0h116.053v116.053c0.051 11.868 4.939 22.584 12.793 30.287l0.007 0.007 82.347 82.347z"],"attrs":[],"grid":0,"tags":["brightness-empty"]},"attrs":[],"properties":{"order":4647,"id":1037,"name":"brightness-empty","prevSize":32,"code":59816},"setIdx":0,"setId":0,"iconIdx":168},{"icon":{"paths":["M512 341.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0c47.128 0 85.333 38.205 85.333 85.333s-38.205 85.333-85.333 85.333v0c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0c94.257 0 170.667-76.41 170.667-170.667s-76.41-170.667-170.667-170.667v0zM926.293 481.707l-100.267-97.707v-143.36c0-23.564-19.103-42.667-42.667-42.667v0h-141.227l-99.84-100.267c-7.733-7.795-18.45-12.621-30.293-12.621s-22.56 4.826-30.291 12.618l-0.003 0.003-97.707 100.267h-143.36c-23.564 0-42.667 19.103-42.667 42.667v0 143.36l-100.267 97.707c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003 100.267 99.84v141.227c0 23.564 19.103 42.667 42.667 42.667v0h143.36l99.84 100.267c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 99.84-100.267h141.227c23.564 0 42.667-19.103 42.667-42.667v0-141.227l100.267-99.84c7.179-7.617 11.592-17.912 11.592-29.237 0-12.381-5.273-23.53-13.697-31.324l-0.028-0.026zM753.493 594.347c-7.861 7.709-12.749 18.426-12.8 30.284l-0 0.010v116.053h-116.053c-11.868 0.051-22.584 4.939-30.287 12.793l-0.007 0.007-82.347 82.347-82.347-82.347c-7.709-7.861-18.426-12.749-30.284-12.8l-0.010-0h-116.053v-116.053c-0.051-11.868-4.939-22.584-12.793-30.287l-0.007-0.007-82.347-82.347 82.347-82.347c7.861-7.709 12.749-18.426 12.8-30.284l0-0.010v-116.053h116.053c11.868-0.051 22.584-4.939 30.287-12.793l0.007-0.007 82.347-82.347 82.347 82.347c7.709 7.861 18.426 12.749 30.284 12.8l0.010 0h116.053v116.053c0.051 11.868 4.939 22.584 12.793 30.287l0.007 0.007 82.347 82.347z"],"attrs":[],"grid":0,"tags":["brightness-half"]},"attrs":[],"properties":{"order":4648,"id":1036,"name":"brightness-half","prevSize":32,"code":59817},"setIdx":0,"setId":0,"iconIdx":169},{"icon":{"paths":["M128 469.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM210.347 753.493c-7.775 7.73-12.587 18.433-12.587 30.26 0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667c0-11.827-4.812-22.53-12.585-30.257l-0.002-0.002c-7.712-7.668-18.343-12.407-30.080-12.407s-22.368 4.74-30.082 12.409l0.002-0.002zM270.507 270.507c7.775-7.73 12.587-18.433 12.587-30.26 0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667c0 11.827 4.812 22.53 12.585 30.257l0.002 0.002c7.712 7.668 18.343 12.407 30.080 12.407s22.368-4.74 30.082-12.409l-0.002 0.002zM512 170.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667c-23.564 0-42.667 19.103-42.667 42.667v0c0 23.564 19.103 42.667 42.667 42.667v0zM753.493 753.493c-7.775 7.73-12.587 18.433-12.587 30.26 0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667c0-11.827-4.812-22.53-12.585-30.257l-0.002-0.002c-7.712-7.668-18.343-12.407-30.080-12.407s-22.368 4.74-30.082 12.409l0.002-0.002zM896 469.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM753.493 210.347c-7.775 7.73-12.587 18.433-12.587 30.26 0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667c0-11.827-4.812-22.53-12.585-30.257l-0.002-0.002c-7.712-7.668-18.343-12.407-30.080-12.407s-22.368 4.74-30.082 12.409l0.002-0.002zM512 853.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM512 256c-141.385 0-256 114.615-256 256s114.615 256 256 256c141.385 0 256-114.615 256-256v0c0-141.385-114.615-256-256-256v0zM512 682.667c-94.257 0-170.667-76.41-170.667-170.667s76.41-170.667 170.667-170.667c94.257 0 170.667 76.41 170.667 170.667v0c0 94.257-76.41 170.667-170.667 170.667v0z"],"attrs":[],"grid":0,"tags":["brightness-low"]},"attrs":[],"properties":{"order":4649,"id":1035,"name":"brightness-low","prevSize":32,"code":59818},"setIdx":0,"setId":0,"iconIdx":170},{"icon":{"paths":["M597.333 469.333h-170.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h170.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM926.293 481.707l-100.267-97.707v-143.36c0-23.564-19.103-42.667-42.667-42.667v0h-141.227l-99.84-100.267c-7.733-7.795-18.45-12.621-30.293-12.621s-22.56 4.826-30.291 12.618l-0.003 0.003-97.707 100.267h-143.36c-23.564 0-42.667 19.103-42.667 42.667v0 143.36l-100.267 97.707c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003 100.267 99.84v141.227c0 23.564 19.103 42.667 42.667 42.667v0h143.36l99.84 100.267c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 99.84-100.267h141.227c23.564 0 42.667-19.103 42.667-42.667v0-141.227l100.267-99.84c7.179-7.617 11.592-17.912 11.592-29.237 0-12.381-5.273-23.53-13.697-31.324l-0.028-0.026zM753.493 594.347c-7.861 7.709-12.749 18.426-12.8 30.284l-0 0.010v116.053h-116.053c-11.868 0.051-22.584 4.939-30.287 12.793l-0.007 0.007-82.347 82.347-82.347-82.347c-7.709-7.861-18.426-12.749-30.284-12.8l-0.010-0h-116.053v-116.053c-0.051-11.868-4.939-22.584-12.793-30.287l-0.007-0.007-82.347-82.347 82.347-82.347c7.861-7.709 12.749-18.426 12.8-30.284l0-0.010v-116.053h116.053c11.868-0.051 22.584-4.939 30.287-12.793l0.007-0.007 82.347-82.347 82.347 82.347c7.709 7.861 18.426 12.749 30.284 12.8l0.010 0h116.053v116.053c0.051 11.868 4.939 22.584 12.793 30.287l0.007 0.007 82.347 82.347z"],"attrs":[],"grid":0,"tags":["brightness-minus"]},"attrs":[],"properties":{"order":4650,"id":1034,"name":"brightness-minus","prevSize":32,"code":59819},"setIdx":0,"setId":0,"iconIdx":171},{"icon":{"paths":["M597.333 469.333h-42.667v-42.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 42.667h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h42.667v42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM926.293 481.707l-100.267-97.707v-143.36c0-23.564-19.103-42.667-42.667-42.667v0h-141.227l-99.84-100.267c-7.733-7.795-18.45-12.621-30.293-12.621s-22.56 4.826-30.291 12.618l-0.003 0.003-97.707 100.267h-143.36c-23.564 0-42.667 19.103-42.667 42.667v0 143.36l-100.267 97.707c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003 100.267 99.84v141.227c0 23.564 19.103 42.667 42.667 42.667v0h143.36l99.84 100.267c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 99.84-100.267h141.227c23.564 0 42.667-19.103 42.667-42.667v0-141.227l100.267-99.84c7.179-7.617 11.592-17.912 11.592-29.237 0-12.381-5.273-23.53-13.697-31.324l-0.028-0.026zM753.493 594.347c-7.861 7.709-12.749 18.426-12.8 30.284l-0 0.010v116.053h-116.053c-11.868 0.051-22.584 4.939-30.287 12.793l-0.007 0.007-82.347 82.347-82.347-82.347c-7.709-7.861-18.426-12.749-30.284-12.8l-0.010-0h-116.053v-116.053c-0.051-11.868-4.939-22.584-12.793-30.287l-0.007-0.007-82.347-82.347 82.347-82.347c7.861-7.709 12.749-18.426 12.8-30.284l0-0.010v-116.053h116.053c11.868-0.051 22.584-4.939 30.287-12.793l0.007-0.007 82.347-82.347 82.347 82.347c7.709 7.861 18.426 12.749 30.284 12.8l0.010 0h116.053v116.053c0.051 11.868 4.939 22.584 12.793 30.287l0.007 0.007 82.347 82.347z"],"attrs":[],"grid":0,"tags":["brightness-plus"]},"attrs":[],"properties":{"order":4651,"id":1033,"name":"brightness-plus","prevSize":32,"code":59820},"setIdx":0,"setId":0,"iconIdx":172},{"icon":{"paths":["M213.333 512c0-23.564-19.103-42.667-42.667-42.667v0h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h42.667c23.564 0 42.667-19.103 42.667-42.667v0zM240.64 725.333l-30.293 30.293c-7.668 7.712-12.407 18.343-12.407 30.080s4.74 22.368 12.409 30.082l-0.002-0.002c7.712 7.668 18.343 12.407 30.080 12.407s22.368-4.74 30.082-12.409l-0.002 0.002 30.293-30.293c6.377-7.412 10.259-17.129 10.259-27.753 0-23.564-19.103-42.667-42.667-42.667-10.624 0-20.341 3.883-27.809 10.307l0.056-0.047zM512 213.333c23.564 0 42.667-19.103 42.667-42.667v0-42.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 42.667c0 23.564 19.103 42.667 42.667 42.667v0zM753.493 313.173c11.656-0.051 22.2-4.767 29.869-12.376l-0.003 0.003 30.293-30.293c9.153-7.872 14.914-19.467 14.914-32.407 0-23.564-19.103-42.667-42.667-42.667-12.94 0-24.535 5.761-32.36 14.858l-0.047 0.056-28.16 30.293c-7.668 7.712-12.407 18.343-12.407 30.080s4.74 22.368 12.409 30.082l-0.002-0.002c7.267 7.23 17.128 11.859 28.065 12.37l0.095 0.004zM241.493 300.8c7.667 7.606 18.211 12.323 29.857 12.373l0.010 0c0.073 0 0.16 0.001 0.247 0.001 11.721 0 22.338-4.726 30.049-12.377l-0.003 0.003c7.668-7.712 12.407-18.343 12.407-30.080s-4.74-22.368-12.409-30.082l0.002 0.002-30.293-30.293c-7.774-7.881-18.57-12.762-30.507-12.762-23.661 0-42.842 19.181-42.842 42.842 0 11.724 4.71 22.349 12.34 30.085l-0.005-0.005zM896 469.333h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM783.36 725.333c-5.976-3.385-13.125-5.38-20.74-5.38-23.564 0-42.667 19.103-42.667 42.667 0 7.615 1.995 14.764 5.491 20.953l-0.111-0.213 30.293 30.293c7.712 7.668 18.343 12.407 30.080 12.407s22.368-4.74 30.082-12.409l-0.002 0.002c7.668-7.712 12.407-18.343 12.407-30.080s-4.74-22.368-12.409-30.082l0.002 0.002zM512 277.333c-129.603 0-234.667 105.064-234.667 234.667s105.064 234.667 234.667 234.667c129.603 0 234.667-105.064 234.667-234.667v0c-0.242-129.505-105.161-234.424-234.643-234.667l-0.023-0zM512 661.333c-82.475 0-149.333-66.859-149.333-149.333s66.859-149.333 149.333-149.333c82.475 0 149.333 66.859 149.333 149.333v0c0 82.475-66.859 149.333-149.333 149.333v0zM512 810.667c-23.564 0-42.667 19.103-42.667 42.667v0 42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667c0-23.564-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["brightness"]},"attrs":[],"properties":{"order":4652,"id":1032,"name":"brightness","prevSize":32,"code":59821},"setIdx":0,"setId":0,"iconIdx":173},{"icon":{"paths":["M896 597.333h-85.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h42.667v170.667h-682.667v-170.667h298.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-42.667v-213.333c0-23.564-19.103-42.667-42.667-42.667v0h-256c-23.564 0-42.667 19.103-42.667 42.667v0 512c0 23.564 19.103 42.667 42.667 42.667v0h768c23.564 0 42.667-19.103 42.667-42.667v0-256c0-23.564-19.103-42.667-42.667-42.667v0zM170.667 426.667h170.667v170.667h-170.667zM542.293 285.867l55.040-55.040v494.507c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-494.507l55.040 55.040c7.709 7.861 18.426 12.749 30.284 12.8l0.010 0c0.073 0 0.16 0.001 0.247 0.001 11.721 0 22.338-4.726 30.049-12.377l-0.003 0.003c7.668-7.712 12.407-18.343 12.407-30.080s-4.74-22.368-12.409-30.082l0.002 0.002-128-128c-7.733-7.795-18.45-12.621-30.293-12.621s-22.56 4.826-30.291 12.618l-0.003 0.003-128 128c-7.668 7.712-12.407 18.343-12.407 30.080s4.74 22.368 12.409 30.082l-0.002-0.002c7.712 7.669 18.343 12.409 30.082 12.409 11.95 0 22.752-4.912 30.497-12.828l0.007-0.008z"],"attrs":[],"grid":0,"tags":["bring-bottom"]},"attrs":[],"properties":{"order":4653,"id":1031,"name":"bring-bottom","prevSize":32,"code":59822},"setIdx":0,"setId":0,"iconIdx":174},{"icon":{"paths":["M481.707 738.133l-55.040 55.040v-494.507c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 494.933l-55.040-55.467c-7.733-7.795-18.45-12.621-30.293-12.621s-22.56 4.826-30.291 12.618l-0.003 0.003c-7.668 7.712-12.407 18.343-12.407 30.080s4.74 22.368 12.409 30.082l-0.002-0.002 128 128c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 128-128c7.668-7.712 12.407-18.343 12.407-30.080s-4.74-22.368-12.409-30.082l0.002 0.002c-7.733-7.795-18.45-12.621-30.293-12.621s-22.56 4.826-30.291 12.618l-0.003 0.003zM938.667 128c0-23.564-19.103-42.667-42.667-42.667v0h-768c-23.564 0-42.667 19.103-42.667 42.667v0 256c0 23.564 19.103 42.667 42.667 42.667v0h85.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-42.667v-170.667h682.667v170.667h-298.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h42.667v213.333c0 23.564 19.103 42.667 42.667 42.667v0h256c23.564 0 42.667-19.103 42.667-42.667v0-256zM853.333 597.333h-170.667v-170.667h170.667z"],"attrs":[],"grid":0,"tags":["bring-front"]},"attrs":[],"properties":{"order":4654,"id":1030,"name":"bring-front","prevSize":32,"code":59823},"setIdx":0,"setId":0,"iconIdx":175},{"icon":{"paths":["M810.667 85.333h-426.667c-70.692 0-128 57.308-128 128v0 42.667h-42.667c-70.692 0-128 57.308-128 128v0 426.667c0 70.692 57.308 128 128 128v0h426.667c70.692 0 128-57.308 128-128v0-42.667h42.667c70.692 0 128-57.308 128-128v0-426.667c0-70.692-57.308-128-128-128v0zM682.667 810.667c0 23.564-19.103 42.667-42.667 42.667v0h-426.667c-23.564 0-42.667-19.103-42.667-42.667v0-298.667h512zM682.667 426.667h-512v-42.667c0-23.564 19.103-42.667 42.667-42.667v0h426.667c23.564 0 42.667 19.103 42.667 42.667v0zM853.333 640c0 23.564-19.103 42.667-42.667 42.667v0h-42.667v-298.667c-0.125-15.341-2.93-29.989-7.968-43.552l0.288 0.885h93.013zM853.333 256h-512v-42.667c0-23.564 19.103-42.667 42.667-42.667v0h426.667c23.564 0 42.667 19.103 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["browser"]},"attrs":[],"properties":{"order":4655,"id":1029,"name":"browser","prevSize":32,"code":59824},"setIdx":0,"setId":0,"iconIdx":176},{"icon":{"paths":["M512 768c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM768 42.667h-512c-23.564 0-42.667 19.103-42.667 42.667v0 384c0 70.692 57.308 128 128 128v0h42.667v101.12c-26.491 29.927-42.667 69.517-42.667 112.885 0 94.257 76.41 170.667 170.667 170.667s170.667-76.41 170.667-170.667c0-43.368-16.176-82.958-42.823-113.066l0.157 0.18v-101.12h42.667c70.692 0 128-57.308 128-128v0-384c0-23.564-19.103-42.667-42.667-42.667v0zM512 896c-46.849-0.366-84.687-38.43-84.687-85.331 0-24.996 10.747-47.481 27.872-63.088l0.068-0.061c8.637-7.818 14.049-19.060 14.080-31.568l0-0.006v-118.613h85.333v118.613c0.031 12.513 5.443 23.756 14.043 31.541l0.037 0.033c17.193 15.668 27.94 38.153 27.94 63.149 0 46.901-37.837 84.965-84.652 85.331l-0.035 0zM725.333 469.333c0 23.564-19.103 42.667-42.667 42.667v0h-341.333c-23.564 0-42.667-19.103-42.667-42.667v0-42.667h426.667zM725.333 341.333h-426.667v-213.333h426.667z"],"attrs":[],"grid":0,"tags":["brush-alt"]},"attrs":[],"properties":{"order":4656,"id":1028,"name":"brush-alt","prevSize":32,"code":59825},"setIdx":0,"setId":0,"iconIdx":177},{"icon":{"paths":["M810.667 597.333h85.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-85.333v-42.667c-0.412-20.829-3.657-40.741-9.365-59.583l0.405 1.556c80.408-31.448 136.429-108.102 136.96-197.907l0-0.066c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0c-0.081 57.537-38.112 106.169-90.4 122.214l-0.907 0.239c-20.936-26.661-47.527-47.922-78.049-62.17l-1.311-0.55c0.211-2.555 0.331-5.53 0.331-8.533s-0.12-5.979-0.356-8.921l0.025 0.388c0-94.257-76.41-170.667-170.667-170.667s-170.667 76.41-170.667 170.667v0c-0.211 2.555-0.331 5.53-0.331 8.533s0.12 5.979 0.356 8.921l-0.025-0.388c-32.506 14.58-59.688 35.881-80.734 62.288l-0.332 0.432c-52.369-16.84-89.6-65.124-89.6-122.104 0-0.123 0-0.245 0.001-0.368l-0 0.019c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0c0.531 89.872 56.552 166.525 135.51 197.473l1.45 0.5c-5.303 17.286-8.548 37.198-8.957 57.806l-0.003 0.221v42.667h-85.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h85.333v42.667c0.040 20.864 2.213 41.196 6.313 60.821l-0.339-1.941c-78.914 32.243-133.585 108.248-133.973 197.071l-0 0.049c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0c0.249-52.102 31.588-96.823 76.407-116.584l0.82-0.322c51.143 95.412 150.175 159.205 264.107 159.205s212.964-63.794 263.324-157.61l0.782-1.595c45.638 20.084 76.978 64.805 77.227 116.875l0 0.032c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0c-0.389-88.872-55.059-164.877-132.55-196.604l-1.423-0.516c3.76-17.684 5.933-38.017 5.973-58.85l0-0.030zM469.333 849.067c-98.072-20.544-170.667-106.306-170.667-209.023 0-0.015 0-0.031 0-0.046l-0 0.002v-170.667c0-70.692 57.308-128 128-128v0h42.667zM426.667 256c0-47.128 38.205-85.333 85.333-85.333s85.333 38.205 85.333 85.333v0zM725.333 640c0 0.013 0 0.028 0 0.044 0 102.717-72.595 188.479-169.277 208.779l-1.389 0.244v-507.733h42.667c70.692 0 128 57.308 128 128v0z"],"attrs":[],"grid":0,"tags":["bug"]},"attrs":[],"properties":{"order":4657,"id":1027,"name":"bug","prevSize":32,"code":59826},"setIdx":0,"setId":0,"iconIdx":178},{"icon":{"paths":["M597.333 341.333h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM597.333 512h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM384 341.333h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM384 512h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM896 853.333h-42.667v-725.333c0-23.564-19.103-42.667-42.667-42.667v0h-597.333c-23.564 0-42.667 19.103-42.667 42.667v0 725.333h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h768c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM554.667 853.333h-85.333v-170.667h85.333zM768 853.333h-128v-213.333c0-23.564-19.103-42.667-42.667-42.667v0h-170.667c-23.564 0-42.667 19.103-42.667 42.667v0 213.333h-128v-682.667h512z"],"attrs":[],"grid":0,"tags":["building"]},"attrs":[],"properties":{"order":4658,"id":1026,"name":"building","prevSize":32,"code":59827},"setIdx":0,"setId":0,"iconIdx":179},{"icon":{"paths":["M789.333 85.333h-512c-70.692 0-128 57.308-128 128v0 512c0.16 55.254 35.305 102.258 84.442 120.038l0.891 0.282v50.347c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667h426.667v42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-50.347c50.028-18.062 85.173-65.066 85.333-120.3l0-0.020v-512c0-70.692-57.308-128-128-128v0zM234.667 341.333h256v170.667h-256zM832 725.333c0 23.564-19.103 42.667-42.667 42.667v0h-512c-23.564 0-42.667-19.103-42.667-42.667v0-128h597.333zM832 512h-256v-170.667h256zM832 256h-597.333v-42.667c0-23.564 19.103-42.667 42.667-42.667v0h512c23.564 0 42.667 19.103 42.667 42.667v0zM687.787 721.92c4.778 2.092 10.34 3.34 16.186 3.413l0.027 0c23.564 0 42.667-19.103 42.667-42.667v0c0.1-1.277 0.157-2.765 0.157-4.267s-0.057-2.99-0.169-4.463l0.012 0.196c-0.513-2.882-1.403-5.459-2.632-7.832l0.072 0.152c-1.020-2.93-2.319-5.469-3.912-7.79l0.072 0.11c-1.693-2.39-3.374-4.477-5.17-6.456l0.050 0.056-6.4-5.12c-2.211-1.521-4.75-2.82-7.453-3.77l-0.227-0.070c-2.453-1.528-5.307-2.708-8.352-3.38l-0.181-0.034c-2.625-0.574-5.639-0.903-8.731-0.903-11.745 0-22.382 4.746-30.097 12.425l0.002-0.002c-1.746 1.923-3.427 4.010-4.98 6.193l-0.14 0.207c-1.521 2.211-2.82 4.75-3.77 7.453l-0.070 0.227c-1.157 2.221-2.047 4.798-2.535 7.514l-0.025 0.166c-0.1 1.277-0.157 2.765-0.157 4.267s0.057 2.99 0.169 4.463l-0.012-0.196c0.051 11.656 4.767 22.2 12.376 29.869l-0.003-0.003c3.649 4.19 8.040 7.626 12.983 10.128l0.244 0.112zM346.453 721.92c4.778 2.092 10.34 3.34 16.186 3.413l0.027 0c23.564 0 42.667-19.103 42.667-42.667v0c0.1-1.277 0.157-2.765 0.157-4.267s-0.057-2.99-0.169-4.463l0.012 0.196c-0.513-2.882-1.403-5.459-2.632-7.832l0.072 0.152c-1.020-2.93-2.319-5.469-3.912-7.79l0.072 0.11c-1.693-2.39-3.374-4.477-5.17-6.456l0.050 0.056-6.4-5.12-7.68-3.84-8.533-3.413c-2.625-0.574-5.639-0.903-8.731-0.903-11.745 0-22.382 4.746-30.097 12.425l0.002-0.002c-1.746 1.923-3.427 4.010-4.98 6.193l-0.14 0.207c-1.521 2.211-2.82 4.75-3.77 7.453l-0.070 0.227c-1.157 2.221-2.047 4.798-2.535 7.514l-0.025 0.166c-0.1 1.277-0.157 2.765-0.157 4.267s0.057 2.99 0.169 4.463l-0.012-0.196c0.051 11.656 4.767 22.2 12.376 29.869l-0.003-0.003c3.649 4.19 8.040 7.626 12.983 10.128l0.244 0.112z"],"attrs":[],"grid":0,"tags":["bus-alt"]},"attrs":[],"properties":{"order":4659,"id":1025,"name":"bus-alt","prevSize":32,"code":59828},"setIdx":0,"setId":0,"iconIdx":180},{"icon":{"paths":["M42.667 533.333v170.667c0 23.564 19.103 42.667 42.667 42.667v0h42.667c0 70.692 57.308 128 128 128s128-57.308 128-128v0h256c0 70.692 57.308 128 128 128s128-57.308 128-128v0h42.667c23.564 0 42.667-19.103 42.667-42.667v0-426.667c0-70.692-57.308-128-128-128v0h-493.227c-56.095 0.108-103.713 36.284-120.906 86.566l-0.268 0.901-61.44 183.893-115.627 77.227c-11.576 7.705-19.121 20.669-19.2 35.401l-0 0.012zM896 405.333h-85.333v-170.667h42.667c23.564 0 42.667 19.103 42.667 42.667v0zM725.333 746.667c0-23.564 19.103-42.667 42.667-42.667s42.667 19.103 42.667 42.667c0 23.564-19.103 42.667-42.667 42.667v0c-23.564 0-42.667-19.103-42.667-42.667v0zM640 490.667h256v170.667h-33.28c-23.501-25.787-57.228-41.906-94.72-41.906s-71.219 16.119-94.629 41.805l-0.091 0.102h-33.28zM640 234.667h85.333v170.667h-85.333zM469.333 490.667h85.333v170.667h-85.333zM469.333 234.667h85.333v170.667h-85.333zM384 405.333h-111.36l46.933-141.653c5.871-17.012 21.745-29.013 40.423-29.013 0.039 0 0.077 0 0.116 0l-0.006-0h23.893zM213.333 746.667c0-23.564 19.103-42.667 42.667-42.667s42.667 19.103 42.667 42.667c0 23.564-19.103 42.667-42.667 42.667v0c-23.564 0-42.667-19.103-42.667-42.667v0zM128 554.667l98.133-64h157.867v170.667h-33.28c-23.501-25.787-57.228-41.906-94.72-41.906s-71.219 16.119-94.629 41.805l-0.091 0.102h-33.28z"],"attrs":[],"grid":0,"tags":["bus-school"]},"attrs":[],"properties":{"order":4660,"id":1024,"name":"bus-school","prevSize":32,"code":59829},"setIdx":0,"setId":0,"iconIdx":181},{"icon":{"paths":["M362.667 725.333c23.564 0 42.667-19.103 42.667-42.667v0c0.1-1.277 0.157-2.765 0.157-4.267s-0.057-2.99-0.169-4.463l0.012 0.196c-0.513-2.882-1.403-5.459-2.632-7.832l0.072 0.152c-1.020-2.93-2.319-5.469-3.912-7.79l0.072 0.11-5.12-6.4c-3.937-3.773-8.616-6.808-13.791-8.859l-0.289-0.101c-5.323-2.565-11.573-4.064-18.175-4.064-2.624 0-5.193 0.237-7.686 0.69l0.261-0.039-7.68 2.56-7.68 3.84c-2.39 1.693-4.477 3.374-6.456 5.17l0.056-0.050-5.12 6.4c-1.521 2.211-2.82 4.75-3.77 7.453l-0.070 0.227c-1.157 2.221-2.047 4.798-2.535 7.514l-0.025 0.166c-0.1 1.277-0.157 2.765-0.157 4.267s0.057 2.99 0.169 4.463l-0.012-0.196c0 23.564 19.103 42.667 42.667 42.667v0zM704 725.333c23.564 0 42.667-19.103 42.667-42.667v0c0.1-1.277 0.157-2.765 0.157-4.267s-0.057-2.99-0.169-4.463l0.012 0.196c-0.513-2.882-1.403-5.459-2.632-7.832l0.072 0.152c-1.020-2.93-2.319-5.469-3.912-7.79l0.072 0.11-5.12-6.4c-4.001-3.646-8.658-6.662-13.76-8.838l-0.32-0.122c-4.793-2.024-10.366-3.201-16.213-3.201s-11.42 1.176-16.495 3.305l0.281-0.105c-5.422 2.298-10.079 5.314-14.119 8.995l0.039-0.035-5.12 6.4c-1.521 2.211-2.82 4.75-3.77 7.453l-0.070 0.227c-1.157 2.221-2.047 4.798-2.535 7.514l-0.025 0.166c-0.1 1.277-0.157 2.765-0.157 4.267s0.057 2.99 0.169 4.463l-0.012-0.196c0.051 11.656 4.767 22.2 12.376 29.869l-0.003-0.003c7.315 7.479 17.344 12.277 28.492 12.796l0.095 0.004zM576 213.333h-85.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h85.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM789.333 85.333h-512c-70.692 0-128 57.308-128 128v0 512c0.16 55.254 35.305 102.258 84.442 120.038l0.891 0.282v50.347c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667h426.667v42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-50.347c50.028-18.062 85.173-65.066 85.333-120.3l0-0.020v-512c0-70.692-57.308-128-128-128v0zM832 725.333c0 23.564-19.103 42.667-42.667 42.667v0h-512c-23.564 0-42.667-19.103-42.667-42.667v0-128h597.333zM832 512h-597.333v-298.667c0-23.564 19.103-42.667 42.667-42.667v0h512c23.564 0 42.667 19.103 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["bus"]},"attrs":[],"properties":{"order":4661,"id":1023,"name":"bus","prevSize":32,"code":59830},"setIdx":0,"setId":0,"iconIdx":182},{"icon":{"paths":["M512 213.333c-164.949 0-298.667 133.718-298.667 298.667s133.718 298.667 298.667 298.667c164.949 0 298.667-133.718 298.667-298.667v0c0-164.949-133.718-298.667-298.667-298.667v0zM512 725.333c-117.821 0-213.333-95.513-213.333-213.333s95.513-213.333 213.333-213.333c117.821 0 213.333 95.513 213.333 213.333v0c0 117.821-95.513 213.333-213.333 213.333v0zM512 384c-70.692 0-128 57.308-128 128s57.308 128 128 128c70.692 0 128-57.308 128-128v0c0-70.692-57.308-128-128-128v0zM512 554.667c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667c23.564 0 42.667 19.103 42.667 42.667v0c0 23.564-19.103 42.667-42.667 42.667v0zM512 42.667c-259.206 0-469.333 210.128-469.333 469.333s210.128 469.333 469.333 469.333c259.206 0 469.333-210.128 469.333-469.333v0c0-259.206-210.128-469.333-469.333-469.333v0zM512 896c-212.077 0-384-171.923-384-384s171.923-384 384-384c212.077 0 384 171.923 384 384v0c0 212.077-171.923 384-384 384v0z"],"attrs":[],"grid":0,"tags":["bullseye"]},"attrs":[],"properties":{"order":4662,"id":1022,"name":"bullseye","prevSize":32,"code":59831},"setIdx":0,"setId":0,"iconIdx":183},{"icon":{"paths":["M234.667 341.333h21.333v21.333c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-21.333h21.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-21.333v-21.333c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 21.333h-21.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM208.213 815.787c7.712 7.668 18.343 12.407 30.080 12.407s22.368-4.74 30.082-12.409l-0.002 0.002 30.293-30.293 30.293 30.293c7.712 7.668 18.343 12.407 30.080 12.407s22.368-4.74 30.082-12.409l-0.002 0.002c7.668-7.712 12.407-18.343 12.407-30.080s-4.74-22.368-12.409-30.082l0.002 0.002-30.293-30.293 30.293-30.293c6.377-7.412 10.259-17.129 10.259-27.753 0-23.564-19.103-42.667-42.667-42.667-10.624 0-20.341 3.883-27.809 10.307l0.056-0.047-30.293 30.293-30.293-30.293c-7.412-6.377-17.129-10.259-27.753-10.259-23.564 0-42.667 19.103-42.667 42.667 0 10.624 3.883 20.341 10.307 27.809l-0.047-0.056 30.293 30.293-30.293 30.293c-7.668 7.712-12.407 18.343-12.407 30.080s4.74 22.368 12.409 30.082l-0.002-0.002zM853.333 42.667h-682.667c-70.692 0-128 57.308-128 128v0 682.667c0 70.692 57.308 128 128 128v0h682.667c70.692 0 128-57.308 128-128v0-682.667c0-70.692-57.308-128-128-128v0zM469.333 896h-298.667c-23.564 0-42.667-19.103-42.667-42.667v0-298.667h341.333zM469.333 469.333h-341.333v-298.667c0-23.564 19.103-42.667 42.667-42.667v0h298.667zM896 853.333c0 23.564-19.103 42.667-42.667 42.667v0h-298.667v-341.333h341.333zM896 469.333h-341.333v-341.333h298.667c23.564 0 42.667 19.103 42.667 42.667v0zM661.333 704h128c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-128c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM789.333 256h-128c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h128c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM661.333 832h128c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-128c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["calculator-alt"]},"attrs":[],"properties":{"order":4663,"id":1021,"name":"calculator-alt","prevSize":32,"code":59832},"setIdx":0,"setId":0,"iconIdx":184},{"icon":{"paths":["M497.493 298.667h142.507v42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667h42.667c23.564 0 42.667 19.103 42.667 42.667v0 128h-57.173c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h57.173v57.173c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-270.507c0-70.692-57.308-128-128-128v0h-42.667v-42.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 42.667h-142.507c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM926.293 865.707l-768-768c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l-0-0 81.493 81.067c-31.118 23.516-51.057 60.401-51.2 101.95l-0 0.023v426.667c0 70.692 57.308 128 128 128v0h512c20.045-0.123 38.962-4.834 55.79-13.134l-0.75 0.334 42.667 42.667c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.668-7.712 12.407-18.343 12.407-30.080s-4.74-22.368-12.409-30.082l0.002 0.002zM213.333 341.333c0.196-18.182 11.734-33.619 27.865-39.584l0.295-0.096 167.68 167.68h-195.84zM256 810.667c-23.564 0-42.667-19.103-42.667-42.667v0-213.333h281.173l256 256z"],"attrs":[],"grid":0,"tags":["calendar-slash"]},"attrs":[],"properties":{"order":4664,"id":1020,"name":"calendar-slash","prevSize":32,"code":59833},"setIdx":0,"setId":0,"iconIdx":185},{"icon":{"paths":["M512 810.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667c-23.564 0-42.667 19.103-42.667 42.667v0c0 23.564 19.103 42.667 42.667 42.667v0zM725.333 810.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667c-23.564 0-42.667 19.103-42.667 42.667v0c0 23.564 19.103 42.667 42.667 42.667v0zM725.333 640c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667c-23.564 0-42.667 19.103-42.667 42.667v0c0 23.564 19.103 42.667 42.667 42.667v0zM512 640c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667c-23.564 0-42.667 19.103-42.667 42.667v0c0 23.564 19.103 42.667 42.667 42.667v0zM810.667 128h-42.667v-42.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 42.667h-341.333v-42.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 42.667h-42.667c-70.692 0-128 57.308-128 128v0 597.333c0 70.692 57.308 128 128 128v0h597.333c70.692 0 128-57.308 128-128v0-597.333c0-70.692-57.308-128-128-128v0zM853.333 853.333c0 23.564-19.103 42.667-42.667 42.667v0h-597.333c-23.564 0-42.667-19.103-42.667-42.667v0-384h682.667zM853.333 384h-682.667v-128c0-23.564 19.103-42.667 42.667-42.667v0h42.667v42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667h341.333v42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667h42.667c23.564 0 42.667 19.103 42.667 42.667v0zM298.667 640c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667c-23.564 0-42.667 19.103-42.667 42.667v0c0 23.564 19.103 42.667 42.667 42.667v0zM298.667 810.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667c-23.564 0-42.667 19.103-42.667 42.667v0c0 23.564 19.103 42.667 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["calendar-alt"]},"attrs":[],"properties":{"order":4665,"id":1019,"name":"calendar-alt","prevSize":32,"code":59834},"setIdx":0,"setId":0,"iconIdx":186},{"icon":{"paths":["M810.667 170.667h-85.333v-42.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 42.667h-256v-42.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 42.667h-85.333c-70.692 0-128 57.308-128 128v0 512c0 70.692 57.308 128 128 128v0h597.333c70.692 0 128-57.308 128-128v0-512c0-70.692-57.308-128-128-128v0zM853.333 810.667c0 23.564-19.103 42.667-42.667 42.667v0h-597.333c-23.564 0-42.667-19.103-42.667-42.667v0-298.667h682.667zM853.333 426.667h-682.667v-128c0-23.564 19.103-42.667 42.667-42.667v0h85.333v42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667h256v42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667h85.333c23.564 0 42.667 19.103 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["calender"]},"attrs":[],"properties":{"order":4666,"id":1018,"name":"calender","prevSize":32,"code":59835},"setIdx":0,"setId":0,"iconIdx":187},{"icon":{"paths":["M542.293 737.707c-2.018-1.861-4.252-3.552-6.64-5.014l-0.187-0.106c-2.068-1.617-4.477-2.923-7.085-3.791l-0.169-0.049c-2.35-1.229-5.082-2.127-7.969-2.544l-0.137-0.016c-2.467-0.546-5.301-0.858-8.208-0.858-5.833 0-11.373 1.259-16.361 3.519l0.249-0.101c-10.747 3.967-19.073 12.293-22.954 22.774l-0.086 0.266c-2.162 4.477-3.425 9.736-3.425 15.29 0 0.325 0.004 0.648 0.013 0.971l-0.001-0.048c-0.002 0.155-0.003 0.339-0.003 0.523 0 5.649 1.098 11.042 3.092 15.977l-0.102-0.286c2.639 5.376 5.769 10.006 9.443 14.144l-0.056-0.064c7.709 7.648 18.326 12.374 30.047 12.374 0.087 0 0.173-0 0.26-0.001l-0.013 0c0.275 0.008 0.599 0.012 0.923 0.012 5.554 0 10.813-1.263 15.505-3.518l-0.215 0.093c5.422-2.298 10.079-5.314 14.119-8.995l-0.039 0.035c7.648-7.709 12.374-18.326 12.374-30.047 0-0.087-0-0.173-0.001-0.26l0 0.013c-0.073-5.873-1.322-11.435-3.52-16.489l0.107 0.275c-2.152-5.464-5.187-10.143-8.974-14.095l0.014 0.015zM364.8 561.92c-2.068-1.617-4.477-2.923-7.085-3.791l-0.169-0.049c-2.326-1.517-5.034-2.694-7.933-3.379l-0.174-0.035c-2.499-0.607-5.369-0.956-8.32-0.956s-5.82 0.348-8.57 1.006l0.25-0.050-7.68 2.56-7.68 3.84-6.4 5.12c-7.66 8.024-12.374 18.918-12.374 30.913 0 0.082 0 0.165 0.001 0.247l-0-0.013c-0 0.073-0.001 0.16-0.001 0.247 0 11.721 4.726 22.338 12.377 30.049l-0.003-0.003c4.001 3.646 8.658 6.662 13.76 8.838l0.32 0.122c4.793 2.024 10.366 3.201 16.214 3.201 23.489 0 42.545-18.982 42.666-42.443l0-0.012c-0.169-11.771-4.851-22.416-12.39-30.311l0.016 0.017zM371.627 737.707c-3.937-3.773-8.616-6.808-13.791-8.859l-0.289-0.101c-5.263-2.499-11.435-3.959-17.948-3.959-2.401 0-4.755 0.198-7.048 0.579l0.249-0.034-7.68 2.56c-2.93 1.020-5.469 2.319-7.79 3.912l0.11-0.072c-2.39 1.693-4.477 3.374-6.456 5.17l0.056-0.050c-3.773 3.937-6.808 8.616-8.859 13.791l-0.101 0.289c-2.163 4.771-3.423 10.345-3.423 16.213s1.26 11.443 3.525 16.466l-0.102-0.253c2.298 5.422 5.314 10.079 8.995 14.119l-0.035-0.039c7.652 8.018 18.368 13.056 30.262 13.226l0.031 0c0.275 0.008 0.599 0.012 0.923 0.012 5.554 0 10.813-1.263 15.505-3.518l-0.215 0.093c5.422-2.298 10.079-5.314 14.119-8.995l-0.039 0.035c3.646-4.001 6.662-8.658 8.838-13.76l0.122-0.32c2.163-4.771 3.423-10.345 3.423-16.213s-1.26-11.443-3.525-16.466l0.102 0.253c-2.152-5.464-5.187-10.143-8.974-14.095l0.014 0.015zM495.787 558.080c-5.464 2.152-10.143 5.187-14.095 8.974l0.015-0.014c-7.522 7.877-12.204 18.523-12.373 30.26l-0 0.033c0.121 23.473 19.177 42.454 42.666 42.454 5.848 0 11.421-1.176 16.495-3.305l-0.281 0.105c5.422-2.298 10.079-5.314 14.119-8.995l-0.039 0.035c7.648-7.709 12.374-18.326 12.374-30.047 0-0.087-0-0.173-0.001-0.26l0 0.013c-0.169-11.771-4.851-22.416-12.39-30.311l0.016 0.017c-7.7-7.601-18.286-12.296-29.968-12.296-5.971 0-11.656 1.227-16.817 3.442l0.278-0.106zM712.96 737.707c-4.001-3.646-8.658-6.662-13.76-8.838l-0.32-0.122c-4.883-2.109-10.568-3.336-16.539-3.336-11.682 0-22.267 4.695-29.972 12.3l0.005-0.004c-3.773 3.937-6.808 8.616-8.859 13.791l-0.101 0.289c-2.163 4.771-3.423 10.345-3.423 16.213s1.26 11.443 3.525 16.466l-0.102-0.253c2.298 5.422 5.314 10.079 8.995 14.119l-0.035-0.039c7.709 7.648 18.326 12.374 30.047 12.374 0.087 0 0.173-0 0.26-0.001l-0.013 0c0.275 0.008 0.599 0.012 0.923 0.012 5.554 0 10.813-1.263 15.505-3.518l-0.215 0.093c5.422-2.298 10.079-5.314 14.119-8.995l-0.039 0.035c7.601-7.7 12.296-18.286 12.296-29.968 0-5.971-1.227-11.656-3.442-16.817l0.106 0.278c-2.152-5.464-5.187-10.143-8.974-14.095l0.014 0.015zM682.667 213.333h-341.333c-23.564 0-42.667 19.103-42.667 42.667v0 170.667c0 23.564 19.103 42.667 42.667 42.667v0h341.333c23.564 0 42.667-19.103 42.667-42.667v0-170.667c0-23.564-19.103-42.667-42.667-42.667v0zM640 384h-256v-85.333h256zM768 42.667h-512c-70.692 0-128 57.308-128 128v0 682.667c0 70.692 57.308 128 128 128v0h512c70.692 0 128-57.308 128-128v0-682.667c0-70.692-57.308-128-128-128v0zM810.667 853.333c0 23.564-19.103 42.667-42.667 42.667v0h-512c-23.564 0-42.667-19.103-42.667-42.667v0-682.667c0-23.564 19.103-42.667 42.667-42.667v0h512c23.564 0 42.667 19.103 42.667 42.667v0zM706.133 561.92c-2.068-1.617-4.477-2.923-7.085-3.791l-0.169-0.049c-2.35-1.229-5.082-2.127-7.969-2.544l-0.137-0.016c-2.499-0.607-5.369-0.956-8.32-0.956s-5.82 0.348-8.57 1.006l0.25-0.050-7.68 2.56-7.68 3.84-6.4 5.12c-7.522 7.877-12.204 18.523-12.373 30.26l-0 0.033c0.121 23.473 19.177 42.454 42.666 42.454 5.848 0 11.421-1.176 16.495-3.305l-0.281 0.105c5.422-2.298 10.079-5.314 14.119-8.995l-0.039 0.035c7.648-7.709 12.374-18.326 12.374-30.047 0-0.087-0-0.173-0.001-0.26l0 0.013c-0.169-11.771-4.851-22.416-12.39-30.311l0.016 0.017z"],"attrs":[],"grid":0,"tags":["calculator"]},"attrs":[],"properties":{"order":4667,"id":1017,"name":"calculator","prevSize":32,"code":59836},"setIdx":0,"setId":0,"iconIdx":188},{"icon":{"paths":["M873.387 384c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667c-23.564 0-42.667 19.103-42.667 42.667v0c0 23.564 19.103 42.667 42.667 42.667v0zM745.387 384c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667c-23.564 0-42.667 19.103-42.667 42.667v0c0 23.564 19.103 42.667 42.667 42.667v0zM617.387 384c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667c-23.564 0-42.667 19.103-42.667 42.667v0c0 23.564 19.103 42.667 42.667 42.667h0zM806.827 554.667c-9.387 0-19.2-2.987-28.587-5.12-21.902-4.865-40.587-10.588-58.643-17.576l2.75 0.936c-8.677-3.257-18.705-5.142-29.174-5.142-33.468 0-62.435 19.267-76.416 47.314l-0.223 0.495-9.387 19.2c-43.411-24.469-80.829-52.781-113.992-85.404l0.072 0.071c-32.378-33.054-60.667-70.311-83.923-110.827l-1.411-2.667 18.773-11.947c28.542-14.205 47.808-43.172 47.808-76.64 0-10.468-1.885-20.497-5.334-29.763l0.192 0.59c-5.868-15.079-11.586-33.757-16.055-52.915l-0.585-2.978c-2.133-9.813-3.84-19.2-5.12-29.013-10.754-60.726-63.13-106.254-126.139-106.254-0.654 0-1.307 0.005-1.959 0.015l0.099-0.001h-128c-0.050-0-0.109-0-0.168-0-37.852 0-71.866 16.43-95.3 42.547l-0.106 0.12c-20.037 22.491-32.28 52.306-32.28 84.98 0 5.992 0.412 11.889 1.209 17.662l-0.076-0.669c47.561 367.612 335.534 655.585 699.079 702.716l4.068 0.431c2.491 0.202 5.392 0.317 8.32 0.317s5.829-0.115 8.699-0.341l-0.379 0.024c70.692 0 128-57.308 128-128v0-128c-0.953-62.061-45.93-113.342-105.033-124.043l-0.78-0.117zM827.733 810.667c0.002 0.144 0.003 0.313 0.003 0.483 0 23.564-19.103 42.667-42.667 42.667-2.26 0-4.478-0.176-6.643-0.514l0.24 0.031c-165.739-22.195-310.897-97.071-421.14-206.954l0.020 0.020c-110.124-110.933-184.942-257.047-206.117-420.005l-0.39-3.675c-0.293-1.879-0.46-4.046-0.46-6.252 0-11.085 4.227-21.182 11.157-28.768l-0.030 0.033c7.755-8.797 19-14.36 31.548-14.506l0.026-0h128c0.283-0.007 0.615-0.011 0.949-0.011 20.394 0 37.446 14.308 41.665 33.434l0.052 0.283q2.56 17.493 6.4 34.56c5.721 25.899 12.474 48.010 20.728 69.374l-1.101-3.241-59.733 27.733c-14.801 6.91-24.874 21.669-24.874 38.78 0 6.52 1.463 12.699 4.078 18.226l-0.11-0.259c62.648 132.060 166.607 236.019 294.925 297.065l3.741 1.602c4.793 2.024 10.366 3.201 16.213 3.201s11.42-1.176 16.495-3.305l-0.281 0.105c10.67-4.048 19.107-11.931 23.783-21.925l0.11-0.262 26.88-59.733c17.866 6.724 40.404 13.471 63.467 18.851l3.947 0.776c11.093 2.56 23.040 4.693 34.56 6.4 19.198 4.434 33.293 21.383 33.293 41.624 0 0.367-0.005 0.732-0.014 1.096l0.001-0.054z"],"attrs":[],"grid":0,"tags":["calling"]},"attrs":[],"properties":{"order":4668,"id":1016,"name":"calling","prevSize":32,"code":59837},"setIdx":0,"setId":0,"iconIdx":189},{"icon":{"paths":["M853.333 448c-23.564 0-42.667 19.103-42.667 42.667v0 298.667c0 23.564-19.103 42.667-42.667 42.667v0h-597.333c-23.564 0-42.667-19.103-42.667-42.667v0-341.333c0-23.564 19.103-42.667 42.667-42.667v0h85.333c0.664 0.037 1.442 0.058 2.224 0.058 18.699 0 34.589-12.029 40.353-28.771l0.090-0.3 23.040-69.973c5.871-17.012 21.745-29.013 40.423-29.013 0.039 0 0.077 0 0.116 0l-0.006-0h235.093c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-237.227c-56.095 0.108-103.713 36.284-120.906 86.566l-0.268 0.901-13.653 42.667h-54.613c-70.692 0-128 57.308-128 128v0 341.333c0 70.692 57.308 128 128 128v0h597.333c70.692 0 128-57.308 128-128v0-298.667c0.034-0.637 0.053-1.383 0.053-2.133 0-23.564-19.103-42.667-42.667-42.667-0.019 0-0.038 0-0.056 0l0.003-0zM469.333 405.333c-94.257 0-170.667 76.41-170.667 170.667s76.41 170.667 170.667 170.667c94.257 0 170.667-76.41 170.667-170.667v0c0-94.257-76.41-170.667-170.667-170.667v0zM469.333 661.333c-47.128 0-85.333-38.205-85.333-85.333s38.205-85.333 85.333-85.333c47.128 0 85.333 38.205 85.333 85.333v0c0 47.128-38.205 85.333-85.333 85.333v0zM938.667 192h-42.667v-42.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 42.667h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h42.667v42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["camera-plus"]},"attrs":[],"properties":{"order":4669,"id":1015,"name":"camera-plus","prevSize":32,"code":59838},"setIdx":0,"setId":0,"iconIdx":190},{"icon":{"paths":["M524.373 222.293l64 64c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.289-7.641 11.775-18.012 11.775-29.43 0-8.208-2.317-15.874-6.334-22.38l0.106 0.184h156.16c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-156.16c3.911-6.323 6.228-13.989 6.228-22.196 0-11.419-4.486-21.79-11.791-29.447l0.016 0.017c-7.733-7.795-18.45-12.621-30.293-12.621s-22.56 4.826-30.291 12.618l-0.003 0.003-64 64c-3.773 3.937-6.808 8.616-8.859 13.791l-0.101 0.289c-2.024 4.793-3.201 10.366-3.201 16.213s1.176 11.42 3.305 16.495l-0.105-0.281c2.152 5.464 5.187 10.143 8.974 14.095l-0.014-0.015zM977.92 389.12c-2.152-5.464-5.187-10.143-8.974-14.095l0.014 0.015-64-64c-7.733-7.795-18.45-12.621-30.293-12.621s-22.56 4.826-30.291 12.618l-0.003 0.003c-7.289 7.641-11.775 18.012-11.775 29.43 0 8.208 2.317 15.874 6.334 22.38l-0.106-0.184h-156.16c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h156.16c-3.911 6.323-6.228 13.989-6.228 22.196 0 11.419 4.486 21.79 11.791 29.447l-0.016-0.017c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 64-64c3.773-3.937 6.808-8.616 8.859-13.791l0.101-0.289c2.024-4.793 3.201-10.366 3.201-16.213s-1.176-11.42-3.305-16.495l0.105 0.281zM469.333 426.667c-94.257 0-170.667 76.41-170.667 170.667s76.41 170.667 170.667 170.667c94.257 0 170.667-76.41 170.667-170.667v0c0-94.257-76.41-170.667-170.667-170.667v0zM469.333 682.667c-47.128 0-85.333-38.205-85.333-85.333s38.205-85.333 85.333-85.333c47.128 0 85.333 38.205 85.333 85.333v0c0 47.128-38.205 85.333-85.333 85.333v0zM853.333 554.667c-23.564 0-42.667 19.103-42.667 42.667v0 213.333c0 23.564-19.103 42.667-42.667 42.667v0h-597.333c-23.564 0-42.667-19.103-42.667-42.667v0-341.333c0-23.564 19.103-42.667 42.667-42.667v0h85.333c0.623 0.032 1.352 0.051 2.085 0.051 18.855 0 34.853-12.23 40.495-29.19l0.087-0.301 23.040-69.12c5.497-16.573 20.441-28.492 38.294-29.436l0.106-0.004h66.56c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-66.56c-0.014-0-0.030-0-0.046-0-56.35 0-104.195 36.412-121.29 86.991l-0.265 0.902-13.227 40.107h-54.613c-70.692 0-128 57.308-128 128v0 341.333c0 70.692 57.308 128 128 128v0h597.333c70.692 0 128-57.308 128-128v0-213.333c0-23.564-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["camera-change"]},"attrs":[],"properties":{"order":4670,"id":1014,"name":"camera-change","prevSize":32,"code":59839},"setIdx":0,"setId":0,"iconIdx":191},{"icon":{"paths":["M832 192c-39.531-39.522-94.137-63.967-154.453-63.967s-114.923 24.445-154.454 63.967l-331.093 331.093c-40.888 39.743-66.258 95.264-66.258 156.711 0 120.648 97.805 218.453 218.453 218.453 61.447 0 116.968-25.37 156.661-66.206l0.050-0.052 331.093-331.093c39.522-39.531 63.967-94.137 63.967-154.453s-24.445-114.923-63.967-154.454l0 0zM440.32 771.84c-24.48 23.176-57.616 37.426-94.080 37.426s-69.6-14.25-94.143-37.485l0.063 0.059c-23.958-24.132-38.764-57.377-38.764-94.080s14.806-69.948 38.772-94.088l-0.008 0.008 135.68-135.68 188.16 188.16zM771.84 440.32l-135.68 135.68-188.16-188.16 135.68-135.68c23.74-22.282 55.777-35.971 91.011-35.971 73.52 0 133.12 59.6 133.12 133.12 0 35.234-13.688 67.27-36.037 91.082l0.066-0.071z"],"attrs":[],"grid":0,"tags":["capsule"]},"attrs":[],"properties":{"order":4671,"id":1013,"name":"capsule","prevSize":32,"code":59840},"setIdx":0,"setId":0,"iconIdx":192},{"icon":{"paths":["M128 384c23.564 0 42.667-19.103 42.667-42.667v0-128c0-23.564 19.103-42.667 42.667-42.667v0h128c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-128c-70.692 0-128 57.308-128 128v0 128c0 23.564 19.103 42.667 42.667 42.667v0zM341.333 853.333h-128c-23.564 0-42.667-19.103-42.667-42.667v0-128c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 128c0 70.692 57.308 128 128 128v0h128c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM512 341.333c-94.257 0-170.667 76.41-170.667 170.667s76.41 170.667 170.667 170.667c94.257 0 170.667-76.41 170.667-170.667v0c0-94.257-76.41-170.667-170.667-170.667v0zM512 597.333c-47.128 0-85.333-38.205-85.333-85.333s38.205-85.333 85.333-85.333c47.128 0 85.333 38.205 85.333 85.333v0c0 47.128-38.205 85.333-85.333 85.333v0zM810.667 85.333h-128c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h128c23.564 0 42.667 19.103 42.667 42.667v0 128c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-128c0-70.692-57.308-128-128-128v0zM896 640c-23.564 0-42.667 19.103-42.667 42.667v0 128c0 23.564-19.103 42.667-42.667 42.667v0h-128c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h128c70.692 0 128-57.308 128-128v0-128c0-23.564-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["capture"]},"attrs":[],"properties":{"order":4672,"id":1012,"name":"capture","prevSize":32,"code":59841},"setIdx":0,"setId":0,"iconIdx":193},{"icon":{"paths":["M928.853 484.693l-213.333-256c-7.881-9.415-19.638-15.36-32.784-15.36-0.024 0-0.049 0-0.073 0l0.004-0h-469.333c-70.692 0-128 57.308-128 128v0 341.333c0 70.692 57.308 128 128 128v0h469.333c0.021 0 0.045 0 0.069 0 13.146 0 24.903-5.945 32.73-15.293l0.054-0.067 213.333-256c6.149-7.342 9.883-16.888 9.883-27.307s-3.734-19.965-9.937-27.373l0.054 0.067zM662.613 725.333h-449.28c-23.564 0-42.667-19.103-42.667-42.667v0-341.333c0-23.564 19.103-42.667 42.667-42.667v0h449.28l177.92 213.333zM542.293 396.373c-7.733-7.795-18.45-12.621-30.293-12.621s-22.56 4.826-30.291 12.618l-0.003 0.003-55.040 55.467-55.040-55.467c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l0 0 55.467 55.040-55.467 55.040c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 55.040-55.467 55.040 55.467c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003-55.467-55.040 55.467-55.040c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003z"],"attrs":[],"grid":0,"tags":["cancel"]},"attrs":[],"properties":{"order":4673,"id":1011,"name":"cancel","prevSize":32,"code":59842},"setIdx":0,"setId":0,"iconIdx":194},{"icon":{"paths":["M810.667 405.333h-13.653l-53.333-133.12c-19.44-47.382-65.192-80.156-118.606-80.213l-256.007-0c-0.109-0-0.238-0.001-0.366-0.001-61.784 0-113.344 43.774-125.358 101.999l-0.143 0.828-22.187 110.507h-7.68c-70.692 0-128 57.308-128 128v0 128c0 23.564 19.103 42.667 42.667 42.667v0h42.667c0 70.692 57.308 128 128 128s128-57.308 128-128v0h170.667c0 70.692 57.308 128 128 128s128-57.308 128-128v0h42.667c23.564 0 42.667-19.103 42.667-42.667v0-128c0-70.692-57.308-128-128-128v0zM554.667 277.333h70.4c17.725 0.165 32.852 11.114 39.151 26.595l0.103 0.285 40.533 101.12h-150.187zM326.827 311.467c4.105-19.619 21.26-34.142 41.806-34.142 0.302 0 0.604 0.003 0.905 0.009l-0.045-0.001h99.84v128h-161.28zM298.667 746.667c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667c23.564 0 42.667 19.103 42.667 42.667v0c0 23.564-19.103 42.667-42.667 42.667v0zM725.333 746.667c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667c23.564 0 42.667 19.103 42.667 42.667v0c0 23.564-19.103 42.667-42.667 42.667v0zM853.333 618.667h-33.28c-23.501-25.787-57.228-41.906-94.72-41.906s-71.219 16.119-94.629 41.805l-0.091 0.102h-237.227c-23.501-25.787-57.228-41.906-94.72-41.906s-71.219 16.119-94.629 41.805l-0.091 0.102h-33.28v-85.333c0-23.564 19.103-42.667 42.667-42.667v0h597.333c23.564 0 42.667 19.103 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["car-sideview"]},"attrs":[],"properties":{"order":4674,"id":1010,"name":"car-sideview","prevSize":32,"code":59843},"setIdx":0,"setId":0,"iconIdx":195},{"icon":{"paths":["M298.667 554.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM843.093 388.693l-57.6-173.227c-18.102-50.142-65.281-85.337-120.681-85.337-0.323 0-0.646 0.001-0.969 0.004l0.050-0h-251.733c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h251.733c0.623-0.032 1.352-0.051 2.085-0.051 18.855 0 34.853 12.23 40.495 29.19l0.087 0.301 44.8 139.093h-83.2c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h142.507c23.564 0 42.667 19.103 42.667 42.667v0 142.507c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-142.507c-0.246-58.954-40.31-108.483-94.678-123.102l-0.895-0.205zM160.427 97.707c-7.939-8.211-19.054-13.309-31.36-13.309-24.081 0-43.602 19.521-43.602 43.602 0 11.775 4.668 22.46 12.254 30.306l-0.012-0.012 120.32 119.893-37.12 110.507c-55.263 14.823-95.327 64.352-95.573 123.279l-0 0.028v170.667c0.16 55.254 35.305 102.258 84.442 120.038l0.891 0.282v50.347c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667h494.507l17.493 17.493v25.173c0 23.564 19.103 42.667 42.667 42.667v0c7.259-0.072 14.024-2.126 19.798-5.644l-0.171 0.097 35.413 35.84c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003zM288.427 345.6l38.4 38.4h-54.187zM213.333 725.333c-23.564 0-42.667-19.103-42.667-42.667v0-170.667c0-23.564 19.103-42.667 42.667-42.667v0h195.84l85.333 85.333h-25.173c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h85.333c7.259-0.072 14.024-2.126 19.798-5.644l-0.171 0.097 90.88 90.88z"],"attrs":[],"grid":0,"tags":["car-slash"]},"attrs":[],"properties":{"order":4675,"id":1009,"name":"car-slash","prevSize":32,"code":59844},"setIdx":0,"setId":0,"iconIdx":196},{"icon":{"paths":["M810.667 277.333h-54.613l-13.653-42.667c-18.102-50.141-65.281-85.334-120.68-85.334-0.174 0-0.347 0-0.52 0.001l0.027-0h-218.453c-56.095 0.108-103.713 36.284-120.906 86.566l-0.268 0.901-13.653 42.667h-54.613c-70.692 0-128 57.308-128 128v0 341.333c0 70.692 57.308 128 128 128v0h597.333c70.692 0 128-57.308 128-128v0-341.333c0.011-0.635 0.018-1.383 0.018-2.133 0-70.692-57.308-128-128-128-0.006 0-0.012 0-0.019 0l0.001-0zM853.333 746.667c0 23.564-19.103 42.667-42.667 42.667v0h-597.333c-23.564 0-42.667-19.103-42.667-42.667v0-341.333c0-23.564 19.103-42.667 42.667-42.667v0h85.333c0.664 0.037 1.442 0.058 2.224 0.058 18.699 0 34.589-12.029 40.353-28.771l0.090-0.3 23.040-69.973c5.871-17.012 21.745-29.013 40.423-29.013 0.039 0 0.077 0 0.116 0l-0.006-0h218.453c0.033-0 0.071-0 0.11-0 18.678 0 34.552 12.002 40.333 28.714l0.090 0.3 23.040 69.973c5.635 16.395 20.539 28.132 38.3 29.009l0.1 0.004h85.333c23.564 0 42.667 19.103 42.667 42.667v0zM512 362.667c-94.257 0-170.667 76.41-170.667 170.667s76.41 170.667 170.667 170.667c94.257 0 170.667-76.41 170.667-170.667v0c0-94.257-76.41-170.667-170.667-170.667v0zM512 618.667c-47.128 0-85.333-38.205-85.333-85.333s38.205-85.333 85.333-85.333c47.128 0 85.333 38.205 85.333 85.333v0c0 47.128-38.205 85.333-85.333 85.333v0z"],"attrs":[],"grid":0,"tags":["camera"]},"attrs":[],"properties":{"order":4676,"id":1008,"name":"camera","prevSize":32,"code":59845},"setIdx":0,"setId":0,"iconIdx":197},{"icon":{"paths":["M158.293 97.707c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l-0-0 119.467 119.040h-3.84c-70.692 0-128 57.308-128 128v0 341.333c0 70.692 57.308 128 128 128v0h600.747l51.627 52.053c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003zM435.2 495.787l114.347 114.347c-10.868 5.384-23.665 8.534-37.197 8.534-0.123 0-0.246-0-0.368-0.001l0.019 0c-47.128 0-85.333-38.205-85.333-85.333v0c-0-0.104-0.001-0.226-0.001-0.349 0-13.533 3.15-26.33 8.757-37.697l-0.223 0.5zM213.333 789.333c-23.564 0-42.667-19.103-42.667-42.667v0-341.333c0-23.564 19.103-42.667 42.667-42.667v0h88.32l72.533 72.107c-20.326 27.192-32.625 61.418-32.853 98.506l-0 0.054c0 94.257 76.41 170.667 170.667 170.667v0c37.292-0.13 71.683-12.445 99.426-33.167l-0.439 0.314 118.187 118.187zM810.667 277.333h-54.613l-13.227-42.667c-18.102-50.142-65.281-85.337-120.681-85.337-0.323 0-0.646 0.001-0.969 0.004l0.050-0h-187.733c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h187.733c0.033-0 0.071-0 0.11-0 18.678 0 34.552 12.002 40.333 28.714l0.090 0.3 23.040 69.547c5.741 17.225 21.71 29.426 40.532 29.44l85.335 0c23.564 0 42.667 19.103 42.667 42.667v0 249.173c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-249.173c0-70.692-57.308-128-128-128v0z"],"attrs":[],"grid":0,"tags":["camera-slash"]},"attrs":[],"properties":{"order":4677,"id":1007,"name":"camera-slash","prevSize":32,"code":59846},"setIdx":0,"setId":0,"iconIdx":198},{"icon":{"paths":["M320 170.667c0.073 0 0.16 0.001 0.247 0.001 11.721 0 22.338-4.726 30.049-12.377l-0.003 0.003 42.667-42.667c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l-42.667 42.667c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003c7.709 7.648 18.326 12.374 30.047 12.374 0.087 0 0.173-0 0.26-0.001l-0.013 0zM490.667 170.667c0.073 0 0.16 0.001 0.247 0.001 11.721 0 22.338-4.726 30.049-12.377l-0.003 0.003 42.667-42.667c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l-42.667 42.667c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003c7.709 7.648 18.326 12.374 30.047 12.374 0.087 0 0.173-0 0.26-0.001l-0.013 0zM661.333 170.667c0.073 0 0.16 0.001 0.247 0.001 11.721 0 22.338-4.726 30.049-12.377l-0.003 0.003 42.667-42.667c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l-42.667 42.667c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003c7.709 7.648 18.326 12.374 30.047 12.374 0.087 0 0.173-0 0.26-0.001l-0.013 0zM764.587 666.453c-1.020-2.93-2.319-5.469-3.912-7.79l0.072 0.11-5.12-6.4-6.4-5.12c-2.211-1.521-4.75-2.82-7.453-3.77l-0.227-0.070c-2.35-1.229-5.082-2.127-7.969-2.544l-0.137-0.016c-2.518-0.528-5.413-0.83-8.377-0.83-11.709 0-22.317 4.717-30.026 12.354l0.003-0.003c-1.746 1.923-3.427 4.010-4.98 6.193l-0.14 0.207c-1.521 2.211-2.82 4.75-3.77 7.453l-0.070 0.227c-1.157 2.221-2.047 4.798-2.535 7.514l-0.025 0.166c-0.1 1.277-0.157 2.765-0.157 4.267s0.057 2.99 0.169 4.463l-0.012-0.196c0.051 11.656 4.767 22.2 12.376 29.869l-0.003-0.003c3.858 4.029 8.556 7.22 13.817 9.295l0.263 0.092c4.518 1.985 9.77 3.222 15.288 3.411l0.072 0.002c23.564 0 42.667-19.103 42.667-42.667v0c0.1-1.277 0.157-2.765 0.157-4.267s-0.057-2.99-0.169-4.463l0.012 0.196c-0.801-2.918-1.969-5.473-3.478-7.785l0.064 0.105zM843.093 474.027l-58.027-173.227c-18.102-50.141-65.281-85.334-120.68-85.334-0.174 0-0.347 0-0.52 0.001l0.027-0h-303.787c-0.146-0.001-0.32-0.001-0.493-0.001-55.399 0-102.577 35.194-120.398 84.443l-0.282 0.891-58.027 173.227c-55.263 14.823-95.327 64.352-95.573 123.279l-0 0.028v170.667c0.16 55.254 35.305 102.258 84.442 120.038l0.891 0.282v50.347c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667h512v42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-50.347c50.028-18.062 85.173-65.066 85.333-120.3l0-0.020v-170.667c-0.246-58.954-40.31-108.483-94.678-123.102l-0.895-0.205zM319.573 327.68c5.871-17.012 21.745-29.013 40.423-29.013 0.039 0 0.077 0 0.116 0l-0.006-0h303.787c0.664-0.037 1.442-0.058 2.224-0.058 18.699 0 34.589 12.029 40.353 28.771l0.090 0.3 44.8 141.653h-478.72zM853.333 768c0 23.564-19.103 42.667-42.667 42.667v0h-597.333c-23.564 0-42.667-19.103-42.667-42.667v0-170.667c0-23.564 19.103-42.667 42.667-42.667v0h597.333c23.564 0 42.667 19.103 42.667 42.667v0zM554.667 640h-85.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h85.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM337.92 666.453c-1.020-2.93-2.319-5.469-3.912-7.79l0.072 0.11-5.12-6.4c-7.7-7.601-18.286-12.296-29.968-12.296-5.971 0-11.656 1.227-16.817 3.442l0.278-0.106c-5.464 2.152-10.143 5.187-14.095 8.974l0.015-0.014c-1.746 1.923-3.427 4.010-4.98 6.193l-0.14 0.207c-1.521 2.211-2.82 4.75-3.77 7.453l-0.070 0.227c-1.445 2.207-2.612 4.762-3.368 7.488l-0.045 0.192c-0.1 1.277-0.157 2.765-0.157 4.267s0.057 2.99 0.169 4.463l-0.012-0.196c0.102 23.487 19.165 42.488 42.666 42.488 11.844 0 22.56-4.826 30.291-12.618l0.003-0.003c7.606-7.667 12.323-18.211 12.373-29.857l0-0.010c0.1-1.277 0.157-2.765 0.157-4.267s-0.057-2.99-0.169-4.463l0.012 0.196c-0.801-2.918-1.969-5.473-3.478-7.785l0.064 0.105z"],"attrs":[],"grid":0,"tags":["car-wash"]},"attrs":[],"properties":{"order":4678,"id":1006,"name":"car-wash","prevSize":32,"code":59847},"setIdx":0,"setId":0,"iconIdx":199},{"icon":{"paths":["M282.453 558.080c-10.747 3.967-19.073 12.293-22.954 22.774l-0.086 0.266c-1.933 4.694-3.055 10.144-3.055 15.855 0 23.564 19.103 42.667 42.667 42.667 5.712 0 11.161-1.122 16.14-3.158l-0.285 0.103c5.422-2.298 10.079-5.314 14.119-8.995l-0.039 0.035c3.646-4.001 6.662-8.658 8.838-13.76l0.122-0.32c2.162-4.477 3.425-9.736 3.425-15.29 0-0.325-0.004-0.648-0.013-0.971l0.001 0.048c-0.169-11.771-4.851-22.416-12.39-30.311l0.016 0.017c-7.7-7.601-18.286-12.296-29.968-12.296-5.971 0-11.656 1.227-16.817 3.442l0.278-0.106zM843.093 387.413l-58.027-171.947c-18.102-50.141-65.281-85.334-120.68-85.334-0.174 0-0.347 0-0.52 0.001l0.027-0h-303.787c-0.146-0.001-0.32-0.001-0.493-0.001-55.399 0-102.577 35.194-120.398 84.443l-0.282 0.891-58.027 173.227c-55.263 14.823-95.327 64.352-95.573 123.279l-0 0.028v170.667c0.16 55.254 35.305 102.258 84.442 120.038l0.891 0.282v50.347c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667h512v42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-50.347c50.028-18.062 85.173-65.066 85.333-120.3l0-0.020v-170.667c-0.246-58.954-40.31-108.483-94.678-123.102l-0.895-0.205zM319.573 242.347c5.871-17.012 21.745-29.013 40.423-29.013 0.039 0 0.077 0 0.116 0l-0.006-0h303.787c0.664-0.037 1.442-0.058 2.224-0.058 18.699 0 34.589 12.029 40.353 28.771l0.090 0.3 44.8 141.653h-478.72zM853.333 682.667c0 23.564-19.103 42.667-42.667 42.667v0h-597.333c-23.564 0-42.667-19.103-42.667-42.667v0-170.667c0-23.564 19.103-42.667 42.667-42.667v0h597.333c23.564 0 42.667 19.103 42.667 42.667v0zM709.12 558.080c-10.747 3.967-19.073 12.293-22.954 22.774l-0.086 0.266c-1.933 4.694-3.055 10.144-3.055 15.855 0 23.564 19.103 42.667 42.667 42.667 5.712 0 11.161-1.122 16.14-3.158l-0.285 0.103c10.747-3.967 19.073-12.293 22.954-22.774l0.086-0.266c2.162-4.477 3.425-9.736 3.425-15.29 0-0.325-0.004-0.648-0.013-0.971l0.001 0.048c-0.169-11.771-4.851-22.416-12.39-30.311l0.016 0.017c-7.7-7.601-18.286-12.296-29.968-12.296-5.971 0-11.656 1.227-16.817 3.442l0.278-0.106zM554.667 554.667h-85.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h85.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["car"]},"attrs":[],"properties":{"order":4679,"id":1005,"name":"car","prevSize":32,"code":59848},"setIdx":0,"setId":0,"iconIdx":200},{"icon":{"paths":["M810.667 192h-597.333c-70.692 0-128 57.308-128 128v0 384c0 70.692 57.308 128 128 128v0h597.333c70.692 0 128-57.308 128-128v0-384c0-70.692-57.308-128-128-128v0zM853.333 704c0 23.564-19.103 42.667-42.667 42.667v0h-597.333c-23.564 0-42.667-19.103-42.667-42.667v0-384c0-23.564 19.103-42.667 42.667-42.667v0h597.333c23.564 0 42.667 19.103 42.667 42.667v0zM682.667 448c-23.796 0.172-46.006 6.81-65.004 18.242l0.577-0.322c-18.671-11.259-41.217-17.92-65.318-17.92-70.692 0-128 57.308-128 128s57.308 128 128 128c24.101 0 46.646-6.661 65.895-18.242l-0.577 0.322c18.67 11.257 41.214 17.917 65.312 17.917 70.692 0 128-57.308 128-128s-57.308-128-128-128c-0.311 0-0.623 0.001-0.934 0.003l0.048-0zM561.92 618.667c-1.086 0.098-2.35 0.154-3.627 0.154s-2.54-0.056-3.788-0.166l0.162 0.011c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667v0c1.086-0.098 2.35-0.154 3.627-0.154s2.54 0.056 3.788 0.166l-0.162-0.011c-4.586 12.181-7.241 26.26-7.241 40.96s2.655 28.779 7.511 41.785l-0.27-0.825zM682.667 618.667c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667c23.564 0 42.667 19.103 42.667 42.667v0c0 23.564-19.103 42.667-42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["card-atm"]},"attrs":[],"properties":{"order":4680,"id":1004,"name":"card-atm","prevSize":32,"code":59849},"setIdx":0,"setId":0,"iconIdx":201},{"icon":{"paths":["M832 474.88l-597.333-344.747c-6.12-3.594-13.479-5.716-21.333-5.716s-15.214 2.123-21.535 5.825l0.201-0.109c-12.844 7.514-21.334 21.241-21.334 36.951 0 0.060 0 0.119 0 0.179l-0-0.009v689.493c-0 0.050-0 0.11-0 0.169 0 15.71 8.49 29.436 21.132 36.842l0.201 0.109c6.12 3.594 13.479 5.716 21.333 5.716s15.214-2.123 21.535-5.825l-0.201 0.109 597.333-344.747c13.010-7.474 21.63-21.29 21.63-37.12s-8.62-29.646-21.423-37.010l-0.207-0.11zM256 782.933v-541.867l469.333 270.933z"],"attrs":[],"grid":0,"tags":["caret-right"]},"attrs":[],"properties":{"order":4681,"id":1003,"name":"caret-right","prevSize":32,"code":59850},"setIdx":0,"setId":0,"iconIdx":202},{"icon":{"paths":["M916.907 201.813l-191.573-109.227c-6.12-3.594-13.479-5.716-21.333-5.716s-15.214 2.123-21.535 5.825l0.201-0.109-170.667 97.28-170.667-97.28c-6.12-3.594-13.479-5.716-21.333-5.716s-15.214 2.123-21.535 5.825l0.201-0.109-191.573 109.227c-13.061 7.444-21.732 21.266-21.76 37.116l-0 0.004v218.453c0.028 15.854 8.699 29.676 21.55 37.010l0.21 0.11 170.667 96.853v193.707c0.028 15.854 8.699 29.676 21.55 37.010l0.21 0.11 192 109.227c6.12 3.594 13.479 5.716 21.333 5.716s15.214-2.123 21.535-5.825l-0.201 0.109 191.147-109.227c13.061-7.444 21.732-21.266 21.76-37.116l0-0.004v-193.707l170.667-96.853c13.061-7.444 21.732-21.266 21.76-37.116l0-0.004v-218.453c-0.21-16.014-9.21-29.878-22.388-37.008l-0.226-0.112zM170.667 432.64v-170.667l149.333-85.333 149.333 85.333v170.667l-149.333 85.333zM661.333 760.32l-149.333 85.333-149.333-85.333v-170.667l149.333-85.333 149.333 85.333zM853.333 432.64l-149.333 85.333-149.333-85.333v-170.667l149.333-85.333 149.333 85.333z"],"attrs":[],"grid":0,"tags":["cell"]},"attrs":[],"properties":{"order":4682,"id":1002,"name":"cell","prevSize":32,"code":59851},"setIdx":0,"setId":0,"iconIdx":203},{"icon":{"paths":["M896 810.667h-256c-70.692 0-128-57.308-128-128v0-341.333c0-70.692 57.308-128 128-128v0h256c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-256c-117.821 0-213.333 95.513-213.333 213.333v0 341.333c0 117.821 95.513 213.333 213.333 213.333v0h256c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM213.333 128c-70.692 0-128 57.308-128 128s57.308 128 128 128c70.692 0 128-57.308 128-128v0c0-70.692-57.308-128-128-128v0zM213.333 298.667c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667c23.564 0 42.667 19.103 42.667 42.667v0c0 23.564-19.103 42.667-42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["celsius"]},"attrs":[],"properties":{"order":4683,"id":1001,"name":"celsius","prevSize":32,"code":59852},"setIdx":0,"setId":0,"iconIdx":204},{"icon":{"paths":["M768 298.667h42.667v42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-42.667v-42.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 42.667h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM853.333 682.667c-27.715 0.147-53.315 9.080-74.19 24.152l0.376-0.259-104.533-61.867c4.711-14.119 7.507-30.383 7.679-47.276l0.001-0.084c-0.264-78.868-53.984-145.116-126.809-164.425l-1.191-0.268v-98.987c50.14-18.103 85.333-65.281 85.333-120.68 0-70.692-57.308-128-128-128s-128 57.308-128 128c0 55.398 35.193 102.577 84.442 120.398l0.891 0.282v98.987c-74.016 19.577-127.736 85.825-128 164.663l-0 0.030c0.173 16.977 2.969 33.241 8.002 48.487l-0.322-1.127-104.533 61.867c-20.498-14.813-46.098-23.746-73.778-23.893l-0.036-0c-70.692 0-128 57.308-128 128s57.308 128 128 128c70.692 0 128-57.308 128-128v0c-0.172-12.225-2.031-23.948-5.353-35.040l0.233 0.906 98.133-58.453c30.848 30.671 73.37 49.629 120.32 49.629s89.472-18.958 120.328-49.637l-0.008 0.008 98.133 58.453c-2.943 10.232-4.635 21.985-4.635 34.132 0 70.692 57.308 128 128 128s128-57.308 128-128c0-70.692-57.308-128-128-128-0.171 0-0.341 0-0.512 0.001l0.026-0zM170.667 853.333c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667c23.564 0 42.667 19.103 42.667 42.667v0c0 23.564-19.103 42.667-42.667 42.667v0zM512 170.667c23.564 0 42.667 19.103 42.667 42.667s-19.103 42.667-42.667 42.667c-23.564 0-42.667-19.103-42.667-42.667v0c0-23.564 19.103-42.667 42.667-42.667v0zM512 682.667c-47.128 0-85.333-38.205-85.333-85.333s38.205-85.333 85.333-85.333c47.128 0 85.333 38.205 85.333 85.333v0c0 47.128-38.205 85.333-85.333 85.333v0zM853.333 853.333c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667c23.564 0 42.667 19.103 42.667 42.667v0c0 23.564-19.103 42.667-42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["channel-add"]},"attrs":[],"properties":{"order":4684,"id":1000,"name":"channel-add","prevSize":32,"code":59853},"setIdx":0,"setId":0,"iconIdx":205},{"icon":{"paths":["M853.333 682.667c-27.715 0.147-53.315 9.080-74.19 24.152l0.376-0.259-104.533-61.867c4.711-14.119 7.507-30.383 7.679-47.276l0.001-0.084c-0.264-78.868-53.984-145.116-126.809-164.425l-1.191-0.268v-98.987c50.14-18.103 85.333-65.281 85.333-120.68 0-70.692-57.308-128-128-128s-128 57.308-128 128c0 55.398 35.193 102.577 84.442 120.398l0.891 0.282v98.987c-74.016 19.577-127.736 85.825-128 164.663l-0 0.030c0.173 16.977 2.969 33.241 8.002 48.487l-0.322-1.127-104.533 61.867c-20.498-14.813-46.098-23.746-73.778-23.893l-0.036-0c-70.692 0-128 57.308-128 128s57.308 128 128 128c70.692 0 128-57.308 128-128v0c-0.172-12.225-2.031-23.948-5.353-35.040l0.233 0.906 98.133-58.453c30.848 30.671 73.37 49.629 120.32 49.629s89.472-18.958 120.328-49.637l-0.008 0.008 98.133 58.453c-2.943 10.232-4.635 21.985-4.635 34.132 0 70.692 57.308 128 128 128s128-57.308 128-128c0-70.692-57.308-128-128-128-0.171 0-0.341 0-0.512 0.001l0.026-0zM170.667 853.333c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667c23.564 0 42.667 19.103 42.667 42.667v0c0 23.564-19.103 42.667-42.667 42.667v0zM512 170.667c23.564 0 42.667 19.103 42.667 42.667s-19.103 42.667-42.667 42.667c-23.564 0-42.667-19.103-42.667-42.667v0c0-23.564 19.103-42.667 42.667-42.667v0zM512 682.667c-47.128 0-85.333-38.205-85.333-85.333s38.205-85.333 85.333-85.333c47.128 0 85.333 38.205 85.333 85.333v0c0 47.128-38.205 85.333-85.333 85.333v0zM853.333 853.333c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667c23.564 0 42.667 19.103 42.667 42.667v0c0 23.564-19.103 42.667-42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["channel"]},"attrs":[],"properties":{"order":4685,"id":999,"name":"channel","prevSize":32,"code":59854},"setIdx":0,"setId":0,"iconIdx":206},{"icon":{"paths":["M896 469.333c-23.564 0-42.667 19.103-42.667 42.667v0 110.507l-268.373-268.8c-7.733-7.795-18.45-12.621-30.293-12.621s-22.56 4.826-30.291 12.618l-0.003 0.003-140.373 140.8-225.707-226.133c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l256 256c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 140.373-140.8 238.507 238.507h-110.507c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h213.333c5.873-0.073 11.435-1.322 16.489-3.52l-0.275 0.107c10.46-4.422 18.618-12.58 22.935-22.76l0.105-0.28c2.092-4.778 3.34-10.34 3.413-16.186l0-0.027v-213.333c0-23.564-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["chart-down"]},"attrs":[],"properties":{"order":4686,"id":998,"name":"chart-down","prevSize":32,"code":59855},"setIdx":0,"setId":0,"iconIdx":207},{"icon":{"paths":["M896 853.333h-42.667v-640c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 640h-85.333v-298.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 298.667h-85.333v-469.333c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 469.333h-85.333v-128c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 128h-85.333v-725.333c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 768c0 23.564 19.103 42.667 42.667 42.667v0h768c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["chart-bar"]},"attrs":[],"properties":{"order":4687,"id":997,"name":"chart-bar","prevSize":32,"code":59856},"setIdx":0,"setId":0,"iconIdx":208},{"icon":{"paths":["M896 853.333h-725.333v-85.333h128c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-128v-85.333h298.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-298.667v-85.333h469.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-469.333v-85.333h640c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-640v-42.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 768c0 23.564 19.103 42.667 42.667 42.667v0h768c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["chart-growth-alt"]},"attrs":[],"properties":{"order":4688,"id":996,"name":"chart-growth-alt","prevSize":32,"code":59857},"setIdx":0,"setId":0,"iconIdx":209},{"icon":{"paths":["M896 853.333h-725.333v-85.333h128c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-128v-85.333h469.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-469.333v-85.333h298.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-298.667v-85.333h640c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-640v-42.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 768c0 23.564 19.103 42.667 42.667 42.667v0h768c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["chart-bar-alt"]},"attrs":[],"properties":{"order":4689,"id":995,"name":"chart-bar-alt","prevSize":32,"code":59858},"setIdx":0,"setId":0,"iconIdx":210},{"icon":{"paths":["M298.667 682.667c35.346 0 64-28.654 64-64v0c0.099-0.959 0.156-2.073 0.156-3.2s-0.057-2.241-0.168-3.338l0.011 0.138 119.040-119.040h19.627l68.693 68.693s0 2.133 0 3.413c0 35.346 28.654 64 64 64s64-28.654 64-64v0-3.413l155.307-156.587c35.346 0 64-28.654 64-64s-28.654-64-64-64c-35.346 0-64 28.654-64 64v0c-0.099 0.959-0.156 2.073-0.156 3.2s0.057 2.241 0.168 3.338l-0.011-0.138-154.027 154.027h-6.827l-73.813-75.093c0-35.346-28.654-64-64-64s-64 28.654-64 64v-0l-128 128c-35.346 0-64 28.654-64 64s28.654 64 64 64v0zM874.667 853.333h-725.333v-725.333c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 768c0 23.564 19.103 42.667 42.667 42.667v0h768c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["chart-line"]},"attrs":[],"properties":{"order":4690,"id":994,"name":"chart-line","prevSize":32,"code":59859},"setIdx":0,"setId":0,"iconIdx":211},{"icon":{"paths":["M896 853.333h-42.667v-640c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 640h-85.333v-469.333c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 469.333h-85.333v-298.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 298.667h-85.333v-128c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 128h-85.333v-725.333c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 768c0 23.564 19.103 42.667 42.667 42.667v0h768c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["chart-growth"]},"attrs":[],"properties":{"order":4691,"id":993,"name":"chart-growth","prevSize":32,"code":59860},"setIdx":0,"setId":0,"iconIdx":212},{"icon":{"paths":["M810.667 512h-298.667v-298.667c0-25.6-17.067-42.667-42.667-42.667-213.333 0-384 170.667-384 384s170.667 384 384 384 384-170.667 384-384c0-25.6-17.067-42.667-42.667-42.667zM512 849.067c-162.133 25.6-315.733-89.6-337.067-251.733-25.6-162.133 89.6-315.733 251.733-337.067v294.4c0 25.6 17.067 42.667 42.667 42.667h294.4c-17.067 132.267-119.467 234.667-251.733 251.733zM640 85.333c-25.6 0-42.667 17.067-42.667 42.667v256c0 25.6 17.067 42.667 42.667 42.667h256c25.6 0 42.667-17.067 42.667-42.667 0-166.4-132.267-298.667-298.667-298.667zM682.667 341.333v-166.4c85.333 17.067 149.333 81.067 166.4 166.4h-166.4z"],"attrs":[],"grid":0,"tags":["chart-pie-alt"]},"attrs":[],"properties":{"order":4692,"id":992,"name":"chart-pie-alt","prevSize":32,"code":59861},"setIdx":0,"setId":0,"iconIdx":213},{"icon":{"paths":["M512 256c-23.564 0-42.667 19.103-42.667 42.667v0 426.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-426.667c0-23.564-19.103-42.667-42.667-42.667v0zM298.667 512c-23.564 0-42.667 19.103-42.667 42.667v0 170.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-170.667c0-23.564-19.103-42.667-42.667-42.667v0zM725.333 426.667c-23.564 0-42.667 19.103-42.667 42.667v0 256c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-256c0-23.564-19.103-42.667-42.667-42.667v0zM810.667 85.333h-597.333c-70.692 0-128 57.308-128 128v0 597.333c0 70.692 57.308 128 128 128v0h597.333c70.692 0 128-57.308 128-128v0-597.333c0-70.692-57.308-128-128-128v0zM853.333 810.667c0 23.564-19.103 42.667-42.667 42.667v0h-597.333c-23.564 0-42.667-19.103-42.667-42.667v0-597.333c0-23.564 19.103-42.667 42.667-42.667v0h597.333c23.564 0 42.667 19.103 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["chart"]},"attrs":[],"properties":{"order":4693,"id":991,"name":"chart","prevSize":32,"code":59862},"setIdx":0,"setId":0,"iconIdx":214},{"icon":{"paths":["M512 85.333c-0.229-0-0.5-0.001-0.772-0.001-235.641 0-426.667 191.025-426.667 426.667s191.025 426.667 426.667 426.667c77.649 0 150.454-20.743 213.175-56.989l-2.057 1.096h5.12c129.696-74.841 215.586-212.788 215.586-370.796 0-235.641-191.025-426.667-426.667-426.667-1.542 0-3.082 0.008-4.621 0.025l0.234-0.002zM554.667 173.653c154.513 20.152 275.528 141.167 295.496 293.958l0.184 1.722h-295.68zM512 853.333c-187.509-1.32-339.004-153.631-339.004-341.325 0-172.647 128.178-315.356 294.562-338.155l1.776-0.199v338.347c0.183 5.412 1.263 10.519 3.095 15.251l-0.108-0.318v6.4l170.667 293.12c-38.625 16.974-83.648 26.861-130.979 26.88l-0.007 0zM718.080 783.36l-132.267-228.693h264.533c-12.3 93.8-61.109 174.309-131.444 228.089l-0.823 0.604z"],"attrs":[],"grid":0,"tags":["chart-pie"]},"attrs":[],"properties":{"order":4694,"id":990,"name":"chart-pie","prevSize":32,"code":59863},"setIdx":0,"setId":0,"iconIdx":215},{"icon":{"paths":["M622.080 482.133c18.665-23.173 30.044-52.901 30.293-85.278l0-0.056c0-77.526-62.847-140.373-140.373-140.373s-140.373 62.847-140.373 140.373h-0c0.249 32.432 11.629 62.16 30.501 85.6l-0.208-0.267c-37.858 23.307-67.325 57.034-84.8 97.183l-0.534 1.377c-2.562 5.319-4.058 11.565-4.058 18.161 0 23.564 19.103 42.667 42.667 42.667 18.13 0 33.62-11.309 39.799-27.257l0.099-0.291c19.963-45.813 64.715-77.326 116.865-77.653l0.042-0c52.361 0.148 97.314 31.712 117.013 76.829l0.321 0.824c6.651 15.415 21.713 26.012 39.251 26.027l0.002 0c6.024-0.116 11.726-1.359 16.948-3.527l-0.308 0.113c15.403-6.666 25.985-21.732 25.985-39.27 0-6.004-1.24-11.718-3.478-16.9l0.106 0.277c-18.117-41.575-47.733-75.311-84.828-98.029l-0.932-0.531zM512 450.987v0c-30.397-0.001-55.038-24.643-55.038-55.040s24.642-55.040 55.040-55.040c30.398 0 55.040 24.642 55.040 55.040 0 0.15-0.001 0.3-0.002 0.45l0-0.023c-0.242 30.214-24.791 54.613-55.038 54.613-0.001 0-0.001-0-0.002-0l0 0zM768 85.333h-512c-70.692 0-128 57.308-128 128v0 469.333c0 70.692 57.308 128 128 128v0h110.507l115.2 115.627c7.709 7.648 18.326 12.374 30.047 12.374 0.087 0 0.173-0 0.26-0.001l-0.013 0c0.001 0 0.002 0 0.003 0 10.613 0 20.321-3.875 27.787-10.288l-0.057 0.048 137.387-117.76h90.88c70.692 0 128-57.308 128-128v0-469.333c0-70.692-57.308-128-128-128v0zM810.667 682.667c0 23.564-19.103 42.667-42.667 42.667v0h-106.667c-0.001-0-0.002-0-0.003-0-10.613 0-20.321 3.875-27.787 10.288l0.057-0.048-119.467 102.4-99.84-100.267c-7.709-7.648-18.326-12.374-30.047-12.374-0.087 0-0.173 0-0.26 0.001l0.013-0h-128c-23.564 0-42.667-19.103-42.667-42.667v0-469.333c0-23.564 19.103-42.667 42.667-42.667v0h512c23.564 0 42.667 19.103 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["chat-bubble-user"]},"attrs":[],"properties":{"order":4695,"id":989,"name":"chat-bubble-user","prevSize":32,"code":59864},"setIdx":0,"setId":0,"iconIdx":216},{"icon":{"paths":["M768 85.333h-512c-70.692 0-128 57.308-128 128v0 469.333c0 70.692 57.308 128 128 128v0h110.507l115.2 115.627c7.709 7.648 18.326 12.374 30.047 12.374 0.087 0 0.173-0 0.26-0.001l-0.013 0c0.001 0 0.002 0 0.003 0 10.613 0 20.321-3.875 27.787-10.288l-0.057 0.048 137.387-117.76h90.88c70.692 0 128-57.308 128-128v0-469.333c0-70.692-57.308-128-128-128v0zM810.667 682.667c0 23.564-19.103 42.667-42.667 42.667v0h-106.667c-0.001-0-0.002-0-0.003-0-10.613 0-20.321 3.875-27.787 10.288l0.057-0.048-119.467 102.4-99.84-100.267c-7.709-7.648-18.326-12.374-30.047-12.374-0.087 0-0.173 0-0.26 0.001l0.013-0h-128c-23.564 0-42.667-19.103-42.667-42.667v0-469.333c0-23.564 19.103-42.667 42.667-42.667v0h512c23.564 0 42.667 19.103 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["chat"]},"attrs":[],"properties":{"order":4696,"id":988,"name":"chat","prevSize":32,"code":59865},"setIdx":0,"setId":0,"iconIdx":217},{"icon":{"paths":["M823.040 158.293c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c3.646-4.001 6.662-8.658 8.838-13.76l0.122-0.32c2.092-4.778 3.34-10.34 3.413-16.186l0-0.027c0-0.073 0.001-0.16 0.001-0.247 0-11.721-4.726-22.338-12.377-30.049l0.003 0.003-6.4-5.12c-2.211-1.521-4.75-2.82-7.453-3.77l-0.227-0.070c-4.883-2.109-10.568-3.336-16.539-3.336-11.682 0-22.267 4.695-29.972 12.3l0.005-0.004c-7.648 7.709-12.374 18.326-12.374 30.047 0 0.087 0 0.173 0.001 0.26l-0-0.013c0.073 5.873 1.322 11.435 3.52 16.489l-0.107-0.275c2.298 5.422 5.314 10.079 8.995 14.119l-0.035-0.039zM853.333 213.333c-23.564 0-42.667 19.103-42.667 42.667v0 170.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-170.667c0-23.564-19.103-42.667-42.667-42.667v0zM855.893 554.667c-1.506-0.188-3.249-0.296-5.018-0.296-21.713 0-39.638 16.22-42.32 37.204l-0.022 0.212c-19.096 148.203-144.487 261.547-296.351 261.547-0.064 0-0.128-0-0.192-0l-238.497 0 27.307-26.88c7.668-7.712 12.407-18.343 12.407-30.080s-4.74-22.368-12.409-30.082l0.002 0.002c-54.31-54.091-87.916-128.935-87.916-211.627 0-164.949 133.718-298.667 298.667-298.667 0.158 0 0.316 0 0.474 0l-0.024-0c0.132-0 0.289-0 0.446-0 54.702 0 105.924 14.898 149.832 40.857l-1.371-0.75c5.162 2.391 11.204 3.786 17.572 3.786 23.564 0 42.667-19.103 42.667-42.667 0-14.131-6.87-26.658-17.453-34.423l-0.119-0.083c-54.719-32.712-120.7-52.054-191.198-52.054-0.132 0-0.263 0-0.395 0l0.020-0c-211.534 0.718-382.738 172.364-382.738 383.998 0 91.056 31.693 174.71 84.65 240.532l-0.579-0.743-72.96 71.253c-7.601 7.7-12.296 18.286-12.296 29.968 0 5.971 1.227 11.656 3.442 16.817l-0.106-0.278c6.527 15.59 21.621 26.363 39.242 26.453l0.012 0h341.333c195.231-0.001 356.433-145.696 380.81-334.29l0.203-1.923c0.222-1.633 0.348-3.521 0.348-5.438 0-21.732-16.247-39.669-37.257-42.327l-0.211-0.022z"],"attrs":[],"grid":0,"tags":["chat-info"]},"attrs":[],"properties":{"order":4697,"id":987,"name":"chat-info","prevSize":32,"code":59866},"setIdx":0,"setId":0,"iconIdx":218},{"icon":{"paths":["M628.053 375.040l-183.040 183.467-70.4-70.4c-7.872-9.153-19.467-14.914-32.407-14.914-23.564 0-42.667 19.103-42.667 42.667 0 12.94 5.761 24.535 14.858 32.36l0.056 0.047 100.267 100.693c7.709 7.648 18.326 12.374 30.047 12.374 0.087 0 0.173-0 0.26-0.001l-0.013 0c11.656-0.051 22.2-4.767 29.869-12.376l-0.003 0.003 213.333-213.333c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003c-7.712-7.668-18.343-12.407-30.080-12.407s-22.368 4.74-30.082 12.409l0.002-0.002zM512 85.333c-235.641 0-426.667 191.025-426.667 426.667s191.025 426.667 426.667 426.667c235.641 0 426.667-191.025 426.667-426.667v0c0-235.641-191.025-426.667-426.667-426.667v0zM512 853.333c-188.513 0-341.333-152.82-341.333-341.333s152.82-341.333 341.333-341.333c188.513 0 341.333 152.82 341.333 341.333v0c0 188.513-152.82 341.333-341.333 341.333v0z"],"attrs":[],"grid":0,"tags":["check-circle"]},"attrs":[],"properties":{"order":4698,"id":986,"name":"check-circle","prevSize":32,"code":59867},"setIdx":0,"setId":0,"iconIdx":219},{"icon":{"paths":["M435.627 629.333c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 174.080-174.080c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l0-0-143.787 144.213-51.627-52.053c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l-0-0zM896 85.333h-768c-23.564 0-42.667 19.103-42.667 42.667v0 768c0 23.564 19.103 42.667 42.667 42.667v0h768c23.564 0 42.667-19.103 42.667-42.667v0-768c0-23.564-19.103-42.667-42.667-42.667v0zM853.333 853.333h-682.667v-682.667h682.667z"],"attrs":[],"grid":0,"tags":["check-square"]},"attrs":[],"properties":{"order":4699,"id":985,"name":"check-square","prevSize":32,"code":59868},"setIdx":0,"setId":0,"iconIdx":220},{"icon":{"paths":["M798.293 307.627c-7.733-7.795-18.45-12.621-30.293-12.621s-22.56 4.826-30.291 12.618l-0.003 0.003-317.867 318.293-133.547-133.973c-7.833-7.574-18.518-12.242-30.293-12.242-24.081 0-43.602 19.521-43.602 43.602 0 12.306 5.098 23.421 13.296 31.348l0.012 0.012 163.84 163.84c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 348.16-348.16c8.458-7.82 13.736-18.974 13.736-31.36s-5.278-23.54-13.707-31.334l-0.028-0.026z"],"attrs":[],"grid":0,"tags":["check"]},"attrs":[],"properties":{"order":4700,"id":984,"name":"check","prevSize":32,"code":59869},"setIdx":0,"setId":0,"iconIdx":221},{"icon":{"paths":["M640 85.333c-145.844 0.122-267.212 104.76-293.256 243.051l-0.29 1.855c-73.148 40.038-124.029 112.846-133.025 198.141l-0.095 1.113c-75.672 33.891-127.436 108.539-127.436 195.276 0 117.821 95.513 213.333 213.333 213.333 86.738 0 161.385-51.765 194.735-126.086l0.542-1.35c86.183-8.809 158.932-59.206 198.587-130.534l0.667-1.306c143.353-23.631 251.36-146.65 251.36-294.896 0-164.949-133.718-298.667-298.667-298.667-2.269 0-4.533 0.025-6.79 0.076l0.336-0.006zM426.667 743.68c0 4.267 0 8.533-2.987 13.227v0c-14.419 56.073-64.523 96.844-124.15 96.844-70.692 0-128-57.308-128-128 0-59.627 40.771-109.731 95.955-123.956l0.888-0.194 11.947-4.267c6.928-1.358 14.894-2.134 23.041-2.134 69.279 0 125.44 56.161 125.44 125.44 0 8.147-0.777 16.113-2.26 23.828l0.126-0.787zM640 587.093c-0.675 3.276-1.411 5.994-2.289 8.649l0.155-0.543c-2.119 9.006-4.608 16.695-7.639 24.105l0.385-1.065c-20.211 50.284-62.22 88.087-114.005 102.124l-1.195 0.276c0-7.68 0-14.933-2.56-22.613s0-11.52 0-17.067-5.12-16.213-7.68-24.32-2.987-10.24-5.12-15.36c-4.159-9.13-8.43-16.827-13.221-24.153l0.421 0.687c0-3.84-3.84-8.107-6.4-11.947-7.985-11.624-16.401-21.801-25.629-31.176l0.029 0.030-8.533-7.253c-6.819-6.287-14.192-12.306-21.916-17.869l-0.698-0.478c-4.078-2.703-8.831-5.403-13.767-7.785l-0.74-0.322c-6.002-3.89-13-7.735-20.273-11.082l-1.061-0.438c-4.799-2.126-10.494-4.031-16.391-5.413l-0.676-0.134c-6.221-2.621-13.637-4.971-21.301-6.662l-0.886-0.164c-5.973 0-12.373 0-18.773-2.56l-26.027-2.56c14.226-52.9 51.864-94.884 100.831-114.789l1.142-0.411c6.322-2.739 13.869-5.229 21.668-7.066l0.945-0.188 8.533-2.133c9.594-2.112 20.635-3.352 31.954-3.413l0.046-0c94.257 0 170.667 76.41 170.667 170.667v0c-0.062 11.515-1.302 22.704-3.605 33.5l0.192-1.073zM725.333 580.267q0-12.8 0-25.6c0-141.385-114.615-256-256-256v0q-12.8 0-25.6 0c34.059-75.257 108.494-126.671 194.938-126.671 117.821 0 213.333 95.513 213.333 213.333 0 86.444-51.414 160.879-125.331 194.394l-1.341 0.544z"],"attrs":[],"grid":0,"tags":["circle-layer"]},"attrs":[],"properties":{"order":4701,"id":983,"name":"circle-layer","prevSize":32,"code":59870},"setIdx":0,"setId":0,"iconIdx":222},{"icon":{"paths":["M512 85.333c-235.641 0-426.667 191.025-426.667 426.667s191.025 426.667 426.667 426.667c235.641 0 426.667-191.025 426.667-426.667v0c0-235.641-191.025-426.667-426.667-426.667v0zM512 853.333c-188.513 0-341.333-152.82-341.333-341.333s152.82-341.333 341.333-341.333c188.513 0 341.333 152.82 341.333 341.333v0c0 188.513-152.82 341.333-341.333 341.333v0z"],"attrs":[],"grid":0,"tags":["circle"]},"attrs":[],"properties":{"order":4702,"id":982,"name":"circle","prevSize":32,"code":59871},"setIdx":0,"setId":0,"iconIdx":223},{"icon":{"paths":["M810.667 85.333h-597.333c-70.692 0-128 57.308-128 128v0 597.333c0 70.692 57.308 128 128 128v0h597.333c70.692 0 128-57.308 128-128v0-597.333c0-70.692-57.308-128-128-128v0zM686.507 170.667l-170.667 170.667h-178.347l170.667-170.667zM170.667 213.333c0-23.564 19.103-42.667 42.667-42.667v0h174.507l-170.667 170.667h-46.507zM853.333 810.667c0 23.564-19.103 42.667-42.667 42.667v0h-597.333c-23.564 0-42.667-19.103-42.667-42.667v0-384h682.667zM853.333 341.333h-217.173l170.667-170.667h3.84c23.564 0 42.667 19.103 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["clapper-board"]},"attrs":[],"properties":{"order":4703,"id":981,"name":"clapper-board","prevSize":32,"code":59872},"setIdx":0,"setId":0,"iconIdx":224},{"icon":{"paths":["M426.667 554.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM426.667 384c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM597.333 384c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM896 554.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-85.333v-85.333h85.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-93.013c-13.196-36.33-41.323-64.457-76.764-77.37l-0.89-0.283v-93.013c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 85.333h-85.333v-85.333c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 85.333h-85.333v-85.333c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 93.013c-36.33 13.196-64.457 41.323-77.37 76.764l-0.283 0.89h-93.013c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h85.333v85.333h-85.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h85.333v85.333h-85.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h93.013c13.196 36.33 41.323 64.457 76.764 77.37l0.89 0.283v93.013c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-85.333h85.333v85.333c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-85.333h85.333v85.333c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-93.013c36.33-13.196 64.457-41.323 77.37-76.764l0.283-0.89h93.013c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-85.333v-85.333zM725.333 682.667c0 23.564-19.103 42.667-42.667 42.667v0h-341.333c-23.564 0-42.667-19.103-42.667-42.667v0-341.333c0-23.564 19.103-42.667 42.667-42.667v0h341.333c23.564 0 42.667 19.103 42.667 42.667v0zM597.333 554.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["circuit"]},"attrs":[],"properties":{"order":4704,"id":980,"name":"circuit","prevSize":32,"code":59873},"setIdx":0,"setId":0,"iconIdx":225},{"icon":{"paths":["M469.333 512v42.667h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h42.667v42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-42.667v-42.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0zM924.333 437.437l-384-341.333c-7.494-6.692-17.436-10.781-28.333-10.781s-20.839 4.090-28.375 10.818l0.042-0.037-384 341.333c-8.809 7.851-14.33 19.229-14.33 31.896 0 23.562 19.101 42.663 42.663 42.663 10.895 0 20.836-4.084 28.376-10.804l-0.042 0.037 14.333-12.739v407.509c-0 0.003-0 0.007-0 0.011 0 23.558 19.098 42.656 42.656 42.656 0.004 0 0.008-0 0.012-0l597.333 0c0.003 0 0.007 0 0.011 0 23.558 0 42.656-19.098 42.656-42.656 0-0.004-0-0.008-0-0.012l0 0.001v-407.509l14.333 12.74c7.497 6.683 17.438 10.767 28.333 10.767 23.562 0 42.663-19.101 42.663-42.663 0-12.667-5.521-24.045-14.287-31.859l-0.042-0.037zM768 853.333h-512v-440.695l256-227.555 256 227.555z"],"attrs":[],"grid":0,"tags":["clinic-medical"]},"attrs":[],"properties":{"order":4705,"id":979,"name":"clinic-medical","prevSize":32,"code":59874},"setIdx":0,"setId":0,"iconIdx":226},{"icon":{"paths":["M725.333 170.667h-42.667c0-47.128-38.205-85.333-85.333-85.333v0h-170.667c-47.128 0-85.333 38.205-85.333 85.333v0h-42.667c-70.692 0-128 57.308-128 128v0 512c0 70.692 57.308 128 128 128v0h426.667c70.692 0 128-57.308 128-128v0-512c0-70.692-57.308-128-128-128v0zM426.667 170.667h170.667v85.333h-170.667v-85.333zM768 810.667c0 23.564-19.103 42.667-42.667 42.667v0h-426.667c-23.564 0-42.667-19.103-42.667-42.667v0-512c0-23.564 19.103-42.667 42.667-42.667v0h42.667c0 47.128 38.205 85.333 85.333 85.333v0h170.667c47.128 0 85.333-38.205 85.333-85.333v0h42.667c23.564 0 42.667 19.103 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["clipboard-blank"]},"attrs":[],"properties":{"order":4706,"id":978,"name":"clipboard-blank","prevSize":32,"code":59875},"setIdx":0,"setId":0,"iconIdx":227},{"icon":{"paths":["M640 597.333h-256c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h256c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM640 426.667h-170.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h170.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM725.333 170.667h-50.347c-18.062-50.028-65.066-85.173-120.3-85.333l-0.020-0h-85.333c-55.254 0.16-102.258 35.305-120.038 84.442l-0.282 0.891h-50.347c-70.692 0-128 57.308-128 128v0 512c0 70.692 57.308 128 128 128v0h426.667c70.692 0 128-57.308 128-128v0-512c0-70.692-57.308-128-128-128v0zM426.667 213.333c0-23.564 19.103-42.667 42.667-42.667v0h85.333c23.564 0 42.667 19.103 42.667 42.667v0 42.667h-170.667zM768 810.667c0 23.564-19.103 42.667-42.667 42.667v0h-426.667c-23.564 0-42.667-19.103-42.667-42.667v0-512c0-23.564 19.103-42.667 42.667-42.667v0h42.667v42.667c0 23.564 19.103 42.667 42.667 42.667v0h256c23.564 0 42.667-19.103 42.667-42.667v0-42.667h42.667c23.564 0 42.667 19.103 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["clipboard-alt"]},"attrs":[],"properties":{"order":4707,"id":977,"name":"clipboard-alt","prevSize":32,"code":59876},"setIdx":0,"setId":0,"iconIdx":228},{"icon":{"paths":["M512 256c-0.003-0-0.007-0-0.011-0-23.558 0-42.656 19.098-42.656 42.656 0 0.004 0 0.008 0 0.012l-0-0.001v187.042l-103.708 52.187c-14.041 7.175-23.487 21.537-23.487 38.104 0 23.557 19.096 42.653 42.653 42.653 6.989 0 13.586-1.681 19.407-4.661l-0.241 0.112 127.209-64c14.047-7.162 23.5-21.52 23.5-38.086 0-0.006-0-0.013-0-0.019l0 0.001v-213.333c0-0.003 0-0.007 0-0.011 0-23.558-19.098-42.656-42.656-42.656-0.004 0-0.008 0-0.012 0l0.001-0zM512 85.333c-235.641 0-426.667 191.025-426.667 426.667s191.025 426.667 426.667 426.667c235.641 0 426.667-191.025 426.667-426.667v0c-0.278-235.529-191.137-426.388-426.64-426.667l-0.027-0zM512 853.333c-188.513 0-341.333-152.82-341.333-341.333s152.82-341.333 341.333-341.333c188.513 0 341.333 152.82 341.333 341.333v0c-0.223 188.424-152.91 341.111-341.312 341.333l-0.021 0z"],"attrs":[],"grid":0,"tags":["clock-eight"]},"attrs":[],"properties":{"order":4708,"id":976,"name":"clock-eight","prevSize":32,"code":59877},"setIdx":0,"setId":0,"iconIdx":229},{"icon":{"paths":["M554.667 597.333h-170.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h170.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM725.333 170.667h-50.347c-18.062-50.028-65.066-85.173-120.3-85.333l-0.020-0h-85.333c-55.254 0.16-102.258 35.305-120.038 84.442l-0.282 0.891h-50.347c-70.692 0-128 57.308-128 128v0 512c0 70.692 57.308 128 128 128v0h426.667c70.692 0 128-57.308 128-128v0-512c0-70.692-57.308-128-128-128v0zM426.667 213.333c0-23.564 19.103-42.667 42.667-42.667v0h85.333c23.564 0 42.667 19.103 42.667 42.667v0 42.667h-170.667zM768 810.667c0 23.564-19.103 42.667-42.667 42.667v0h-426.667c-23.564 0-42.667-19.103-42.667-42.667v0-512c0-23.564 19.103-42.667 42.667-42.667v0h42.667v42.667c0 23.564 19.103 42.667 42.667 42.667v0h256c23.564 0 42.667-19.103 42.667-42.667v0-42.667h42.667c23.564 0 42.667 19.103 42.667 42.667v0zM640 426.667h-256c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h256c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["clipboard-notes"]},"attrs":[],"properties":{"order":4709,"id":975,"name":"clipboard-notes","prevSize":32,"code":59878},"setIdx":0,"setId":0,"iconIdx":230},{"icon":{"paths":["M512 85.333c-235.641 0-426.667 191.025-426.667 426.667s191.025 426.667 426.667 426.667c235.641 0 426.667-191.025 426.667-426.667v0c-0.278-235.529-191.137-426.388-426.64-426.667l-0.027-0zM512 853.333c-188.513 0-341.333-152.82-341.333-341.333s152.82-341.333 341.333-341.333c188.513 0 341.333 152.82 341.333 341.333v0c-0.223 188.424-152.91 341.111-341.312 341.333l-0.021 0zM554.667 501.291v-202.624c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 213.333c0.006 7.375 1.872 14.313 5.154 20.373l-0.112-0.227 64 119.417c7.343 13.514 21.431 22.533 37.625 22.533 23.571 0 42.679-19.108 42.679-42.679 0-7.377-1.872-14.316-5.166-20.37l0.112 0.224z"],"attrs":[],"grid":0,"tags":["clock-five"]},"attrs":[],"properties":{"order":4710,"id":974,"name":"clock-five","prevSize":32,"code":59879},"setIdx":0,"setId":0,"iconIdx":231},{"icon":{"paths":["M725.333 170.667h-50.347c-18.062-50.028-65.066-85.173-120.3-85.333l-0.020-0h-85.333c-55.254 0.16-102.258 35.305-120.038 84.442l-0.282 0.891h-50.347c-70.692 0-128 57.308-128 128v0 512c0 70.692 57.308 128 128 128v0h426.667c70.692 0 128-57.308 128-128v0-512c0-70.692-57.308-128-128-128v0zM426.667 213.333c0-23.564 19.103-42.667 42.667-42.667v0h85.333c23.564 0 42.667 19.103 42.667 42.667v0 42.667h-170.667zM768 810.667c0 23.564-19.103 42.667-42.667 42.667v0h-426.667c-23.564 0-42.667-19.103-42.667-42.667v0-512c0-23.564 19.103-42.667 42.667-42.667v0h42.667v42.667c0 23.564 19.103 42.667 42.667 42.667v0h256c23.564 0 42.667-19.103 42.667-42.667v0-42.667h42.667c23.564 0 42.667 19.103 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["clipboard"]},"attrs":[],"properties":{"order":4711,"id":973,"name":"clipboard","prevSize":32,"code":59880},"setIdx":0,"setId":0,"iconIdx":232},{"icon":{"paths":["M512 256c-0.003-0-0.007-0-0.011-0-23.558 0-42.656 19.098-42.656 42.656 0 0.004 0 0.008 0 0.012l-0-0.001v170.667h-85.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h128c0.003 0 0.007 0 0.011 0 23.558 0 42.656-19.098 42.656-42.656 0-0.004-0-0.008-0-0.012l0 0.001v-213.333c0-0.003 0-0.007 0-0.011 0-23.558-19.098-42.656-42.656-42.656-0.004 0-0.008 0-0.012 0l0.001-0zM512 85.333c-235.641 0-426.667 191.025-426.667 426.667s191.025 426.667 426.667 426.667c235.641 0 426.667-191.025 426.667-426.667v0c-0.278-235.529-191.137-426.388-426.64-426.667l-0.027-0zM512 853.333c-188.513 0-341.333-152.82-341.333-341.333s152.82-341.333 341.333-341.333c188.513 0 341.333 152.82 341.333 341.333v0c-0.223 188.424-152.91 341.111-341.312 341.333l-0.021 0z"],"attrs":[],"grid":0,"tags":["clock-nine"]},"attrs":[],"properties":{"order":4712,"id":972,"name":"clock-nine","prevSize":32,"code":59881},"setIdx":0,"setId":0,"iconIdx":233},{"icon":{"paths":["M512 85.333c-235.641 0-426.667 191.025-426.667 426.667s191.025 426.667 426.667 426.667c235.641 0 426.667-191.025 426.667-426.667v0c-0.278-235.529-191.137-426.388-426.64-426.667l-0.027-0zM512 853.333c-188.513 0-341.333-152.82-341.333-341.333s152.82-341.333 341.333-341.333c188.513 0 341.333 152.82 341.333 341.333v0c-0.223 188.424-152.91 341.111-341.312 341.333l-0.021 0zM512 256c-0.003-0-0.007-0-0.011-0-23.558 0-42.656 19.098-42.656 42.656 0 0.004 0 0.008 0 0.012l-0-0.001v202.624l-58.959 109.98c-3.182 5.829-5.054 12.769-5.054 20.146 0 23.571 19.108 42.679 42.679 42.679 16.194 0 30.282-9.020 37.514-22.309l0.112-0.224 64-119.417c3.169-5.833 5.035-12.771 5.041-20.144l0-0.002v-213.333c0-0.003 0-0.007 0-0.011 0-23.558-19.098-42.656-42.656-42.656-0.004 0-0.008 0-0.012 0l0.001-0z"],"attrs":[],"grid":0,"tags":["clock-seven"]},"attrs":[],"properties":{"order":4713,"id":971,"name":"clock-seven","prevSize":32,"code":59882},"setIdx":0,"setId":0,"iconIdx":234},{"icon":{"paths":["M512 256c-0.003-0-0.007-0-0.011-0-23.558 0-42.656 19.098-42.656 42.656 0 0.004 0 0.008 0 0.012l-0-0.001v139.417l-46.833-27.042c-6.115-3.586-13.468-5.704-21.314-5.704-23.568 0-42.673 19.106-42.673 42.673 0 15.706 8.485 29.43 21.12 36.838l0.201 0.109 110.833 64c6.12 3.594 13.479 5.716 21.333 5.716 23.564 0 42.667-19.103 42.667-42.667 0-0.003-0-0.006-0-0.008l0 0v-213.333c0-0.003 0-0.007 0-0.011 0-23.558-19.098-42.656-42.656-42.656-0.004 0-0.008 0-0.012 0l0.001-0zM512 85.333c-235.641 0-426.667 191.025-426.667 426.667s191.025 426.667 426.667 426.667c235.641 0 426.667-191.025 426.667-426.667v0c-0.278-235.529-191.137-426.388-426.64-426.667l-0.027-0zM512 853.333c-188.513 0-341.333-152.82-341.333-341.333s152.82-341.333 341.333-341.333c188.513 0 341.333 152.82 341.333 341.333v0c-0.223 188.424-152.91 341.111-341.312 341.333l-0.021 0z"],"attrs":[],"grid":0,"tags":["clock-ten"]},"attrs":[],"properties":{"order":4714,"id":970,"name":"clock-ten","prevSize":32,"code":59883},"setIdx":0,"setId":0,"iconIdx":235},{"icon":{"paths":["M640 469.333h-85.333v-170.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 213.333c0 23.564 19.103 42.667 42.667 42.667v0h128c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM512 85.333c-235.641 0-426.667 191.025-426.667 426.667s191.025 426.667 426.667 426.667c235.641 0 426.667-191.025 426.667-426.667v0c-0.27-235.533-191.134-426.396-426.641-426.667l-0.026-0zM512 853.333c-188.513 0-341.333-152.82-341.333-341.333s152.82-341.333 341.333-341.333c188.513 0 341.333 152.82 341.333 341.333v0c-0.223 188.424-152.91 341.111-341.312 341.333l-0.021 0z"],"attrs":[],"grid":0,"tags":["clock-three"]},"attrs":[],"properties":{"order":4715,"id":969,"name":"clock-three","prevSize":32,"code":59884},"setIdx":0,"setId":0,"iconIdx":236},{"icon":{"paths":["M512 85.333c-235.641 0-426.667 191.025-426.667 426.667s191.025 426.667 426.667 426.667c235.641 0 426.667-191.025 426.667-426.667v0c-0.27-235.533-191.134-426.396-426.641-426.667l-0.026-0zM512 853.333c-188.513 0-341.333-152.82-341.333-341.333s152.82-341.333 341.333-341.333c188.513 0 341.333 152.82 341.333 341.333v0c-0.223 188.424-152.91 341.111-341.312 341.333l-0.021 0zM601.521 411.042l-46.854 27.063v-139.438c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 213.333c0.006 23.565 19.111 42.667 42.677 42.667 7.85 0 15.205-2.12 21.524-5.818l-0.202 0.109 110.854-64c12.858-7.513 21.359-21.248 21.359-36.969 0-23.568-19.106-42.673-42.673-42.673-7.862 0-15.228 2.126-21.553 5.835l0.201-0.109z"],"attrs":[],"grid":0,"tags":["clock-two"]},"attrs":[],"properties":{"order":4716,"id":968,"name":"clock-two","prevSize":32,"code":59885},"setIdx":0,"setId":0,"iconIdx":237},{"icon":{"paths":["M644.187 539.042l-89.521-51.667v-188.708c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 213.333c-0 0.003-0 0.008-0 0.012 0 15.708 8.49 29.434 21.132 36.838l0.201 0.109 110.854 64c6.124 3.6 13.49 5.726 21.352 5.726 23.568 0 42.673-19.106 42.673-42.673 0-15.721-8.501-29.456-21.157-36.86l-0.202-0.109zM512 85.333c-235.641 0-426.667 191.025-426.667 426.667s191.025 426.667 426.667 426.667c235.641 0 426.667-191.025 426.667-426.667v0c-0.27-235.533-191.134-426.396-426.641-426.667l-0.026-0zM512 853.333c-188.513 0-341.333-152.82-341.333-341.333s152.82-341.333 341.333-341.333c188.513 0 341.333 152.82 341.333 341.333v0c-0.223 188.424-152.91 341.111-341.312 341.333l-0.021 0z"],"attrs":[],"grid":0,"tags":["clock"]},"attrs":[],"properties":{"order":4717,"id":967,"name":"clock","prevSize":32,"code":59886},"setIdx":0,"setId":0,"iconIdx":238},{"icon":{"paths":["M512 85.333c-235.641 0-426.667 191.025-426.667 426.667s191.025 426.667 426.667 426.667c235.641 0 426.667-191.025 426.667-426.667v0c0-235.641-191.025-426.667-426.667-426.667v0zM512 853.333c-188.513 0-341.333-152.82-341.333-341.333v0c-0-0.125-0-0.272-0-0.42 0-79.067 27.155-151.792 72.648-209.357l-0.541 0.71 64.427 64.427c-31.118 23.516-51.057 60.401-51.2 101.95l-0 0.023v85.333c0.336 70.438 57.514 127.409 127.999 127.409 46.888 0 87.888-25.211 110.183-62.817l0.325-0.592c5.099-6.945 8.16-15.662 8.16-25.095 0-23.564-19.103-42.667-42.667-42.667-17.197 0-32.017 10.173-38.771 24.83l-0.109 0.265c-7.55 12.691-21.193 21.062-36.792 21.062-12.008 0-22.858-4.961-30.611-12.944l-0.010-0.010c-7.631-7.246-12.379-17.466-12.379-28.795 0-0.227 0.002-0.453 0.006-0.679l-0 0.034v-85.333c0.45-18.107 12.114-33.378 28.289-39.16l0.298-0.093 142.080 144.213c8.345 56.174 52.199 100.028 107.673 108.288l0.701 0.086 100.693 100.693c-56.362 43.66-128.065 69.988-205.918 69.988-1.107 0-2.213-0.005-3.317-0.016l0.169 0.001zM781.227 721.067l-64.853-64.853c13.797-10.122 25.203-22.617 33.817-36.978l0.316-0.569c5.099-6.945 8.16-15.662 8.16-25.095 0-23.564-19.103-42.667-42.667-42.667-17.197 0-32.017 10.173-38.771 24.83l-0.109 0.265c-5.498 8.303-13.619 14.487-23.164 17.414l-0.302 0.080-56.32-56.32v-67.84c-0-0.064-0.001-0.14-0.001-0.215 0-23.564 19.103-42.667 42.667-42.667 16.14 0 30.187 8.962 37.436 22.18l0.111 0.222c7.607 12.421 21.104 20.584 36.507 20.584 8.105 0 15.682-2.26 22.135-6.184l-0.189 0.107c12.528-7.585 20.773-21.14 20.773-36.621 0-8.233-2.332-15.922-6.372-22.441l0.105 0.182c-5.777-9.539-12.267-17.793-19.63-25.176l0.003 0.003c-23.285-23.948-55.811-38.807-91.807-38.807-65.272 0-119.133 48.856-127.009 111.994l-0.064 0.626-14.933-14.933c1.082-3.575 1.704-7.684 1.704-11.938 0-8.032-2.219-15.546-6.078-21.961l0.107 0.193c-5.777-9.539-12.267-17.793-19.63-25.176l0.003 0.003c-18.634-18.786-43.158-31.705-70.569-35.757l-0.684-0.083-98.987-100.693c56.854-44.951 129.579-72.107 208.646-72.107 0.148 0 0.295 0 0.443 0l-0.023-0c188.513 0 341.333 152.82 341.333 341.333v0c0 0.125 0 0.272 0 0.42 0 79.067-27.155 151.792-72.648 209.357l0.541-0.71z"],"attrs":[],"grid":0,"tags":["closed-captioning-slash"]},"attrs":[],"properties":{"order":4718,"id":966,"name":"closed-captioning-slash","prevSize":32,"code":59887},"setIdx":0,"setId":0,"iconIdx":239},{"icon":{"paths":["M479.573 560.64c-6.176-3.68-13.62-5.855-21.572-5.855-15.661 0-29.352 8.438-36.773 21.016l-0.109 0.199c-7.55 12.691-21.193 21.062-36.792 21.062-12.008 0-22.858-4.961-30.611-12.944l-0.010-0.010c-7.631-7.246-12.379-17.466-12.379-28.795 0-0.227 0.002-0.453 0.006-0.679l-0 0.034v-85.333c-0-0.064-0.001-0.14-0.001-0.215 0-23.564 19.103-42.667 42.667-42.667 16.14 0 30.187 8.962 37.436 22.18l0.111 0.222c7.607 12.421 21.104 20.584 36.507 20.584 8.105 0 15.682-2.26 22.135-6.184l-0.189 0.107c12.528-7.585 20.773-21.14 20.773-36.621 0-8.233-2.332-15.922-6.372-22.441l0.105 0.182c-5.777-9.539-12.267-17.793-19.63-25.176l0.003 0.003c-23.185-23.426-55.334-37.942-90.874-37.973l-0.006-0c-70.692 0-128 57.308-128 128v0 85.333c0.336 70.438 57.514 127.409 127.999 127.409 46.888 0 87.888-25.211 110.183-62.817l0.325-0.592c3.633-6.146 5.779-13.543 5.779-21.442 0-15.456-8.218-28.993-20.524-36.478l-0.189-0.107zM735.573 560.64c-6.176-3.68-13.62-5.855-21.572-5.855-15.661 0-29.352 8.438-36.773 21.016l-0.109 0.199c-7.55 12.691-21.193 21.062-36.792 21.062-12.008 0-22.858-4.961-30.611-12.944l-0.010-0.010c-7.631-7.246-12.379-17.466-12.379-28.795 0-0.227 0.002-0.453 0.006-0.679l-0 0.034v-85.333c-0-0.064-0.001-0.14-0.001-0.215 0-23.564 19.103-42.667 42.667-42.667 16.14 0 30.187 8.962 37.436 22.18l0.111 0.222c7.607 12.421 21.104 20.584 36.507 20.584 8.105 0 15.682-2.26 22.135-6.184l-0.189 0.107c12.528-7.585 20.773-21.14 20.773-36.621 0-8.233-2.332-15.922-6.372-22.441l0.105 0.182c-5.777-9.539-12.267-17.793-19.63-25.176l0.003 0.003c-23.185-23.426-55.334-37.942-90.874-37.973l-0.006-0c-70.692 0-128 57.308-128 128v0 85.333c0.336 70.438 57.514 127.409 127.999 127.409 46.888 0 87.888-25.211 110.183-62.817l0.325-0.592c3.633-6.146 5.779-13.543 5.779-21.442 0-15.456-8.218-28.993-20.524-36.478l-0.189-0.107zM512 85.333c-235.641 0-426.667 191.025-426.667 426.667s191.025 426.667 426.667 426.667c235.641 0 426.667-191.025 426.667-426.667v0c0-235.641-191.025-426.667-426.667-426.667v0zM512 853.333c-188.513 0-341.333-152.82-341.333-341.333s152.82-341.333 341.333-341.333c188.513 0 341.333 152.82 341.333 341.333v0c0 188.513-152.82 341.333-341.333 341.333v0z"],"attrs":[],"grid":0,"tags":["closed-captioning"]},"attrs":[],"properties":{"order":4719,"id":965,"name":"closed-captioning","prevSize":32,"code":59888},"setIdx":0,"setId":0,"iconIdx":240},{"icon":{"paths":["M785.92 329.387c-47.208-106.522-152.012-179.486-273.857-179.486-151.36 0-276.423 112.594-296.001 258.594l-0.168 1.532c-75.345 18.809-130.279 85.899-130.279 165.819 0 73.972 47.061 136.952 112.876 160.634l1.19 0.374c4.073 1.301 8.762 2.077 13.625 2.133l0.029 0c2.052 0.345 4.416 0.543 6.827 0.543 23.864 0 43.209-19.345 43.209-43.209 0-21.454-15.635-39.255-36.132-42.633l-0.251-0.034c-32.334-11.916-55.194-41.976-56.317-77.52l-0.003-0.133c0-47.128 38.205-85.333 85.333-85.333v0c23.564 0 42.667-19.103 42.667-42.667v0c0.262-117.622 95.674-212.873 213.333-212.873 93.059 0 172.202 59.585 201.357 142.684l0.457 1.495c5.038 14.827 17.602 25.829 33.023 28.549l0.257 0.038c60.216 11.193 105.203 63.319 105.203 125.954 0 46.532-24.829 87.264-61.962 109.671l-0.574 0.322c-12.929 7.531-21.48 21.327-21.48 37.12 0 23.645 19.168 42.814 42.814 42.814 7.852 0 15.21-2.114 21.537-5.803l-0.203 0.11c63.977-37.629 106.24-106.131 106.24-184.505 0-0.085-0-0.17-0-0.255l0 0.013c-0.28-95.977-63.896-177.021-151.236-203.552l-1.511-0.395zM391.253 585.387c-30.845 30.878-49.92 73.518-49.92 120.612 0 94.257 76.41 170.667 170.667 170.667s170.667-76.41 170.667-170.667c0-47.095-19.076-89.735-49.922-120.614l0.002 0.002c-31.464-30.578-74.462-49.432-121.865-49.432-46.316 0-88.427 17.999-119.721 47.385l0.093-0.086zM426.667 704c0-47.128 38.205-85.333 85.333-85.333v0c7.779 0.104 15.26 1.187 22.385 3.132l-0.625-0.146-104.107 103.68c-1.764-6.361-2.845-13.69-2.985-21.249l-0.001-0.084zM572.16 764.16c-15.359 14.971-36.372 24.205-59.541 24.205-7.806 0-15.367-1.048-22.551-3.011l0.599 0.139 103.68-102.827c1.8 6.5 2.883 13.981 2.986 21.699l0.001 0.061c-0.223 23.367-9.804 44.454-25.169 59.729l-0.004 0.004z"],"attrs":[],"grid":0,"tags":["cloud-block"]},"attrs":[],"properties":{"order":4720,"id":964,"name":"cloud-block","prevSize":32,"code":59889},"setIdx":0,"setId":0,"iconIdx":241},{"icon":{"paths":["M640 469.333h-213.333c-23.564 0-42.667 19.103-42.667 42.667v0 341.333c-0 0.019-0 0.042-0 0.064 0 23.564 19.103 42.667 42.667 42.667 8.917 0 17.194-2.735 24.040-7.412l-0.147 0.095 82.773-55.467 80.64 53.76c7.111 5.561 16.173 8.928 26.019 8.96l0.007 0c0.052 0 0.113 0 0.175 0 6.766 0 13.165-1.575 18.849-4.378l-0.25 0.111c14.265-7.104 23.893-21.585 23.893-38.315 0-0.030-0-0.060-0-0.090l0 0.005v-341.333c0-23.564-19.103-42.667-42.667-42.667v0zM597.333 773.12l-40.107-26.88c-6.699-4.582-14.977-7.318-23.893-7.318s-17.194 2.735-24.040 7.412l0.147-0.095-40.107 27.307v-218.88h128zM785.92 308.053c-47.208-106.522-152.012-179.486-273.857-179.486-151.36 0-276.423 112.594-296.001 258.594l-0.168 1.532c-75.666 18.574-130.919 85.822-130.919 165.974 0 94.257 76.41 170.667 170.667 170.667 0.126 0 0.253-0 0.379-0l-0.020 0c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0c-47.128 0-85.333-38.205-85.333-85.333s38.205-85.333 85.333-85.333v0c23.564 0 42.667-19.103 42.667-42.667v0c0.262-117.622 95.674-212.873 213.333-212.873 93.059 0 172.202 59.585 201.357 142.684l0.457 1.495c5.038 14.827 17.602 25.829 33.023 28.549l0.257 0.038c60.216 11.193 105.203 63.319 105.203 125.954 0 46.532-24.829 87.264-61.962 109.671l-0.574 0.322c-12.929 7.531-21.48 21.327-21.48 37.12 0 23.645 19.168 42.814 42.814 42.814 7.852 0 15.21-2.114 21.537-5.803l-0.203 0.11c63.977-37.629 106.24-106.131 106.24-184.505 0-0.085-0-0.17-0-0.255l0 0.013c-0.28-95.977-63.896-177.021-151.236-203.552l-1.511-0.395z"],"attrs":[],"grid":0,"tags":["cloud-bookmark"]},"attrs":[],"properties":{"order":4721,"id":963,"name":"cloud-bookmark","prevSize":32,"code":59890},"setIdx":0,"setId":0,"iconIdx":242},{"icon":{"paths":["M609.707 605.44l-140.373 140.373-55.040-55.040c-7.733-7.795-18.45-12.621-30.293-12.621s-22.56 4.826-30.291 12.618l-0.003 0.003c-7.668 7.712-12.407 18.343-12.407 30.080s4.74 22.368 12.409 30.082l-0.002-0.002 85.333 85.333c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 170.667-170.667c7.668-7.712 12.407-18.343 12.407-30.080s-4.74-22.368-12.409-30.082l0.002 0.002c-7.733-7.795-18.45-12.621-30.293-12.621s-22.56 4.826-30.291 12.618l-0.003 0.003zM785.92 354.987c-47.23-106.469-152.007-179.388-273.815-179.388-151.477 0-276.616 112.767-296.047 258.931l-0.166 1.524c-74.987 19.066-129.568 85.981-129.568 165.644 0 73.706 46.724 136.5 112.168 160.377l1.186 0.378c5.749 3.078 12.576 4.886 19.825 4.886 23.564 0 42.667-19.103 42.667-42.667 0-20.92-15.056-38.324-34.923-41.966l-0.262-0.040c-33.129-12.226-56.324-43.53-56.324-80.251 0-0.287 0.001-0.573 0.004-0.859l-0 0.044c0-47.128 38.205-85.333 85.333-85.333v0c23.564 0 42.667-19.103 42.667-42.667v0c0.502-117.44 95.821-212.45 213.332-212.45 93.061 0 172.204 59.587 201.358 142.688l0.457 1.495c5.163 14.65 17.694 25.478 33.026 28.124l0.254 0.036c59.742 11.591 104.232 63.487 104.232 125.774 0 58.59-39.365 107.986-93.090 123.181l-0.902 0.218c-21.342 2.744-37.665 20.799-37.665 42.667 0 23.748 19.251 42.999 42.999 42.999 1.88 0 3.732-0.121 5.548-0.355l-0.215 0.023h10.667c92.152-24.941 158.832-107.811 158.832-206.254 0-95.793-63.137-176.839-150.067-203.796l-1.511-0.404z"],"attrs":[],"grid":0,"tags":["cloud-check"]},"attrs":[],"properties":{"order":4722,"id":962,"name":"cloud-check","prevSize":32,"code":59891},"setIdx":0,"setId":0,"iconIdx":243},{"icon":{"paths":["M896 853.333h-128c-23.564 0-42.667-19.103-42.667-42.667v0-128c116.971-1.114 211.365-96.196 211.365-213.324 0-95.499-62.75-176.341-149.267-203.546l-1.511-0.41c-47.208-106.522-152.012-179.486-273.857-179.486-151.36 0-276.423 112.594-296.001 258.594l-0.168 1.532c-75.666 18.574-130.919 85.822-130.919 165.974 0 94.257 76.41 170.667 170.667 170.667 0.126 0 0.253-0 0.379-0l-0.020 0h42.667v128c0 23.564-19.103 42.667-42.667 42.667v0h-128c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h128c70.692 0 128-57.308 128-128v0-128h85.333v213.333c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-213.333h85.333v128c0 70.692 57.308 128 128 128v0h128c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM256 597.333c-47.128 0-85.333-38.205-85.333-85.333s38.205-85.333 85.333-85.333v0c23.564 0 42.667-19.103 42.667-42.667v0c0.262-117.622 95.674-212.873 213.333-212.873 93.059 0 172.202 59.585 201.357 142.684l0.457 1.495c5.038 14.827 17.602 25.829 33.023 28.549l0.257 0.038c60.487 10.718 105.888 62.725 106.24 125.402l0 0.038c0 70.692-57.308 128-128 128v0z"],"attrs":[],"grid":0,"tags":["cloud-computing"]},"attrs":[],"properties":{"order":4723,"id":961,"name":"cloud-computing","prevSize":32,"code":59892},"setIdx":0,"setId":0,"iconIdx":244},{"icon":{"paths":["M896 789.333h-263.68c-13.196-36.33-41.323-64.457-76.764-77.37l-0.89-0.283v-135.68h135.253c1.808 0.063 3.933 0.1 6.067 0.1 102.033 0 184.747-82.714 184.747-184.747 0-84.45-56.663-155.666-134.044-177.702l-1.303-0.317c-41.155-89.595-130.111-150.691-233.337-150.691-128.77 0-235.334 95.075-253.325 218.857l-0.165 1.381c-63.402 18.2-109.012 75.667-109.012 143.787 0 82.399 66.737 149.211 149.107 149.333l0.012 0h170.667v135.68c-36.33 13.196-64.457 41.323-77.37 76.764l-0.283 0.89h-263.68c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h263.68c18.382 49.611 65.296 84.33 120.32 84.33s101.938-34.719 120.032-83.444l0.288-0.886h263.68c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM298.667 490.667c-35.346 0-64-28.654-64-64s28.654-64 64-64v0c23.564 0 42.667-19.103 42.667-42.667v0c-0-0.14-0.001-0.305-0.001-0.47 0-94.257 76.41-170.667 170.667-170.667 74.727 0 138.237 48.027 161.347 114.898l0.36 1.199c5.038 14.827 17.602 25.829 33.023 28.549l0.257 0.038c47.017 8.055 82.348 48.51 82.348 97.217 0 0.172-0 0.344-0.001 0.516l0-0.027c-0.241 54.807-44.606 99.172-99.39 99.413l-0.023 0zM512 874.667c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667c23.564 0 42.667 19.103 42.667 42.667v0c0 23.564-19.103 42.667-42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["cloud-data-connection"]},"attrs":[],"properties":{"order":4724,"id":960,"name":"cloud-data-connection","prevSize":32,"code":59893},"setIdx":0,"setId":0,"iconIdx":245},{"icon":{"paths":["M960 618.667c0-47.128-38.205-85.333-85.333-85.333v0h-256c-47.128 0-85.333 38.205-85.333 85.333v0h-128v-128h99.413c0.077 0 0.169 0 0.26 0 86.245 0 156.16-69.915 156.16-156.16 0-68.476-44.074-126.658-105.402-147.726l-1.098-0.328c-35.212-72.214-108.078-121.088-192.359-121.088-104.52 0-191.484 75.165-209.787 174.389l-0.201 1.312c-51.554 17.318-88.033 65.199-88.033 121.6 0 70.592 57.144 127.836 127.697 128l0.016 0h128v341.333c0 23.564 19.103 42.667 42.667 42.667v0h170.667c0 47.128 38.205 85.333 85.333 85.333v0h256c47.128 0 85.333-38.205 85.333-85.333v0-85.333c-0.169-15.766-4.587-30.466-12.161-43.051l0.215 0.385c7.359-12.201 11.778-26.9 11.946-42.619l0-0.048zM192 405.333c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667v0c23.564 0 42.667-19.103 42.667-42.667v0c-0.005-0.43-0.008-0.938-0.008-1.447 0-70.692 57.308-128 128-128 55.937 0 103.494 35.881 120.909 85.882l0.272 0.898c5.163 14.65 17.694 25.478 33.026 28.124l0.254 0.036c33.623 5.719 58.903 34.635 58.903 69.455 0 0.632-0.008 1.263-0.025 1.891l0.002-0.093c-0 39.352-31.901 71.253-71.253 71.253h0zM533.333 789.333h-128v-85.333h128c0.169 15.766 4.587 30.466 12.161 43.051l-0.215-0.385c-7.359 12.201-11.778 26.9-11.946 42.619l-0 0.048zM618.667 874.667v-85.333h256v85.333zM618.667 704v-85.333h256v85.333z"],"attrs":[],"grid":0,"tags":["cloud-database-tree"]},"attrs":[],"properties":{"order":4725,"id":959,"name":"cloud-database-tree","prevSize":32,"code":59894},"setIdx":0,"setId":0,"iconIdx":246},{"icon":{"paths":["M609.707 737.707l-55.040 55.467v-238.507c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 238.507l-55.040-55.467c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l128 128c3.937 3.773 8.616 6.808 13.791 8.859l0.289 0.101c4.771 2.163 10.345 3.423 16.213 3.423s11.443-1.26 16.466-3.525l-0.253 0.102c5.464-2.152 10.143-5.187 14.095-8.974l-0.015 0.014 128-128c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l0-0zM785.92 265.387c-47.208-106.522-152.012-179.486-273.857-179.486-151.36 0-276.423 112.594-296.001 258.594l-0.168 1.532c-75.666 18.574-130.919 85.822-130.919 165.974 0 94.257 76.41 170.667 170.667 170.667 0.126 0 0.253-0 0.379-0l-0.020 0c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0c-47.128 0-85.333-38.205-85.333-85.333s38.205-85.333 85.333-85.333v0c23.564 0 42.667-19.103 42.667-42.667v0c0.262-117.622 95.674-212.873 213.333-212.873 93.059 0 172.202 59.585 201.357 142.684l0.457 1.495c5.038 14.827 17.602 25.829 33.023 28.549l0.257 0.038c59.742 11.591 104.232 63.487 104.232 125.774 0 58.59-39.365 107.986-93.090 123.181l-0.902 0.218c-18.59 4.908-32.072 21.573-32.072 41.387 0 23.604 19.135 42.739 42.739 42.739 3.79 0 7.466-0.493 10.965-1.42l-0.298 0.067c92.152-24.941 158.832-107.811 158.832-206.254 0-95.793-63.137-176.839-150.067-203.796l-1.511-0.404z"],"attrs":[],"grid":0,"tags":["cloud-download"]},"attrs":[],"properties":{"order":4726,"id":958,"name":"cloud-download","prevSize":32,"code":59895},"setIdx":0,"setId":0,"iconIdx":247},{"icon":{"paths":["M512 810.667c-23.564 0-42.667 19.103-42.667 42.667v0 42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667c0-23.564-19.103-42.667-42.667-42.667v0zM341.333 469.333c-23.564 0-42.667 19.103-42.667 42.667v0 42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667c0-23.564-19.103-42.667-42.667-42.667v0zM341.333 682.667c-23.564 0-42.667 19.103-42.667 42.667v0 42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667c0-23.564-19.103-42.667-42.667-42.667v0zM512 597.333c-23.564 0-42.667 19.103-42.667 42.667v0 42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667c0-23.564-19.103-42.667-42.667-42.667v0zM785.92 265.387c-47.208-106.522-152.012-179.486-273.857-179.486-151.36 0-276.423 112.594-296.001 258.594l-0.168 1.532c-75.486 18.706-130.56 85.865-130.56 165.887 0 0.030 0 0.061 0 0.091l-0-0.005c-0.001 0.16-0.001 0.349-0.001 0.538 0 50.603 22.023 96.063 57.008 127.316l0.166 0.146c7.655 7.361 18.076 11.895 29.556 11.895 23.564 0 42.667-19.103 42.667-42.667 0-13.392-6.17-25.344-15.823-33.166l-0.080-0.063c-17.325-15.679-28.162-38.249-28.162-63.35 0-0.228 0.001-0.457 0.003-0.685l-0 0.035c0-47.128 38.205-85.333 85.333-85.333v0c23.564 0 42.667-19.103 42.667-42.667v0c0.262-117.622 95.674-212.873 213.333-212.873 93.059 0 172.202 59.585 201.357 142.684l0.457 1.495c5.038 14.827 17.602 25.829 33.023 28.549l0.257 0.038c60.487 10.718 105.888 62.725 106.24 125.402l0 0.038c0.017 0.767 0.027 1.672 0.027 2.578 0 31.847-11.99 60.893-31.703 82.871l0.103-0.116c-5.855 7.243-9.399 16.566-9.399 26.715 0 23.564 19.103 42.667 42.667 42.667 11.638 0 22.188-4.66 29.886-12.215l-0.007 0.006c32.785-37.319 52.789-86.567 52.789-140.488 0-95.865-63.232-176.962-150.264-203.857l-1.512-0.402zM682.667 469.333c-23.564 0-42.667 19.103-42.667 42.667v0 42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667c0-23.564-19.103-42.667-42.667-42.667v0zM682.667 682.667c-23.564 0-42.667 19.103-42.667 42.667v0 42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667c0-23.564-19.103-42.667-42.667-42.667v0zM512 384c-23.564 0-42.667 19.103-42.667 42.667v0 42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667c0-23.564-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["cloud-drizzle"]},"attrs":[],"properties":{"order":4727,"id":957,"name":"cloud-drizzle","prevSize":32,"code":59896},"setIdx":0,"setId":0,"iconIdx":248},{"icon":{"paths":["M542.293 801.707c-4.001-3.646-8.658-6.662-13.76-8.838l-0.32-0.122c-4.883-2.109-10.568-3.336-16.539-3.336-11.682 0-22.267 4.695-29.972 12.3l0.005-0.004c-7.522 7.877-12.204 18.523-12.373 30.26l-0 0.033c-0 0.073-0.001 0.16-0.001 0.247 0 11.721 4.726 22.338 12.377 30.049l-0.003-0.003c4.001 3.646 8.658 6.662 13.76 8.838l0.32 0.122c4.694 1.933 10.144 3.055 15.855 3.055 23.564 0 42.667-19.103 42.667-42.667 0-5.712-1.122-11.161-3.158-16.14l0.103 0.285c-2.152-5.464-5.187-10.143-8.974-14.095l0.014 0.015zM512 533.333c-23.564 0-42.667 19.103-42.667 42.667v0 128c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-128c0-23.564-19.103-42.667-42.667-42.667v0zM785.92 328.96c-47.23-106.469-152.007-179.388-273.815-179.388-151.477 0-276.616 112.767-296.047 258.931l-0.166 1.524c-75.666 18.574-130.919 85.822-130.919 165.974 0 94.257 76.41 170.667 170.667 170.667 0.126 0 0.253-0 0.379-0l-0.020 0h85.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-85.333c-47.128 0-85.333-38.205-85.333-85.333s38.205-85.333 85.333-85.333v0c23.564 0 42.667-19.103 42.667-42.667v0c0.262-117.622 95.674-212.873 213.333-212.873 93.059 0 172.202 59.585 201.357 142.684l0.457 1.495c5.163 14.65 17.694 25.478 33.026 28.124l0.254 0.036c60.007 11.37 104.774 63.394 104.774 125.875 0 70.177-56.475 127.163-126.455 127.991l-0.078 0.001h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h42.667c117.568-0.334 212.745-95.718 212.745-213.333 0-96.006-63.418-177.2-150.648-203.975l-1.511-0.399z"],"attrs":[],"grid":0,"tags":["cloud-exclamation"]},"attrs":[],"properties":{"order":4728,"id":956,"name":"cloud-exclamation","prevSize":32,"code":59897},"setIdx":0,"setId":0,"iconIdx":249},{"icon":{"paths":["M512 725.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM341.333 469.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM512 554.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM341.333 810.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM341.333 640c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM682.667 640c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM512 384c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM682.667 469.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM785.92 265.387c-47.208-106.522-152.012-179.486-273.857-179.486-151.36 0-276.423 112.594-296.001 258.594l-0.168 1.532c-75.486 18.706-130.56 85.865-130.56 165.887 0 0.030 0 0.061 0 0.091l-0-0.005c-0.001 0.16-0.001 0.349-0.001 0.538 0 50.603 22.023 96.063 57.008 127.316l0.166 0.146c7.655 7.361 18.076 11.895 29.556 11.895 23.564 0 42.667-19.103 42.667-42.667 0-13.392-6.17-25.344-15.823-33.166l-0.080-0.063c-17.325-15.679-28.162-38.249-28.162-63.35 0-0.228 0.001-0.457 0.003-0.685l-0 0.035c0-47.128 38.205-85.333 85.333-85.333v0c23.564 0 42.667-19.103 42.667-42.667v0c0.262-117.622 95.674-212.873 213.333-212.873 93.059 0 172.202 59.585 201.357 142.684l0.457 1.495c5.038 14.827 17.602 25.829 33.023 28.549l0.257 0.038c60.487 10.718 105.888 62.725 106.24 125.402l0 0.038c0.017 0.767 0.027 1.672 0.027 2.578 0 31.847-11.99 60.893-31.703 82.871l0.103-0.116c-5.855 7.243-9.399 16.566-9.399 26.715 0 23.564 19.103 42.667 42.667 42.667 11.638 0 22.188-4.66 29.886-12.215l-0.007 0.006c32.785-37.319 52.789-86.567 52.789-140.488 0-95.865-63.232-176.962-150.264-203.857l-1.512-0.402zM682.667 810.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["cloud-hail"]},"attrs":[],"properties":{"order":4729,"id":955,"name":"cloud-hail","prevSize":32,"code":59898},"setIdx":0,"setId":0,"iconIdx":250},{"icon":{"paths":["M785.92 329.387c-47.208-106.522-152.012-179.486-273.857-179.486-151.36 0-276.423 112.594-296.001 258.594l-0.168 1.532c-75.345 18.809-130.279 85.899-130.279 165.819 0 73.972 47.061 136.952 112.876 160.634l1.19 0.374c4.073 1.301 8.762 2.077 13.625 2.133l0.029 0c2.052 0.345 4.416 0.543 6.827 0.543 23.864 0 43.209-19.345 43.209-43.209 0-21.454-15.635-39.255-36.132-42.633l-0.251-0.034c-32.334-11.916-55.194-41.976-56.317-77.52l-0.003-0.133c0-47.128 38.205-85.333 85.333-85.333v0c23.564 0 42.667-19.103 42.667-42.667v0c0.262-117.622 95.674-212.873 213.333-212.873 93.059 0 172.202 59.585 201.357 142.684l0.457 1.495c5.038 14.827 17.602 25.829 33.023 28.549l0.257 0.038c60.216 11.193 105.203 63.319 105.203 125.954 0 46.532-24.829 87.264-61.962 109.671l-0.574 0.322c-12.929 7.531-21.48 21.327-21.48 37.12 0 23.645 19.168 42.814 42.814 42.814 7.852 0 15.21-2.114 21.537-5.803l-0.203 0.11c63.977-37.629 106.24-106.131 106.24-184.505 0-0.085-0-0.17-0-0.255l0 0.013c-0.28-95.977-63.896-177.021-151.236-203.552l-1.511-0.395zM512 547.413c-16.756-8.862-36.626-14.064-57.711-14.064-34.608 0-65.942 14.015-88.637 36.678l0.001-0.001c-22.45 22.594-36.325 53.73-36.325 88.107s13.876 65.513 36.332 88.113l-0.006-0.007 116.053 116.053c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 116.053-116.053c22.45-22.594 36.325-53.73 36.325-88.107s-13.876-65.513-36.332-88.113l0.006 0.007c-22.694-22.662-54.028-36.677-88.636-36.677-21.085 0-40.955 5.202-58.396 14.393l0.685-0.329zM597.333 685.653l-85.333 85.333-85.333-85.333c-7.11-6.842-11.526-16.439-11.526-27.068 0-0.234 0.002-0.467 0.006-0.7l-0.001 0.035c-0.002-0.145-0.003-0.316-0.003-0.487 0-10.684 4.412-20.337 11.514-27.238l0.009-0.009c7.101-7.090 16.905-11.474 27.733-11.474s20.632 4.384 27.734 11.475l-0.001-0.001c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.19-6.891 16.966-11.134 27.733-11.134s20.543 4.243 27.748 11.148l-0.014-0.014c7.111 6.909 11.523 16.562 11.523 27.246 0 0.171-0.001 0.342-0.003 0.513l0-0.026c-0.038 10.99-4.791 20.863-12.342 27.705l-0.032 0.028z"],"attrs":[],"grid":0,"tags":["cloud-heart"]},"attrs":[],"properties":{"order":4730,"id":954,"name":"cloud-heart","prevSize":32,"code":59899},"setIdx":0,"setId":0,"iconIdx":251},{"icon":{"paths":["M481.707 524.373c-7.796 7.733-12.621 18.45-12.621 30.294 0 23.564 19.103 42.667 42.667 42.667 0.087 0 0.174-0 0.262-0.001l-0.013 0h8.107c3.025-0.433 5.757-1.331 8.249-2.627l-0.142 0.067c2.777-0.917 5.185-2.223 7.306-3.88l-0.053 0.040 6.4-5.12c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003c-7.753-7.926-18.557-12.84-30.509-12.84-11.526 0-21.985 4.57-29.663 11.998l0.012-0.011zM512 640c-23.564 0-42.667 19.103-42.667 42.667v0 128c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-128c0-23.564-19.103-42.667-42.667-42.667v0zM785.92 350.72c-47.208-106.522-152.012-179.486-273.857-179.486-151.36 0-276.423 112.594-296.001 258.594l-0.168 1.532c-75.666 18.574-130.919 85.822-130.919 165.974 0 94.257 76.41 170.667 170.667 170.667 0.126 0 0.253-0 0.379-0l-0.020 0h85.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-85.333c-47.128 0-85.333-38.205-85.333-85.333s38.205-85.333 85.333-85.333v0c23.564 0 42.667-19.103 42.667-42.667v0c0.262-117.622 95.674-212.873 213.333-212.873 93.059 0 172.202 59.585 201.357 142.684l0.457 1.495c5.038 14.827 17.602 25.829 33.023 28.549l0.257 0.038c60.487 10.718 105.888 62.725 106.24 125.402l0 0.038c0 70.692-57.308 128-128 128v0h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h42.667c116.971-1.114 211.365-96.196 211.365-213.324 0-95.499-62.75-176.341-149.267-203.546l-1.511-0.41z"],"attrs":[],"grid":0,"tags":["cloud-info"]},"attrs":[],"properties":{"order":4731,"id":953,"name":"cloud-info","prevSize":32,"code":59900},"setIdx":0,"setId":0,"iconIdx":252},{"icon":{"paths":["M785.92 286.72c-47.208-106.522-152.012-179.486-273.857-179.486-151.36 0-276.423 112.594-296.001 258.594l-0.168 1.532c-75.345 18.809-130.279 85.899-130.279 165.819 0 73.972 47.061 136.952 112.876 160.634l1.19 0.374c4.073 1.301 8.762 2.077 13.625 2.133l0.029 0c2.052 0.345 4.416 0.543 6.827 0.543 23.864 0 43.209-19.345 43.209-43.209 0-21.454-15.635-39.255-36.132-42.633l-0.251-0.034c-32.334-11.916-55.194-41.976-56.317-77.52l-0.003-0.133c0-47.128 38.205-85.333 85.333-85.333v0c23.564 0 42.667-19.103 42.667-42.667v0c0.262-117.622 95.674-212.873 213.333-212.873 93.059 0 172.202 59.585 201.357 142.684l0.457 1.495c5.038 14.827 17.602 25.829 33.023 28.549l0.257 0.038c60.216 11.193 105.203 63.319 105.203 125.954 0 46.532-24.829 87.264-61.962 109.671l-0.574 0.322c-12.929 7.531-21.48 21.327-21.48 37.12 0 23.645 19.168 42.814 42.814 42.814 7.852 0 15.21-2.114 21.537-5.803l-0.203 0.11c63.977-37.629 106.24-106.131 106.24-184.505 0-0.085-0-0.17-0-0.255l0 0.013c-0.28-95.977-63.896-177.021-151.236-203.552l-1.511-0.395zM640 670.72v-52.053c0-70.692-57.308-128-128-128s-128 57.308-128 128v0 50.347c-49.617 18.379-84.34 65.296-84.34 120.324 0 70.343 56.743 127.434 126.954 127.996l0.053 0h170.667c70.264-0.563 127.007-57.653 127.007-127.996 0-55.027-34.724-101.945-83.455-120.036l-0.886-0.288zM469.333 618.667c0-23.564 19.103-42.667 42.667-42.667s42.667 19.103 42.667 42.667v0 42.667h-85.333zM597.333 832h-170.667c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667v0h170.667c23.564 0 42.667 19.103 42.667 42.667s-19.103 42.667-42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["cloud-lock"]},"attrs":[],"properties":{"order":4732,"id":952,"name":"cloud-lock","prevSize":32,"code":59901},"setIdx":0,"setId":0,"iconIdx":253},{"icon":{"paths":["M618.667 679.253h-32.853l16.64-28.587c3.58-6.123 5.694-13.481 5.694-21.333 0-23.645-19.168-42.814-42.814-42.814-15.793 0-29.589 8.552-37.010 21.277l-0.11 0.203-16.213 28.587-16.213-28.587c-7.531-12.929-21.327-21.48-37.12-21.48-23.645 0-42.814 19.168-42.814 42.814 0 7.852 2.114 15.21 5.803 21.537l-0.11-0.203 16.64 28.587h-32.853c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h32.853l-16.64 28.16c-3.58 6.123-5.694 13.481-5.694 21.333 0 23.645 19.168 42.814 42.814 42.814 15.793 0 29.589-8.552 37.010-21.277l0.11-0.203 16.213-28.16 16.213 28.16c7.531 12.929 21.327 21.48 37.12 21.48 23.645 0 42.814-19.168 42.814-42.814 0-7.852-2.114-15.21-5.803-21.537l0.11 0.203-16.64-28.16h32.853c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM785.92 346.88c-47.163-106.629-152.022-179.684-273.943-179.684-151.128 0-276.039 112.248-295.911 257.922l-0.173 1.549c-75.489 18.704-130.565 85.864-130.565 165.889 0 0.48 0.002 0.959 0.006 1.438l-0-0.073c0.329 84.041 61.351 153.732 141.493 167.535l1.014 0.145h6.827c1.022 0.087 2.212 0.136 3.413 0.136 23.639 0 42.803-19.164 42.803-42.803 0-22.438-17.265-40.844-39.235-42.656l-0.154-0.010c-40.484-7.17-70.836-42.087-70.836-84.093 0-0.436 0.003-0.872 0.010-1.306l-0.001 0.066c0-47.128 38.205-85.333 85.333-85.333v0c23.564 0 42.667-19.103 42.667-42.667v0c0.262-117.622 95.674-212.873 213.333-212.873 93.059 0 172.202 59.585 201.357 142.684l0.457 1.495c5.163 14.65 17.694 25.478 33.026 28.124l0.254 0.036c60.179 11.224 105.126 63.333 105.126 125.94 0 52.889-32.077 98.285-77.837 117.797l-0.836 0.317c-17.683 5.475-30.305 21.682-30.305 40.837 0 23.564 19.103 42.667 42.667 42.667 7.007 0 13.619-1.689 19.452-4.682l-0.24 0.112c78.274-32.775 132.263-108.747 132.263-197.329 0-95.75-63.081-176.767-149.951-203.76l-1.512-0.405z"],"attrs":[],"grid":0,"tags":["cloud-meatball"]},"attrs":[],"properties":{"order":4733,"id":951,"name":"cloud-meatball","prevSize":32,"code":59902},"setIdx":0,"setId":0,"iconIdx":254},{"icon":{"paths":["M392.96 695.040c-3.937-3.773-8.616-6.808-13.791-8.859l-0.289-0.101c-4.883-2.109-10.568-3.336-16.539-3.336-11.682 0-22.267 4.695-29.972 12.3l0.005-0.004c-3.646 4.001-6.662 8.658-8.838 13.76l-0.122 0.32c-2.162 4.477-3.425 9.736-3.425 15.29 0 0.325 0.004 0.648 0.013 0.971l-0.001-0.048c0.121 23.473 19.177 42.454 42.666 42.454 5.848 0 11.421-1.176 16.495-3.305l-0.281 0.105c5.422-2.298 10.079-5.314 14.119-8.995l-0.039 0.035c7.601-7.7 12.296-18.286 12.296-29.968 0-5.971-1.227-11.656-3.442-16.817l0.106 0.278c-2.298-5.422-5.314-10.079-8.995-14.119l0.035 0.039zM392.96 865.707c-4.001-3.646-8.658-6.662-13.76-8.838l-0.32-0.122c-4.883-2.109-10.568-3.336-16.539-3.336-11.682 0-22.267 4.695-29.972 12.3l0.005-0.004c-3.646 4.001-6.662 8.658-8.838 13.76l-0.122 0.32c-2.158 4.933-3.413 10.681-3.413 16.722 0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667c0-6.041-1.256-11.789-3.52-16.997l0.107 0.276c-2.298-5.422-5.314-10.079-8.995-14.119l0.035 0.039zM557.227 604.587l-7.68-3.84-7.68-3.413c-2.457-0.503-5.282-0.79-8.174-0.79-5.984 0-11.681 1.232-16.85 3.456l0.277-0.106c-5.492 2.069-10.185 5.116-14.084 8.964l0.004-0.004c-7.648 7.709-12.374 18.326-12.374 30.047 0 0.087 0 0.173 0.001 0.26l-0-0.013c-0 0.073-0.001 0.16-0.001 0.247 0 11.721 4.726 22.338 12.377 30.049l-0.003-0.003c4.001 3.646 8.658 6.662 13.76 8.838l0.32 0.122c4.771 2.163 10.345 3.423 16.213 3.423s11.443-1.26 16.466-3.525l-0.253 0.102c5.422-2.298 10.079-5.314 14.119-8.995l-0.039 0.035c7.51-7.568 12.204-17.94 12.373-29.408l0-0.032c-0.169-11.771-4.851-22.416-12.39-30.311l0.016 0.017zM563.627 780.373c-7.7-7.601-18.286-12.296-29.968-12.296-5.971 0-11.656 1.227-16.817 3.442l0.278-0.106c-10.747 3.967-19.073 12.293-22.954 22.774l-0.086 0.266c-2.109 4.883-3.336 10.568-3.336 16.539 0 11.682 4.695 22.267 12.3 29.972l-0.004-0.005c4.001 3.646 8.658 6.662 13.76 8.838l0.32 0.122c4.771 2.163 10.345 3.423 16.213 3.423s11.443-1.26 16.466-3.525l-0.253 0.102c5.422-2.298 10.079-5.314 14.119-8.995l-0.039 0.035c7.601-7.7 12.296-18.286 12.296-29.968 0-5.971-1.227-11.656-3.442-16.817l0.106 0.278c-2.298-5.422-5.314-10.079-8.995-14.119l0.035 0.039zM925.867 301.653c-7.702-7.611-18.294-12.312-29.984-12.312-3.593 0-7.083 0.444-10.417 1.281l0.294-0.063c-8.286 2.043-17.832 3.28-27.644 3.412l-0.089 0.001c-70.692 0-128-57.308-128-128v0c0.134-9.902 1.37-19.447 3.593-28.608l-0.179 0.875c0.975-3.401 1.536-7.307 1.536-11.344 0-23.564-19.103-42.667-42.667-42.667-3.42 0-6.746 0.402-9.933 1.162l0.29-0.058c-86.575 19.6-152.111 90.609-163.305 178.584l-0.108 1.042c-20.56-5.699-44.168-8.974-68.541-8.974-0.954 0-1.906 0.005-2.858 0.015l0.145-0.001c-0.043-0-0.094-0-0.145-0-128.287 0-234.535 94.364-253.119 217.467l-0.175 1.413c-63.535 18.112-109.274 75.645-109.274 143.86 0 60.886 36.438 113.261 88.696 136.509l0.951 0.378c5.046 2.059 10.896 3.302 17.022 3.413l0.045 0.001c0.103 0.001 0.226 0.001 0.348 0.001 23.564 0 42.667-19.103 42.667-42.667 0-17.524-10.565-32.581-25.673-39.148l-0.276-0.107c-22.766-9.878-38.401-32.161-38.401-58.096 0-0.126 0-0.251 0.001-0.377l-0 0.019c0-35.346 28.654-64 64-64v0c23.564 0 42.667-19.103 42.667-42.667v0c0-94.257 76.41-170.667 170.667-170.667v0c34.79 0.257 67.082 10.73 94.088 28.562l-0.648-0.402c30.859 20.336 54.364 49.628 67.033 84.149l0.38 1.184c5.038 14.827 17.602 25.829 33.023 28.549l0.257 0.038c49.553 5.9 87.609 47.671 87.609 98.331 0 35.456-18.641 66.558-46.658 84.040l-0.417 0.243c-11.737 7.768-19.372 20.912-19.372 35.84 0 23.659 19.18 42.839 42.839 42.839 8.732 0 16.853-2.612 23.626-7.098l-0.159 0.099c49.211-33.785 81.071-89.742 81.071-153.14 0-0.462-0.002-0.923-0.005-1.384l0 0.071c0.002-0.3 0.003-0.655 0.003-1.011 0-30.848-7.739-59.889-21.382-85.286l0.473 0.963c74.531-21.297 131.336-80.655 148.629-155.164l0.278-1.422c0.532-2.529 0.837-5.434 0.837-8.411 0-12.339-5.238-23.455-13.611-31.245l-0.026-0.024zM730.027 421.973c-2.682 0.221-5.807 0.346-8.96 0.346s-6.278-0.126-9.367-0.373l0.407 0.026c-8.35-5.263-18.031-10.269-28.138-14.456l-1.302-0.478c-18.246-39.132-44.586-71.759-77.054-96.835l-0.599-0.445c0-5.12 0-10.667 0-15.787-0-0.002-0-0.005-0-0.008 0-38.848 17.306-73.654 44.63-97.129l0.17-0.143c13.952 93.524 86.955 166.528 179.309 180.336l1.171 0.144c-23.618 27.514-58.437 44.834-97.301 44.834-1.043 0-2.083-0.012-3.12-0.037l0.154 0.003z"],"attrs":[],"grid":0,"tags":["cloud-moon-hail"]},"attrs":[],"properties":{"order":4734,"id":950,"name":"cloud-moon-hail","prevSize":32,"code":59903},"setIdx":0,"setId":0,"iconIdx":255},{"icon":{"paths":["M925.867 341.333c-7.702-7.611-18.294-12.312-29.984-12.312-3.593 0-7.083 0.444-10.417 1.281l0.294-0.063c-8.286 2.043-17.832 3.28-27.644 3.412l-0.089 0.001c-70.692 0-128-57.308-128-128v0c0.118-10.045 1.356-19.741 3.593-29.047l-0.18 0.887c0.774-3.040 1.218-6.53 1.218-10.123 0-11.69-4.701-22.281-12.316-29.988l0.004 0.004c-7.761-7.977-18.599-12.926-30.593-12.926-3.22 0-6.356 0.357-9.372 1.033l0.285-0.054c-86.242 20.46-151.418 91.243-163.291 178.952l-0.122 1.101c-21.204-6.498-45.576-10.24-70.823-10.24-0.151 0-0.303 0-0.454 0l0.024-0c-0.139-0-0.303-0-0.467-0-127.529 0-233.278 93.251-252.78 215.286l-0.192 1.461c-63.559 18.439-109.233 76.133-109.233 144.495 0 0.501 0.002 1.001 0.007 1.501l-0.001-0.076c0.034 48.644 23.522 91.794 59.766 118.759l0.394 0.281c7.343 6.153 16.893 9.89 27.316 9.89 23.564 0 42.667-19.103 42.667-42.667 0-15.011-7.751-28.211-19.47-35.816l-0.166-0.101c-15.347-11.477-25.174-29.604-25.174-50.026 0-0.113 0-0.225 0.001-0.338l-0 0.017c0-35.346 28.654-64 64-64v0c23.564 0 42.667-19.103 42.667-42.667v0c0.248-94.069 76.563-170.231 170.666-170.231 34.408 0 66.438 10.182 93.241 27.698l-0.653-0.401c30.907 20.164 54.341 49.528 66.627 84.169l0.36 1.164c5.163 14.65 17.694 25.478 33.026 28.124l0.254 0.036c47.509 8.050 83.237 48.897 83.237 98.088 0 40.731-24.495 75.741-59.558 91.102l-0.639 0.25c-15.292 6.713-25.78 21.723-25.78 39.183 0 6.2 1.323 12.092 3.701 17.408l-0.108-0.271c6.753 15.195 21.714 25.6 39.105 25.6 0.052 0 0.104-0 0.157-0l-0.008 0c6.206-0.095 12.060-1.5 17.33-3.95l-0.263 0.11c65.844-29.221 110.938-94.026 110.938-169.362 0-0.459-0.002-0.917-0.005-1.375l0 0.070c0.002-0.3 0.003-0.655 0.003-1.011 0-30.848-7.739-59.889-21.382-85.286l0.473 0.963c74.34-20.127 131.519-78.014 150.296-151.286l0.317-1.461c0.487-2.42 0.766-5.203 0.766-8.050 0-12.305-5.209-23.393-13.542-31.18l-0.025-0.023zM730.027 461.653c-2.682 0.221-5.807 0.346-8.96 0.346s-6.278-0.126-9.367-0.373l0.407 0.026c-8.631-4.747-18.782-9.219-29.338-12.817l-1.382-0.409c-18.008-39.26-44.395-71.938-77.039-96.831l-0.614-0.449c0-5.12 0-10.667 0-15.787-0-0.002-0-0.005-0-0.008 0-38.848 17.306-73.654 44.63-97.129l0.17-0.143c14.126 93.345 87.075 166.149 179.31 179.91l1.17 0.143c-23.56 26.512-57.749 43.133-95.82 43.133-1.113 0-2.224-0.014-3.33-0.042l0.164 0.003zM533.333 721.92h-32.853l16.64-28.587c3.58-6.123 5.694-13.481 5.694-21.333 0-23.645-19.168-42.814-42.814-42.814-15.793 0-29.589 8.552-37.010 21.277l-0.11 0.203-16.213 28.587-16.213-28.587c-7.531-12.929-21.327-21.48-37.12-21.48-23.645 0-42.814 19.168-42.814 42.814 0 7.852 2.114 15.21 5.803 21.537l-0.11-0.203 16.64 28.587h-32.853c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h32.853l-16.64 28.16c-3.58 6.123-5.694 13.481-5.694 21.333 0 23.645 19.168 42.814 42.814 42.814 15.793 0 29.589-8.552 37.010-21.277l0.11-0.203 16.213-28.16 16.213 28.16c7.531 12.929 21.327 21.48 37.12 21.48 23.645 0 42.814-19.168 42.814-42.814 0-7.852-2.114-15.21-5.803-21.537l0.11 0.203-16.64-28.16h32.853c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["cloud-moon-meatball"]},"attrs":[],"properties":{"order":4735,"id":949,"name":"cloud-moon-meatball","prevSize":32,"code":59904},"setIdx":0,"setId":0,"iconIdx":256},{"icon":{"paths":["M362.667 597.333c-23.564 0-42.667 19.103-42.667 42.667v0 42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667c0-23.564-19.103-42.667-42.667-42.667v0zM362.667 810.667c-23.564 0-42.667 19.103-42.667 42.667v0 42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667c0-23.564-19.103-42.667-42.667-42.667v0zM925.867 301.653c-7.702-7.611-18.294-12.312-29.984-12.312-3.593 0-7.083 0.444-10.417 1.281l0.294-0.063c-8.286 2.043-17.832 3.28-27.644 3.412l-0.089 0.001c-70.692 0-128-57.308-128-128v0c0.147-10.058 1.383-19.752 3.595-29.067l-0.182 0.907c0.722-2.938 1.136-6.311 1.136-9.78 0-11.648-4.668-22.207-12.235-29.906l0.006 0.006c-7.814-8.4-18.93-13.637-31.269-13.637-2.977 0-5.882 0.305-8.687 0.885l0.276-0.048c-86.575 19.6-152.111 90.609-163.305 178.584l-0.108 1.042c-20.56-5.699-44.168-8.974-68.541-8.974-0.954 0-1.906 0.005-2.858 0.015l0.145-0.001c-0.043-0-0.094-0-0.145-0-128.287 0-234.535 94.364-253.119 217.467l-0.175 1.413c-63.535 18.112-109.274 75.645-109.274 143.86 0 60.886 36.438 113.261 88.696 136.509l0.951 0.378c5.046 2.059 10.896 3.302 17.022 3.413l0.045 0.001c0.103 0.001 0.226 0.001 0.348 0.001 23.564 0 42.667-19.103 42.667-42.667 0-17.524-10.565-32.581-25.673-39.148l-0.276-0.107c-22.766-9.878-38.401-32.161-38.401-58.096 0-0.126 0-0.251 0.001-0.377l-0 0.019c0-35.346 28.654-64 64-64v0c23.564 0 42.667-19.103 42.667-42.667v0c0-94.257 76.41-170.667 170.667-170.667v0c34.522 0.035 66.582 10.551 93.176 28.536l-0.589-0.376c30.819 20.258 54.221 49.588 66.619 84.16l0.367 1.173c5.038 14.827 17.602 25.829 33.023 28.549l0.257 0.038c50.060 5.386 88.695 47.406 88.695 98.45 0 35.376-18.557 66.418-46.468 83.921l-0.414 0.242c-11.737 7.768-19.372 20.912-19.372 35.84 0 23.659 19.18 42.839 42.839 42.839 8.732 0 16.853-2.612 23.626-7.098l-0.159 0.099c49.2-33.602 81.075-89.424 81.075-152.69 0-0.62-0.003-1.239-0.009-1.857l0.001 0.094c0.002-0.3 0.003-0.655 0.003-1.011 0-30.848-7.739-59.889-21.382-85.286l0.473 0.963c74.531-21.297 131.336-80.655 148.629-155.164l0.278-1.422c0.532-2.529 0.837-5.434 0.837-8.411 0-12.339-5.238-23.455-13.611-31.245l-0.026-0.024zM730.027 421.973c-2.682 0.221-5.807 0.346-8.96 0.346s-6.278-0.126-9.367-0.373l0.407 0.026c-8.35-5.263-18.031-10.269-28.138-14.456l-1.302-0.478c-18.246-39.132-44.586-71.759-77.054-96.835l-0.599-0.445c0-5.12 0-10.667 0-15.787-0-0.002-0-0.005-0-0.008 0-38.848 17.306-73.654 44.63-97.129l0.17-0.143c13.952 93.524 86.955 166.528 179.309 180.336l1.171 0.144c-23.618 27.514-58.437 44.834-97.301 44.834-1.043 0-2.083-0.012-3.12-0.037l0.154 0.003zM533.333 554.667c-23.564 0-42.667 19.103-42.667 42.667v0 42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667c0-23.564-19.103-42.667-42.667-42.667v0zM533.333 768c-23.564 0-42.667 19.103-42.667 42.667v0 42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667c0-23.564-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["cloud-moon-rain"]},"attrs":[],"properties":{"order":4736,"id":948,"name":"cloud-moon-rain","prevSize":32,"code":59905},"setIdx":0,"setId":0,"iconIdx":257},{"icon":{"paths":["M362.667 597.333c-23.564 0-42.667 19.103-42.667 42.667v0 256c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-256c0-23.564-19.103-42.667-42.667-42.667v0zM533.333 554.667c-23.564 0-42.667 19.103-42.667 42.667v0 256c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-256c0-23.564-19.103-42.667-42.667-42.667v0zM925.867 301.653c-7.702-7.611-18.294-12.312-29.984-12.312-3.593 0-7.083 0.444-10.417 1.281l0.294-0.063c-8.286 2.043-17.832 3.28-27.644 3.412l-0.089 0.001c-70.692 0-128-57.308-128-128v0c0.147-10.058 1.383-19.752 3.595-29.067l-0.182 0.907c0.722-2.938 1.136-6.311 1.136-9.78 0-11.648-4.668-22.207-12.235-29.906l0.006 0.006c-7.814-8.4-18.93-13.637-31.269-13.637-2.977 0-5.882 0.305-8.687 0.885l0.276-0.048c-86.575 19.6-152.111 90.609-163.305 178.584l-0.108 1.042c-20.56-5.699-44.168-8.974-68.541-8.974-0.954 0-1.906 0.005-2.858 0.015l0.145-0.001c-0.043-0-0.094-0-0.145-0-128.287 0-234.535 94.364-253.119 217.467l-0.175 1.413c-63.535 18.112-109.274 75.645-109.274 143.86 0 60.886 36.438 113.261 88.696 136.509l0.951 0.378c5.046 2.059 10.896 3.302 17.022 3.413l0.045 0.001c0.103 0.001 0.226 0.001 0.348 0.001 23.564 0 42.667-19.103 42.667-42.667 0-17.524-10.565-32.581-25.673-39.148l-0.276-0.107c-22.766-9.878-38.401-32.161-38.401-58.096 0-0.126 0-0.251 0.001-0.377l-0 0.019c0-35.346 28.654-64 64-64v0c23.564 0 42.667-19.103 42.667-42.667v0c0-94.257 76.41-170.667 170.667-170.667v0c34.522 0.035 66.582 10.551 93.176 28.536l-0.589-0.376c30.819 20.258 54.221 49.588 66.619 84.16l0.367 1.173c5.038 14.827 17.602 25.829 33.023 28.549l0.257 0.038c50.060 5.386 88.695 47.406 88.695 98.45 0 35.376-18.557 66.418-46.468 83.921l-0.414 0.242c-11.737 7.768-19.372 20.912-19.372 35.84 0 23.659 19.18 42.839 42.839 42.839 8.732 0 16.853-2.612 23.626-7.098l-0.159 0.099c49.2-33.602 81.075-89.424 81.075-152.69 0-0.62-0.003-1.239-0.009-1.857l0.001 0.094c0.002-0.3 0.003-0.655 0.003-1.011 0-30.848-7.739-59.889-21.382-85.286l0.473 0.963c74.531-21.297 131.336-80.655 148.629-155.164l0.278-1.422c0.532-2.529 0.837-5.434 0.837-8.411 0-12.339-5.238-23.455-13.611-31.245l-0.026-0.024zM730.027 421.973c-2.682 0.221-5.807 0.346-8.96 0.346s-6.278-0.126-9.367-0.373l0.407 0.026c-8.35-5.263-18.031-10.269-28.138-14.456l-1.302-0.478c-18.246-39.132-44.586-71.759-77.054-96.835l-0.599-0.445c0-5.12 0-10.667 0-15.787-0-0.002-0-0.005-0-0.008 0-38.848 17.306-73.654 44.63-97.129l0.17-0.143c13.952 93.524 86.955 166.528 179.309 180.336l1.171 0.144c-23.618 27.514-58.437 44.834-97.301 44.834-1.043 0-2.083-0.012-3.12-0.037l0.154 0.003z"],"attrs":[],"grid":0,"tags":["cloud-moon-showers"]},"attrs":[],"properties":{"order":4737,"id":947,"name":"cloud-moon-showers","prevSize":32,"code":59906},"setIdx":0,"setId":0,"iconIdx":258},{"icon":{"paths":["M925.867 386.987c-7.693-7.561-18.252-12.229-29.9-12.229-3.469 0-6.842 0.414-10.071 1.196l0.291-0.060c-8.408 2.030-18.102 3.266-28.059 3.412l-0.101 0.001c-70.692 0-128-57.308-128-128v0c0.147-10.058 1.383-19.752 3.595-29.067l-0.182 0.907c0.722-2.938 1.136-6.311 1.136-9.78 0-11.648-4.668-22.207-12.235-29.906l0.006 0.006c-7.814-8.4-18.93-13.637-31.269-13.637-2.977 0-5.882 0.305-8.687 0.885l0.276-0.048c-86.575 19.6-152.111 90.609-163.305 178.584l-0.108 1.042c-20.56-5.699-44.168-8.974-68.541-8.974-0.954 0-1.906 0.005-2.858 0.015l0.145-0.001c-0.043-0-0.094-0-0.145-0-128.287 0-234.535 94.364-253.119 217.467l-0.175 1.413c-63.402 18.2-109.012 75.667-109.012 143.787 0 82.399 66.737 149.211 149.107 149.333l0.012 0h391.253c102.033 0 184.747-82.714 184.747-184.747v-0c0.002-0.3 0.003-0.655 0.003-1.011 0-30.848-7.739-59.889-21.382-85.286l0.473 0.963c74.531-21.297 131.336-80.655 148.629-155.164l0.278-1.422c0.532-2.529 0.837-5.434 0.837-8.411 0-12.339-5.238-23.455-13.611-31.245l-0.026-0.024zM627.2 768h-392.533c-35.346 0-64-28.654-64-64s28.654-64 64-64v0c23.564 0 42.667-19.103 42.667-42.667v0c0.333-94.004 76.615-170.081 170.666-170.081 34.587 0 66.771 10.289 93.659 27.972l-0.644-0.398c30.819 20.258 54.221 49.588 66.619 84.16l0.367 1.173c5.038 14.827 17.602 25.829 33.023 28.549l0.257 0.038c51.781 4.112 92.242 47.144 92.242 99.627 0 55.186-44.737 99.922-99.922 99.922-2.703 0-5.381-0.107-8.030-0.318l0.35 0.022zM731.307 507.307c-2.683 0.23-5.806 0.361-8.96 0.361s-6.277-0.131-9.364-0.388l0.404 0.027c-8.631-4.747-18.782-9.219-29.338-12.817l-1.382-0.409c-18.246-39.132-44.586-71.759-77.054-96.835l-0.599-0.445c0-5.12 0-10.667 0-15.787-0-0.002-0-0.005-0-0.008 0-38.848 17.306-73.654 44.63-97.129l0.17-0.143c13.952 93.524 86.955 166.528 179.309 180.336l1.171 0.144c-23.562 26.534-57.765 43.169-95.853 43.169-1.552 0-3.098-0.028-4.637-0.082l0.223 0.006z"],"attrs":[],"grid":0,"tags":["cloud-moon"]},"attrs":[],"properties":{"order":4738,"id":946,"name":"cloud-moon","prevSize":32,"code":59907},"setIdx":0,"setId":0,"iconIdx":259},{"icon":{"paths":["M785.92 350.72c-47.208-106.522-152.012-179.486-273.857-179.486-151.36 0-276.423 112.594-296.001 258.594l-0.168 1.532c-75.666 18.574-130.919 85.822-130.919 165.974 0 94.257 76.41 170.667 170.667 170.667 0.126 0 0.253-0 0.379-0l-0.020 0h85.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-85.333c-47.128 0-85.333-38.205-85.333-85.333s38.205-85.333 85.333-85.333v0c23.564 0 42.667-19.103 42.667-42.667v0c0.262-117.622 95.674-212.873 213.333-212.873 93.059 0 172.202 59.585 201.357 142.684l0.457 1.495c5.038 14.827 17.602 25.829 33.023 28.549l0.257 0.038c60.487 10.718 105.888 62.725 106.24 125.402l0 0.038c0 70.692-57.308 128-128 128v0c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0c116.971-1.114 211.365-96.196 211.365-213.324 0-95.499-62.75-176.341-149.267-203.546l-1.511-0.41zM551.253 794.453c-0.917-2.777-2.223-5.185-3.88-7.306l0.040 0.053-5.12-6.827c-4.001-3.646-8.658-6.662-13.76-8.838l-0.32-0.122c-4.883-2.109-10.568-3.336-16.539-3.336-11.682 0-22.267 4.695-29.972 12.3l0.005-0.004-5.12 6.827c-1.617 2.068-2.923 4.477-3.791 7.085l-0.049 0.169c-1.157 2.221-2.047 4.798-2.535 7.514l-0.025 0.166c-0.091 1.276-0.142 2.765-0.142 4.267s0.052 2.99 0.153 4.466l-0.011-0.199c-0.1 1.214-0.157 2.627-0.157 4.053s0.057 2.84 0.169 4.238l-0.012-0.184c0.433 3.025 1.331 5.757 2.627 8.249l-0.067-0.142c0.917 2.777 2.223 5.185 3.88 7.306l-0.040-0.053 5.12 6.827c7.877 7.522 18.523 12.204 30.26 12.373l0.033 0c5.873-0.073 11.435-1.322 16.489-3.52l-0.275 0.107c5.422-2.298 10.079-5.314 14.119-8.995l-0.039 0.035 5.12-6.827c1.617-2.068 2.923-4.477 3.791-7.085l0.049-0.169c1.229-2.35 2.127-5.082 2.544-7.969l0.016-0.137c0.465-2.391 0.772-5.184 0.852-8.033l0.002-0.073c0.091-1.276 0.142-2.765 0.142-4.267s-0.052-2.99-0.153-4.466l0.011 0.199c-0.801-2.918-1.969-5.473-3.478-7.785l0.064 0.105zM512 469.333c-0.024-0-0.053-0-0.082-0-47.128 0-88.308 25.47-110.524 63.396l-0.327 0.604c-3.613 6.133-5.748 13.511-5.748 21.388 0 15.791 8.578 29.578 21.329 36.956l0.205 0.11c6.055 3.499 13.32 5.563 21.067 5.563 15.716 0 29.448-8.497 36.851-21.148l0.109-0.202c7.514-12.844 21.241-21.334 36.951-21.334 0.060 0 0.119 0 0.179 0l-0.009-0c23.564 0 42.667 19.103 42.667 42.667s-19.103 42.667-42.667 42.667v0c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0c70.692 0 128-57.308 128-128s-57.308-128-128-128v0z"],"attrs":[],"grid":0,"tags":["cloud-question"]},"attrs":[],"properties":{"order":4739,"id":945,"name":"cloud-question","prevSize":32,"code":59908},"setIdx":0,"setId":0,"iconIdx":260},{"icon":{"paths":["M896 298.667h-34.133c-4.812-20.513-12.457-38.604-22.633-54.956l0.446 0.769 23.893-23.893c6.377-7.412 10.259-17.129 10.259-27.753 0-23.564-19.103-42.667-42.667-42.667-10.624 0-20.341 3.883-27.809 10.307l0.056-0.047-23.893 23.893c-15.583-9.73-33.674-17.375-52.956-21.941l-1.231-0.246v-34.133c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 34.133c-20.356 4.732-38.313 12.383-54.478 22.611l0.718-0.424-24.32-23.893c-7.412-6.377-17.129-10.259-27.753-10.259-23.564 0-42.667 19.103-42.667 42.667 0 10.624 3.883 20.341 10.307 27.809l-0.047-0.056 23.893 24.32c-3.84 6.4-6.827 13.653-10.24 20.48-20.193-5.922-43.395-9.348-67.392-9.387l-0.022-0c-0.043-0-0.094-0-0.145-0-128.287 0-234.535 94.364-253.119 217.467l-0.175 1.413c-63.535 18.112-109.274 75.645-109.274 143.86 0 60.886 36.438 113.261 88.696 136.509l0.951 0.378c5.046 2.059 10.896 3.302 17.022 3.413l0.045 0.001c0.103 0.001 0.226 0.001 0.348 0.001 23.564 0 42.667-19.103 42.667-42.667 0-17.524-10.565-32.581-25.673-39.148l-0.276-0.107c-22.766-9.878-38.401-32.161-38.401-58.096 0-0.126 0-0.251 0.001-0.377l-0 0.019c0-35.346 28.654-64 64-64v0c23.564 0 42.667-19.103 42.667-42.667v0c0.44-93.923 76.681-169.892 170.665-169.892 74.265 0 137.45 47.434 160.913 113.658l0.369 1.194c5.038 14.827 17.602 25.829 33.023 28.549l0.257 0.038c48.076 7.319 84.486 48.367 84.486 97.919 0 34.331-17.477 64.58-44.020 82.335l-0.359 0.226c-11.737 7.768-19.372 20.912-19.372 35.84 0 23.659 19.18 42.839 42.839 42.839 8.732 0 16.853-2.612 23.626-7.098l-0.159 0.099c49.211-33.785 81.071-89.742 81.071-153.14 0-0.462-0.002-0.923-0.005-1.384l0 0.071c-0.041-23.833-4.739-46.557-13.232-67.327l0.432 1.193 5.547 5.12c7.667 7.606 18.211 12.323 29.857 12.373l0.010 0c0.073 0 0.16 0.001 0.247 0.001 11.721 0 22.338-4.726 30.049-12.377l-0.003 0.003c7.668-7.712 12.407-18.343 12.407-30.080s-4.74-22.368-12.409-30.082l0.002 0.002-23.893-23.893c9.73-15.583 17.375-33.674 21.941-52.956l0.246-1.231h34.133c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM753.493 411.733v0c-7.229 7.25-15.696 13.26-25.058 17.689l-0.542 0.231c-13.008-9.132-27.979-16.794-43.974-22.243l-1.253-0.371c-20.261-43.562-50.674-79.451-88.321-105.678l-0.852-0.562c5.043-11.522 11.643-21.402 19.674-29.918l-0.048 0.051c18.429-17.084 43.191-27.566 70.4-27.566s51.971 10.481 70.467 27.627l-0.067-0.061c17.65 18.183 28.531 43.021 28.531 70.4s-10.881 52.217-28.556 70.425l0.024-0.025zM362.667 597.333c-23.564 0-42.667 19.103-42.667 42.667v0 256c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-256c0-23.564-19.103-42.667-42.667-42.667v0zM533.333 554.667c-23.564 0-42.667 19.103-42.667 42.667v0 256c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-256c0-23.564-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["cloud-rain-sun"]},"attrs":[],"properties":{"order":4740,"id":944,"name":"cloud-rain-sun","prevSize":32,"code":59909},"setIdx":0,"setId":0,"iconIdx":261},{"icon":{"paths":["M535.893 540.587c-6.699-4.582-14.977-7.318-23.893-7.318s-17.194 2.735-24.040 7.412l0.147-0.095c-4.693 3.413-114.773 79.36-114.773 195.413 0 76.583 62.083 138.667 138.667 138.667s138.667-62.083 138.667-138.667v0c-0-117.333-110.080-192.427-114.773-195.413zM512 789.333c-29.455 0-53.333-23.878-53.333-53.333v0c3.743-41.936 23.551-78.634 53.144-104.372l0.19-0.162c29.96 25.767 49.828 62.538 53.296 103.972l0.038 0.561c0 29.455-23.878 53.333-53.333 53.333v0zM785.92 329.387c-47.208-106.522-152.012-179.486-273.857-179.486-151.36 0-276.423 112.594-296.001 258.594l-0.168 1.532c-75.202 18.912-129.995 85.932-129.995 165.75 0 89.101 68.28 162.254 155.37 169.99l0.652 0.047h3.413c0.041 0 0.089 0 0.137 0 22.363 0 40.707-17.204 42.52-39.099l0.010-0.154c0.094-1.060 0.147-2.293 0.147-3.539 0-22.415-17.284-40.792-39.252-42.532l-0.149-0.009c-43.716-3.84-77.788-40.135-78.080-84.451l-0-0.029c0-47.128 38.205-85.333 85.333-85.333v0c23.564 0 42.667-19.103 42.667-42.667v0c0.262-117.622 95.674-212.873 213.333-212.873 93.059 0 172.202 59.585 201.357 142.684l0.457 1.495c5.038 14.827 17.602 25.829 33.023 28.549l0.257 0.038c60.103 11.288 104.972 63.36 104.972 125.911 0 55.879-35.807 103.395-85.727 120.855l-0.898 0.273c-16.438 6.179-27.922 21.767-27.922 40.038 0 23.564 19.103 42.667 42.667 42.667 4.17 0 8.201-0.598 12.011-1.714l-0.302 0.076c85.437-29.141 145.789-108.702 145.789-202.358 0-95.86-63.226-176.953-150.251-203.853l-1.511-0.402z"],"attrs":[],"grid":0,"tags":["cloud-rain"]},"attrs":[],"properties":{"order":4741,"id":943,"name":"cloud-rain","prevSize":32,"code":59910},"setIdx":0,"setId":0,"iconIdx":262},{"icon":{"paths":["M640 533.333c-17.281 0.116-32.111 10.488-38.719 25.329l-0.108 0.271c-25.482-15.959-56.445-25.423-89.619-25.423-94.257 0-170.667 76.41-170.667 170.667s76.41 170.667 170.667 170.667c43.462 0 83.129-16.246 113.261-42.996l-0.176 0.153c9.733-7.885 15.903-19.836 15.903-33.229 0-23.564-19.103-42.667-42.667-42.667-11.48 0-21.901 4.534-29.57 11.909l0.014-0.013c-14.934 13.219-34.68 21.301-56.313 21.333l-0.007 0c-46.533-0.774-83.958-38.677-83.958-85.322 0-47.128 38.205-85.333 85.333-85.333 15.154 0 29.386 3.95 41.721 10.877l-0.429-0.222h-9.387c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h94.72c23.564 0 42.667-19.103 42.667-42.667v0-96c0-23.564-19.103-42.667-42.667-42.667v0zM785.92 329.387c-47.208-106.522-152.012-179.486-273.857-179.486-151.36 0-276.423 112.594-296.001 258.594l-0.168 1.532c-75.345 18.809-130.279 85.899-130.279 165.819 0 73.972 47.061 136.952 112.876 160.634l1.19 0.374c4.073 1.301 8.762 2.077 13.625 2.133l0.029 0c2.052 0.345 4.416 0.543 6.827 0.543 23.864 0 43.209-19.345 43.209-43.209 0-21.454-15.635-39.255-36.132-42.633l-0.251-0.034c-32.334-11.916-55.194-41.976-56.317-77.52l-0.003-0.133c0-47.128 38.205-85.333 85.333-85.333v0c23.564 0 42.667-19.103 42.667-42.667v0c0.262-117.622 95.674-212.873 213.333-212.873 93.059 0 172.202 59.585 201.357 142.684l0.457 1.495c5.038 14.827 17.602 25.829 33.023 28.549l0.257 0.038c60.216 11.193 105.203 63.319 105.203 125.954 0 46.532-24.829 87.264-61.962 109.671l-0.574 0.322c-12.929 7.531-21.48 21.327-21.48 37.12 0 23.645 19.168 42.814 42.814 42.814 7.852 0 15.21-2.114 21.537-5.803l-0.203 0.11c63.977-37.629 106.24-106.131 106.24-184.505 0-0.085-0-0.17-0-0.255l0 0.013c-0.28-95.977-63.896-177.021-151.236-203.552l-1.511-0.395z"],"attrs":[],"grid":0,"tags":["cloud-redo"]},"attrs":[],"properties":{"order":4742,"id":942,"name":"cloud-redo","prevSize":32,"code":59911},"setIdx":0,"setId":0,"iconIdx":263},{"icon":{"paths":["M618.667 640c47.128 0 85.333-38.205 85.333-85.333s-38.205-85.333-85.333-85.333c-47.128 0-85.333 38.205-85.333 85.333v0l-81.067 37.12c-13.213-8.819-29.459-14.075-46.932-14.080l-0.001-0c-47.128 0-85.333 38.205-85.333 85.333s38.205 85.333 85.333 85.333v0c0.011 0 0.024 0 0.037 0 14.407 0 27.926-3.798 39.612-10.447l-0.396 0.207 89.6 42.667c5.091 42.713 41.098 75.515 84.767 75.515 47.128 0 85.333-38.205 85.333-85.333s-38.205-85.333-85.333-85.333c-19.059 0-36.658 6.248-50.861 16.807l0.228-0.162-74.667-34.133 81.493-37.547c11.366 5.986 24.837 9.5 39.129 9.5 1.545 0 3.080-0.041 4.604-0.122l-0.213 0.009zM785.92 308.053c-47.208-106.522-152.012-179.486-273.857-179.486-151.36 0-276.423 112.594-296.001 258.594l-0.168 1.532c-75.345 18.809-130.279 85.899-130.279 165.819 0 73.972 47.061 136.952 112.876 160.634l1.19 0.374c4.073 1.301 8.762 2.077 13.625 2.133l0.029 0c2.052 0.345 4.416 0.543 6.827 0.543 23.864 0 43.209-19.345 43.209-43.209 0-21.454-15.635-39.255-36.132-42.633l-0.251-0.034c-32.334-11.916-55.194-41.976-56.317-77.52l-0.003-0.133c0-47.128 38.205-85.333 85.333-85.333v0c23.564 0 42.667-19.103 42.667-42.667v0c0.262-117.622 95.674-212.873 213.333-212.873 93.059 0 172.202 59.585 201.357 142.684l0.457 1.495c5.038 14.827 17.602 25.829 33.023 28.549l0.257 0.038c60.216 11.193 105.203 63.319 105.203 125.954 0 46.532-24.829 87.264-61.962 109.671l-0.574 0.322c-12.929 7.531-21.48 21.327-21.48 37.12 0 23.645 19.168 42.814 42.814 42.814 7.852 0 15.21-2.114 21.537-5.803l-0.203 0.11c63.977-37.629 106.24-106.131 106.24-184.505 0-0.085-0-0.17-0-0.255l0 0.013c-0.28-95.977-63.896-177.021-151.236-203.552l-1.511-0.395z"],"attrs":[],"grid":0,"tags":["cloud-share"]},"attrs":[],"properties":{"order":4743,"id":941,"name":"cloud-share","prevSize":32,"code":59912},"setIdx":0,"setId":0,"iconIdx":264},{"icon":{"paths":["M785.92 308.053c-47.208-106.522-152.012-179.486-273.857-179.486-151.36 0-276.423 112.594-296.001 258.594l-0.168 1.532c-75.345 18.809-130.279 85.899-130.279 165.819 0 73.972 47.061 136.952 112.876 160.634l1.19 0.374c4.073 1.301 8.762 2.077 13.625 2.133l0.029 0c2.052 0.345 4.416 0.543 6.827 0.543 23.864 0 43.209-19.345 43.209-43.209 0-21.454-15.635-39.255-36.132-42.633l-0.251-0.034c-32.334-11.916-55.194-41.976-56.317-77.52l-0.003-0.133c0-47.128 38.205-85.333 85.333-85.333v0c23.564 0 42.667-19.103 42.667-42.667v0c0.262-117.622 95.674-212.873 213.333-212.873 93.059 0 172.202 59.585 201.357 142.684l0.457 1.495c5.038 14.827 17.602 25.829 33.023 28.549l0.257 0.038c60.216 11.193 105.203 63.319 105.203 125.954 0 46.532-24.829 87.264-61.962 109.671l-0.574 0.322c-12.929 7.531-21.48 21.327-21.48 37.12 0 23.645 19.168 42.814 42.814 42.814 7.852 0 15.21-2.114 21.537-5.803l-0.203 0.11c63.977-37.629 106.24-106.131 106.24-184.505 0-0.085-0-0.17-0-0.255l0 0.013c-0.28-95.977-63.896-177.021-151.236-203.552l-1.511-0.395zM631.040 497.493c-7.442 1.692-15.987 2.662-24.76 2.662-26.012 0-50.032-8.526-69.418-22.936l0.311 0.221c-6.96-5.134-15.707-8.217-25.173-8.217s-18.213 3.083-25.291 8.3l0.117-0.083c-19.035 14.207-43.025 22.747-69.009 22.747-8.808 0-17.387-0.981-25.633-2.84l0.776 0.147c-2.707-0.611-5.816-0.961-9.006-0.961-10.203 0-19.57 3.582-26.912 9.556l0.078-0.062c-9.594 7.827-15.696 19.618-15.787 32.838l-0 0.015v143.787c-0 0.064-0 0.139-0 0.215 0 64.181 30.607 121.214 78.022 157.298l0.485 0.354 66.987 49.067c6.96 5.134 15.707 8.217 25.173 8.217s18.213-3.083 25.291-8.3l-0.117 0.083 66.987-49.493c47.884-36.187 78.507-93.024 78.507-157.014 0-0.15-0-0.3-0.001-0.449l0 0.023v-143.787c-0.090-13.235-6.193-25.027-15.71-32.792l-0.077-0.061c-7.264-5.913-16.631-9.495-26.834-9.495-3.19 0-6.299 0.35-9.29 1.014l0.284-0.053zM597.333 682.667c-0.813 34.593-17.218 65.196-42.433 85.155l-0.233 0.178-42.667 30.72-42.667-30.72c-25.449-20.137-41.854-50.74-42.664-85.201l-0.002-0.132v-97.28c31.463-1.455 60.636-9.972 86.381-23.989l-1.048 0.522c24.698 13.495 53.87 22.012 84.892 23.45l0.442 0.016z"],"attrs":[],"grid":0,"tags":["cloud-shield"]},"attrs":[],"properties":{"order":4744,"id":940,"name":"cloud-shield","prevSize":32,"code":59913},"setIdx":0,"setId":0,"iconIdx":265},{"icon":{"paths":["M341.333 554.667c-23.564 0-42.667 19.103-42.667 42.667v0 213.333c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-213.333c0-23.564-19.103-42.667-42.667-42.667v0zM512 469.333c-23.564 0-42.667 19.103-42.667 42.667v0 384c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-384c0-23.564-19.103-42.667-42.667-42.667v0zM785.92 265.387c-47.208-106.522-152.012-179.486-273.857-179.486-151.36 0-276.423 112.594-296.001 258.594l-0.168 1.532c-75.486 18.706-130.56 85.865-130.56 165.887 0 0.030 0 0.061 0 0.091l-0-0.005c-0.001 0.16-0.001 0.349-0.001 0.538 0 50.603 22.023 96.063 57.008 127.316l0.166 0.146c7.655 7.361 18.076 11.895 29.556 11.895 23.564 0 42.667-19.103 42.667-42.667 0-13.392-6.17-25.344-15.823-33.166l-0.080-0.063c-17.325-15.679-28.162-38.249-28.162-63.35 0-0.228 0.001-0.457 0.003-0.685l-0 0.035c0-47.128 38.205-85.333 85.333-85.333v0c23.564 0 42.667-19.103 42.667-42.667v0c0.262-117.622 95.674-212.873 213.333-212.873 93.059 0 172.202 59.585 201.357 142.684l0.457 1.495c5.038 14.827 17.602 25.829 33.023 28.549l0.257 0.038c60.487 10.718 105.888 62.725 106.24 125.402l0 0.038c0.017 0.767 0.027 1.672 0.027 2.578 0 31.847-11.99 60.893-31.703 82.871l0.103-0.116c-5.855 7.243-9.399 16.566-9.399 26.715 0 23.564 19.103 42.667 42.667 42.667 11.638 0 22.188-4.66 29.886-12.215l-0.007 0.006c32.785-37.319 52.789-86.567 52.789-140.488 0-95.865-63.232-176.962-150.264-203.857l-1.512-0.402zM682.667 554.667c-23.564 0-42.667 19.103-42.667 42.667v0 213.333c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-213.333c0-23.564-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["cloud-showers-alt"]},"attrs":[],"properties":{"order":4745,"id":939,"name":"cloud-showers-alt","prevSize":32,"code":59914},"setIdx":0,"setId":0,"iconIdx":266},{"icon":{"paths":["M549.973 770.56c-4.313-1.608-9.296-2.538-14.496-2.538-18.352 0-33.997 11.586-40.021 27.843l-0.096 0.295-31.147 85.333c-1.608 4.313-2.538 9.296-2.538 14.496 0 18.352 11.586 33.997 27.843 40.021l0.295 0.096c4.314 1.616 9.3 2.554 14.504 2.56l0.003 0c18.353-0.008 33.995-11.602 40.011-27.865l0.096-0.295 31.147-85.333c1.608-4.313 2.538-9.296 2.538-14.496 0-18.352-11.586-33.997-27.843-40.021l-0.295-0.096zM379.307 770.56c-4.313-1.608-9.296-2.538-14.496-2.538-18.352 0-33.997 11.586-40.021 27.843l-0.096 0.295-31.147 85.333c-1.608 4.313-2.538 9.296-2.538 14.496 0 18.352 11.586 33.997 27.843 40.021l0.295 0.096c4.314 1.616 9.3 2.554 14.504 2.56l0.003 0c18.353-0.008 33.995-11.602 40.011-27.865l0.096-0.295 31.147-85.333c1.608-4.313 2.538-9.296 2.538-14.496 0-18.352-11.586-33.997-27.843-40.021l-0.295-0.096zM379.307 471.893c-4.313-1.608-9.296-2.538-14.496-2.538-18.352 0-33.997 11.586-40.021 27.843l-0.096 0.295-46.933 128c-1.61 4.316-2.542 9.302-2.542 14.507 0 23.558 19.092 42.656 42.648 42.667l0.001 0c18.353-0.008 33.995-11.602 40.011-27.865l0.096-0.295 46.933-128c1.608-4.313 2.538-9.296 2.538-14.496 0-18.352-11.586-33.997-27.843-40.021l-0.295-0.096zM549.973 471.893c-4.313-1.608-9.296-2.538-14.496-2.538-18.352 0-33.997 11.586-40.021 27.843l-0.096 0.295-46.933 128c-1.61 4.316-2.542 9.302-2.542 14.507 0 23.558 19.092 42.656 42.648 42.667l0.001 0c18.353-0.008 33.995-11.602 40.011-27.865l0.096-0.295 46.933-128c1.608-4.313 2.538-9.296 2.538-14.496 0-18.352-11.586-33.997-27.843-40.021l-0.295-0.096zM785.92 265.387c-47.208-106.522-152.012-179.486-273.857-179.486-151.36 0-276.423 112.594-296.001 258.594l-0.168 1.532c-75.486 18.706-130.56 85.865-130.56 165.887 0 0.030 0 0.061 0 0.091l-0-0.005c-0.001 0.16-0.001 0.349-0.001 0.538 0 50.603 22.023 96.063 57.008 127.316l0.166 0.146c7.655 7.361 18.076 11.895 29.556 11.895 23.564 0 42.667-19.103 42.667-42.667 0-13.392-6.17-25.344-15.823-33.166l-0.080-0.063c-17.325-15.679-28.162-38.249-28.162-63.35 0-0.228 0.001-0.457 0.003-0.685l-0 0.035c0-47.128 38.205-85.333 85.333-85.333v0c23.564 0 42.667-19.103 42.667-42.667v0c0.262-117.622 95.674-212.873 213.333-212.873 93.059 0 172.202 59.585 201.357 142.684l0.457 1.495c5.038 14.827 17.602 25.829 33.023 28.549l0.257 0.038c60.487 10.718 105.888 62.725 106.24 125.402l0 0.038c0.017 0.767 0.027 1.672 0.027 2.578 0 31.847-11.99 60.893-31.703 82.871l0.103-0.116c-5.855 7.243-9.399 16.566-9.399 26.715 0 23.564 19.103 42.667 42.667 42.667 11.638 0 22.188-4.66 29.886-12.215l-0.007 0.006c32.785-37.319 52.789-86.567 52.789-140.488 0-95.865-63.232-176.962-150.264-203.857l-1.512-0.402zM720.64 770.56c-4.313-1.608-9.296-2.538-14.496-2.538-18.352 0-33.997 11.586-40.021 27.843l-0.096 0.295-31.147 85.333c-1.608 4.313-2.538 9.296-2.538 14.496 0 18.352 11.586 33.997 27.843 40.021l0.295 0.096c4.314 1.616 9.3 2.554 14.504 2.56l0.003 0c18.353-0.008 33.995-11.602 40.011-27.865l0.096-0.295 31.147-85.333c1.608-4.313 2.538-9.296 2.538-14.496 0-18.352-11.586-33.997-27.843-40.021l-0.295-0.096zM720.64 471.893c-4.313-1.608-9.296-2.538-14.496-2.538-18.352 0-33.997 11.586-40.021 27.843l-0.096 0.295-46.933 128c-1.61 4.316-2.542 9.302-2.542 14.507 0 23.558 19.092 42.656 42.648 42.667l0.001 0c18.353-0.008 33.995-11.602 40.011-27.865l0.096-0.295 46.933-128c1.608-4.313 2.538-9.296 2.538-14.496 0-18.352-11.586-33.997-27.843-40.021l-0.295-0.096z"],"attrs":[],"grid":0,"tags":["cloud-showers-heavy"]},"attrs":[],"properties":{"order":4746,"id":938,"name":"cloud-showers-heavy","prevSize":32,"code":59915},"setIdx":0,"setId":0,"iconIdx":267},{"icon":{"paths":["M341.333 469.333c-23.564 0-42.667 19.103-42.667 42.667v0 128c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-128c0-23.564-19.103-42.667-42.667-42.667v0zM512 725.333c-23.564 0-42.667 19.103-42.667 42.667v0 128c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-128c0-23.564-19.103-42.667-42.667-42.667v0zM341.333 725.333c-23.564 0-42.667 19.103-42.667 42.667v0 128c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-128c0-23.564-19.103-42.667-42.667-42.667v0zM785.92 265.387c-47.208-106.522-152.012-179.486-273.857-179.486-151.36 0-276.423 112.594-296.001 258.594l-0.168 1.532c-75.486 18.706-130.56 85.865-130.56 165.887 0 0.030 0 0.061 0 0.091l-0-0.005c-0.001 0.16-0.001 0.349-0.001 0.538 0 50.603 22.023 96.063 57.008 127.316l0.166 0.146c7.655 7.361 18.076 11.895 29.556 11.895 23.564 0 42.667-19.103 42.667-42.667 0-13.392-6.17-25.344-15.823-33.166l-0.080-0.063c-17.325-15.679-28.162-38.249-28.162-63.35 0-0.228 0.001-0.457 0.003-0.685l-0 0.035c0-47.128 38.205-85.333 85.333-85.333v0c23.564 0 42.667-19.103 42.667-42.667v0c0.262-117.622 95.674-212.873 213.333-212.873 93.059 0 172.202 59.585 201.357 142.684l0.457 1.495c5.038 14.827 17.602 25.829 33.023 28.549l0.257 0.038c60.487 10.718 105.888 62.725 106.24 125.402l0 0.038c0.017 0.767 0.027 1.672 0.027 2.578 0 31.847-11.99 60.893-31.703 82.871l0.103-0.116c-5.855 7.243-9.399 16.566-9.399 26.715 0 23.564 19.103 42.667 42.667 42.667 11.638 0 22.188-4.66 29.886-12.215l-0.007 0.006c32.785-37.319 52.789-86.567 52.789-140.488 0-95.865-63.232-176.962-150.264-203.857l-1.512-0.402zM512 469.333c-23.564 0-42.667 19.103-42.667 42.667v0 128c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-128c0-23.564-19.103-42.667-42.667-42.667v0zM682.667 469.333c-23.564 0-42.667 19.103-42.667 42.667v0 128c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-128c0-23.564-19.103-42.667-42.667-42.667v0zM682.667 725.333c-23.564 0-42.667 19.103-42.667 42.667v0 128c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-128c0-23.564-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["cloud-showers"]},"attrs":[],"properties":{"order":4747,"id":937,"name":"cloud-showers","prevSize":32,"code":59916},"setIdx":0,"setId":0,"iconIdx":268},{"icon":{"paths":["M712.96 695.040v0l-554.667-554.667c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293v0l143.36 142.933c-11.862 24.78-20.685 53.533-24.987 83.742l-0.186 1.592c-82.522 12.956-144.897 83.549-144.897 168.71 0 94.257 76.41 170.667 170.667 170.667 5.047 0 10.043-0.219 14.978-0.648l-0.641 0.045h409.173l115.2 115.627c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003zM256 682.667c-47.128 0-85.333-38.205-85.333-85.333s38.205-85.333 85.333-85.333v0c23.564 0 42.667-19.103 42.667-42.667v0c0.044-21.15 3.158-41.555 8.921-60.817l-0.388 1.51 272.64 272.64zM785.92 350.72c-47.056-106.774-151.93-179.976-273.91-180.053l-0.010-0c-0.411-0.002-0.897-0.003-1.384-0.003-35.012 0-68.563 6.257-99.595 17.714l1.992-0.644c-14.924 6.862-25.1 21.684-25.1 38.883 0 23.564 19.103 42.667 42.667 42.667 3.764 0 7.414-0.487 10.891-1.403l-0.297 0.066c20.768-7.571 44.744-11.949 69.742-11.949 0.382 0 0.763 0.001 1.144 0.003l-0.059-0c93.167 0.071 172.352 59.854 201.36 143.143l0.454 1.497c5.038 14.827 17.602 25.829 33.023 28.549l0.257 0.038c60.457 10.986 105.7 63.231 105.7 126.042 0 29.637-10.072 56.921-26.981 78.617l0.214-0.286c-5.716 7.194-9.171 16.408-9.171 26.429 0 13.435 6.21 25.42 15.916 33.241l0.082 0.064c7.178 5.797 16.398 9.326 26.44 9.387l0.013 0c13.459-0.064 25.436-6.35 33.213-16.126l0.067-0.087c28.256-35.847 45.32-81.663 45.32-131.464 0-95.943-63.335-177.093-150.476-203.922l-1.512-0.401z"],"attrs":[],"grid":0,"tags":["cloud-slash"]},"attrs":[],"properties":{"order":4748,"id":936,"name":"cloud-slash","prevSize":32,"code":59917},"setIdx":0,"setId":0,"iconIdx":269},{"icon":{"paths":["M392.96 865.707c-7.7-7.601-18.286-12.296-29.968-12.296-5.971 0-11.656 1.227-16.817 3.442l0.278-0.106c-5.492 2.069-10.185 5.116-14.084 8.964l0.004-0.004c-3.646 4.001-6.662 8.658-8.838 13.76l-0.122 0.32c-2.163 4.771-3.423 10.345-3.423 16.213s1.26 11.443 3.525 16.466l-0.102-0.253c3.967 10.747 12.293 19.073 22.774 22.954l0.266 0.086c4.771 2.163 10.345 3.423 16.213 3.423s11.443-1.26 16.466-3.525l-0.253 0.102c5.422-2.298 10.079-5.314 14.119-8.995l-0.039 0.035c7.648-7.709 12.374-18.326 12.374-30.047 0-0.087-0-0.173-0.001-0.26l0 0.013c0.008-0.275 0.012-0.599 0.012-0.923 0-5.554-1.263-10.813-3.518-15.505l0.093 0.215c-2.298-5.422-5.314-10.079-8.995-14.119l0.035 0.039zM563.627 780.373c-3.895-3.844-8.588-6.891-13.807-8.869l-0.273-0.091c-4.883-2.109-10.568-3.336-16.539-3.336-11.682 0-22.267 4.695-29.972 12.3l0.005-0.004c-3.646 4.001-6.662 8.658-8.838 13.76l-0.122 0.32c-1.933 4.694-3.055 10.144-3.055 15.855 0 23.564 19.103 42.667 42.667 42.667 5.712 0 11.161-1.122 16.14-3.158l-0.285 0.103c5.422-2.298 10.079-5.314 14.119-8.995l-0.039 0.035c7.601-7.7 12.296-18.286 12.296-29.968 0-5.971-1.227-11.656-3.442-16.817l0.106 0.278c-2.298-5.422-5.314-10.079-8.995-14.119l0.035 0.039zM392.96 695.040c-7.7-7.601-18.286-12.296-29.968-12.296-5.971 0-11.656 1.227-16.817 3.442l0.278-0.106c-5.464 2.152-10.143 5.187-14.095 8.974l0.015-0.014c-3.646 4.001-6.662 8.658-8.838 13.76l-0.122 0.32c-2.109 4.883-3.336 10.568-3.336 16.539 0 11.682 4.695 22.267 12.3 29.972l-0.004-0.005c4.001 3.646 8.658 6.662 13.76 8.838l0.32 0.122c4.771 2.163 10.345 3.423 16.213 3.423s11.443-1.26 16.466-3.525l-0.253 0.102c5.422-2.298 10.079-5.314 14.119-8.995l-0.039 0.035c7.648-7.709 12.374-18.326 12.374-30.047 0-0.087-0-0.173-0.001-0.26l0 0.013c0.008-0.275 0.012-0.599 0.012-0.923 0-5.554-1.263-10.813-3.518-15.505l0.093 0.215c-2.298-5.422-5.314-10.079-8.995-14.119l0.035 0.039zM517.12 600.747c-5.464 2.152-10.143 5.187-14.095 8.974l0.015-0.014c-7.522 7.877-12.204 18.523-12.373 30.26l-0 0.033c-0 0.073-0.001 0.16-0.001 0.247 0 11.721 4.726 22.338 12.377 30.049l-0.003-0.003c4.001 3.646 8.658 6.662 13.76 8.838l0.32 0.122c4.477 2.162 9.736 3.425 15.29 3.425 0.325 0 0.648-0.004 0.971-0.013l-0.048 0.001c23.564 0 42.667-19.103 42.667-42.667v0c-0.169-11.771-4.851-22.416-12.39-30.311l0.016 0.017c-7.7-7.601-18.286-12.296-29.968-12.296-5.971 0-11.656 1.227-16.817 3.442l0.278-0.106zM896 298.667h-34.133c-4.812-20.513-12.457-38.604-22.633-54.956l0.446 0.769 23.893-23.893c6.377-7.412 10.259-17.129 10.259-27.753 0-23.564-19.103-42.667-42.667-42.667-10.624 0-20.341 3.883-27.809 10.307l0.056-0.047-23.893 23.893c-15.583-9.73-33.674-17.375-52.956-21.941l-1.231-0.246v-34.133c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 34.133c-20.356 4.732-38.313 12.383-54.478 22.611l0.718-0.424-24.32-23.893c-7.412-6.377-17.129-10.259-27.753-10.259-23.564 0-42.667 19.103-42.667 42.667 0 10.624 3.883 20.341 10.307 27.809l-0.047-0.056 23.893 24.32c-3.84 6.4-6.827 13.653-10.24 20.48-20.193-5.922-43.395-9.348-67.392-9.387l-0.022-0c-0.043-0-0.094-0-0.145-0-128.287 0-234.535 94.364-253.119 217.467l-0.175 1.413c-63.535 18.112-109.274 75.645-109.274 143.86 0 60.886 36.438 113.261 88.696 136.509l0.951 0.378c5.046 2.059 10.896 3.302 17.022 3.413l0.045 0.001c0.103 0.001 0.226 0.001 0.348 0.001 23.564 0 42.667-19.103 42.667-42.667 0-17.524-10.565-32.581-25.673-39.148l-0.276-0.107c-22.766-9.878-38.401-32.161-38.401-58.096 0-0.126 0-0.251 0.001-0.377l-0 0.019c0-35.346 28.654-64 64-64v0c23.564 0 42.667-19.103 42.667-42.667v0c0.44-93.923 76.681-169.892 170.665-169.892 74.265 0 137.45 47.434 160.913 113.658l0.369 1.194c5.038 14.827 17.602 25.829 33.023 28.549l0.257 0.038c48.076 7.319 84.486 48.367 84.486 97.919 0 34.331-17.477 64.58-44.020 82.335l-0.359 0.226c-11.737 7.768-19.372 20.912-19.372 35.84 0 23.659 19.18 42.839 42.839 42.839 8.732 0 16.853-2.612 23.626-7.098l-0.159 0.099c49.211-33.785 81.071-89.742 81.071-153.14 0-0.462-0.002-0.923-0.005-1.384l0 0.071c-0.041-23.833-4.739-46.557-13.232-67.327l0.432 1.193 5.547 5.12c7.667 7.606 18.211 12.323 29.857 12.373l0.010 0c0.073 0 0.16 0.001 0.247 0.001 11.721 0 22.338-4.726 30.049-12.377l-0.003 0.003c7.668-7.712 12.407-18.343 12.407-30.080s-4.74-22.368-12.409-30.082l0.002 0.002-23.893-23.893c9.73-15.583 17.375-33.674 21.941-52.956l0.246-1.231h34.133c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM753.493 411.733v0c-7.229 7.25-15.696 13.26-25.058 17.689l-0.542 0.231c-13.008-9.132-27.979-16.794-43.974-22.243l-1.253-0.371c-20.261-43.562-50.674-79.451-88.321-105.678l-0.852-0.562c5.043-11.522 11.643-21.402 19.674-29.918l-0.048 0.051c18.429-17.084 43.191-27.566 70.4-27.566s51.971 10.481 70.467 27.627l-0.067-0.061c17.65 18.183 28.531 43.021 28.531 70.4s-10.881 52.217-28.556 70.425l0.024-0.025z"],"attrs":[],"grid":0,"tags":["cloud-sun-hail"]},"attrs":[],"properties":{"order":4749,"id":935,"name":"cloud-sun-hail","prevSize":32,"code":59918},"setIdx":0,"setId":0,"iconIdx":270},{"icon":{"paths":["M533.333 721.92h-32.853l16.64-28.587c3.58-6.123 5.694-13.481 5.694-21.333 0-23.645-19.168-42.814-42.814-42.814-15.793 0-29.589 8.552-37.010 21.277l-0.11 0.203-16.213 28.587-16.213-28.587c-7.531-12.929-21.327-21.48-37.12-21.48-23.645 0-42.814 19.168-42.814 42.814 0 7.852 2.114 15.21 5.803 21.537l-0.11-0.203 16.64 28.587h-32.853c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h32.853l-16.64 28.16c-3.58 6.123-5.694 13.481-5.694 21.333 0 23.645 19.168 42.814 42.814 42.814 15.793 0 29.589-8.552 37.010-21.277l0.11-0.203 16.213-28.16 16.213 28.16c7.531 12.929 21.327 21.48 37.12 21.48 23.645 0 42.814-19.168 42.814-42.814 0-7.852-2.114-15.21-5.803-21.537l0.11 0.203-16.64-28.16h32.853c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM896 337.92h-34.133c-4.812-20.513-12.457-38.604-22.633-54.956l0.446 0.769 23.893-23.893c6.377-7.412 10.259-17.129 10.259-27.753 0-23.564-19.103-42.667-42.667-42.667-10.624 0-20.341 3.883-27.809 10.307l0.056-0.047-23.893 23.893c-15.583-9.73-33.674-17.375-52.956-21.941l-1.231-0.246v-34.133c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 34.133c-20.356 4.732-38.313 12.383-54.478 22.611l0.718-0.424-24.32-23.893c-7.412-6.377-17.129-10.259-27.753-10.259-23.564 0-42.667 19.103-42.667 42.667 0 10.624 3.883 20.341 10.307 27.809l-0.047-0.056 23.893 23.893c-3.84 6.827-6.827 14.080-10.24 20.907-20.193-5.922-43.395-9.348-67.392-9.387l-0.022-0c-0.139-0-0.303-0-0.467-0-127.529 0-233.278 93.251-252.78 215.286l-0.192 1.461c-63.559 18.439-109.233 76.133-109.233 144.495 0 0.501 0.002 1.001 0.007 1.501l-0.001-0.076c0.034 48.644 23.522 91.794 59.766 118.759l0.394 0.281c7.343 6.153 16.893 9.89 27.316 9.89 23.564 0 42.667-19.103 42.667-42.667 0-15.011-7.751-28.211-19.47-35.816l-0.166-0.101c-15.347-11.477-25.174-29.604-25.174-50.026 0-0.113 0-0.225 0.001-0.338l-0 0.017c0-35.346 28.654-64 64-64v0c23.564 0 42.667-19.103 42.667-42.667v0c0.44-93.923 76.681-169.892 170.665-169.892 74.265 0 137.45 47.434 160.913 113.658l0.369 1.194c5.163 14.65 17.694 25.478 33.026 28.124l0.254 0.036c47.509 8.050 83.237 48.897 83.237 98.088 0 40.731-24.495 75.741-59.558 91.102l-0.639 0.25c-15.292 6.713-25.78 21.723-25.78 39.183 0 6.2 1.323 12.092 3.701 17.408l-0.108-0.271c6.753 15.195 21.714 25.6 39.105 25.6 0.052 0 0.104-0 0.157-0l-0.008 0c0.011 0 0.024 0 0.037 0 6.188 0 12.046-1.417 17.266-3.943l-0.237 0.103c65.844-29.221 110.938-94.026 110.938-169.362 0-0.459-0.002-0.917-0.005-1.375l0 0.070c-0.093-23.985-4.785-46.848-13.238-67.789l0.438 1.229 5.547 5.547c7.667 7.606 18.211 12.323 29.857 12.373l0.010 0c0.073 0 0.16 0.001 0.247 0.001 11.721 0 22.338-4.726 30.049-12.377l-0.003 0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003-23.893-23.893c9.726-15.456 17.368-33.402 21.941-52.54l0.246-1.22h34.133c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM753.493 450.56v0c-7.146 7.251-15.641 13.149-25.082 17.291l-0.518 0.203c-13.008-8.842-27.993-16.231-43.974-21.409l-1.253-0.351c-20.553-43.304-51.419-78.824-89.53-104.377l-0.923-0.583c4.813-11.596 11.443-21.511 19.642-29.883l-0.016 0.016c18.39-17.176 43.164-27.721 70.4-27.721s52.010 10.546 70.46 27.777l-0.060-0.055c17.824 18.026 28.834 42.82 28.834 70.187s-11.010 52.161-28.843 70.196l0.009-0.009z"],"attrs":[],"grid":0,"tags":["cloud-sun-meatball"]},"attrs":[],"properties":{"order":4750,"id":934,"name":"cloud-sun-meatball","prevSize":32,"code":59919},"setIdx":0,"setId":0,"iconIdx":271},{"icon":{"paths":["M362.667 810.667c-23.564 0-42.667 19.103-42.667 42.667v0 42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667c0-23.564-19.103-42.667-42.667-42.667v0zM362.667 597.333c-23.564 0-42.667 19.103-42.667 42.667v0 42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667c0-23.564-19.103-42.667-42.667-42.667v0zM896 298.667h-34.133c-4.812-20.513-12.457-38.604-22.633-54.956l0.446 0.769 23.893-23.893c6.377-7.412 10.259-17.129 10.259-27.753 0-23.564-19.103-42.667-42.667-42.667-10.624 0-20.341 3.883-27.809 10.307l0.056-0.047-23.893 23.893c-15.583-9.73-33.674-17.375-52.956-21.941l-1.231-0.246v-34.133c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 34.133c-20.356 4.732-38.313 12.383-54.478 22.611l0.718-0.424-24.32-23.893c-7.412-6.377-17.129-10.259-27.753-10.259-23.564 0-42.667 19.103-42.667 42.667 0 10.624 3.883 20.341 10.307 27.809l-0.047-0.056 23.893 24.32c-3.84 6.4-6.827 13.653-10.24 20.48-20.193-5.922-43.395-9.348-67.392-9.387l-0.022-0c-0.043-0-0.094-0-0.145-0-128.287 0-234.535 94.364-253.119 217.467l-0.175 1.413c-63.535 18.112-109.274 75.645-109.274 143.86 0 60.886 36.438 113.261 88.696 136.509l0.951 0.378c5.046 2.059 10.896 3.302 17.022 3.413l0.045 0.001c0.103 0.001 0.226 0.001 0.348 0.001 23.564 0 42.667-19.103 42.667-42.667 0-17.524-10.565-32.581-25.673-39.148l-0.276-0.107c-22.766-9.878-38.401-32.161-38.401-58.096 0-0.126 0-0.251 0.001-0.377l-0 0.019c0-35.346 28.654-64 64-64v0c23.564 0 42.667-19.103 42.667-42.667v0c0.44-93.923 76.681-169.892 170.665-169.892 74.265 0 137.45 47.434 160.913 113.658l0.369 1.194c5.038 14.827 17.602 25.829 33.023 28.549l0.257 0.038c48.076 7.319 84.486 48.367 84.486 97.919 0 34.331-17.477 64.58-44.020 82.335l-0.359 0.226c-11.737 7.768-19.372 20.912-19.372 35.84 0 23.659 19.18 42.839 42.839 42.839 8.732 0 16.853-2.612 23.626-7.098l-0.159 0.099c49.211-33.785 81.071-89.742 81.071-153.14 0-0.462-0.002-0.923-0.005-1.384l0 0.071c-0.041-23.833-4.739-46.557-13.232-67.327l0.432 1.193 5.547 5.12c7.667 7.606 18.211 12.323 29.857 12.373l0.010 0c0.073 0 0.16 0.001 0.247 0.001 11.721 0 22.338-4.726 30.049-12.377l-0.003 0.003c7.668-7.712 12.407-18.343 12.407-30.080s-4.74-22.368-12.409-30.082l0.002 0.002-23.893-23.893c9.73-15.583 17.375-33.674 21.941-52.956l0.246-1.231h34.133c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM753.493 411.733v0c-7.229 7.25-15.696 13.26-25.058 17.689l-0.542 0.231c-13.008-9.132-27.979-16.794-43.974-22.243l-1.253-0.371c-20.261-43.562-50.674-79.451-88.321-105.678l-0.852-0.562c5.043-11.522 11.643-21.402 19.674-29.918l-0.048 0.051c18.429-17.084 43.191-27.566 70.4-27.566s51.971 10.481 70.467 27.627l-0.067-0.061c17.65 18.183 28.531 43.021 28.531 70.4s-10.881 52.217-28.556 70.425l0.024-0.025zM533.333 768c-23.564 0-42.667 19.103-42.667 42.667v0 42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667c0-23.564-19.103-42.667-42.667-42.667v0zM533.333 554.667c-23.564 0-42.667 19.103-42.667 42.667v0 42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667c0-23.564-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["cloud-sun-rain-alt"]},"attrs":[],"properties":{"order":4751,"id":933,"name":"cloud-sun-rain-alt","prevSize":32,"code":59920},"setIdx":0,"setId":0,"iconIdx":272},{"icon":{"paths":["M320 640c-23.564 0-42.667 19.103-42.667 42.667v0 42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667c0-23.564-19.103-42.667-42.667-42.667v0zM938.667 298.667h-46.933c-6.172-28.447-16.962-53.592-31.665-75.932l0.519 0.839 35.413-32.853c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l-0 0-32.853 33.28c-22.062-14.647-48.002-25.502-75.881-30.929l-1.345-0.218v-46.933c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 46.933c-28.447 6.172-53.592 16.962-75.932 31.665l0.839-0.519-32.853-33.28c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l-0-0 33.28 32.853c-16.173 24.309-27.731 53.103-32.691 84.101l-0.163 1.233c-19.847-6.15-42.699-9.866-66.362-10.238l-0.198-0.002c-0.043-0-0.094-0-0.145-0-128.287 0-234.535 94.364-253.119 217.467l-0.175 1.413c-63.535 18.112-109.274 75.645-109.274 143.86 0 60.886 36.438 113.261 88.696 136.509l0.951 0.378c5.046 2.059 10.896 3.302 17.022 3.413l0.045 0.001c0.103 0.001 0.226 0.001 0.348 0.001 23.564 0 42.667-19.103 42.667-42.667 0-17.524-10.565-32.581-25.673-39.148l-0.276-0.107c-22.766-9.878-38.401-32.161-38.401-58.096 0-0.126 0-0.251 0.001-0.377l-0 0.019c0-35.346 28.654-64 64-64v0c23.564 0 42.667-19.103 42.667-42.667v0c0.44-93.923 76.681-169.892 170.665-169.892 74.265 0 137.45 47.434 160.913 113.658l0.369 1.194c5.038 14.827 17.602 25.829 33.023 28.549l0.257 0.038c48.076 7.319 84.486 48.367 84.486 97.919 0 34.331-17.477 64.58-44.020 82.335l-0.359 0.226c-11.737 7.768-19.372 20.912-19.372 35.84 0 23.659 19.18 42.839 42.839 42.839 8.732 0 16.853-2.612 23.626-7.098l-0.159 0.099c49.211-33.785 81.071-89.742 81.071-153.14 0-0.462-0.002-0.923-0.005-1.384l0 0.071c-0.146-29.85-7.219-58.013-19.693-83.010l0.493 1.090c19.69-6.545 36.772-14.928 52.456-25.26l-0.83 0.513 32.853 33.28c7.87 9.109 19.437 14.839 32.343 14.839 11.886 0 22.636-4.86 30.373-12.701l0.005-0.005c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003-33.28-32.853c13.912-22.143 24.069-48.133 28.834-75.963l0.179-1.264h46.933c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM773.547 431.787c-23.169 23.197-55.192 37.547-90.566 37.547-0.11 0-0.221-0-0.331-0l0.017 0h-2.56c-12.274-7.908-26.414-14.578-41.421-19.29l-1.245-0.337c-19.54-41.562-48.61-75.831-84.522-101.007l-0.812-0.539c0-2.56 0-4.267 0-6.827-0-0.094-0-0.204-0-0.315 0-35.162 14.178-67.012 37.129-90.147l-0.008 0.008c23.618-22.275 55.543-35.965 90.667-35.965s67.049 13.69 90.732 36.026l-0.065-0.061c23.257 23.179 37.648 55.242 37.648 90.667s-14.39 67.488-37.644 90.663l-0.004 0.004zM320 853.333c-23.564 0-42.667 19.103-42.667 42.667v0 42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667c0-23.564-19.103-42.667-42.667-42.667v0zM490.667 810.667c-23.564 0-42.667 19.103-42.667 42.667v0 42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667c0-23.564-19.103-42.667-42.667-42.667v0zM490.667 597.333c-23.564 0-42.667 19.103-42.667 42.667v0 42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667c0-23.564-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["cloud-sun-rain"]},"attrs":[],"properties":{"order":4752,"id":932,"name":"cloud-sun-rain","prevSize":32,"code":59921},"setIdx":0,"setId":0,"iconIdx":273},{"icon":{"paths":["M471.467 611.413c-6.653-4.494-14.854-7.174-23.68-7.174s-17.027 2.68-23.832 7.271l0.152-0.096c-4.267 3.413-104.107 71.253-104.107 177.92 0 70.692 57.308 128 128 128s128-57.308 128-128v0c0-106.667-99.84-174.933-104.533-177.92zM448 832c-23.564 0-42.667-19.103-42.667-42.667v0c2.875-34.108 18.726-64.041 42.537-85.22l0.13-0.113c23.94 21.292 39.792 51.225 42.635 84.863l0.032 0.47c0 23.564-19.103 42.667-42.667 42.667v0zM896 320h-34.133c-4.812-20.513-12.457-38.604-22.633-54.956l0.446 0.769 23.893-23.893c6.377-7.412 10.259-17.129 10.259-27.753 0-23.564-19.103-42.667-42.667-42.667-10.624 0-20.341 3.883-27.809 10.307l0.056-0.047-23.893 23.893c-15.583-9.73-33.674-17.375-52.956-21.941l-1.231-0.246v-34.133c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 34.133c-20.356 4.732-38.313 12.383-54.478 22.611l0.718-0.424-24.32-23.893c-7.412-6.377-17.129-10.259-27.753-10.259-23.564 0-42.667 19.103-42.667 42.667 0 10.624 3.883 20.341 10.307 27.809l-0.047-0.056 23.893 24.32c-3.84 6.4-6.827 13.653-10.24 20.48-20.193-5.922-43.395-9.348-67.392-9.387l-0.022-0c-0.043-0-0.094-0-0.145-0-128.287 0-234.535 94.364-253.119 217.467l-0.175 1.413c-63.535 18.112-109.274 75.645-109.274 143.86 0 60.886 36.438 113.261 88.696 136.509l0.951 0.378c5.046 2.059 10.896 3.302 17.022 3.413l0.045 0.001c0.103 0.001 0.226 0.001 0.348 0.001 23.564 0 42.667-19.103 42.667-42.667 0-17.524-10.565-32.581-25.673-39.148l-0.276-0.107c-22.766-9.878-38.401-32.161-38.401-58.096 0-0.126 0-0.251 0.001-0.377l-0 0.019c0-35.346 28.654-64 64-64v0c23.564 0 42.667-19.103 42.667-42.667v0c0.44-93.923 76.681-169.892 170.665-169.892 74.265 0 137.45 47.434 160.913 113.658l0.369 1.194c5.038 14.827 17.602 25.829 33.023 28.549l0.257 0.038c48.076 7.319 84.486 48.367 84.486 97.919 0 34.331-17.477 64.58-44.020 82.335l-0.359 0.226c-11.737 7.768-19.372 20.912-19.372 35.84 0 23.659 19.18 42.839 42.839 42.839 8.732 0 16.853-2.612 23.626-7.098l-0.159 0.099c50.408-33.246 83.213-89.619 83.213-153.653 0-24.251-4.705-47.403-13.252-68.592l0.439 1.232 5.547 5.547c7.667 7.606 18.211 12.323 29.857 12.373l0.010 0c0.073 0 0.16 0.001 0.247 0.001 11.721 0 22.338-4.726 30.049-12.377l-0.003 0.003c7.668-7.712 12.407-18.343 12.407-30.080s-4.74-22.368-12.409-30.082l0.002 0.002-23.893-23.893c9.006-15.628 15.956-33.772 19.856-53.023l0.197-1.164h34.133c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM753.493 433.067v0c-7.361 6.85-15.793 12.691-24.987 17.22l-0.613 0.273c-13.007-9.589-27.961-17.664-43.989-23.5l-1.237-0.394c-20.261-43.562-50.674-79.451-88.321-105.678l-0.852-0.562c4.929-11.407 11.542-21.164 19.645-29.459l-0.018 0.019c18.363-17.057 43.053-27.523 70.187-27.523s51.823 10.466 70.251 27.582l-0.065-0.059c17.65 18.183 28.531 43.021 28.531 70.4s-10.881 52.217-28.556 70.425l0.024-0.025z"],"attrs":[],"grid":0,"tags":["cloud-sun-tear"]},"attrs":[],"properties":{"order":4753,"id":931,"name":"cloud-sun-tear","prevSize":32,"code":59922},"setIdx":0,"setId":0,"iconIdx":274},{"icon":{"paths":["M896 384h-34.133c-4.812-20.513-12.457-38.604-22.633-54.956l0.446 0.769 23.893-23.893c6.377-7.412 10.259-17.129 10.259-27.753 0-23.564-19.103-42.667-42.667-42.667-10.624 0-20.341 3.883-27.809 10.307l0.056-0.047-23.893 23.893c-15.583-9.73-33.674-17.375-52.956-21.941l-1.231-0.246v-34.133c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 34.133c-20.356 4.732-38.313 12.383-54.478 22.611l0.718-0.424-24.32-23.893c-7.412-6.377-17.129-10.259-27.753-10.259-23.564 0-42.667 19.103-42.667 42.667 0 10.624 3.883 20.341 10.307 27.809l-0.047-0.056 23.893 24.32c-3.84 6.4-6.827 13.653-10.24 20.48-20.193-5.922-43.395-9.348-67.392-9.387l-0.022-0c-0.043-0-0.094-0-0.145-0-128.287 0-234.535 94.364-253.119 217.467l-0.175 1.413c-63.402 18.2-109.012 75.667-109.012 143.787 0 82.399 66.737 149.211 149.107 149.333l0.012 0h391.253c102.033 0 184.747-82.714 184.747-184.747v-0c-0.041-23.833-4.739-46.557-13.232-67.327l0.432 1.193 5.547 5.12c7.667 7.606 18.211 12.323 29.857 12.373l0.010 0c0.073 0 0.16 0.001 0.247 0.001 11.721 0 22.338-4.726 30.049-12.377l-0.003 0.003c7.668-7.712 12.407-18.343 12.407-30.080s-4.74-22.368-12.409-30.082l0.002 0.002-23.893-23.893c9.73-15.583 17.375-33.674 21.941-52.956l0.246-1.231h34.133c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM625.92 768h-391.253c-35.346 0-64-28.654-64-64s28.654-64 64-64v0c23.564 0 42.667-19.103 42.667-42.667v0c0.44-93.923 76.681-169.892 170.665-169.892 74.265 0 137.45 47.434 160.913 113.658l0.369 1.194c5.038 14.827 17.602 25.829 33.023 28.549l0.257 0.038c46.492 8.925 81.143 49.276 81.143 97.72 0 54.331-43.584 98.483-97.697 99.399l-0.086 0.001zM753.92 497.067v0c-7.284 6.866-15.742 12.592-25.021 16.83l-0.579 0.237c-13.136-8.682-28.248-16.060-44.3-21.372l-1.353-0.388c-20.261-43.562-50.674-79.451-88.321-105.678l-0.852-0.562c4.929-11.407 11.542-21.164 19.645-29.459l-0.018 0.019c18.363-17.057 43.053-27.523 70.187-27.523s51.823 10.466 70.251 27.582l-0.065-0.059c17.65 18.183 28.531 43.021 28.531 70.4s-10.881 52.217-28.556 70.425l0.024-0.025z"],"attrs":[],"grid":0,"tags":["cloud-sun"]},"attrs":[],"properties":{"order":4754,"id":930,"name":"cloud-sun","prevSize":32,"code":59923},"setIdx":0,"setId":0,"iconIdx":275},{"icon":{"paths":["M785.92 350.72c-47.208-106.522-152.012-179.486-273.857-179.486-151.36 0-276.423 112.594-296.001 258.594l-0.168 1.532c-75.666 18.574-130.919 85.822-130.919 165.974 0 94.257 76.41 170.667 170.667 170.667 0.126 0 0.253-0 0.379-0l-0.020 0c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0c-47.128 0-85.333-38.205-85.333-85.333s38.205-85.333 85.333-85.333v0c23.564 0 42.667-19.103 42.667-42.667v0c0.262-117.622 95.674-212.873 213.333-212.873 93.059 0 172.202 59.585 201.357 142.684l0.457 1.495c5.038 14.827 17.602 25.829 33.023 28.549l0.257 0.038c59.742 11.591 104.232 63.487 104.232 125.774 0 58.59-39.365 107.986-93.090 123.181l-0.902 0.218c-18.59 4.908-32.072 21.573-32.072 41.387 0 23.604 19.135 42.739 42.739 42.739 3.79 0 7.466-0.493 10.965-1.42l-0.298 0.067c92.152-24.941 158.832-107.811 158.832-206.254 0-95.793-63.137-176.839-150.067-203.796l-1.511-0.404zM627.627 609.707c-7.733-7.795-18.45-12.621-30.293-12.621s-22.56 4.826-30.291 12.618l-0.003 0.003-55.040 55.467-55.040-55.467c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l-0-0 55.467 55.040-55.467 55.040c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 55.040-55.467 55.040 55.467c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003-55.467-55.040 55.467-55.040c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003z"],"attrs":[],"grid":0,"tags":["cloud-times"]},"attrs":[],"properties":{"order":4755,"id":929,"name":"cloud-times","prevSize":32,"code":59924},"setIdx":0,"setId":0,"iconIdx":276},{"icon":{"paths":["M597.333 661.333h-128v-42.667c-0.009-0.326-0.014-0.709-0.014-1.094 0-23.564 19.103-42.667 42.667-42.667 16.15 0 30.204 8.973 37.449 22.205l0.111 0.222c7.607 12.421 21.104 20.584 36.507 20.584 8.105 0 15.682-2.26 22.135-6.184l-0.189 0.107c12.111-7.667 20.035-20.993 20.035-36.17 0-7.721-2.051-14.963-5.638-21.212l0.11 0.208c-5.777-9.539-12.267-17.793-19.63-25.176l0.003 0.003c-23.072-23.74-55.22-38.554-90.829-38.826l-0.051-0c-70.692 0-128 57.308-128 128v0 50.347c-49.617 18.379-84.34 65.296-84.34 120.324 0 70.343 56.743 127.434 126.954 127.996l0.053 0h170.667c70.692 0 128-57.308 128-128s-57.308-128-128-128v0zM597.333 832h-170.667c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667v0h170.667c23.564 0 42.667 19.103 42.667 42.667s-19.103 42.667-42.667 42.667v0zM785.92 286.72c-47.208-106.522-152.012-179.486-273.857-179.486-151.36 0-276.423 112.594-296.001 258.594l-0.168 1.532c-75.345 18.809-130.279 85.899-130.279 165.819 0 73.972 47.061 136.952 112.876 160.634l1.19 0.374c4.073 1.301 8.762 2.077 13.625 2.133l0.029 0c2.052 0.345 4.416 0.543 6.827 0.543 23.864 0 43.209-19.345 43.209-43.209 0-21.454-15.635-39.255-36.132-42.633l-0.251-0.034c-32.334-11.916-55.194-41.976-56.317-77.52l-0.003-0.133c0-47.128 38.205-85.333 85.333-85.333v0c23.564 0 42.667-19.103 42.667-42.667v0c0.262-117.622 95.674-212.873 213.333-212.873 93.059 0 172.202 59.585 201.357 142.684l0.457 1.495c5.038 14.827 17.602 25.829 33.023 28.549l0.257 0.038c60.216 11.193 105.203 63.319 105.203 125.954 0 46.532-24.829 87.264-61.962 109.671l-0.574 0.322c-12.929 7.531-21.48 21.327-21.48 37.12 0 23.645 19.168 42.814 42.814 42.814 7.852 0 15.21-2.114 21.537-5.803l-0.203 0.11c63.977-37.629 106.24-106.131 106.24-184.505 0-0.085-0-0.17-0-0.255l0 0.013c-0.28-95.977-63.896-177.021-151.236-203.552l-1.511-0.395z"],"attrs":[],"grid":0,"tags":["cloud-unlock"]},"attrs":[],"properties":{"order":4756,"id":928,"name":"cloud-unlock","prevSize":32,"code":59925},"setIdx":0,"setId":0,"iconIdx":277},{"icon":{"paths":["M785.92 350.72c-47.208-106.522-152.012-179.486-273.857-179.486-151.36 0-276.423 112.594-296.001 258.594l-0.168 1.532c-75.666 18.574-130.919 85.822-130.919 165.974 0 94.257 76.41 170.667 170.667 170.667 0.126 0 0.253-0 0.379-0l-0.020 0c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0c-47.128 0-85.333-38.205-85.333-85.333s38.205-85.333 85.333-85.333v0c23.564 0 42.667-19.103 42.667-42.667v0c0.262-117.622 95.674-212.873 213.333-212.873 93.059 0 172.202 59.585 201.357 142.684l0.457 1.495c5.038 14.827 17.602 25.829 33.023 28.549l0.257 0.038c59.742 11.591 104.232 63.487 104.232 125.774 0 58.59-39.365 107.986-93.090 123.181l-0.902 0.218c-18.59 4.908-32.072 21.573-32.072 41.387 0 23.604 19.135 42.739 42.739 42.739 3.79 0 7.466-0.493 10.965-1.42l-0.298 0.067c92.152-24.941 158.832-107.811 158.832-206.254 0-95.793-63.137-176.839-150.067-203.796l-1.511-0.404zM542.293 439.040c-3.937-3.773-8.616-6.808-13.791-8.859l-0.289-0.101c-4.793-2.024-10.366-3.201-16.213-3.201s-11.42 1.176-16.495 3.305l0.281-0.105c-5.464 2.152-10.143 5.187-14.095 8.974l0.015-0.014-128 128c-7.753 7.753-12.548 18.463-12.548 30.293 0 23.661 19.181 42.841 42.841 42.841 11.83 0 22.541-4.795 30.293-12.548l-0 0 55.040-55.467v238.507c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-238.507l55.040 55.467c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003z"],"attrs":[],"grid":0,"tags":["cloud-upload"]},"attrs":[],"properties":{"order":4757,"id":927,"name":"cloud-upload","prevSize":32,"code":59926},"setIdx":0,"setId":0,"iconIdx":278},{"icon":{"paths":["M362.667 253.44c42.936-24.759 94.429-39.365 149.333-39.365s106.397 14.606 150.805 40.145l-1.471-0.78c6.133 3.613 13.511 5.748 21.388 5.748 15.791 0 29.578-8.578 36.956-21.329l0.11-0.205c3.499-6.055 5.563-13.32 5.563-21.067 0-15.716-8.497-29.448-21.148-36.851l-0.202-0.109c-55.214-31.788-121.417-50.54-192-50.54s-136.786 18.752-193.899 51.545l1.899-1.005c-12.853 7.512-21.35 21.244-21.35 36.96 0 7.747 2.064 15.011 5.673 21.273l-0.11-0.207c7.488 12.956 21.275 21.534 37.066 21.534 7.877 0 15.255-2.134 21.588-5.856l-0.2 0.109zM785.92 478.293c-5.101-11.938-10.241-21.888-15.994-31.426l0.634 1.133c-7.621-12.353-21.080-20.462-36.433-20.462-8.311 0-16.067 2.376-22.625 6.486l0.178-0.104c-12.245 7.642-20.272 21.042-20.272 36.317 0 8.183 2.304 15.828 6.298 22.321l-0.106-0.185c6.055 10.219 11.535 22.060 15.802 34.466l0.411 1.374c5.038 14.827 17.602 25.829 33.023 28.549l0.257 0.038c60.629 10.744 106.103 62.975 106.24 125.852l0 0.015c0 70.692-57.308 128-128 128v0h-483.84c-35.773-5.656-63.861-32.881-70.738-67.725l-0.089-0.542c-1.099-5.136-1.728-11.037-1.728-17.084 0-47.128 38.205-85.333 85.333-85.333 0.607 0 1.213 0.006 1.818 0.019l-0.090-0.001c23.564 0 42.667-19.103 42.667-42.667v0c-0-0.143-0.001-0.312-0.001-0.482 0-38.97 10.619-75.459 29.121-106.733l-0.534 0.975c3.613-6.133 5.748-13.511 5.748-21.388 0-15.791-8.578-29.578-21.329-36.956l-0.205-0.11c-6.055-3.499-13.32-5.563-21.067-5.563-15.716 0-29.448 8.497-36.851 21.148l-0.109 0.202c-19.057 31.89-32.351 69.42-37.401 109.516l-0.146 1.418c-36.737 9.147-67.877 29.201-90.66 56.476l-0.22 0.271c-25.32 29.593-40.729 68.322-40.729 110.649 0 86.503 64.356 157.975 147.801 169.148l0.875 0.096h492.373c117.568-0.334 212.745-95.718 212.745-213.333 0-96.006-63.418-177.2-150.648-203.975l-1.511-0.399zM634.453 384s0 0 0-2.56c2.121-2.474 3.971-5.279 5.444-8.301l0.102-0.232c1.794-4.537 2.835-9.794 2.835-15.293 0-17.982-11.125-33.366-26.867-39.646l-0.288-0.101c-21.791-8.361-47.028-14.131-73.314-16.156l-0.926-0.057c-4.267 0-8.533 0-12.8 0-5.172-0.408-11.199-0.641-17.28-0.641s-12.108 0.233-18.072 0.689l0.792-0.049c-1.975-0.109-4.287-0.171-6.613-0.171s-4.638 0.062-6.934 0.185l0.32-0.014c-27.212 2.082-52.449 7.852-76.104 16.835l1.864-0.622c-15.242 6.734-25.686 21.718-25.686 39.142 0 5.728 1.129 11.192 3.176 16.182l-0.103-0.284c1.589 3.094 3.29 5.749 5.209 8.226l-0.089-0.119c-0.068 0.703-0.106 1.52-0.106 2.347s0.038 1.643 0.114 2.45l-0.008-0.103c7.53 12.777 21.22 21.215 36.882 21.215 7.952 0 15.395-2.175 21.768-5.963l-0.197 0.108c18.436-10.468 40.497-16.638 64-16.638s45.564 6.17 64.654 16.978l-0.654-0.34c6.082 3.538 13.386 5.627 21.177 5.627 16.256 0 30.388-9.091 37.591-22.466l0.112-0.227zM469.333 512c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667c0-23.564-19.103-42.667-42.667-42.667v0c-23.564 0-42.667 19.103-42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["cloud-wifi"]},"attrs":[],"properties":{"order":4758,"id":926,"name":"cloud-wifi","prevSize":32,"code":59927},"setIdx":0,"setId":0,"iconIdx":279},{"icon":{"paths":["M213.333 768c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM810.667 597.333h-298.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h298.667c23.564 0 42.667 19.103 42.667 42.667s-19.103 42.667-42.667 42.667v0c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0c70.692 0 128-57.308 128-128s-57.308-128-128-128v0zM597.333 469.333c0 23.564 19.103 42.667 42.667 42.667v0h170.667c70.692 0 128-57.308 128-128v0c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0c0 23.564-19.103 42.667-42.667 42.667v0h-170.667c-23.564 0-42.667 19.103-42.667 42.667v0zM426.667 640c0-23.564-19.103-42.667-42.667-42.667v0h-128c-47.128 0-85.333-38.205-85.333-85.333s38.205-85.333 85.333-85.333v0c23.564 0 42.667-19.103 42.667-42.667v0c0.262-117.622 95.674-212.873 213.333-212.873 93.059 0 172.202 59.585 201.357 142.684l0.457 1.495c5.875 17.071 21.797 29.118 40.533 29.118 23.622 0 42.771-19.149 42.771-42.771 0-4.886-0.819-9.581-2.328-13.954l0.090 0.301c-41.266-118.777-152.237-202.509-282.764-202.509-151.506 0-276.663 112.81-296.058 259.014l-0.165 1.521c-75.666 18.574-130.919 85.822-130.919 165.974 0 94.257 76.41 170.667 170.667 170.667 0.126 0 0.253-0 0.379-0l-0.020 0h128c23.564 0 42.667-19.103 42.667-42.667v0zM426.667 469.333c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667c0-23.564-19.103-42.667-42.667-42.667v0c-23.564 0-42.667 19.103-42.667 42.667v0zM597.333 768h-213.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h213.333c23.564 0 42.667 19.103 42.667 42.667v0c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0c0-70.692-57.308-128-128-128v0z"],"attrs":[],"grid":0,"tags":["cloud-wind"]},"attrs":[],"properties":{"order":4759,"id":925,"name":"cloud-wind","prevSize":32,"code":59928},"setIdx":0,"setId":0,"iconIdx":280},{"icon":{"paths":["M785.92 392.96c-47.23-106.469-152.007-179.388-273.815-179.388-151.477 0-276.616 112.767-296.047 258.931l-0.166 1.524c-75.666 18.574-130.919 85.822-130.919 165.974 0 94.257 76.41 170.667 170.667 170.667 0.126 0 0.253-0 0.379-0l-0.020 0h469.333c117.568-0.334 212.745-95.718 212.745-213.333 0-96.006-63.418-177.2-150.648-203.975l-1.511-0.399zM725.333 725.333h-469.333c-47.128 0-85.333-38.205-85.333-85.333s38.205-85.333 85.333-85.333v0c23.564 0 42.667-19.103 42.667-42.667v0c0.262-117.622 95.674-212.873 213.333-212.873 93.059 0 172.202 59.585 201.357 142.684l0.457 1.495c5.163 14.65 17.694 25.478 33.026 28.124l0.254 0.036c60.007 11.37 104.774 63.394 104.774 125.875 0 70.177-56.475 127.163-126.455 127.991l-0.078 0.001z"],"attrs":[],"grid":0,"tags":["cloud"]},"attrs":[],"properties":{"order":4760,"id":924,"name":"cloud","prevSize":32,"code":59929},"setIdx":0,"setId":0,"iconIdx":281},{"icon":{"paths":["M830.72 449.707c-41.065-89.752-130.068-150.995-233.381-151.040l-0.006-0c-21.144 0.176-41.556 2.967-61.035 8.064l1.728-0.384c-39.135-54.749-102.488-90.011-174.076-90.011-104.392 0-191.272 74.981-209.72 174.025l-0.204 1.318c-49.776 18.295-84.643 65.293-84.643 120.433 0 68.799 54.279 124.92 122.349 127.878l0.267 0.009h42.667c-0.213 3.189-0.334 6.914-0.334 10.667s0.121 7.477 0.36 11.17l-0.026-0.503c0 82.475 66.859 149.333 149.333 149.333v0h391.253c102.019-0.019 184.714-82.725 184.714-184.747 0-82.213-53.701-151.884-127.94-175.849l-1.307-0.365zM192 554.667c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667v0c23.564 0 42.667-19.103 42.667-42.667v0c0-70.692 57.308-128 128-128v0c37.599 0.208 71.33 16.596 94.615 42.547l0.105 0.12c-59.969 39.439-101.952 102.033-113.308 174.772l-0.185 1.441c-25.101 7.21-46.647 20.060-64.021 37.141l0.021-0.021zM775.253 725.333h-391.253c-35.346 0-64-28.654-64-64s28.654-64 64-64v0c23.564 0 42.667-19.103 42.667-42.667v0c0.44-93.923 76.681-169.892 170.665-169.892 74.265 0 137.45 47.434 160.913 113.658l0.369 1.194c5.038 14.827 17.602 25.829 33.023 28.549l0.257 0.038c46.492 8.925 81.143 49.276 81.143 97.72 0 54.331-43.584 98.483-97.697 99.399l-0.086 0.001z"],"attrs":[],"grid":0,"tags":["clouds"]},"attrs":[],"properties":{"order":4761,"id":923,"name":"clouds","prevSize":32,"code":59930},"setIdx":0,"setId":0,"iconIdx":282},{"icon":{"paths":["M896 533.333c-0.389-98.854-61.62-183.309-148.172-217.893l-1.588-0.56c0-129.603-105.064-234.667-234.667-234.667s-234.667 105.064-234.667 234.667v0c-87.955 35.194-148.954 119.7-148.954 218.453 0 129.603 105.064 234.667 234.667 234.667 0.017 0 0.033-0 0.050-0l8.531 0c-11.57 39.153-29.701 73.163-53.35 102.543l0.444-0.57c-5.527 7.122-8.86 16.187-8.86 26.030 0 23.379 18.803 42.366 42.112 42.663l0.028 0h320.853c0.043 0 0.094 0 0.145 0 23.564 0 42.667-19.103 42.667-42.667 0-10.224-3.596-19.609-9.593-26.957l0.061 0.077c-23.115-28.576-41.229-62.287-52.363-99.032l-0.544-2.088h8.533c129.505-0.242 234.424-105.161 234.667-234.643l0-0.023zM429.227 853.333c15.987-31.649 28.054-68.374 34.272-107.056l0.288-2.171c18.386-8.59 34.23-18.56 48.657-30.213l-0.444 0.347c13.984 11.307 29.828 21.277 46.789 29.264l1.424 0.603c6.506 40.853 18.573 77.578 35.554 111.412l-0.994-2.185zM545.28 627.2l-6.827-6.827h-2.987l-7.68-3.84-7.68-2.56h-16.213l-7.68 2.56c-2.777 0.917-5.185 2.223-7.306 3.88l0.053-0.040h-3.413l-6.827 6.827c-27.597 33.926-69.343 55.423-116.109 55.423-82.475 0-149.333-66.859-149.333-149.333 0-71.156 49.767-130.688 116.391-145.688l0.998-0.189c2.654-1.078 4.899-2.222 7.033-3.531l-0.206 0.118c3.037-1.111 5.569-2.261 8.002-3.572l-0.322 0.159c2.24-1.655 4.199-3.478 5.934-5.499l0.040-0.047c4.198-3.337 7.331-7.85 8.911-13.039l0.049-0.187c1.279-2.088 2.305-4.505 2.949-7.074l0.038-0.179c0.198-1.282 0.311-2.761 0.311-4.267s-0.113-2.984-0.331-4.429l0.020 0.162c0.098-1.086 0.154-2.35 0.154-3.627s-0.056-2.54-0.166-3.788l0.011 0.162c-0.203-2.871-0.318-6.222-0.318-9.6s0.115-6.729 0.343-10.049l-0.025 0.449c0-82.475 66.859-149.333 149.333-149.333s149.333 66.859 149.333 149.333v0c0.203 2.871 0.318 6.222 0.318 9.6s-0.115 6.729-0.343 10.049l0.025-0.449c-0.108 1.024-0.169 2.211-0.169 3.413s0.061 2.39 0.181 3.56l-0.012-0.147c-0.203 1.346-0.319 2.9-0.319 4.48s0.116 3.134 0.34 4.652l-0.021-0.172c0.682 2.748 1.708 5.166 3.052 7.368l-0.065-0.114c1.629 5.377 4.762 9.89 8.906 13.185l0.054 0.042c1.774 2.069 3.733 3.892 5.877 5.479l0.096 0.068c2.111 1.153 4.643 2.303 7.261 3.277l0.419 0.137c1.904 1.046 4.157 2.054 6.495 2.884l0.331 0.102c67.623 15.189 117.389 74.721 117.389 145.877 0 82.475-66.859 149.333-149.333 149.333-46.767 0-88.512-21.498-115.894-55.15l-0.216-0.274z"],"attrs":[],"grid":0,"tags":["club"]},"attrs":[],"properties":{"order":4762,"id":922,"name":"club","prevSize":32,"code":59931},"setIdx":0,"setId":0,"iconIdx":283},{"icon":{"paths":["M725.333 258.56c-70.656 0.048-127.915 57.337-127.915 128 0 52.955 32.158 98.4 78.010 117.871l0.838 0.316c-13.212 31.081-43.485 52.48-78.756 52.48-0.062 0-0.125-0-0.187-0l0.010 0h-170.667c-31.541 0.136-60.983 9.005-86.067 24.31l0.734-0.416v-244.907c50.14-18.103 85.333-65.281 85.333-120.68 0-70.692-57.308-128-128-128s-128 57.308-128 128c0 55.398 35.193 102.577 84.442 120.398l0.891 0.282v356.693c-49.798 18.284-84.683 65.292-84.683 120.448 0 70.692 57.308 128 128 128s128-57.308 128-128c0-53.073-32.3-98.601-78.315-118l-0.841-0.315c13.179-31.006 43.334-52.374 78.493-52.48l0.014-0h170.667c81.547-0.017 149.727-57.224 166.617-133.694l0.21-1.133c50.92-17.676 86.82-65.243 86.82-121.195 0-69.865-55.974-126.657-125.523-127.977l-0.123-0.002zM298.667 173.227c23.564 0 42.667 19.103 42.667 42.667s-19.103 42.667-42.667 42.667c-23.564 0-42.667-19.103-42.667-42.667v0c0-23.564 19.103-42.667 42.667-42.667v0zM298.667 855.893c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667c23.564 0 42.667 19.103 42.667 42.667v0c0 23.564-19.103 42.667-42.667 42.667v0zM725.333 429.227c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667c23.564 0 42.667 19.103 42.667 42.667v0c0 23.564-19.103 42.667-42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["code-branch"]},"attrs":[],"properties":{"order":4763,"id":921,"name":"code-branch","prevSize":32,"code":59932},"setIdx":0,"setId":0,"iconIdx":284},{"icon":{"paths":["M384 725.333h170.667c117.821 0 213.333-95.513 213.333-213.333v0-42.667h42.667c70.692 0 128-57.308 128-128s-57.308-128-128-128v0h-42.667v-42.667c0-23.564-19.103-42.667-42.667-42.667v0h-512c-23.564 0-42.667 19.103-42.667 42.667v0 341.333c0 117.821 95.513 213.333 213.333 213.333v0zM768 298.667h42.667c23.564 0 42.667 19.103 42.667 42.667s-19.103 42.667-42.667 42.667v0h-42.667zM256 213.333h426.667v298.667c0 70.692-57.308 128-128 128v0h-170.667c-70.692 0-128-57.308-128-128v0zM896 810.667h-768c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h768c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["coffee"]},"attrs":[],"properties":{"order":4764,"id":920,"name":"coffee","prevSize":32,"code":59933},"setIdx":0,"setId":0,"iconIdx":285},{"icon":{"paths":["M909.653 407.467l-80.64-26.88 37.973-75.947c2.691-5.433 4.265-11.83 4.265-18.595 0-11.72-4.725-22.336-12.375-30.047l0.003 0.003-90.88-90.88c-7.723-7.73-18.395-12.512-30.185-12.512-6.877 0-13.374 1.627-19.127 4.517l0.246-0.112-75.947 37.973-26.88-80.64c-5.836-16.913-21.556-28.871-40.090-29.013l-0.017-0h-128c-0.033-0-0.071-0-0.11-0-18.678 0-34.552 12.002-40.333 28.714l-0.090 0.3-26.88 80.64-75.947-37.973c-5.433-2.691-11.83-4.265-18.595-4.265-11.72 0-22.336 4.725-30.047 12.375l0.003-0.003-90.88 90.88c-7.73 7.723-12.512 18.395-12.512 30.185 0 6.877 1.627 13.374 4.517 19.127l-0.112-0.246 37.973 75.947-80.64 26.88c-16.913 5.836-28.871 21.556-29.013 40.090l-0 0.017v128c-0 0.033-0 0.071-0 0.11 0 18.678 12.002 34.552 28.714 40.333l0.3 0.090 80.64 26.88-37.973 75.947c-2.691 5.433-4.265 11.83-4.265 18.595 0 11.72 4.725 22.336 12.375 30.047l-0.003-0.003 90.88 90.88c7.723 7.73 18.395 12.512 30.185 12.512 6.877 0 13.374-1.627 19.127-4.517l-0.246 0.112 75.947-37.973 26.88 80.64c5.871 17.012 21.745 29.013 40.423 29.013 0.039 0 0.077-0 0.116-0l-0.006 0h128c0.033 0 0.071 0 0.11 0 18.678 0 34.552-12.002 40.333-28.714l0.090-0.3 26.88-80.64 75.947 37.973c5.358 2.605 11.655 4.128 18.308 4.128 11.651 0 22.211-4.67 29.911-12.24l-0.006 0.006 90.88-90.88c7.73-7.723 12.512-18.395 12.512-30.185 0-6.877-1.627-13.374-4.517-19.127l0.112 0.246-37.973-75.947 80.64-26.88c16.913-5.836 28.871-21.556 29.013-40.090l0-0.017v-128c0-0.033 0-0.071 0-0.11 0-18.678-12.002-34.552-28.714-40.333l-0.3-0.090zM853.333 545.28l-51.2 17.067c-34.534 11.45-59.004 43.452-59.004 81.17 0 14.3 3.518 27.779 9.735 39.618l-0.224-0.468 24.32 48.64-46.933 46.933-47.36-25.6c-11.090-5.646-24.185-8.954-38.053-8.954-37.512 0-69.37 24.204-80.81 57.847l-0.177 0.601-17.067 51.2h-67.84l-17.067-51.2c-11.45-34.534-43.452-59.004-81.17-59.004-14.3 0-27.779 3.518-39.618 9.735l0.468-0.224-48.64 24.32-46.933-46.933 25.6-47.36c5.993-11.371 9.511-24.85 9.511-39.15 0-37.718-24.471-69.72-58.402-80.996l-0.603-0.174-51.2-17.067v-66.56l51.2-17.067c34.534-11.45 59.004-43.452 59.004-81.17 0-14.3-3.518-27.779-9.735-39.618l0.224 0.468-24.32-47.36 46.933-46.933 47.36 24.32c11.371 5.993 24.85 9.511 39.15 9.511 37.718 0 69.72-24.471 80.996-58.402l0.174-0.603 17.067-51.2h66.56l17.067 51.2c11.45 34.534 43.452 59.004 81.17 59.004 14.3 0 27.779-3.518 39.618-9.735l-0.468 0.224 48.64-24.32 46.933 46.933-25.6 47.36c-5.646 11.090-8.954 24.185-8.954 38.053 0 37.512 24.204 69.37 57.847 80.81l0.601 0.177 51.2 17.067zM512 341.333c-94.257 0-170.667 76.41-170.667 170.667s76.41 170.667 170.667 170.667c94.257 0 170.667-76.41 170.667-170.667v0c0-94.257-76.41-170.667-170.667-170.667v0zM512 597.333c-47.128 0-85.333-38.205-85.333-85.333s38.205-85.333 85.333-85.333c47.128 0 85.333 38.205 85.333 85.333v0c0 47.128-38.205 85.333-85.333 85.333v0z"],"attrs":[],"grid":0,"tags":["cog"]},"attrs":[],"properties":{"order":4765,"id":919,"name":"cog","prevSize":32,"code":59934},"setIdx":0,"setId":0,"iconIdx":286},{"icon":{"paths":["M905.387 512c20.473-22.461 33.077-52.406 33.28-85.292l0-0.041c0-70.692-57.308-128-128-128v0h-221.013c4.638-12.705 7.321-27.373 7.321-42.667 0-70.566-57.103-127.795-127.621-127.999l-0.020-0h-256c-70.692 0-128 57.308-128 128v0c0.203 32.927 12.807 62.872 33.371 85.435l-0.091-0.102c-20.227 22.54-32.594 52.493-32.594 85.333s12.368 62.793 32.7 85.453l-0.105-0.119c-20.227 22.54-32.594 52.493-32.594 85.333s12.368 62.793 32.7 85.453l-0.105-0.119c-20.473 22.461-33.077 52.406-33.28 85.292l-0 0.041c0 70.692 57.308 128 128 128v0h597.333c70.398-0.388 127.316-57.546 127.316-127.998 0-32.842-12.368-62.795-32.701-85.455l0.105 0.119c20.227-22.54 32.594-52.493 32.594-85.333s-12.368-62.793-32.7-85.453l0.105 0.119zM469.333 810.667h-256c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667v0h256c23.564 0 42.667 19.103 42.667 42.667s-19.103 42.667-42.667 42.667v0zM469.333 640h-256c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667v0h256c23.564 0 42.667 19.103 42.667 42.667s-19.103 42.667-42.667 42.667v0zM469.333 469.333h-256c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667v0h256c23.564 0 42.667 19.103 42.667 42.667s-19.103 42.667-42.667 42.667v0zM469.333 298.667h-256c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667v0h256c23.564 0 42.667 19.103 42.667 42.667s-19.103 42.667-42.667 42.667v0zM840.107 798.293c-7.246 7.631-17.466 12.379-28.795 12.379-0.227 0-0.453-0.002-0.679-0.006l0.034 0h-221.013c4.859-12.678 7.674-27.344 7.674-42.667s-2.814-29.988-7.954-43.508l0.281 0.841h221.013c23.564 0 42.667 19.103 42.667 42.667v0c-0.171 11.925-5.208 22.641-13.21 30.277l-0.017 0.016zM840.107 627.627c-7.246 7.631-17.466 12.379-28.795 12.379-0.227 0-0.453-0.002-0.679-0.006l0.034 0h-221.013c4.859-12.678 7.674-27.344 7.674-42.667s-2.814-29.988-7.954-43.508l0.281 0.841h221.013c23.564 0 42.667 19.103 42.667 42.667v0c-0.171 11.925-5.208 22.641-13.21 30.277l-0.017 0.016zM840.107 456.96c-7.246 7.631-17.466 12.379-28.795 12.379-0.227 0-0.453-0.002-0.679-0.006l0.034 0h-221.013c4.859-12.678 7.674-27.344 7.674-42.667s-2.814-29.988-7.954-43.508l0.281 0.841h221.013c23.564 0 42.667 19.103 42.667 42.667v0c-0.171 11.925-5.208 22.641-13.21 30.277l-0.017 0.016z"],"attrs":[],"grid":0,"tags":["coins"]},"attrs":[],"properties":{"order":4766,"id":918,"name":"coins","prevSize":32,"code":59935},"setIdx":0,"setId":0,"iconIdx":287},{"icon":{"paths":["M896 85.333h-768c-23.564 0-42.667 19.103-42.667 42.667v0 768c0 23.564 19.103 42.667 42.667 42.667v0h768c23.564 0 42.667-19.103 42.667-42.667v0-768c0-23.564-19.103-42.667-42.667-42.667v0zM469.333 853.333h-298.667v-682.667h298.667zM853.333 853.333h-298.667v-682.667h298.667z"],"attrs":[],"grid":0,"tags":["columns"]},"attrs":[],"properties":{"order":4767,"id":917,"name":"columns","prevSize":32,"code":59936},"setIdx":0,"setId":0,"iconIdx":288},{"icon":{"paths":["M213.333 341.333c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-42.667v-42.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 42.667h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h42.667zM768 213.333h-256c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h256c23.564 0 42.667 19.103 42.667 42.667v0 414.72l-66.987-61.867c-7.573-7.104-17.778-11.48-29.005-11.52l-0.008-0h-373.333c-23.564 0-42.667-19.103-42.667-42.667v0-128c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 128c0 70.692 57.308 128 128 128v0h356.693l128 116.48c7.163 6.738 16.691 11.033 27.213 11.517l0.094 0.003c6.166-0.069 12.022-1.317 17.379-3.527l-0.312 0.114c15.195-6.753 25.6-21.714 25.6-39.105 0-0.052-0-0.104-0-0.157l0 0.008v-512c0-70.692-57.308-128-128-128v0z"],"attrs":[],"grid":0,"tags":["comment-add"]},"attrs":[],"properties":{"order":4768,"id":916,"name":"comment-add","prevSize":32,"code":59937},"setIdx":0,"setId":0,"iconIdx":289},{"icon":{"paths":["M810.667 256h-170.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h170.667c23.564 0 42.667 19.103 42.667 42.667v0 414.72l-66.987-61.867c-7.573-7.104-17.778-11.48-29.005-11.52l-0.008-0h-373.333c-23.564 0-42.667-19.103-42.667-42.667v0-42.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 42.667c0 70.692 57.308 128 128 128v0h356.693l128 116.48c7.163 6.738 16.691 11.033 27.213 11.517l0.094 0.003c6.166-0.069 12.022-1.317 17.379-3.527l-0.312 0.114c15.195-6.753 25.6-21.714 25.6-39.105 0-0.052-0-0.104-0-0.157l0 0.008v-512c0-70.692-57.308-128-128-128v0zM449.707 449.707c38.719-38.625 62.674-92.035 62.674-151.040 0-117.821-95.513-213.333-213.333-213.333s-213.333 95.513-213.333 213.333c0 117.687 95.296 213.116 212.932 213.333l0.021 0c0.113 0 0.247 0 0.381 0 58.816 0 112.072-23.801 150.663-62.298l-0.004 0.004zM170.667 298.667c0-70.692 57.308-128 128-128v0c19.902 0.191 38.661 4.895 55.363 13.134l-0.75-0.334-170.667 170.667c-7.547-15.833-11.955-34.409-11.955-54.014 0-0.511 0.003-1.021 0.009-1.53l-0.001 0.078zM413.867 243.627c7.966 16.078 12.677 34.995 12.8 54.999l0 0.041c-0.32 70.45-57.505 127.436-127.999 127.436-19.839 0-38.623-4.513-55.383-12.569l0.768 0.333z"],"attrs":[],"grid":0,"tags":["comment-alt-block"]},"attrs":[],"properties":{"order":4769,"id":915,"name":"comment-alt-block","prevSize":32,"code":59938},"setIdx":0,"setId":0,"iconIdx":290},{"icon":{"paths":["M512 341.333c-23.564 0-42.667 19.103-42.667 42.667v0 170.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-170.667c0-23.564-19.103-42.667-42.667-42.667v0zM341.333 469.333c-23.564 0-42.667 19.103-42.667 42.667v0 42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667c0-23.564-19.103-42.667-42.667-42.667v0zM810.667 85.333h-597.333c-70.692 0-128 57.308-128 128v0 426.667c0 70.692 57.308 128 128 128v0h494.507l157.867 158.293c7.709 7.648 18.326 12.374 30.047 12.374 0.087 0 0.173-0 0.26-0.001l-0.013 0c0.275 0.008 0.599 0.012 0.923 0.012 5.554 0 10.813-1.263 15.505-3.518l-0.215 0.093c15.59-6.527 26.363-21.621 26.453-39.242l0-0.012v-682.667c0-70.692-57.308-128-128-128v0zM853.333 793.173l-97.707-98.133c-7.709-7.648-18.326-12.374-30.047-12.374-0.087 0-0.173 0-0.26 0.001l0.013-0h-512c-23.564 0-42.667-19.103-42.667-42.667v0-426.667c0-23.564 19.103-42.667 42.667-42.667v0h597.333c23.564 0 42.667 19.103 42.667 42.667v0zM682.667 256c-23.564 0-42.667 19.103-42.667 42.667v0 256c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-256c0-23.564-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["comment-alt-chart-lines"]},"attrs":[],"properties":{"order":4770,"id":914,"name":"comment-alt-chart-lines","prevSize":32,"code":59939},"setIdx":0,"setId":0,"iconIdx":291},{"icon":{"paths":["M288.853 390.4l232.107-232.107c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l-0 0-201.813 200.96-78.933-78.080c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l109.227 109.227c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003zM789.333 256h-234.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h234.667c23.564 0 42.667 19.103 42.667 42.667v0 414.72l-66.987-61.867c-7.573-7.104-17.778-11.48-29.005-11.52l-0.008-0h-373.333c-23.564 0-42.667-19.103-42.667-42.667v0-149.333c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 149.333c0 70.692 57.308 128 128 128v0h356.693l128 116.48c7.573 7.104 17.778 11.48 29.005 11.52l0.008 0c6.166-0.069 12.022-1.317 17.379-3.527l-0.312 0.114c15.195-6.753 25.6-21.714 25.6-39.105 0-0.052-0-0.104-0-0.157l0 0.008v-512c0-0.003 0-0.007 0-0.011 0-70.692-57.308-128-128-128-0.6 0-1.199 0.004-1.797 0.012l0.091-0.001z"],"attrs":[],"grid":0,"tags":["comment-alt-check"]},"attrs":[],"properties":{"order":4771,"id":913,"name":"comment-alt-check","prevSize":32,"code":59940},"setIdx":0,"setId":0,"iconIdx":292},{"icon":{"paths":["M512 384c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM810.667 85.333h-597.333c-70.692 0-128 57.308-128 128v0 426.667c0 70.692 57.308 128 128 128v0h494.507l157.867 158.293c7.709 7.648 18.326 12.374 30.047 12.374 0.087 0 0.173-0 0.26-0.001l-0.013 0c0.275 0.008 0.599 0.012 0.923 0.012 5.554 0 10.813-1.263 15.505-3.518l-0.215 0.093c15.59-6.527 26.363-21.621 26.453-39.242l0-0.012v-682.667c0-70.692-57.308-128-128-128v0zM853.333 793.173l-97.707-98.133c-7.709-7.648-18.326-12.374-30.047-12.374-0.087 0-0.173 0-0.26 0.001l0.013-0h-512c-23.564 0-42.667-19.103-42.667-42.667v0-426.667c0-23.564 19.103-42.667 42.667-42.667v0h597.333c23.564 0 42.667 19.103 42.667 42.667v0zM341.333 384c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM682.667 384c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["comment-alt-dots"]},"attrs":[],"properties":{"order":4772,"id":912,"name":"comment-alt-dots","prevSize":32,"code":59941},"setIdx":0,"setId":0,"iconIdx":293},{"icon":{"paths":["M261.12 508.587c4.771 2.163 10.345 3.423 16.213 3.423s11.443-1.26 16.466-3.525l-0.253 0.102c5.464-2.152 10.143-5.187 14.095-8.974l-0.015 0.014 128-128c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l-0 0-55.040 55.467v-238.507c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 238.507l-55.040-55.467c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l128 128c3.937 3.773 8.616 6.808 13.791 8.859l0.289 0.101zM789.333 256h-213.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h213.333c23.564 0 42.667 19.103 42.667 42.667v0 414.72l-66.987-61.867c-7.573-7.104-17.778-11.48-29.005-11.52l-0.008-0h-373.333c-23.564 0-42.667-19.103-42.667-42.667v0-42.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 42.667c0 70.692 57.308 128 128 128v0h356.693l128 116.48c7.573 7.104 17.778 11.48 29.005 11.52l0.008 0c6.166-0.069 12.022-1.317 17.379-3.527l-0.312 0.114c15.195-6.753 25.6-21.714 25.6-39.105 0-0.052-0-0.104-0-0.157l0 0.008v-512c0-0.003 0-0.007 0-0.011 0-70.692-57.308-128-128-128-0.6 0-1.199 0.004-1.797 0.012l0.091-0.001z"],"attrs":[],"grid":0,"tags":["comment-alt-download"]},"attrs":[],"properties":{"order":4773,"id":911,"name":"comment-alt-download","prevSize":32,"code":59942},"setIdx":0,"setId":0,"iconIdx":294},{"icon":{"paths":["M789.333 234.667h-170.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h170.667c23.564 0 42.667 19.103 42.667 42.667v0 414.72l-66.987-61.867c-7.573-7.104-17.778-11.48-29.005-11.52l-0.008-0h-373.333c-23.564 0-42.667-19.103-42.667-42.667v0-42.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 42.667c0 70.692 57.308 128 128 128v0h356.693l128 116.48c7.573 7.104 17.778 11.48 29.005 11.52l0.008 0c6.166-0.069 12.022-1.317 17.379-3.527l-0.312 0.114c15.195-6.753 25.6-21.714 25.6-39.105 0-0.052-0-0.104-0-0.157l0 0.008v-512c0-0.003 0-0.007 0-0.011 0-70.692-57.308-128-128-128-0.6 0-1.199 0.004-1.797 0.012l0.091-0.001zM387.413 533.333h103.253c23.564 0 42.667-19.103 42.667-42.667v0-103.253c0-0.073 0.001-0.16 0.001-0.247 0-11.721-4.726-22.338-12.377-30.049l0.003 0.003-238.080-238.080c-7.712-7.668-18.343-12.407-30.080-12.407s-22.368 4.74-30.082 12.409l0.002-0.002-103.68 103.68c-7.668 7.712-12.407 18.343-12.407 30.080s4.74 22.368 12.409 30.082l-0.002-0.002 238.080 238.080c7.709 7.648 18.326 12.374 30.047 12.374 0.087 0 0.173-0 0.26-0.001l-0.013 0zM252.587 209.493l195.413 195.413v42.667h-42.667l-195.84-194.987z"],"attrs":[],"grid":0,"tags":["comment-alt-edit"]},"attrs":[],"properties":{"order":4774,"id":910,"name":"comment-alt-edit","prevSize":32,"code":59943},"setIdx":0,"setId":0,"iconIdx":295},{"icon":{"paths":["M810.667 85.333h-597.333c-70.692 0-128 57.308-128 128v0 426.667c0 70.692 57.308 128 128 128v0h494.507l157.867 158.293c7.709 7.648 18.326 12.374 30.047 12.374 0.087 0 0.173-0 0.26-0.001l-0.013 0c0.275 0.008 0.599 0.012 0.923 0.012 5.554 0 10.813-1.263 15.505-3.518l-0.215 0.093c15.59-6.527 26.363-21.621 26.453-39.242l0-0.012v-682.667c0-70.692-57.308-128-128-128v0zM853.333 793.173l-97.707-98.133c-7.709-7.648-18.326-12.374-30.047-12.374-0.087 0-0.173 0-0.26 0.001l0.013-0h-512c-23.564 0-42.667-19.103-42.667-42.667v0-426.667c0-23.564 19.103-42.667 42.667-42.667v0h597.333c23.564 0 42.667 19.103 42.667 42.667v0zM512 512c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM512 256c-23.564 0-42.667 19.103-42.667 42.667v0 128c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-128c0-23.564-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["comment-alt-exclamation"]},"attrs":[],"properties":{"order":4775,"id":909,"name":"comment-alt-exclamation","prevSize":32,"code":59944},"setIdx":0,"setId":0,"iconIdx":296},{"icon":{"paths":["M512 270.933c-17.37-9.093-37.943-14.428-59.762-14.428-35.508 0-67.716 14.128-91.309 37.070l0.030-0.029c-23.13 23.158-37.434 55.135-37.434 90.453s14.304 67.296 37.435 90.455l-0.001-0.001 120.747 122.88c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 120.747-120.747c23.13-23.158 37.434-55.135 37.434-90.453s-14.304-67.296-37.435-90.455l0.001 0.001c-23.713-23.756-56.494-38.452-92.708-38.452-21.256 0-41.329 5.063-59.080 14.049l0.748-0.343zM602.453 414.293l-90.453 90.453-90.453-90.453c-7.795-7.733-12.621-18.45-12.621-30.293s4.826-22.56 12.618-30.291l0.003-0.003c7.712-7.668 18.343-12.407 30.080-12.407s22.368 4.74 30.082 12.409l-0.002-0.002c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.712-7.668 18.343-12.407 30.080-12.407s22.368 4.74 30.082 12.409l-0.002-0.002c7.795 7.733 12.621 18.45 12.621 30.293s-4.826 22.56-12.618 30.291l-0.003 0.003zM810.667 85.333h-597.333c-70.692 0-128 57.308-128 128v0 426.667c0 70.692 57.308 128 128 128v0h494.507l157.867 158.293c7.709 7.648 18.326 12.374 30.047 12.374 0.087 0 0.173-0 0.26-0.001l-0.013 0c0.275 0.008 0.599 0.012 0.923 0.012 5.554 0 10.813-1.263 15.505-3.518l-0.215 0.093c15.59-6.527 26.363-21.621 26.453-39.242l0-0.012v-682.667c0-70.692-57.308-128-128-128v0zM853.333 793.173l-97.707-98.133c-7.709-7.648-18.326-12.374-30.047-12.374-0.087 0-0.173 0-0.26 0.001l0.013-0h-512c-23.564 0-42.667-19.103-42.667-42.667v0-426.667c0-23.564 19.103-42.667 42.667-42.667v0h597.333c23.564 0 42.667 19.103 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["comment-alt-heart"]},"attrs":[],"properties":{"order":4776,"id":908,"name":"comment-alt-heart","prevSize":32,"code":59945},"setIdx":0,"setId":0,"iconIdx":297},{"icon":{"paths":["M810.667 85.333h-597.333c-70.692 0-128 57.308-128 128v0 426.667c0 70.692 57.308 128 128 128v0h494.507l157.867 158.293c7.709 7.648 18.326 12.374 30.047 12.374 0.087 0 0.173-0 0.26-0.001l-0.013 0c0.275 0.008 0.599 0.012 0.923 0.012 5.554 0 10.813-1.263 15.505-3.518l-0.215 0.093c15.59-6.527 26.363-21.621 26.453-39.242l0-0.012v-682.667c0-70.692-57.308-128-128-128v0zM246.187 682.667h-32.853c-23.564 0-42.667-19.103-42.667-42.667v0-17.92l140.8-140.373c7.712-7.668 18.343-12.407 30.080-12.407s22.368 4.74 30.082 12.409l-0.002-0.002 37.12 37.12zM853.333 793.173l-97.707-98.133c-7.709-7.648-18.326-12.374-30.047-12.374-0.087 0-0.173 0-0.26 0.001l0.013-0h-358.827l286.293-286.293c7.69-7.542 18.235-12.197 29.867-12.197s22.177 4.655 29.874 12.203l-0.007-0.007 140.8 140.373zM853.333 416.427l-80.213-79.787c-23.158-23.13-55.135-37.434-90.453-37.434s-67.296 14.304-90.455 37.435l0.001-0.001-122.88 122.453-37.547-37.12c-23.426-22.533-55.319-36.411-90.453-36.411s-67.027 13.878-90.496 36.451l0.042-0.041-80.213 79.787v-288.427c0-23.564 19.103-42.667 42.667-42.667v0h597.333c23.564 0 42.667 19.103 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["comment-alt-image"]},"attrs":[],"properties":{"order":4777,"id":907,"name":"comment-alt-image","prevSize":32,"code":59946},"setIdx":0,"setId":0,"iconIdx":298},{"icon":{"paths":["M213.333 469.333c23.564 0 42.667-19.103 42.667-42.667v0-170.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 170.667c0 23.564 19.103 42.667 42.667 42.667v0zM183.040 158.293c7.7 7.601 18.286 12.296 29.968 12.296 5.971 0 11.656-1.227 16.817-3.442l-0.278 0.106c5.422-2.298 10.079-5.314 14.119-8.995l-0.039 0.035c3.646-4.001 6.662-8.658 8.838-13.76l0.122-0.32c2.162-4.477 3.425-9.736 3.425-15.29 0-0.325-0.004-0.648-0.013-0.971l0.001 0.048c0-0.073 0.001-0.16 0.001-0.247 0-11.721-4.726-22.338-12.377-30.049l0.003 0.003c-7.7-7.601-18.286-12.296-29.968-12.296-5.971 0-11.656 1.227-16.817 3.442l0.278-0.106c-5.464 2.152-10.143 5.187-14.095 8.974l0.015-0.014c-7.648 7.709-12.374 18.326-12.374 30.047 0 0.087 0 0.173 0.001 0.26l-0-0.013c0.073 5.873 1.322 11.435 3.52 16.489l-0.107-0.275c2.298 5.422 5.314 10.079 8.995 14.119l-0.035-0.039zM725.333 256h-341.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h341.333c23.564 0 42.667 19.103 42.667 42.667v0 414.72l-66.987-61.867c-7.573-7.104-17.778-11.48-29.005-11.52l-0.008-0h-373.333c-23.564 0-42.667-19.103-42.667-42.667v0-85.333c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 85.333c0 70.692 57.308 128 128 128v0h356.693l128 116.48c7.163 6.738 16.691 11.033 27.213 11.517l0.094 0.003c6.166-0.069 12.022-1.317 17.379-3.527l-0.312 0.114c15.195-6.753 25.6-21.714 25.6-39.105 0-0.052-0-0.104-0-0.157l0 0.008v-512c0-70.692-57.308-128-128-128v0z"],"attrs":[],"grid":0,"tags":["comment-alt-info"]},"attrs":[],"properties":{"order":4778,"id":906,"name":"comment-alt-info","prevSize":32,"code":59947},"setIdx":0,"setId":0,"iconIdx":299},{"icon":{"paths":["M554.667 469.333h-256c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h256c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM725.333 298.667h-426.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h426.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM810.667 85.333h-597.333c-70.692 0-128 57.308-128 128v0 426.667c0 70.692 57.308 128 128 128v0h494.507l157.867 158.293c7.709 7.648 18.326 12.374 30.047 12.374 0.087 0 0.173-0 0.26-0.001l-0.013 0c0.275 0.008 0.599 0.012 0.923 0.012 5.554 0 10.813-1.263 15.505-3.518l-0.215 0.093c15.59-6.527 26.363-21.621 26.453-39.242l0-0.012v-682.667c0-70.692-57.308-128-128-128v0zM853.333 793.173l-97.707-98.133c-7.709-7.648-18.326-12.374-30.047-12.374-0.087 0-0.173 0-0.26 0.001l0.013-0h-512c-23.564 0-42.667-19.103-42.667-42.667v0-426.667c0-23.564 19.103-42.667 42.667-42.667v0h597.333c23.564 0 42.667 19.103 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["comment-alt-lines"]},"attrs":[],"properties":{"order":4779,"id":905,"name":"comment-alt-lines","prevSize":32,"code":59948},"setIdx":0,"setId":0,"iconIdx":300},{"icon":{"paths":["M512 426.667v-85.333c-0.16-55.254-35.305-102.258-84.442-120.038l-0.891-0.282v-50.347c0-70.692-57.308-128-128-128s-128 57.308-128 128v0 50.347c-50.028 18.062-85.173 65.066-85.333 120.3l-0 0.020v85.333c0 70.692 57.308 128 128 128v0h170.667c70.692 0 128-57.308 128-128v0zM256 170.667c0-23.564 19.103-42.667 42.667-42.667s42.667 19.103 42.667 42.667v0 42.667h-85.333zM170.667 426.667v-85.333c0-23.564 19.103-42.667 42.667-42.667v0h170.667c23.564 0 42.667 19.103 42.667 42.667v0 85.333c0 23.564-19.103 42.667-42.667 42.667v0h-170.667c-23.564 0-42.667-19.103-42.667-42.667v0zM810.667 298.667h-170.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h170.667c23.564 0 42.667 19.103 42.667 42.667v0 414.72l-66.987-61.867c-7.573-7.104-17.778-11.48-29.005-11.52l-0.008-0h-373.333c-23.564 0-42.667-19.103-42.667-42.667v0-42.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 42.667c0 70.692 57.308 128 128 128v0h356.693l128 116.48c7.163 6.738 16.691 11.033 27.213 11.517l0.094 0.003c6.166-0.069 12.022-1.317 17.379-3.527l-0.312 0.114c15.195-6.753 25.6-21.714 25.6-39.105 0-0.052-0-0.104-0-0.157l0 0.008v-512c0-70.692-57.308-128-128-128v0z"],"attrs":[],"grid":0,"tags":["comment-alt-lock"]},"attrs":[],"properties":{"order":4780,"id":904,"name":"comment-alt-lock","prevSize":32,"code":59949},"setIdx":0,"setId":0,"iconIdx":301},{"icon":{"paths":["M597.333 384h-42.667v-42.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 42.667h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h42.667v42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM810.667 85.333h-597.333c-70.692 0-128 57.308-128 128v0 426.667c0 70.692 57.308 128 128 128v0h494.507l157.867 158.293c7.709 7.648 18.326 12.374 30.047 12.374 0.087 0 0.173-0 0.26-0.001l-0.013 0c0.275 0.008 0.599 0.012 0.923 0.012 5.554 0 10.813-1.263 15.505-3.518l-0.215 0.093c15.59-6.527 26.363-21.621 26.453-39.242l0-0.012v-682.667c0-70.692-57.308-128-128-128v0zM853.333 793.173l-97.707-98.133c-7.709-7.648-18.326-12.374-30.047-12.374-0.087 0-0.173 0-0.26 0.001l0.013-0h-512c-23.564 0-42.667-19.103-42.667-42.667v0-426.667c0-23.564 19.103-42.667 42.667-42.667v0h597.333c23.564 0 42.667 19.103 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["comment-alt-medical"]},"attrs":[],"properties":{"order":4781,"id":903,"name":"comment-alt-medical","prevSize":32,"code":59950},"setIdx":0,"setId":0,"iconIdx":302},{"icon":{"paths":["M725.333 298.667h-426.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h426.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM725.333 469.333h-426.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h426.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM810.667 85.333h-597.333c-70.692 0-128 57.308-128 128v0 426.667c0 70.692 57.308 128 128 128v0h494.507l157.867 158.293c7.709 7.648 18.326 12.374 30.047 12.374 0.087 0 0.173-0 0.26-0.001l-0.013 0c0.275 0.008 0.599 0.012 0.923 0.012 5.554 0 10.813-1.263 15.505-3.518l-0.215 0.093c15.59-6.527 26.363-21.621 26.453-39.242l0-0.012v-682.667c0-70.692-57.308-128-128-128v0zM853.333 793.173l-97.707-98.133c-7.709-7.648-18.326-12.374-30.047-12.374-0.087 0-0.173 0-0.26 0.001l0.013-0h-512c-23.564 0-42.667-19.103-42.667-42.667v0-426.667c0-23.564 19.103-42.667 42.667-42.667v0h597.333c23.564 0 42.667 19.103 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["comment-alt-message"]},"attrs":[],"properties":{"order":4782,"id":902,"name":"comment-alt-message","prevSize":32,"code":59951},"setIdx":0,"setId":0,"iconIdx":303},{"icon":{"paths":["M298.667 298.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM298.667 469.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM725.333 469.333h-256c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h256c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM725.333 298.667h-256c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h256c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM810.667 85.333h-597.333c-70.692 0-128 57.308-128 128v0 426.667c0 70.692 57.308 128 128 128v0h494.507l157.867 158.293c7.709 7.648 18.326 12.374 30.047 12.374 0.087 0 0.173-0 0.26-0.001l-0.013 0c0.275 0.008 0.599 0.012 0.923 0.012 5.554 0 10.813-1.263 15.505-3.518l-0.215 0.093c15.59-6.527 26.363-21.621 26.453-39.242l0-0.012v-682.667c0-70.692-57.308-128-128-128v0zM853.333 793.173l-97.707-98.133c-7.709-7.648-18.326-12.374-30.047-12.374-0.087 0-0.173 0-0.26 0.001l0.013-0h-512c-23.564 0-42.667-19.103-42.667-42.667v0-426.667c0-23.564 19.103-42.667 42.667-42.667v0h597.333c23.564 0 42.667 19.103 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["comment-alt-notes"]},"attrs":[],"properties":{"order":4783,"id":901,"name":"comment-alt-notes","prevSize":32,"code":59952},"setIdx":0,"setId":0,"iconIdx":304},{"icon":{"paths":["M640 384h-85.333v-85.333c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 85.333h-85.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h85.333v85.333c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-85.333h85.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM810.667 85.333h-597.333c-70.692 0-128 57.308-128 128v0 426.667c0 70.692 57.308 128 128 128v0h494.507l157.867 158.293c7.709 7.648 18.326 12.374 30.047 12.374 0.087 0 0.173-0 0.26-0.001l-0.013 0c0.275 0.008 0.599 0.012 0.923 0.012 5.554 0 10.813-1.263 15.505-3.518l-0.215 0.093c15.59-6.527 26.363-21.621 26.453-39.242l0-0.012v-682.667c0-70.692-57.308-128-128-128v0zM853.333 793.173l-97.707-98.133c-7.709-7.648-18.326-12.374-30.047-12.374-0.087 0-0.173 0-0.26 0.001l0.013-0h-512c-23.564 0-42.667-19.103-42.667-42.667v0-426.667c0-23.564 19.103-42.667 42.667-42.667v0h597.333c23.564 0 42.667 19.103 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["comment-alt-plus"]},"attrs":[],"properties":{"order":4784,"id":900,"name":"comment-alt-plus","prevSize":32,"code":59953},"setIdx":0,"setId":0,"iconIdx":305},{"icon":{"paths":["M268.373 439.467c-7.682 7.715-12.432 18.355-12.432 30.105 0 23.564 19.103 42.667 42.667 42.667 5.87 0 11.462-1.185 16.552-3.329l-0.281 0.105c5.423-2.458 10.075-5.608 14.105-9.41l-0.025 0.023c3.733-3.822 6.76-8.354 8.856-13.372l0.104-0.282c2.168-4.513 3.434-9.811 3.434-15.405 0-0.434-0.008-0.867-0.023-1.298l0.002 0.062c-0.051-11.656-4.767-22.2-12.376-29.869l0.003 0.003c-7.733-7.795-18.45-12.621-30.293-12.621s-22.56 4.826-30.291 12.618l-0.003 0.003zM298.667 213.333c23.564 0 42.667 19.103 42.667 42.667s-19.103 42.667-42.667 42.667v0c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0c70.657-0.047 127.918-57.336 127.918-128 0-70.692-57.308-128-128-128-47.128 0-88.308 25.47-110.524 63.396l-0.327 0.604c-3.613 6.133-5.748 13.511-5.748 21.388 0 15.791 8.578 29.578 21.329 36.956l0.205 0.11c6.055 3.499 13.32 5.563 21.067 5.563 15.716 0 29.448-8.497 36.851-21.148l0.109-0.202c7.514-12.844 21.241-21.334 36.951-21.334 0.060 0 0.119 0 0.179 0l-0.009-0zM810.667 256h-256c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h256c23.564 0 42.667 19.103 42.667 42.667v0 414.72l-66.987-61.867c-7.573-7.104-17.778-11.48-29.005-11.52l-0.008-0h-373.333c-23.564 0-42.667-19.103-42.667-42.667v0-42.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 42.667c0 70.692 57.308 128 128 128v0h356.693l128 116.48c7.163 6.738 16.691 11.033 27.213 11.517l0.094 0.003c6.166-0.069 12.022-1.317 17.379-3.527l-0.312 0.114c15.195-6.753 25.6-21.714 25.6-39.105 0-0.052-0-0.104-0-0.157l0 0.008v-512c0-70.692-57.308-128-128-128v0z"],"attrs":[],"grid":0,"tags":["comment-alt-question"]},"attrs":[],"properties":{"order":4785,"id":899,"name":"comment-alt-question","prevSize":32,"code":59954},"setIdx":0,"setId":0,"iconIdx":306},{"icon":{"paths":["M439.467 458.667c11.455-7.77 18.882-20.729 18.882-35.422 0-23.564-19.103-42.667-42.667-42.667-12.554 0-23.842 5.422-31.65 14.052l-0.033 0.037c-22.445 19.867-52.137 31.998-84.662 31.998-70.692 0-128-57.308-128-128 0-70.456 56.926-127.617 127.292-127.998l0.036-0c37.756 0.079 71.663 16.493 95.041 42.547l0.106 0.12h-52.48c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h128c23.564 0 42.667-19.103 42.667-42.667v0-128c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 0c-35.241-26.713-79.826-42.791-128.166-42.791-117.821 0-213.333 95.513-213.333 213.333s95.513 213.333 213.333 213.333c54.144 0 103.577-20.171 141.194-53.407l-0.229 0.198zM810.667 256h-170.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h170.667c23.564 0 42.667 19.103 42.667 42.667v0 414.72l-66.987-61.867c-7.573-7.104-17.778-11.48-29.005-11.52l-0.008-0h-373.333c-23.564 0-42.667-19.103-42.667-42.667v0-42.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 42.667c0 70.692 57.308 128 128 128v0h356.693l128 116.48c7.163 6.738 16.691 11.033 27.213 11.517l0.094 0.003c6.166-0.069 12.022-1.317 17.379-3.527l-0.312 0.114c15.195-6.753 25.6-21.714 25.6-39.105 0-0.052-0-0.104-0-0.157l0 0.008v-512c0-70.692-57.308-128-128-128v0z"],"attrs":[],"grid":0,"tags":["comment-alt-redo"]},"attrs":[],"properties":{"order":4786,"id":898,"name":"comment-alt-redo","prevSize":32,"code":59955},"setIdx":0,"setId":0,"iconIdx":307},{"icon":{"paths":["M810.667 256h-213.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h213.333c23.564 0 42.667 19.103 42.667 42.667v0 414.72l-66.987-61.867c-7.573-7.104-17.778-11.48-29.005-11.52l-0.008-0h-373.333c-23.564 0-42.667-19.103-42.667-42.667v0-85.333c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 85.333c0 70.692 57.308 128 128 128v0h356.693l128 116.48c7.163 6.738 16.691 11.033 27.213 11.517l0.094 0.003c6.166-0.069 12.022-1.317 17.379-3.527l-0.312 0.114c15.195-6.753 25.6-21.714 25.6-39.105 0-0.052-0-0.104-0-0.157l0 0.008v-512c0-70.692-57.308-128-128-128v0zM365.653 426.667l73.387 73.813c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003-72.96-74.24c17.165-27.43 27.452-60.698 27.733-96.35l0-0.077c0-101.915-82.618-184.533-184.533-184.533s-184.533 82.618-184.533 184.533v-0c-0 0-0 0-0 0 0 101.647 82.28 184.077 183.87 184.319l0.023 0c0.066 0 0.144 0 0.222 0 35.559 0 68.782-10 97.011-27.341l-0.807 0.461zM170.667 269.227c-0-0.019-0-0.042-0-0.064 0-27.177 11.096-51.763 29.004-69.474l0.009-0.009c17.992-18.415 43.076-29.835 70.827-29.835s52.835 11.42 70.808 29.816l0.019 0.019c18.523 17.942 30.021 43.041 30.021 70.827s-11.498 52.885-29.994 70.802l-0.026 0.025c-18.071 18.99-43.535 30.802-71.758 30.802-54.669 0-98.987-44.318-98.987-98.987 0-1.379 0.028-2.752 0.084-4.117l-0.006 0.196z"],"attrs":[],"grid":0,"tags":["comment-alt-search"]},"attrs":[],"properties":{"order":4787,"id":897,"name":"comment-alt-search","prevSize":32,"code":59956},"setIdx":0,"setId":0,"iconIdx":308},{"icon":{"paths":["M832 277.333h-213.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h213.333c23.564 0 42.667 19.103 42.667 42.667v0 414.72l-66.987-61.867c-7.573-7.104-17.778-11.48-29.005-11.52l-0.008-0h-373.333c-23.564 0-42.667-19.103-42.667-42.667v0-85.333c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 85.333c0 70.692 57.308 128 128 128v0h356.693l128 116.48c7.573 7.104 17.778 11.48 29.005 11.52l0.008 0c6.166-0.069 12.022-1.317 17.379-3.527l-0.312 0.114c15.195-6.753 25.6-21.714 25.6-39.105 0-0.052-0-0.104-0-0.157l0 0.008v-512c0-0.003 0-0.007 0-0.011 0-70.692-57.308-128-128-128-0.6 0-1.199 0.004-1.797 0.012l0.091-0.001zM405.333 490.667c0.083 0 0.181 0 0.279 0 47.128 0 85.333-38.205 85.333-85.333s-38.205-85.333-85.333-85.333c-19.055 0-36.651 6.246-50.854 16.802l0.228-0.162-74.667-34.133 81.493-37.547c12.169 7.502 26.854 12.065 42.582 12.372l0.085 0.001c47.128 0 85.333-38.205 85.333-85.333s-38.205-85.333-85.333-85.333c-47.128 0-85.333 38.205-85.333 85.333v0l-81.067 37.12c-12.842-9.253-28.717-15.060-45.908-15.781l-0.172-0.006c-47.128 0-85.333 38.205-85.333 85.333s38.205 85.333 85.333 85.333v0c14.561-0.151 28.207-3.926 40.123-10.463l-0.443 0.223 89.173 42.667c5.673 42.070 41.317 74.173 84.473 74.24l0.007 0z"],"attrs":[],"grid":0,"tags":["comment-alt-share"]},"attrs":[],"properties":{"order":4788,"id":896,"name":"comment-alt-share","prevSize":32,"code":59957},"setIdx":0,"setId":0,"iconIdx":309},{"icon":{"paths":["M280.32 512c9.304-0.062 17.889-3.093 24.868-8.191l-0.121 0.084 69.12-49.493c48.905-35.222 80.606-91.684 81.492-155.594l0.002-0.139v-143.787c-0.090-13.235-6.193-25.027-15.71-32.792l-0.077-0.061c-7.264-5.913-16.631-9.495-26.834-9.495-3.19 0-6.299 0.35-9.29 1.014l0.284-0.053c-7.815 1.696-16.792 2.668-25.997 2.668-27.491 0-52.958-8.667-73.817-23.417l0.401 0.269c-6.788-4.762-15.222-7.61-24.32-7.61s-17.532 2.848-24.457 7.701l0.137-0.091c-20.459 14.481-45.926 23.148-73.417 23.148-9.204 0-18.182-0.972-26.835-2.818l0.839 0.15c-2.568-0.549-5.518-0.864-8.542-0.864-23.564 0-42.667 19.103-42.667 42.667 0 0.304 0.003 0.607 0.009 0.909l-0.001-0.045v142.507c-0 0.017-0 0.037-0 0.058 0 64.782 31.731 122.153 80.499 157.418l0.568 0.391 69.547 47.36c6.641 5.060 15.053 8.107 24.178 8.107 0.050 0 0.1-0 0.15-0l-0.008 0zM190.293 298.667v-97.28c33.069-1.433 63.839-9.944 91.263-24.044l-1.237 0.578c26.18 13.573 56.959 22.091 89.587 23.452l0.439 0.015v97.28c-1.24 35.129-18.821 65.909-45.334 85.113l-0.319 0.22-42.667 31.573-46.080-31.573c-26.833-19.425-44.414-50.204-45.648-85.144l-0.005-0.19zM791.040 256h-213.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h213.333c23.564 0 42.667 19.103 42.667 42.667v0 414.72l-65.707-61.867c-7.235-7.128-17.174-11.529-28.141-11.529-0.307 0-0.613 0.003-0.918 0.010l0.045-0.001h-374.613c-23.564 0-42.667-19.103-42.667-42.667v0-42.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 42.667c0 70.692 57.308 128 128 128v0h356.693l128 116.48c7.471 7.010 17.506 11.365 28.556 11.52l0.031 0c6.313-0.066 12.315-1.313 17.823-3.531l-0.33 0.117c14.965-6.846 25.175-21.689 25.175-38.916 0-0.119-0-0.237-0.001-0.355l0 0.018v-512c0-0.002 0-0.004 0-0.006 0-70.692-57.308-128-128-128-0.45 0-0.899 0.002-1.348 0.007l0.068-0.001z"],"attrs":[],"grid":0,"tags":["comment-alt-shield"]},"attrs":[],"properties":{"order":4789,"id":895,"name":"comment-alt-shield","prevSize":32,"code":59958},"setIdx":0,"setId":0,"iconIdx":310},{"icon":{"paths":["M454.827 256h270.507c23.564 0 42.667 19.103 42.667 42.667v0 270.507c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-270.507c0-70.692-57.308-128-128-128v0h-270.507c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM926.293 865.707l-768-768c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293v0l85.333 85.333c-7.809 16.068-12.373 34.953-12.373 54.904 0 0.048 0 0.095 0 0.143l-0-0.007v512c0.091 17.632 10.863 32.726 26.172 39.149l0.281 0.105c4.477 2.162 9.736 3.425 15.29 3.425 0.325 0 0.648-0.004 0.971-0.013l-0.048 0.001c0.073 0 0.16 0.001 0.247 0.001 11.721 0 22.338-4.726 30.049-12.377l-0.003 0.003 115.2-115.627h306.347l200.533 200.96c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003zM341.333 640c-0.073-0-0.16-0.001-0.247-0.001-11.721 0-22.338 4.726-30.049 12.377l0.003-0.003-55.040 55.467v-391.68l323.84 323.84z"],"attrs":[],"grid":0,"tags":["comment-alt-slash"]},"attrs":[],"properties":{"order":4790,"id":894,"name":"comment-alt-slash","prevSize":32,"code":59959},"setIdx":0,"setId":0,"iconIdx":311},{"icon":{"paths":["M234.667 469.333c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-238.507l55.040 55.467c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003-128-128c-3.937-3.773-8.616-6.808-13.791-8.859l-0.289-0.101c-4.793-2.024-10.366-3.201-16.213-3.201s-11.42 1.176-16.495 3.305l0.281-0.105c-5.464 2.152-10.143 5.187-14.095 8.974l0.015-0.014-128 128c-7.753 7.753-12.548 18.463-12.548 30.293 0 23.661 19.181 42.841 42.841 42.841 11.83 0 22.541-4.795 30.293-12.548l-0 0 55.040-55.467zM789.333 256h-213.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h213.333c23.564 0 42.667 19.103 42.667 42.667v0 414.72l-66.987-61.867c-7.573-7.104-17.778-11.48-29.005-11.52l-0.008-0h-373.333c-23.564 0-42.667-19.103-42.667-42.667v0-42.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 42.667c0 70.692 57.308 128 128 128v0h356.693l128 116.48c7.573 7.104 17.778 11.48 29.005 11.52l0.008 0c6.166-0.069 12.022-1.317 17.379-3.527l-0.312 0.114c15.195-6.753 25.6-21.714 25.6-39.105 0-0.052-0-0.104-0-0.157l0 0.008v-512c0-0.003 0-0.007 0-0.011 0-70.692-57.308-128-128-128-0.6 0-1.199 0.004-1.797 0.012l0.091-0.001z"],"attrs":[],"grid":0,"tags":["comment-alt-upload"]},"attrs":[],"properties":{"order":4791,"id":893,"name":"comment-alt-upload","prevSize":32,"code":59960},"setIdx":0,"setId":0,"iconIdx":312},{"icon":{"paths":["M670.293 268.373l-226.133 226.133-90.453-90.453c-7.872-9.153-19.467-14.914-32.407-14.914-23.564 0-42.667 19.103-42.667 42.667 0 12.94 5.761 24.535 14.858 32.36l0.056 0.047 120.747 120.747c7.667 7.606 18.211 12.323 29.857 12.373l0.010 0c0.073 0 0.16 0.001 0.247 0.001 11.721 0 22.338-4.726 30.049-12.377l-0.003 0.003 256-256c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003c-7.712-7.668-18.343-12.407-30.080-12.407s-22.368 4.74-30.082 12.409l0.002-0.002zM810.667 85.333h-597.333c-70.692 0-128 57.308-128 128v0 426.667c0 70.692 57.308 128 128 128v0h494.507l157.867 158.293c7.709 7.648 18.326 12.374 30.047 12.374 0.087 0 0.173-0 0.26-0.001l-0.013 0c0.275 0.008 0.599 0.012 0.923 0.012 5.554 0 10.813-1.263 15.505-3.518l-0.215 0.093c15.59-6.527 26.363-21.621 26.453-39.242l0-0.012v-682.667c0-70.692-57.308-128-128-128v0zM853.333 793.173l-97.707-98.133c-7.709-7.648-18.326-12.374-30.047-12.374-0.087 0-0.173 0-0.26 0.001l0.013-0h-512c-23.564 0-42.667-19.103-42.667-42.667v0-426.667c0-23.564 19.103-42.667 42.667-42.667v0h597.333c23.564 0 42.667 19.103 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["comment-alt-verify"]},"attrs":[],"properties":{"order":4792,"id":892,"name":"comment-alt-verify","prevSize":32,"code":59961},"setIdx":0,"setId":0,"iconIdx":313},{"icon":{"paths":["M810.667 85.333h-597.333c-70.692 0-128 57.308-128 128v0 426.667c0 70.692 57.308 128 128 128v0h494.507l157.867 158.293c7.709 7.648 18.326 12.374 30.047 12.374 0.087 0 0.173-0 0.26-0.001l-0.013 0c0.275 0.008 0.599 0.012 0.923 0.012 5.554 0 10.813-1.263 15.505-3.518l-0.215 0.093c15.59-6.527 26.363-21.621 26.453-39.242l0-0.012v-682.667c0-70.692-57.308-128-128-128v0zM853.333 793.173l-97.707-98.133c-7.709-7.648-18.326-12.374-30.047-12.374-0.087 0-0.173 0-0.26 0.001l0.013-0h-512c-23.564 0-42.667-19.103-42.667-42.667v0-426.667c0-23.564 19.103-42.667 42.667-42.667v0h597.333c23.564 0 42.667 19.103 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["comment-alt"]},"attrs":[],"properties":{"order":4793,"id":891,"name":"comment-alt","prevSize":32,"code":59962},"setIdx":0,"setId":0,"iconIdx":314},{"icon":{"paths":["M810.667 597.333c-3.216-0.869-6.909-1.368-10.719-1.368-19.806 0-36.459 13.495-41.268 31.791l-0.066 0.297c-33.871 130.414-150.494 225.169-289.267 225.28l-238.519 0 27.307-26.88c7.668-7.712 12.407-18.343 12.407-30.080s-4.74-22.368-12.409-30.082l0.002 0.002c-54.301-54.090-87.901-128.927-87.901-211.612 0-138.573 94.373-255.104 222.353-288.828l2.081-0.466c18.59-4.908 32.072-21.573 32.072-41.387 0-23.604-19.135-42.739-42.739-42.739-3.79 0-7.466 0.493-10.965 1.42l0.298-0.067c-166.493 44.467-287.117 193.936-287.117 371.577 0 91.27 31.842 175.102 85.022 240.995l-0.572-0.732-72.96 71.253c-7.601 7.7-12.296 18.286-12.296 29.968 0 5.971 1.227 11.656 3.442 16.817l-0.106-0.278c6.527 15.59 21.621 26.363 39.242 26.453l0.012 0h341.333c0.073 0 0.16 0 0.247 0 177.962 0 327.65-121.060 371.202-285.321l0.604-2.679c1.077-3.569 1.698-7.67 1.698-11.916 0-19.925-13.658-36.66-32.123-41.354l-0.295-0.064zM876.373 147.627c-38.625-38.719-92.035-62.674-151.040-62.674-117.821 0-213.333 95.513-213.333 213.333s95.513 213.333 213.333 213.333c117.687 0 213.116-95.296 213.333-212.932l0-0.021c0-0.113 0-0.247 0-0.381 0-58.816-23.801-112.072-62.298-150.663l0.004 0.004zM597.333 298.667c0-70.692 57.308-128 128-128v0c20.045 0.123 38.962 4.834 55.79 13.134l-0.75-0.334-170.667 170.667c-7.81-16.069-12.375-34.955-12.375-54.907 0-0.197 0-0.394 0.001-0.59l-0 0.030zM815.787 389.12c-23.521 22.391-55.421 36.166-90.54 36.166-19.769 0-38.519-4.365-55.337-12.184l0.81 0.338 170.667-170.667c7.551 15.836 11.96 34.416 11.96 54.026 0 0.657-0.005 1.312-0.015 1.966l0.001-0.099c-0.032 35.333-14.375 67.31-37.545 90.452l-0.001 0.001z"],"attrs":[],"grid":0,"tags":["comment-block"]},"attrs":[],"properties":{"order":4794,"id":890,"name":"comment-block","prevSize":32,"code":59963},"setIdx":0,"setId":0,"iconIdx":315},{"icon":{"paths":["M512 426.667c-23.564 0-42.667 19.103-42.667 42.667v0 170.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-170.667c0-23.564-19.103-42.667-42.667-42.667v0zM341.333 554.667c-23.564 0-42.667 19.103-42.667 42.667v0 42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667c0-23.564-19.103-42.667-42.667-42.667v0zM512 85.333c-235.641 0-426.667 191.025-426.667 426.667v0c-0.002 0.474-0.003 1.036-0.003 1.598 0 102.317 36.415 196.128 96.992 269.181l-0.563-0.698-85.333 85.333c-7.601 7.7-12.296 18.286-12.296 29.968 0 5.971 1.227 11.656 3.442 16.817l-0.106-0.278c6.929 14.753 21.662 24.784 38.738 24.784 0.631 0 1.259-0.014 1.884-0.041l-0.089 0.003h384c235.641 0 426.667-191.025 426.667-426.667s-191.025-426.667-426.667-426.667v0zM512 853.333h-281.173l39.68-39.68c7.861-7.709 12.749-18.426 12.8-30.284l0-0.010c-0.172-11.712-5.037-22.255-12.793-29.86l-0.007-0.007c-61.849-61.783-100.108-147.17-100.108-241.493 0-188.513 152.82-341.333 341.333-341.333s341.333 152.82 341.333 341.333c0 188.419-152.667 341.181-341.051 341.333l-0.014 0zM682.667 341.333c-23.564 0-42.667 19.103-42.667 42.667v0 256c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-256c0-23.564-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["comment-chart-line"]},"attrs":[],"properties":{"order":4795,"id":889,"name":"comment-chart-line","prevSize":32,"code":59964},"setIdx":0,"setId":0,"iconIdx":316},{"icon":{"paths":["M567.040 304.213c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003 81.92 81.92c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 174.080-174.080c9.649-7.885 15.76-19.785 15.76-33.113 0-23.564-19.103-42.667-42.667-42.667-13.648 0-25.799 6.408-33.609 16.38l-0.070 0.093-143.787 142.933-51.627-52.053c-7.733-7.795-18.45-12.621-30.293-12.621s-22.56 4.826-30.291 12.618l-0.003 0.003zM849.493 453.973c-21.922 1.96-38.977 20.242-38.977 42.507 0 1.258 0.054 2.503 0.161 3.733l-0.011-0.16c0.102 1.784 0.16 3.872 0.16 5.973s-0.058 4.189-0.172 6.261l0.013-0.288c0 164.949-133.718 298.667-298.667 298.667v0h-238.507l27.307-26.88c7.668-7.712 12.407-18.343 12.407-30.080s-4.74-22.368-12.409-30.082l0.002 0.002c-54.39-54.104-88.051-129.002-88.051-211.762 0-142.942 100.417-262.43 234.556-291.769l1.975-0.362c17.958-3.761 38.594-5.914 59.733-5.914s41.775 2.153 61.701 6.252l-1.968-0.338c2.565 0.537 5.513 0.845 8.533 0.845 24.031 0 43.512-19.481 43.512-43.512 0-21.011-14.892-38.544-34.697-42.618l-0.281-0.048c-23.153-4.878-49.757-7.671-77.013-7.671s-53.861 2.793-79.542 8.109l2.528-0.438c-174.978 39.178-303.787 193.172-303.787 377.251 0 0.123 0 0.245 0 0.368l-0-0.019c0.386 91.207 32.51 174.837 85.889 240.493l-0.556-0.706-72.96 71.253c-7.601 7.7-12.296 18.286-12.296 29.968 0 5.971 1.227 11.656 3.442 16.817l-0.106-0.278c6.527 15.59 21.621 26.363 39.242 26.453l0.012 0h341.333c212.077 0 384-171.923 384-384v0c0-6.4 0-12.373 0-18.773-1.73-22.133-20.117-39.438-42.544-39.438-1.395 0-2.775 0.067-4.136 0.198l0.173-0.013z"],"attrs":[],"grid":0,"tags":["comment-check"]},"attrs":[],"properties":{"order":4796,"id":888,"name":"comment-check","prevSize":32,"code":59965},"setIdx":0,"setId":0,"iconIdx":317},{"icon":{"paths":["M341.333 469.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM512 469.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM682.667 469.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM512 85.333c-235.641 0-426.667 191.025-426.667 426.667v0c-0.002 0.474-0.003 1.036-0.003 1.598 0 102.317 36.415 196.128 96.992 269.181l-0.563-0.698-85.333 85.333c-7.601 7.7-12.296 18.286-12.296 29.968 0 5.971 1.227 11.656 3.442 16.817l-0.106-0.278c6.929 14.753 21.662 24.784 38.738 24.784 0.631 0 1.259-0.014 1.884-0.041l-0.089 0.003h384c235.641 0 426.667-191.025 426.667-426.667s-191.025-426.667-426.667-426.667v0zM512 853.333h-281.173l39.68-39.68c7.861-7.709 12.749-18.426 12.8-30.284l0-0.010c-0.172-11.712-5.037-22.255-12.793-29.86l-0.007-0.007c-61.849-61.783-100.108-147.17-100.108-241.493 0-188.513 152.82-341.333 341.333-341.333s341.333 152.82 341.333 341.333c0 188.419-152.667 341.181-341.051 341.333l-0.014 0z"],"attrs":[],"grid":0,"tags":["comment-dots"]},"attrs":[],"properties":{"order":4797,"id":887,"name":"comment-dots","prevSize":32,"code":59966},"setIdx":0,"setId":0,"iconIdx":318},{"icon":{"paths":["M810.667 597.333c-3.216-0.869-6.909-1.368-10.719-1.368-19.806 0-36.459 13.495-41.268 31.791l-0.066 0.297c-33.871 130.414-150.494 225.169-289.267 225.28l-238.519 0 27.307-26.88c7.668-7.712 12.407-18.343 12.407-30.080s-4.74-22.368-12.409-30.082l0.002 0.002c-54.31-54.091-87.916-128.935-87.916-211.627 0-164.949 133.718-298.667 298.667-298.667 0.158 0 0.316 0 0.474 0l-0.024-0c5.608-0.31 12.17-0.487 18.773-0.487s13.166 0.177 19.682 0.526l-0.909-0.039c1.537 0.195 3.316 0.306 5.12 0.306 23.733 0 42.973-19.24 42.973-42.973 0-21.929-16.425-40.021-37.644-42.646l-0.209-0.021c-7.147-0.513-15.486-0.805-23.893-0.805s-16.746 0.292-25.007 0.867l1.113-0.062c-211.534 0.718-382.738 172.364-382.738 383.998 0 91.056 31.693 174.71 84.65 240.532l-0.579-0.743-72.96 71.253c-7.601 7.7-12.296 18.286-12.296 29.968 0 5.971 1.227 11.656 3.442 16.817l-0.106-0.278c6.527 15.59 21.621 26.363 39.242 26.453l0.012 0h341.333c0.073 0 0.16 0 0.247 0 177.962 0 327.65-121.060 371.202-285.321l0.604-2.679c1.077-3.569 1.698-7.67 1.698-11.916 0-19.925-13.658-36.66-32.123-41.354l-0.295-0.064zM926.293 309.76c-7.733-7.795-18.45-12.621-30.293-12.621s-22.56 4.826-30.291 12.618l-0.003 0.003-55.040 56.747v-238.507c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 238.507l-55.040-55.467c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l128 128c3.937 3.773 8.616 6.808 13.791 8.859l0.289 0.101c4.771 2.163 10.345 3.423 16.213 3.423s11.443-1.26 16.466-3.525l-0.253 0.102c5.464-2.152 10.143-5.187 14.095-8.974l-0.015 0.014 128-128c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003z"],"attrs":[],"grid":0,"tags":["comment-download"]},"attrs":[],"properties":{"order":4798,"id":886,"name":"comment-download","prevSize":32,"code":59967},"setIdx":0,"setId":0,"iconIdx":319},{"icon":{"paths":["M926.293 201.387l-103.68-103.68c-7.712-7.668-18.343-12.407-30.080-12.407s-22.368 4.74-30.082 12.409l0.002-0.002-238.080 238.080c-7.648 7.709-12.374 18.326-12.374 30.047 0 0.087 0 0.173 0.001 0.26l-0-0.013v103.253c0 23.564 19.103 42.667 42.667 42.667v0h103.253c0.073 0 0.16 0.001 0.247 0.001 11.721 0 22.338-4.726 30.049-12.377l-0.003 0.003 238.080-238.080c7.668-7.712 12.407-18.343 12.407-30.080s-4.74-22.368-12.409-30.082l0.002 0.002zM640 426.667h-42.667v-42.667l195.413-195.413 42.667 42.667zM810.667 512v0c-23.564 0-42.667 19.103-42.667 42.667v0c0 164.949-133.718 298.667-298.667 298.667v0h-238.507l27.307-26.88c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003c-54.055-54.049-87.488-128.72-87.488-211.2 0-164.949 133.718-298.667 298.667-298.667 0.008 0 0.015 0 0.023 0l-0.002-0c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0 0c-211.534 0.718-382.738 172.364-382.738 383.998 0 91.056 31.693 174.71 84.65 240.532l-0.579-0.743-72.96 71.253c-7.601 7.7-12.296 18.286-12.296 29.968 0 5.971 1.227 11.656 3.442 16.817l-0.106-0.278c6.527 15.59 21.621 26.363 39.242 26.453l0.012 0h341.333c212.077 0 384-171.923 384-384v0c0-23.564-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["comment-edit"]},"attrs":[],"properties":{"order":4799,"id":885,"name":"comment-edit","prevSize":32,"code":59968},"setIdx":0,"setId":0,"iconIdx":320},{"icon":{"paths":["M512 597.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM512 85.333c-235.641 0-426.667 191.025-426.667 426.667v0c-0.002 0.474-0.003 1.036-0.003 1.598 0 102.317 36.415 196.128 96.992 269.181l-0.563-0.698-85.333 85.333c-7.601 7.7-12.296 18.286-12.296 29.968 0 5.971 1.227 11.656 3.442 16.817l-0.106-0.278c6.929 14.753 21.662 24.784 38.738 24.784 0.631 0 1.259-0.014 1.884-0.041l-0.089 0.003h384c235.641 0 426.667-191.025 426.667-426.667s-191.025-426.667-426.667-426.667v0zM512 853.333h-281.173l39.68-39.68c7.861-7.709 12.749-18.426 12.8-30.284l0-0.010c-0.172-11.712-5.037-22.255-12.793-29.86l-0.007-0.007c-61.849-61.783-100.108-147.17-100.108-241.493 0-188.513 152.82-341.333 341.333-341.333s341.333 152.82 341.333 341.333c0 188.419-152.667 341.181-341.051 341.333l-0.014 0zM512 341.333c-23.564 0-42.667 19.103-42.667 42.667v0 128c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-128c0-23.564-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["comment-exclamation"]},"attrs":[],"properties":{"order":4800,"id":884,"name":"comment-exclamation","prevSize":32,"code":59969},"setIdx":0,"setId":0,"iconIdx":321},{"icon":{"paths":["M512 356.267c-17.37-9.093-37.943-14.428-59.762-14.428-35.508 0-67.716 14.128-91.309 37.070l0.030-0.029c-23.13 23.158-37.434 55.135-37.434 90.453s14.304 67.296 37.435 90.455l-0.001-0.001 120.747 122.88c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 120.747-120.747c23.13-23.158 37.434-55.135 37.434-90.453s-14.304-67.296-37.435-90.455l0.001 0.001c-23.713-23.756-56.494-38.452-92.708-38.452-21.256 0-41.329 5.063-59.080 14.049l0.748-0.343zM602.453 499.627l-90.453 90.453-90.453-90.453c-7.795-7.733-12.621-18.45-12.621-30.293s4.826-22.56 12.618-30.291l0.003-0.003c7.712-7.668 18.343-12.407 30.080-12.407s22.368 4.74 30.082 12.409l-0.002-0.002c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.712-7.668 18.343-12.407 30.080-12.407s22.368 4.74 30.082 12.409l-0.002-0.002c7.795 7.733 12.621 18.45 12.621 30.293s-4.826 22.56-12.618 30.291l-0.003 0.003zM512 85.333c-235.641 0-426.667 191.025-426.667 426.667v0c-0.002 0.474-0.003 1.036-0.003 1.598 0 102.317 36.415 196.128 96.992 269.181l-0.563-0.698-85.333 85.333c-7.601 7.7-12.296 18.286-12.296 29.968 0 5.971 1.227 11.656 3.442 16.817l-0.106-0.278c6.929 14.753 21.662 24.784 38.738 24.784 0.631 0 1.259-0.014 1.884-0.041l-0.089 0.003h384c235.641 0 426.667-191.025 426.667-426.667s-191.025-426.667-426.667-426.667v0zM512 853.333h-281.173l39.68-39.68c7.668-7.712 12.407-18.343 12.407-30.080s-4.74-22.368-12.409-30.082l0.002 0.002c-61.849-61.783-100.108-147.17-100.108-241.493 0-188.513 152.82-341.333 341.333-341.333s341.333 152.82 341.333 341.333c0 188.419-152.667 341.181-341.051 341.333l-0.014 0z"],"attrs":[],"grid":0,"tags":["comment-heart"]},"attrs":[],"properties":{"order":4801,"id":883,"name":"comment-heart","prevSize":32,"code":59970},"setIdx":0,"setId":0,"iconIdx":322},{"icon":{"paths":["M512 85.333c-235.509 0.176-426.358 191.133-426.358 426.667 0 44.295 6.75 87.013 19.277 127.183l-0.812-3.022c-0.118 0.641-0.185 1.379-0.185 2.133s0.067 1.492 0.197 2.209l-0.011-0.075c17.229 54.466 43.316 101.642 76.943 142.364l-0.57-0.711-85.333 85.333c-7.601 7.7-12.296 18.286-12.296 29.968 0 5.971 1.227 11.656 3.442 16.817l-0.106-0.278c6.914 14.791 21.667 24.855 38.771 24.855 1.071 0 2.132-0.039 3.183-0.117l-0.14 0.008h384c186.334-0.142 344.704-119.708 402.719-286.286l0.908-2.994v-3.413c14.213-39.874 22.617-85.874 23.039-133.78l0.001-0.193c0-235.641-191.025-426.667-426.667-426.667v0zM512 853.333h-281.173l12.8-12.373 358.827-359.253c7.69-7.542 18.235-12.197 29.867-12.197s22.177 4.655 29.874 12.203l-0.007-0.007 154.453 153.6 9.813 9.387c-53.143 123.626-173.87 208.626-314.451 208.64l-0.002 0zM193.707 634.453l67.413-67.413c7.712-7.668 18.343-12.407 30.080-12.407s22.368 4.74 30.082 12.409l-0.002-0.002 37.12 37.12-116.053 116.907c-19.609-24.859-36.020-53.489-47.884-84.373l-0.756-2.24zM851.2 549.12l-128-128c-23.158-23.13-55.135-37.434-90.453-37.434s-67.296 14.304-90.455 37.435l0.001-0.001-123.307 123.307-37.547-37.12c-23.136-23.003-55.028-37.221-90.24-37.221s-67.104 14.219-90.246 37.228l0.006-0.006-30.293 28.587c-0.203-3.569-0.319-7.744-0.319-11.947s0.116-8.378 0.344-12.523l-0.025 0.577c0-188.513 152.82-341.333 341.333-341.333s341.333 152.82 341.333 341.333v0c0.304 5.48 0.477 11.893 0.477 18.347s-0.173 12.867-0.515 19.235l0.038-0.888z"],"attrs":[],"grid":0,"tags":["comment-image"]},"attrs":[],"properties":{"order":4802,"id":882,"name":"comment-image","prevSize":32,"code":59971},"setIdx":0,"setId":0,"iconIdx":323},{"icon":{"paths":["M512 384c-23.564 0-42.667 19.103-42.667 42.667v0 128c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-128c0-23.564-19.103-42.667-42.667-42.667v0zM810.667 85.333h-597.333c-70.692 0-128 57.308-128 128v0 426.667c0 70.692 57.308 128 128 128v0h494.507l157.867 158.293c7.709 7.648 18.326 12.374 30.047 12.374 0.087 0 0.173-0 0.26-0.001l-0.013 0c0.275 0.008 0.599 0.012 0.923 0.012 5.554 0 10.813-1.263 15.505-3.518l-0.215 0.093c15.59-6.527 26.363-21.621 26.453-39.242l0-0.012v-682.667c0-70.692-57.308-128-128-128v0zM853.333 793.173l-97.707-98.133c-7.709-7.648-18.326-12.374-30.047-12.374-0.087 0-0.173 0-0.26 0.001l0.013-0h-512c-23.564 0-42.667-19.103-42.667-42.667v0-426.667c0-23.564 19.103-42.667 42.667-42.667v0h597.333c23.564 0 42.667 19.103 42.667 42.667v0zM512 256c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["comment-info-alt"]},"attrs":[],"properties":{"order":4803,"id":881,"name":"comment-info-alt","prevSize":32,"code":59972},"setIdx":0,"setId":0,"iconIdx":324},{"icon":{"paths":["M512 469.333c-23.564 0-42.667 19.103-42.667 42.667v0 128c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-128c0-23.564-19.103-42.667-42.667-42.667v0zM512 341.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM512 85.333c-235.641 0-426.667 191.025-426.667 426.667v0c-0.002 0.474-0.003 1.036-0.003 1.598 0 102.317 36.415 196.128 96.992 269.181l-0.563-0.698-85.333 85.333c-7.601 7.7-12.296 18.286-12.296 29.968 0 5.971 1.227 11.656 3.442 16.817l-0.106-0.278c6.929 14.753 21.662 24.784 38.738 24.784 0.631 0 1.259-0.014 1.884-0.041l-0.089 0.003h384c235.641 0 426.667-191.025 426.667-426.667s-191.025-426.667-426.667-426.667v0zM512 853.333h-281.173l39.68-39.68c7.861-7.709 12.749-18.426 12.8-30.284l0-0.010c-0.172-11.712-5.037-22.255-12.793-29.86l-0.007-0.007c-61.849-61.783-100.108-147.17-100.108-241.493 0-188.513 152.82-341.333 341.333-341.333s341.333 152.82 341.333 341.333c0 188.419-152.667 341.181-341.051 341.333l-0.014 0z"],"attrs":[],"grid":0,"tags":["comment-info"]},"attrs":[],"properties":{"order":4804,"id":880,"name":"comment-info","prevSize":32,"code":59973},"setIdx":0,"setId":0,"iconIdx":325},{"icon":{"paths":["M725.333 384h-426.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h426.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM554.667 554.667h-256c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h256c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM512 85.333c-235.641 0-426.667 191.025-426.667 426.667v0c-0.002 0.474-0.003 1.036-0.003 1.598 0 102.317 36.415 196.128 96.992 269.181l-0.563-0.698-85.333 85.333c-7.601 7.7-12.296 18.286-12.296 29.968 0 5.971 1.227 11.656 3.442 16.817l-0.106-0.278c6.929 14.753 21.662 24.784 38.738 24.784 0.631 0 1.259-0.014 1.884-0.041l-0.089 0.003h384c235.641 0 426.667-191.025 426.667-426.667s-191.025-426.667-426.667-426.667v0zM512 853.333h-281.173l39.68-39.68c7.668-7.712 12.407-18.343 12.407-30.080s-4.74-22.368-12.409-30.082l0.002 0.002c-61.849-61.783-100.108-147.17-100.108-241.493 0-188.513 152.82-341.333 341.333-341.333s341.333 152.82 341.333 341.333c0 188.419-152.667 341.181-341.051 341.333l-0.014 0z"],"attrs":[],"grid":0,"tags":["comment-lines"]},"attrs":[],"properties":{"order":4805,"id":879,"name":"comment-lines","prevSize":32,"code":59974},"setIdx":0,"setId":0,"iconIdx":326},{"icon":{"paths":["M807.253 688.213c-6.133-3.613-13.511-5.748-21.388-5.748-15.791 0-29.578 8.578-36.956 21.329l-0.11 0.205c-52.515 89.756-148.368 149.136-258.105 149.333l-0.028 0h-238.507l27.307-26.88c7.668-7.712 12.407-18.343 12.407-30.080s-4.74-22.368-12.409-30.082l0.002 0.002c-54.405-54.107-88.076-129.014-88.076-211.786 0-151.929 113.441-277.362 260.24-296.218l1.49-0.156c21.428-2.645 37.853-20.738 37.853-42.667 0-23.733-19.24-42.973-42.973-42.973-1.804 0-3.583 0.111-5.329 0.327l0.209-0.021c-190.817 24.287-336.849 185.637-336.849 381.094 0 91.403 31.935 175.348 85.256 241.284l-0.567-0.725-71.68 71.253c-7.601 7.7-12.296 18.286-12.296 29.968 0 5.971 1.227 11.656 3.442 16.817l-0.106-0.278c6.527 15.59 21.621 26.363 39.242 26.453l0.012 0h341.333c141.315-0.068 264.773-76.461 331.392-190.188l0.981-1.812c3.613-6.133 5.748-13.511 5.748-21.388 0-15.791-8.578-29.578-21.329-36.956l-0.205-0.11zM832 263.68v-50.347c0-70.692-57.308-128-128-128s-128 57.308-128 128v0 50.347c-50.028 18.062-85.173 65.066-85.333 120.3l-0 0.020v85.333c0 70.692 57.308 128 128 128v0h170.667c70.692 0 128-57.308 128-128v0-85.333c-0.16-55.254-35.305-102.258-84.442-120.038l-0.891-0.282zM661.333 213.333c0-23.564 19.103-42.667 42.667-42.667s42.667 19.103 42.667 42.667v0 42.667h-85.333zM832 469.333c0 23.564-19.103 42.667-42.667 42.667v0h-170.667c-23.564 0-42.667-19.103-42.667-42.667v0-85.333c0-23.564 19.103-42.667 42.667-42.667v0h170.667c23.564 0 42.667 19.103 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["comment-lock"]},"attrs":[],"properties":{"order":4806,"id":878,"name":"comment-lock","prevSize":32,"code":59975},"setIdx":0,"setId":0,"iconIdx":327},{"icon":{"paths":["M512 85.333c-235.641 0-426.667 191.025-426.667 426.667v0c-0.002 0.474-0.003 1.036-0.003 1.598 0 102.317 36.415 196.128 96.992 269.181l-0.563-0.698-85.333 85.333c-7.601 7.7-12.296 18.286-12.296 29.968 0 5.971 1.227 11.656 3.442 16.817l-0.106-0.278c6.929 14.753 21.662 24.784 38.738 24.784 0.631 0 1.259-0.014 1.884-0.041l-0.089 0.003h384c235.641 0 426.667-191.025 426.667-426.667s-191.025-426.667-426.667-426.667v0zM512 853.333h-281.173l39.68-39.68c7.668-7.712 12.407-18.343 12.407-30.080s-4.74-22.368-12.409-30.082l0.002 0.002c-61.849-61.783-100.108-147.17-100.108-241.493 0-188.513 152.82-341.333 341.333-341.333s341.333 152.82 341.333 341.333c0 188.419-152.667 341.181-341.051 341.333l-0.014 0zM597.333 469.333h-42.667v-42.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 42.667h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h42.667v42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["comment-medical"]},"attrs":[],"properties":{"order":4807,"id":877,"name":"comment-medical","prevSize":32,"code":59976},"setIdx":0,"setId":0,"iconIdx":328},{"icon":{"paths":["M512 85.333c-235.641 0-426.667 191.025-426.667 426.667v0c-0.002 0.474-0.003 1.036-0.003 1.598 0 102.317 36.415 196.128 96.992 269.181l-0.563-0.698-85.333 85.333c-7.601 7.7-12.296 18.286-12.296 29.968 0 5.971 1.227 11.656 3.442 16.817l-0.106-0.278c6.929 14.753 21.662 24.784 38.738 24.784 0.631 0 1.259-0.014 1.884-0.041l-0.089 0.003h384c235.641 0 426.667-191.025 426.667-426.667s-191.025-426.667-426.667-426.667v0zM512 853.333h-281.173l39.68-39.68c7.668-7.712 12.407-18.343 12.407-30.080s-4.74-22.368-12.409-30.082l0.002 0.002c-61.849-61.783-100.108-147.17-100.108-241.493 0-188.513 152.82-341.333 341.333-341.333s341.333 152.82 341.333 341.333c0 188.419-152.667 341.181-341.051 341.333l-0.014 0zM725.333 469.333h-426.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h426.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM640 640h-256c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h256c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM384 384h256c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-256c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["comment-message"]},"attrs":[],"properties":{"order":4808,"id":876,"name":"comment-message","prevSize":32,"code":59977},"setIdx":0,"setId":0,"iconIdx":329},{"icon":{"paths":["M469.333 469.333h256c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-256c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM298.667 384c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM298.667 554.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM512 85.333c-235.641 0-426.667 191.025-426.667 426.667v0c-0.002 0.474-0.003 1.036-0.003 1.598 0 102.317 36.415 196.128 96.992 269.181l-0.563-0.698-85.333 85.333c-7.601 7.7-12.296 18.286-12.296 29.968 0 5.971 1.227 11.656 3.442 16.817l-0.106-0.278c6.929 14.753 21.662 24.784 38.738 24.784 0.631 0 1.259-0.014 1.884-0.041l-0.089 0.003h384c235.641 0 426.667-191.025 426.667-426.667s-191.025-426.667-426.667-426.667v0zM512 853.333h-281.173l39.68-39.68c7.861-7.709 12.749-18.426 12.8-30.284l0-0.010c-0.172-11.712-5.037-22.255-12.793-29.86l-0.007-0.007c-61.849-61.783-100.108-147.17-100.108-241.493 0-188.513 152.82-341.333 341.333-341.333s341.333 152.82 341.333 341.333c0 188.419-152.667 341.181-341.051 341.333l-0.014 0zM725.333 554.667h-256c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h256c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["comment-notes"]},"attrs":[],"properties":{"order":4809,"id":875,"name":"comment-notes","prevSize":32,"code":59978},"setIdx":0,"setId":0,"iconIdx":330},{"icon":{"paths":["M512 85.333c-235.641 0-426.667 191.025-426.667 426.667v0c-0.002 0.474-0.003 1.036-0.003 1.598 0 102.317 36.415 196.128 96.992 269.181l-0.563-0.698-85.333 85.333c-7.601 7.7-12.296 18.286-12.296 29.968 0 5.971 1.227 11.656 3.442 16.817l-0.106-0.278c6.929 14.753 21.662 24.784 38.738 24.784 0.631 0 1.259-0.014 1.884-0.041l-0.089 0.003h384c235.641 0 426.667-191.025 426.667-426.667s-191.025-426.667-426.667-426.667v0zM512 853.333h-281.173l39.68-39.68c7.668-7.712 12.407-18.343 12.407-30.080s-4.74-22.368-12.409-30.082l0.002 0.002c-61.849-61.783-100.108-147.17-100.108-241.493 0-188.513 152.82-341.333 341.333-341.333s341.333 152.82 341.333 341.333c0 188.419-152.667 341.181-341.051 341.333l-0.014 0zM640 469.333h-85.333v-85.333c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 85.333h-85.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h85.333v85.333c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-85.333h85.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["comment-plus"]},"attrs":[],"properties":{"order":4810,"id":874,"name":"comment-plus","prevSize":32,"code":59979},"setIdx":0,"setId":0,"iconIdx":331},{"icon":{"paths":["M630.187 250.453c6.055 3.499 13.32 5.563 21.067 5.563 15.716 0 29.448-8.497 36.851-21.148l0.109-0.202c7.474-13.011 21.291-21.632 37.121-21.632 23.564 0 42.667 19.103 42.667 42.667 0 0.105-0 0.21-0.001 0.314l0-0.016c0 23.564-19.103 42.667-42.667 42.667v0c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0c70.657-0.047 127.918-57.336 127.918-128 0-70.692-57.308-128-128-128-47.128 0-88.308 25.47-110.524 63.396l-0.327 0.604c-3.613 6.133-5.748 13.511-5.748 21.388 0 15.791 8.578 29.578 21.329 36.956l0.205 0.11zM813.653 554.667c-1.649-0.226-3.555-0.355-5.492-0.355-21.583 0-39.423 16.025-42.27 36.826l-0.025 0.222c-18.899 148.403-144.389 261.973-296.404 261.973-0.045 0-0.091-0-0.136-0l-238.5 0 27.733-27.733c7.668-7.712 12.407-18.343 12.407-30.080s-4.74-22.368-12.409-30.082l0.002 0.002c-53.801-54.006-87.064-128.506-87.064-210.774 0-164.657 133.245-298.194 297.792-298.665l0.045-0c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0c-211.387 0.91-382.398 172.482-382.398 383.997 0 90.865 31.56 174.358 84.316 240.117l-0.585-0.754-72.96 71.68c-7.601 7.7-12.296 18.286-12.296 29.968 0 5.971 1.227 11.656 3.442 16.817l-0.106-0.278c6.527 15.59 21.621 26.363 39.242 26.453l0.012 0h341.333c0.015 0 0.034 0 0.052 0 195.081 0 356.185-145.47 380.755-333.852l0.206-1.935c0.262-1.776 0.411-3.826 0.411-5.911 0-21.603-16.055-39.456-36.884-42.278l-0.22-0.024zM741.547 429.653c-5.079-2.305-11.014-3.648-17.263-3.648-2.645 0-5.234 0.241-7.746 0.701l0.262-0.040-7.68 2.56-7.68 3.84-6.4 5.547c-3.733 3.822-6.76 8.354-8.856 13.372l-0.104 0.282c-2.18 4.493-3.454 9.774-3.454 15.352 0 0.603 0.015 1.203 0.044 1.799l-0.003-0.084c-0.006 0.277-0.010 0.604-0.010 0.932 0 5.656 1.101 11.055 3.099 15.994l-0.102-0.286c2.325 5.317 5.491 9.849 9.378 13.645l0.008 0.008c7.709 7.648 18.326 12.374 30.047 12.374 0.087 0 0.173-0 0.26-0.001l-0.013 0c23.564 0 42.667-19.103 42.667-42.667v0c0.008-0.275 0.012-0.599 0.012-0.923 0-5.554-1.263-10.813-3.518-15.505l0.093 0.215c-4.679-10.291-12.749-18.361-22.754-22.923l-0.286-0.117z"],"attrs":[],"grid":0,"tags":["comment-question"]},"attrs":[],"properties":{"order":4811,"id":873,"name":"comment-question","prevSize":32,"code":59980},"setIdx":0,"setId":0,"iconIdx":332},{"icon":{"paths":["M810.667 597.333c-3.216-0.869-6.909-1.368-10.719-1.368-19.806 0-36.459 13.495-41.268 31.791l-0.066 0.297c-33.871 130.414-150.494 225.169-289.267 225.28l-238.519 0 27.307-26.88c7.668-7.712 12.407-18.343 12.407-30.080s-4.74-22.368-12.409-30.082l0.002 0.002c-54.301-54.090-87.901-128.927-87.901-211.612 0-138.573 94.373-255.104 222.353-288.828l2.081-0.466c18.59-4.908 32.072-21.573 32.072-41.387 0-23.604-19.135-42.739-42.739-42.739-3.79 0-7.466 0.493-10.965 1.42l0.298-0.067c-166.493 44.467-287.117 193.936-287.117 371.577 0 91.27 31.842 175.102 85.022 240.995l-0.572-0.732-72.96 71.253c-7.601 7.7-12.296 18.286-12.296 29.968 0 5.971 1.227 11.656 3.442 16.817l-0.106-0.278c6.527 15.59 21.621 26.363 39.242 26.453l0.012 0h341.333c0.073 0 0.16 0 0.247 0 177.962 0 327.65-121.060 371.202-285.321l0.604-2.679c1.077-3.569 1.698-7.67 1.698-11.916 0-19.925-13.658-36.66-32.123-41.354l-0.295-0.064zM896 85.333c-23.564 0-42.667 19.103-42.667 42.667v0 0c-35.241-26.713-79.826-42.791-128.166-42.791-117.821 0-213.333 95.513-213.333 213.333s95.513 213.333 213.333 213.333c54.144 0 103.577-20.171 141.194-53.407l-0.229 0.198c11.455-7.77 18.882-20.729 18.882-35.422 0-23.564-19.103-42.667-42.667-42.667-12.554 0-23.842 5.422-31.65 14.052l-0.033 0.037c-22.445 19.867-52.137 31.998-84.662 31.998-70.692 0-128-57.308-128-128 0-70.456 56.926-127.617 127.292-127.998l0.036-0c37.756 0.079 71.663 16.493 95.041 42.547l0.106 0.12h-52.48c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h128c23.564 0 42.667-19.103 42.667-42.667v0-128c0-23.564-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["comment-redo"]},"attrs":[],"properties":{"order":4812,"id":872,"name":"comment-redo","prevSize":32,"code":59981},"setIdx":0,"setId":0,"iconIdx":333},{"icon":{"paths":["M904.96 439.040l-73.813-73.387c17.165-27.43 27.452-60.698 27.733-96.35l0-0.077c-0.243-101.378-82.482-183.466-183.893-183.466-101.561 0-183.893 82.332-183.893 183.893 0 101.411 82.089 183.65 183.443 183.893l0.023 0c0.066 0 0.144 0 0.222 0 35.559 0 68.782-10 97.011-27.341l-0.807 0.461 73.387 73.813c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c8.055-7.772 13.057-18.662 13.057-30.72s-5.002-22.948-13.044-30.708l-0.013-0.012zM744.533 341.333c-17.869 17.656-42.441 28.562-69.561 28.562-54.669 0-98.987-44.318-98.987-98.987 0-0.591 0.005-1.182 0.016-1.771l-0.001 0.089c-0-0.019-0-0.042-0-0.064 0-27.177 11.096-51.763 29.004-69.474l0.009-0.009c17.889-17.774 42.542-28.759 69.76-28.759s51.871 10.985 69.765 28.764l-0.005-0.005c17.876 17.843 28.935 42.51 28.935 69.76s-11.059 51.917-28.934 69.758l-0.002 0.002zM832 597.333c-3.216-0.869-6.909-1.368-10.719-1.368-19.806 0-36.459 13.495-41.268 31.791l-0.066 0.297c-33.871 130.414-150.494 225.169-289.267 225.28l-238.519 0 27.307-26.88c7.668-7.712 12.407-18.343 12.407-30.080s-4.74-22.368-12.409-30.082l0.002 0.002c-52.785-53.827-85.364-127.636-85.364-209.054 0-1.505 0.011-3.006 0.033-4.506l-0.003 0.227c0.485-123.241 75.537-228.832 182.36-274.037l1.96-0.736c15.906-6.452 26.918-21.78 26.918-39.68 0-23.585-19.12-42.705-42.705-42.705-5.685 0-11.111 1.111-16.072 3.128l0.286-0.103c-142.528 58.248-241.125 195.825-241.125 356.431 0 91.558 32.043 175.632 85.528 241.62l-0.563-0.717-71.68 69.547c-7.601 7.7-12.296 18.286-12.296 29.968 0 5.971 1.227 11.656 3.442 16.817l-0.106-0.278c6.527 15.59 21.621 26.363 39.242 26.453l0.012 0h341.333c0.073 0 0.16 0 0.247 0 177.962 0 327.65-121.060 371.202-285.321l0.604-2.679c1.077-3.569 1.698-7.67 1.698-11.916 0-19.925-13.658-36.66-32.123-41.354l-0.295-0.064z"],"attrs":[],"grid":0,"tags":["comment-search"]},"attrs":[],"properties":{"order":4813,"id":871,"name":"comment-search","prevSize":32,"code":59982},"setIdx":0,"setId":0,"iconIdx":334},{"icon":{"paths":["M813.227 576.427c-1.506-0.188-3.249-0.296-5.018-0.296-21.713 0-39.638 16.22-42.32 37.204l-0.022 0.212c-19.292 148.002-144.584 261.12-296.297 261.12-0.083 0-0.166-0-0.249-0l-238.494 0 27.307-26.88c7.668-7.712 12.407-18.343 12.407-30.080s-4.74-22.368-12.409-30.082l0.002 0.002c-54.301-54.090-87.901-128.927-87.901-211.612 0-138.573 94.373-255.104 222.353-288.828l2.081-0.466c18.59-4.908 32.072-21.573 32.072-41.387 0-23.604-19.135-42.739-42.739-42.739-3.79 0-7.466 0.493-10.965 1.42l0.298-0.067c-166.493 44.467-287.117 193.936-287.117 371.577 0 91.27 31.842 175.102 85.022 240.995l-0.572-0.732-72.96 71.253c-7.601 7.7-12.296 18.286-12.296 29.968 0 5.971 1.227 11.656 3.442 16.817l-0.106-0.278c6.527 15.59 21.621 26.363 39.242 26.453l0.012 0h341.333c195.231-0.001 356.433-145.696 380.81-334.29l0.203-1.923c0.188-1.506 0.296-3.249 0.296-5.018 0-21.713-16.22-39.638-37.204-42.32l-0.212-0.022zM810.667 320c-18.957 0.064-36.446 6.3-50.575 16.802l0.228-0.162-74.667-34.133 82.347-37.547c12.169 7.502 26.854 12.065 42.582 12.372l0.085 0.001c47.128 0 85.333-38.205 85.333-85.333s-38.205-85.333-85.333-85.333c-47.128 0-85.333 38.205-85.333 85.333v0l-81.067 37.12c-13.071-9.406-29.27-15.239-46.802-15.783l-0.131-0.003c-47.128 0-85.333 38.205-85.333 85.333s38.205 85.333 85.333 85.333v0c14.561-0.151 28.207-3.926 40.123-10.463l-0.443 0.223 89.173 42.667c5.679 42.113 41.392 74.24 84.609 74.24 47.128 0 85.333-38.205 85.333-85.333s-38.205-85.333-85.333-85.333c-0.045 0-0.091 0-0.136 0l0.007-0z"],"attrs":[],"grid":0,"tags":["comment-share"]},"attrs":[],"properties":{"order":4814,"id":870,"name":"comment-share","prevSize":32,"code":59983},"setIdx":0,"setId":0,"iconIdx":335},{"icon":{"paths":["M925.867 122.027c-7.264-5.913-16.631-9.495-26.834-9.495-3.19 0-6.299 0.35-9.29 1.014l0.284-0.053c-7.815 1.696-16.792 2.668-25.997 2.668-27.491 0-52.958-8.667-73.817-23.417l0.401 0.269c-6.832-4.853-15.343-7.759-24.533-7.759s-17.701 2.905-24.666 7.848l0.132-0.089c-20.459 14.481-45.926 23.148-73.417 23.148-9.204 0-18.182-0.972-26.835-2.818l0.839 0.15c-2.707-0.611-5.816-0.961-9.006-0.961-10.203 0-19.57 3.582-26.912 9.556l0.078-0.062c-9.594 7.827-15.696 19.618-15.787 32.838l-0 0.015v143.787c0.161 64.855 32.029 122.234 80.918 157.472l0.575 0.394 69.12 49.493c6.918 5.040 15.586 8.063 24.96 8.063s18.042-3.023 25.082-8.147l-0.122 0.085 69.12-49.493c49.464-35.633 81.333-93.011 81.493-157.841l0-0.025v-143.787c-0.090-13.235-6.193-25.027-15.71-32.792l-0.077-0.061zM856.32 298.667c-1.24 35.129-18.821 65.909-45.334 85.113l-0.319 0.22-42.667 31.573-46.507-31.573c-26.833-19.425-44.414-50.204-45.648-85.144l-0.005-0.19v-97.28c33.792-1.116 65.34-9.662 93.403-24.045l-1.243 0.579c26.18 13.573 56.959 22.091 89.587 23.452l0.439 0.015zM807.68 597.333c-3.098-0.805-6.654-1.266-10.318-1.266-19.769 0-36.397 13.444-41.241 31.689l-0.067 0.298c-33.89 130.489-150.63 225.28-289.51 225.28-0.069 0-0.138-0-0.207-0l-238.070 0 27.733-26.88c7.174-7.616 11.582-17.907 11.582-29.227s-4.408-21.611-11.602-29.248l0.020 0.022c-55.342-54.253-89.647-129.789-89.647-213.336 0-164.949 133.718-298.667 298.667-298.667 0.466 0 0.933 0.001 1.399 0.003l-0.072-0c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0c-211.534 0.718-382.738 172.364-382.738 383.998 0 91.056 31.693 174.71 84.65 240.532l-0.579-0.743-72.533 71.253c-7.795 7.733-12.621 18.45-12.621 30.294 0 23.501 19.001 42.565 42.478 42.666l0.010 0h341.333c0.073 0 0.16 0 0.247 0 177.962 0 327.65-121.060 371.202-285.321l0.604-2.679c1.077-3.569 1.698-7.67 1.698-11.916 0-19.925-13.658-36.66-32.123-41.354l-0.295-0.064z"],"attrs":[],"grid":0,"tags":["comment-shield"]},"attrs":[],"properties":{"order":4815,"id":869,"name":"comment-shield","prevSize":32,"code":59984},"setIdx":0,"setId":0,"iconIdx":336},{"icon":{"paths":["M434.773 223.147c22.982-6.233 49.369-9.814 76.592-9.814 0.223 0 0.446 0 0.669 0.001l-0.035-0c164.949 0 298.667 133.718 298.667 298.667v0c0 0.188 0.001 0.411 0.001 0.634 0 27.223-3.581 53.611-10.297 78.716l0.483-2.123c-0.972 3.396-1.531 7.297-1.531 11.328 0 19.555 13.155 36.037 31.098 41.080l0.3 0.072c1.665 0.2 3.592 0.315 5.547 0.315s3.882-0.114 5.777-0.336l-0.23 0.022c0.435 0.016 0.947 0.025 1.461 0.025 19.628 0 36.16-13.253 41.136-31.299l0.070-0.3c7.34-27.921 11.554-59.975 11.554-93.014 0-1.8-0.013-3.597-0.037-5.391l0.003 0.272c0-212.077-171.923-384-384-384v0c-0.47-0.002-1.027-0.003-1.583-0.003-34.788 0-68.485 4.673-100.496 13.425l2.666-0.621c-17.636 5.504-30.214 21.688-30.214 40.809 0 4.156 0.594 8.174 1.703 11.973l-0.075-0.302c5.252 18.036 21.632 30.992 41.038 30.992 3.453 0 6.811-0.41 10.026-1.185l-0.291 0.059zM926.293 865.707l-768-768c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293v0l115.627 113.92c-52.377 65.078-84.069 148.731-84.069 239.787s31.692 174.708 84.648 240.53l-0.579-0.743-72.96 71.253c-7.601 7.7-12.296 18.286-12.296 29.968 0 5.971 1.227 11.656 3.442 16.817l-0.106-0.278c6.527 15.59 21.621 26.363 39.242 26.453l0.012 0h341.333c91.207-0.386 174.837-32.51 240.493-85.889l-0.706 0.556 113.92 114.347c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.418-7.666 11.989-18.126 11.989-29.653s-4.571-21.987-12-29.665l0.011 0.012zM512 810.667h-238.507l27.307-26.88c7.668-7.712 12.407-18.343 12.407-30.080s-4.74-22.368-12.409-30.082l0.002 0.002c-54.047-54.048-87.476-128.714-87.476-211.188 0-67.579 22.445-129.916 60.287-179.963l-0.544 0.751 417.707 417.707c-49.182 37.208-111.349 59.634-178.75 59.733l-0.023 0z"],"attrs":[],"grid":0,"tags":["comment-slash"]},"attrs":[],"properties":{"order":4816,"id":868,"name":"comment-slash","prevSize":32,"code":59985},"setIdx":0,"setId":0,"iconIdx":337},{"icon":{"paths":["M810.667 597.333c-3.216-0.869-6.909-1.368-10.719-1.368-19.806 0-36.459 13.495-41.268 31.791l-0.066 0.297c-33.871 130.414-150.494 225.169-289.267 225.28l-238.519 0 27.307-26.88c7.668-7.712 12.407-18.343 12.407-30.080s-4.74-22.368-12.409-30.082l0.002 0.002c-54.31-54.091-87.916-128.935-87.916-211.627 0-164.949 133.718-298.667 298.667-298.667 0.158 0 0.316 0 0.474 0l-0.024-0c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0c-211.534 0.718-382.738 172.364-382.738 383.998 0 91.056 31.693 174.71 84.65 240.532l-0.579-0.743-72.96 71.253c-7.601 7.7-12.296 18.286-12.296 29.968 0 5.971 1.227 11.656 3.442 16.817l-0.106-0.278c6.527 15.59 21.621 26.363 39.242 26.453l0.012 0h341.333c0.073 0 0.16 0 0.247 0 177.962 0 327.65-121.060 371.202-285.321l0.604-2.679c1.077-3.569 1.698-7.67 1.698-11.916 0-19.925-13.658-36.66-32.123-41.354l-0.295-0.064zM926.293 224.427l-128-128c-3.937-3.773-8.616-6.808-13.791-8.859l-0.289-0.101c-4.793-2.024-10.366-3.201-16.213-3.201s-11.42 1.176-16.495 3.305l0.281-0.105c-5.464 2.152-10.143 5.187-14.095 8.974l0.015-0.014-128 128c-7.753 7.753-12.548 18.463-12.548 30.293 0 23.661 19.181 42.841 42.841 42.841 11.83 0 22.541-4.795 30.293-12.548l-0 0 55.040-54.187v238.507c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-238.507l55.040 55.467c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003z"],"attrs":[],"grid":0,"tags":["comment-upload"]},"attrs":[],"properties":{"order":4817,"id":867,"name":"comment-upload","prevSize":32,"code":59986},"setIdx":0,"setId":0,"iconIdx":338},{"icon":{"paths":["M652.373 377.6l-201.813 202.24-78.933-79.36c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l109.227 109.227c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 232.107-232.107c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l-0 0zM512 85.333c-235.641 0-426.667 191.025-426.667 426.667v0c-0.002 0.474-0.003 1.036-0.003 1.598 0 102.317 36.415 196.128 96.992 269.181l-0.563-0.698-85.333 85.333c-7.601 7.7-12.296 18.286-12.296 29.968 0 5.971 1.227 11.656 3.442 16.817l-0.106-0.278c6.929 14.753 21.662 24.784 38.738 24.784 0.631 0 1.259-0.014 1.884-0.041l-0.089 0.003h384c235.641 0 426.667-191.025 426.667-426.667s-191.025-426.667-426.667-426.667v0zM512 853.333h-281.173l39.68-39.68c7.668-7.712 12.407-18.343 12.407-30.080s-4.74-22.368-12.409-30.082l0.002 0.002c-61.849-61.783-100.108-147.17-100.108-241.493 0-188.513 152.82-341.333 341.333-341.333s341.333 152.82 341.333 341.333c0 188.419-152.667 341.181-341.051 341.333l-0.014 0z"],"attrs":[],"grid":0,"tags":["comment-verify"]},"attrs":[],"properties":{"order":4818,"id":866,"name":"comment-verify","prevSize":32,"code":59987},"setIdx":0,"setId":0,"iconIdx":339},{"icon":{"paths":["M512 85.333c-235.641 0-426.667 191.025-426.667 426.667v0c-0.002 0.474-0.003 1.036-0.003 1.598 0 102.317 36.415 196.128 96.992 269.181l-0.563-0.698-85.333 85.333c-7.601 7.7-12.296 18.286-12.296 29.968 0 5.971 1.227 11.656 3.442 16.817l-0.106-0.278c6.929 14.753 21.662 24.784 38.738 24.784 0.631 0 1.259-0.014 1.884-0.041l-0.089 0.003h384c235.641 0 426.667-191.025 426.667-426.667s-191.025-426.667-426.667-426.667v0zM512 853.333h-281.173l39.68-39.68c7.668-7.712 12.407-18.343 12.407-30.080s-4.74-22.368-12.409-30.082l0.002 0.002c-61.849-61.783-100.108-147.17-100.108-241.493 0-188.513 152.82-341.333 341.333-341.333s341.333 152.82 341.333 341.333c0 188.419-152.667 341.181-341.051 341.333l-0.014 0z"],"attrs":[],"grid":0,"tags":["comment"]},"attrs":[],"properties":{"order":4819,"id":865,"name":"comment","prevSize":32,"code":59988},"setIdx":0,"setId":0,"iconIdx":340},{"icon":{"paths":["M810.667 341.333h-42.667v-128c0-70.692-57.308-128-128-128v0h-426.667c-70.692 0-128 57.308-128 128v0 512c0.091 17.632 10.863 32.726 26.172 39.149l0.281 0.105c4.477 2.162 9.736 3.425 15.29 3.425 0.325 0 0.648-0.004 0.971-0.013l-0.048 0.001c0.073 0 0.16 0.001 0.247 0.001 11.721 0 22.338-4.726 30.049-12.377l-0.003 0.003 119.893-120.32h63.147v61.44c0 70.692 57.308 128 128 128v0h295.253l101.12 101.547c7.709 7.648 18.326 12.374 30.047 12.374 0.087 0 0.173-0 0.26-0.001l-0.013 0c0.275 0.008 0.599 0.012 0.923 0.012 5.554 0 10.813-1.263 15.505-3.518l-0.215 0.093c15.59-6.527 26.363-21.621 26.453-39.242l0-0.012v-426.667c0-70.692-57.308-128-128-128v0zM341.333 469.333v80.64h-80.64c-0.073-0-0.16-0.001-0.247-0.001-11.721 0-22.338 4.726-30.049 12.377l0.003-0.003-59.733 60.16v-409.173c0-23.564 19.103-42.667 42.667-42.667v0h426.667c23.564 0 42.667 19.103 42.667 42.667v0 128h-213.333c-70.692 0-128 57.308-128 128v0zM853.333 793.173l-42.667-42.667c-7.709-7.861-18.426-12.749-30.284-12.8l-0.010-0h-311.040c-23.564 0-42.667-19.103-42.667-42.667v0-225.707c0-23.564 19.103-42.667 42.667-42.667v0h341.333c23.564 0 42.667 19.103 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["comments-alt"]},"attrs":[],"properties":{"order":4820,"id":864,"name":"comments-alt","prevSize":32,"code":59989},"setIdx":0,"setId":0,"iconIdx":341},{"icon":{"paths":["M879.36 818.773c37.014-49.178 59.277-111.284 59.277-178.59 0-120.576-71.451-224.463-174.323-271.632l-1.861-0.765c-28.871-161.713-168.431-282.883-336.291-282.883-188.513 0-341.333 152.82-341.333 341.333 0 79.495 27.175 152.643 72.743 210.66l-0.558-0.738-59.307 58.88c-7.601 7.7-12.296 18.286-12.296 29.968 0 5.971 1.227 11.656 3.442 16.817l-0.106-0.278c6.527 15.59 21.621 26.363 39.242 26.453l0.012 0h242.773c48.983 101.541 151.031 170.413 269.193 170.667l0.034 0h256c17.632-0.091 32.726-10.863 39.149-26.172l0.105-0.281c2.109-4.883 3.336-10.568 3.336-16.539 0-11.682-4.695-22.267-12.3-29.972l0.004 0.005zM341.333 640c0.064 15.112 1.303 29.883 3.63 44.29l-0.216-1.623h-113.92l14.933-14.507c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003c-46.377-45.882-75.095-109.533-75.095-179.891 0-0.357 0.001-0.714 0.002-1.070l-0 0.055c0-141.385 114.615-256 256-256v0c0.452-0.003 0.988-0.005 1.523-0.005 110.326 0 204.187 70.495 238.997 168.898l0.547 1.773c-9.387 0-18.347 0-27.733 0-164.949 0-298.667 133.718-298.667 298.667v0zM791.040 853.333l2.133 2.133h-153.173c-117.657-0.217-212.952-95.646-212.952-213.333 0-117.821 95.513-213.333 213.333-213.333s213.333 95.513 213.333 213.333c0 59.005-23.955 112.415-62.67 151.035l-0.004 0.004c-7.763 7.612-12.628 18.155-12.8 29.835l-0 0.032c0.051 11.868 4.939 22.584 12.793 30.287l0.007 0.007z"],"attrs":[],"grid":0,"tags":["comments"]},"attrs":[],"properties":{"order":4821,"id":863,"name":"comments","prevSize":32,"code":59990},"setIdx":0,"setId":0,"iconIdx":342},{"icon":{"paths":["M512 85.333c-235.641 0-426.667 191.025-426.667 426.667s191.025 426.667 426.667 426.667c235.641 0 426.667-191.025 426.667-426.667v0c0-235.641-191.025-426.667-426.667-426.667v0zM512 853.333c-188.513 0-341.333-152.82-341.333-341.333s152.82-341.333 341.333-341.333c188.513 0 341.333 152.82 341.333 341.333v0c0 188.513-152.82 341.333-341.333 341.333v0zM512 384c-70.692 0-128 57.308-128 128s57.308 128 128 128c70.692 0 128-57.308 128-128v0c0-70.692-57.308-128-128-128v0zM512 554.667c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667c23.564 0 42.667 19.103 42.667 42.667v0c0 23.564-19.103 42.667-42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["compact-disc"]},"attrs":[],"properties":{"order":4822,"id":862,"name":"compact-disc","prevSize":32,"code":59991},"setIdx":0,"setId":0,"iconIdx":343},{"icon":{"paths":["M896 853.333h-725.333v-23.040l213.333-213.333 162.133 162.133c7.712 7.668 18.343 12.407 30.080 12.407s22.368-4.74 30.082-12.409l-0.002 0.002 320-320c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003c-7.712-7.668-18.343-12.407-30.080-12.407s-22.368 4.74-30.082 12.409l0.002-0.002-290.133 290.133-161.707-162.133c-7.712-7.668-18.343-12.407-30.080-12.407s-22.368 4.74-30.082 12.409l0.002-0.002-183.467 183.040v-220.587l213.333-213.333 119.467 119.467c7.712 7.668 18.343 12.407 30.080 12.407s22.368-4.74 30.082-12.409l-0.002 0.002 204.373-204.373 93.44 93.44c7.715 7.662 18.344 12.397 30.080 12.397 23.577 0 42.691-19.113 42.691-42.691 0-11.842-4.821-22.557-12.608-30.291l-0.002-0.002-124.16-123.307c-7.712-7.668-18.343-12.407-30.080-12.407s-22.368 4.74-30.082 12.409l0.002-0.002-204.8 204.8-119.040-119.467c-7.712-7.668-18.343-12.407-30.080-12.407s-22.368 4.74-30.082 12.409l0.002-0.002-182.613 182.613v-240.213c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 768c0 23.564 19.103 42.667 42.667 42.667v0h768c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["comparison"]},"attrs":[],"properties":{"order":4823,"id":861,"name":"comparison","prevSize":32,"code":59992},"setIdx":0,"setId":0,"iconIdx":344},{"icon":{"paths":["M512 85.333c-235.641 0-426.667 191.025-426.667 426.667s191.025 426.667 426.667 426.667c235.641 0 426.667-191.025 426.667-426.667v0c0-235.641-191.025-426.667-426.667-426.667v0zM554.667 850.347v-39.68c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 39.68c-154.513-20.152-275.528-141.167-295.496-293.958l-0.184-1.722h39.68c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-39.68c20.152-154.513 141.167-275.528 293.958-295.496l1.722-0.184v39.68c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-39.68c154.513 20.152 275.528 141.167 295.496 293.958l0.184 1.722h-39.68c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h39.68c-20.152 154.513-141.167 275.528-293.958 295.496l-1.722 0.184zM645.973 322.133l-213.333 90.453c-9.981 4.4-17.787 12.206-22.079 21.914l-0.108 0.273-90.453 213.333c-2.189 4.964-3.463 10.752-3.463 16.838 0 11.745 4.746 22.382 12.424 30.097l-0.002-0.002c7.612 7.763 18.155 12.628 29.835 12.8l0.032 0c0.011 0 0.024 0 0.037 0 6.188 0 12.046-1.417 17.266-3.943l-0.237 0.103 213.333-90.453c9.981-4.4 17.787-12.206 22.079-21.914l0.108-0.273 90.453-213.333c2.12-4.894 3.353-10.593 3.353-16.58 0-23.564-19.103-42.667-42.667-42.667-5.987 0-11.686 1.233-16.857 3.459l0.277-0.106zM539.733 539.733l-97.28 42.667 42.667-97.28 97.28-42.667z"],"attrs":[],"grid":0,"tags":["compass"]},"attrs":[],"properties":{"order":4824,"id":860,"name":"compass","prevSize":32,"code":59993},"setIdx":0,"setId":0,"iconIdx":345},{"icon":{"paths":["M448 234.667c-23.564 0-42.667 19.103-42.667 42.667v0 67.84l-247.040-247.467c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l-0-0 247.467 247.040h-67.84c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h170.667c5.873-0.073 11.435-1.322 16.489-3.52l-0.275 0.107c10.46-4.422 18.618-12.58 22.935-22.76l0.105-0.28c2.092-4.778 3.34-10.34 3.413-16.186l0-0.027v-170.667c-0-23.564-19.103-42.667-42.667-42.667v0zM926.293 865.707l-247.467-247.040h67.84c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-170.667c-5.873 0.073-11.435 1.322-16.489 3.52l0.275-0.107c-10.46 4.422-18.618 12.58-22.935 22.76l-0.105 0.28c-2.092 4.778-3.34 10.34-3.413 16.186l-0 0.027v170.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-67.84l247.040 247.467c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003z"],"attrs":[],"grid":0,"tags":["compress-alt-left"]},"attrs":[],"properties":{"order":4825,"id":859,"name":"compress-alt-left","prevSize":32,"code":59994},"setIdx":0,"setId":0,"iconIdx":346},{"icon":{"paths":["M926.293 97.707c-7.733-7.795-18.45-12.621-30.293-12.621s-22.56 4.826-30.291 12.618l-0.003 0.003-247.040 247.467v-67.84c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 170.667c0.073 5.873 1.322 11.435 3.52 16.489l-0.107-0.275c4.422 10.46 12.58 18.618 22.76 22.935l0.28 0.105c4.778 2.092 10.34 3.34 16.186 3.413l0.027 0h170.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-67.84l247.467-247.040c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003zM464.213 536.747c-4.778-2.092-10.34-3.34-16.186-3.413l-0.027-0h-170.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h67.84l-247.467 247.040c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 247.040-247.467v67.84c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-170.667c-0.073-5.873-1.322-11.435-3.52-16.489l0.107 0.275c-4.422-10.46-12.58-18.618-22.76-22.935l-0.28-0.105z"],"attrs":[],"grid":0,"tags":["compress-alt"]},"attrs":[],"properties":{"order":4826,"id":858,"name":"compress-alt","prevSize":32,"code":59995},"setIdx":0,"setId":0,"iconIdx":347},{"icon":{"paths":["M442.88 558.080c-4.778-2.092-10.34-3.34-16.186-3.413l-0.027-0h-170.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h67.84l-226.133 225.707c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 225.707-226.133v67.84c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-170.667c-0.073-5.873-1.322-11.435-3.52-16.489l0.107 0.275c-4.422-10.46-12.58-18.618-22.76-22.935l-0.28-0.105zM426.667 213.333c-23.564 0-42.667 19.103-42.667 42.667v0 67.84l-225.707-226.133c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l-0-0 226.133 225.707h-67.84c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h170.667c5.873-0.073 11.435-1.322 16.489-3.52l-0.275 0.107c10.46-4.422 18.618-12.58 22.935-22.76l0.105-0.28c2.092-4.778 3.34-10.34 3.413-16.186l0-0.027v-170.667c0-23.564-19.103-42.667-42.667-42.667v0zM581.12 465.92c4.778 2.092 10.34 3.34 16.186 3.413l0.027 0h170.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-67.84l226.133-225.707c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l-0 0-225.707 226.133v-67.84c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 170.667c0.073 5.873 1.322 11.435 3.52 16.489l-0.107-0.275c4.422 10.46 12.58 18.618 22.76 22.935l0.28 0.105zM700.16 640h67.84c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-170.667c-5.873 0.073-11.435 1.322-16.489 3.52l0.275-0.107c-10.46 4.422-18.618 12.58-22.935 22.76l-0.105 0.28c-2.092 4.778-3.34 10.34-3.413 16.186l-0 0.027v170.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-67.84l225.707 226.133c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003z"],"attrs":[],"grid":0,"tags":["compress-arrows"]},"attrs":[],"properties":{"order":4827,"id":857,"name":"compress-arrows","prevSize":32,"code":59996},"setIdx":0,"setId":0,"iconIdx":348},{"icon":{"paths":["M725.333 853.333h-170.667v-153.173l33.707 34.133c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003-106.667-106.667c-3.937-3.773-8.616-6.808-13.791-8.859l-0.289-0.101c-4.793-2.024-10.366-3.201-16.213-3.201s-11.42 1.176-16.495 3.305l0.281-0.105c-5.464 2.152-10.143 5.187-14.095 8.974l0.015-0.014-106.667 106.667c-7.753 7.753-12.548 18.463-12.548 30.293 0 23.661 19.181 42.841 42.841 42.841 11.83 0 22.541-4.795 30.293-12.548l-0 0 33.707-34.133v153.173h-170.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h426.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM298.667 170.667h170.667v153.173l-33.707-34.133c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l106.667 106.667c3.937 3.773 8.616 6.808 13.791 8.859l0.289 0.101c4.771 2.163 10.345 3.423 16.213 3.423s11.443-1.26 16.466-3.525l-0.253 0.102c5.464-2.152 10.143-5.187 14.095-8.974l-0.015 0.014 106.667-106.667c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l-0 0-33.707 34.133v-153.173h170.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-426.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["compress-lines"]},"attrs":[],"properties":{"order":4828,"id":856,"name":"compress-lines","prevSize":32,"code":59997},"setIdx":0,"setId":0,"iconIdx":349},{"icon":{"paths":["M926.293 865.707l-268.8-268.373h67.84c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-153.173l241.493-241.493c9.153-7.872 14.914-19.467 14.914-32.407 0-23.564-19.103-42.667-42.667-42.667-12.94 0-24.535 5.761-32.36 14.858l-0.047 0.056-241.493 241.493v-153.173c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 67.84l-268.373-268.8c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l-0-0 268.8 268.373h-67.84c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h153.173l-241.493 241.493c-7.668 7.712-12.407 18.343-12.407 30.080s4.74 22.368 12.409 30.082l-0.002-0.002c7.712 7.668 18.343 12.407 30.080 12.407s22.368-4.74 30.082-12.409l-0.002 0.002 241.493-241.493v153.173c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-67.84l268.373 268.8c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003z"],"attrs":[],"grid":0,"tags":["compress-point"]},"attrs":[],"properties":{"order":4829,"id":855,"name":"compress-point","prevSize":32,"code":59998},"setIdx":0,"setId":0,"iconIdx":350},{"icon":{"paths":["M542.293 567.040c-3.937-3.773-8.616-6.808-13.791-8.859l-0.289-0.101c-4.793-2.024-10.366-3.201-16.213-3.201s-11.42 1.176-16.495 3.305l0.281-0.105c-5.464 2.152-10.143 5.187-14.095 8.974l0.015-0.014-106.667 106.667c-7.753 7.753-12.548 18.463-12.548 30.293 0 23.661 19.181 42.841 42.841 42.841 11.83 0 22.541-4.795 30.293-12.548l-0 0 33.707-34.133v195.84c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-195.84l33.707 34.133c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003zM481.707 456.96c3.937 3.773 8.616 6.808 13.791 8.859l0.289 0.101c4.771 2.163 10.345 3.423 16.213 3.423s11.443-1.26 16.466-3.525l-0.253 0.102c5.464-2.152 10.143-5.187 14.095-8.974l-0.015 0.014 106.667-106.667c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l-0 0-33.707 34.133v-195.84c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 195.84l-33.707-34.133c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l0 0z"],"attrs":[],"grid":0,"tags":["compress-v"]},"attrs":[],"properties":{"order":4830,"id":854,"name":"compress-v","prevSize":32,"code":59999},"setIdx":0,"setId":0,"iconIdx":351},{"icon":{"paths":["M682.667 384h213.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-170.667v-170.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 213.333c0 23.564 19.103 42.667 42.667 42.667v0zM341.333 640h-213.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h170.667v170.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-213.333c0-23.564-19.103-42.667-42.667-42.667v0zM341.333 85.333c-23.564 0-42.667 19.103-42.667 42.667v0 170.667h-170.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h213.333c23.564 0 42.667-19.103 42.667-42.667v0-213.333c0-23.564-19.103-42.667-42.667-42.667v0zM896 640h-213.333c-23.564 0-42.667 19.103-42.667 42.667v0 213.333c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-170.667h170.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["compress"]},"attrs":[],"properties":{"order":4831,"id":853,"name":"compress","prevSize":32,"code":60000},"setIdx":0,"setId":0,"iconIdx":352},{"icon":{"paths":["M384 384c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM625.493 578.56l-178.773 64c-16.541 6.125-28.117 21.765-28.117 40.109 0 23.399 18.836 42.399 42.172 42.664l0.025 0c5.207-0.006 10.192-0.944 14.802-2.656l-0.295 0.096 179.2-64c17.159-5.787 29.295-21.735 29.295-40.517 0-23.564-19.103-42.667-42.667-42.667-5.631 0-11.007 1.091-15.928 3.072l0.287-0.102zM640 384c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM512 85.333c-235.641 0-426.667 191.025-426.667 426.667s191.025 426.667 426.667 426.667c235.641 0 426.667-191.025 426.667-426.667v0c0-235.641-191.025-426.667-426.667-426.667v0zM512 853.333c-188.513 0-341.333-152.82-341.333-341.333s152.82-341.333 341.333-341.333c188.513 0 341.333 152.82 341.333 341.333v0c0 188.513-152.82 341.333-341.333 341.333v0z"],"attrs":[],"grid":0,"tags":["confused"]},"attrs":[],"properties":{"order":4832,"id":852,"name":"confused","prevSize":32,"code":60001},"setIdx":0,"setId":0,"iconIdx":353},{"icon":{"paths":["M853.333 412.587v-7.253c0.001-0.359 0.002-0.784 0.002-1.21 0-151.391-99.179-279.617-236.107-323.25l-2.402-0.661h-2.56c-30.969-9.789-66.585-15.429-103.518-15.429-2.457 0-4.909 0.025-7.355 0.075l0.366-0.006c-184.319 10.426-329.98 161.891-331.093 347.624l-0.001 0.11c-50.24 18.049-85.524 65.277-85.524 120.747s35.283 102.698 84.631 120.466l0.892 0.281c18.536 172.657 163.45 305.925 339.492 305.925 0.647 0 1.294-0.002 1.941-0.005l-0.1 0h9.813c169.957-8.48 307.188-138.074 327.512-303.817l0.168-1.676c51.591-17.297 88.104-65.196 88.104-121.624 0-54.999-34.688-101.896-83.379-120.008l-0.885-0.288zM519.68 874.667c-2.205 0.068-4.799 0.107-7.403 0.107-126.351 0-231.323-91.537-252.218-211.913l-0.219-1.528h502.187c-21.845 117.835-120.81 206.884-241.699 213.306l-0.648 0.027zM810.667 576h-597.333c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667v0h85.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-42.667c4.117-92.575 53.729-172.731 126.882-219.072l1.118-0.661v134.4c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-166.827c9.942-1.765 21.97-3.135 34.184-3.805l0.803-0.035h7.68c15.236 0.221 29.977 1.609 44.348 4.079l-1.681-0.239v166.827c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-135.68c19.053 11.134 35.544 23.413 50.533 37.29l-0.186-0.17c47.92 46.574 77.653 111.641 77.653 183.653 0 0.084-0 0.169-0 0.253l0-0.013h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h85.333c23.564 0 42.667 19.103 42.667 42.667s-19.103 42.667-42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["constructor"]},"attrs":[],"properties":{"order":4833,"id":851,"name":"constructor","prevSize":32,"code":60002},"setIdx":0,"setId":0,"iconIdx":354},{"icon":{"paths":["M682.667 853.333h-341.333c-70.692 0-128-57.308-128-128v0-426.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 426.667c0 117.821 95.513 213.333 213.333 213.333v0h341.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM896 381.44c-0.496-4.292-1.396-8.191-2.678-11.913l0.118 0.393v-3.84c-2.174-4.59-4.887-8.531-8.128-11.969l0.021 0.023-256-256c-3.415-3.219-7.356-5.932-11.671-7.988l-0.276-0.118h-3.84l-13.653-4.693h-173.227c-70.692 0-128 57.308-128 128v0 426.667c0 70.692 57.308 128 128 128v0h341.333c70.692 0 128-57.308 128-128v0-256s0 0 0-2.56zM640 230.827l110.507 110.507h-67.84c-23.564 0-42.667-19.103-42.667-42.667v0zM810.667 640c0 23.564-19.103 42.667-42.667 42.667v0h-341.333c-23.564 0-42.667-19.103-42.667-42.667v0-426.667c0-23.564 19.103-42.667 42.667-42.667v0h128v128c0 70.692 57.308 128 128 128v0h128z"],"attrs":[],"grid":0,"tags":["copy-alt"]},"attrs":[],"properties":{"order":4834,"id":850,"name":"copy-alt","prevSize":32,"code":60003},"setIdx":0,"setId":0,"iconIdx":355},{"icon":{"paths":["M768 810.667h-512c-70.692 0-128-57.308-128-128v0-341.333c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 341.333c0 117.821 95.513 213.333 213.333 213.333v0h512c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM981.333 424.107c-0.496-4.292-1.396-8.191-2.678-11.913l0.118 0.393v-3.84c-2.174-4.59-4.887-8.531-8.128-11.969l0.021 0.023-256-256c-3.415-3.219-7.356-5.932-11.671-7.988l-0.276-0.118h-3.84l-13.653-4.693h-343.893c-70.692 0-128 57.308-128 128v0 341.333c0 70.692 57.308 128 128 128v0h512c70.692 0 128-57.308 128-128v0-170.667s0 0 0-2.56zM725.333 273.493l110.507 110.507h-67.84c-23.564 0-42.667-19.103-42.667-42.667v0zM896 597.333c0 23.564-19.103 42.667-42.667 42.667v0h-512c-23.564 0-42.667-19.103-42.667-42.667v0-341.333c0-23.564 19.103-42.667 42.667-42.667v0h298.667v128c0 70.692 57.308 128 128 128v0h128z"],"attrs":[],"grid":0,"tags":["copy-landscape"]},"attrs":[],"properties":{"order":4835,"id":849,"name":"copy-landscape","prevSize":32,"code":60004},"setIdx":0,"setId":0,"iconIdx":356},{"icon":{"paths":["M896 381.44c-0.496-4.292-1.396-8.191-2.678-11.913l0.118 0.393v-3.84c-2.174-4.59-4.887-8.531-8.128-11.969l0.021 0.023-256-256c-3.415-3.219-7.356-5.932-11.671-7.988l-0.276-0.118c-0.577-0.086-1.243-0.136-1.92-0.136s-1.343 0.049-1.994 0.145l0.074-0.009c-4.056-2.368-8.817-4.028-13.894-4.674l-0.186-0.019h-172.8c-70.692 0-128 57.308-128 128v0 42.667h-42.667c-70.692 0-128 57.308-128 128v0 426.667c0 70.692 57.308 128 128 128v0h341.333c70.692 0 128-57.308 128-128v0-42.667h42.667c70.692 0 128-57.308 128-128v0-256s0 0 0-2.56zM640 230.827l110.507 110.507h-67.84c-23.564 0-42.667-19.103-42.667-42.667v0zM640 810.667c0 23.564-19.103 42.667-42.667 42.667v0h-341.333c-23.564 0-42.667-19.103-42.667-42.667v0-426.667c0-23.564 19.103-42.667 42.667-42.667v0h42.667v298.667c0 70.692 57.308 128 128 128v0h213.333zM810.667 640c0 23.564-19.103 42.667-42.667 42.667v0h-341.333c-23.564 0-42.667-19.103-42.667-42.667v0-426.667c0-23.564 19.103-42.667 42.667-42.667v0h128v128c0 70.692 57.308 128 128 128v0h128z"],"attrs":[],"grid":0,"tags":["copy"]},"attrs":[],"properties":{"order":4836,"id":848,"name":"copy","prevSize":32,"code":60005},"setIdx":0,"setId":0,"iconIdx":357},{"icon":{"paths":["M469.333 384h85.333c23.564 0 42.667 19.103 42.667 42.667v0c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0c0-70.692-57.308-128-128-128v0h-85.333c-70.692 0-128 57.308-128 128v0 170.667c0 70.692 57.308 128 128 128v0h85.333c70.692 0 128-57.308 128-128v0c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0c0 23.564-19.103 42.667-42.667 42.667v0h-85.333c-23.564 0-42.667-19.103-42.667-42.667v0-170.667c0-23.564 19.103-42.667 42.667-42.667v0zM512 85.333c-235.641 0-426.667 191.025-426.667 426.667s191.025 426.667 426.667 426.667c235.641 0 426.667-191.025 426.667-426.667v0c0-235.641-191.025-426.667-426.667-426.667v0zM512 853.333c-188.513 0-341.333-152.82-341.333-341.333s152.82-341.333 341.333-341.333c188.513 0 341.333 152.82 341.333 341.333v0c0 188.513-152.82 341.333-341.333 341.333v0z"],"attrs":[],"grid":0,"tags":["copyright"]},"attrs":[],"properties":{"order":4837,"id":847,"name":"copyright","prevSize":32,"code":60006},"setIdx":0,"setId":0,"iconIdx":358},{"icon":{"paths":["M797.44 85.333c-23.564 0-42.667 19.103-42.667 42.667v0 442.453c0 47.128-38.205 85.333-85.333 85.333v0h-341.333l124.587-124.587c6.953-7.566 11.214-17.7 11.214-28.831 0-23.564-19.103-42.667-42.667-42.667-10.279 0-19.709 3.635-27.075 9.69l0.074-0.059-197.547 198.827c-3.779 4.005-6.928 8.657-9.257 13.762l-0.13 0.318c-2.024 4.793-3.201 10.366-3.201 16.213s1.176 11.42 3.305 16.495l-0.105-0.281c2.278 5.483 5.452 10.162 9.385 14.079l0.001 0.001 197.547 197.547c7.667 7.606 18.211 12.323 29.857 12.373l0.010 0c0.073 0 0.16 0.001 0.247 0.001 11.721 0 22.338-4.726 30.049-12.377l-0.003 0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003-124.587-124.587h341.333c94.257 0 170.667-76.41 170.667-170.667v0-442.453c0-0.010 0-0.022 0-0.034 0-23.564-19.103-42.667-42.667-42.667-0.6 0-1.198 0.012-1.792 0.037l0.085-0.003z"],"attrs":[],"grid":0,"tags":["corner-down-left"]},"attrs":[],"properties":{"order":4838,"id":846,"name":"corner-down-left","prevSize":32,"code":60007},"setIdx":0,"setId":0,"iconIdx":359},{"icon":{"paths":["M892.587 538.453c-2.152-5.464-5.187-10.143-8.974-14.095l0.014 0.015-128-128c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l-0-0 55.467 55.040h-409.173c-23.564 0-42.667-19.103-42.667-42.667v0-170.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 170.667c0 70.692 57.308 128 128 128v0h409.173l-55.467 55.040c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 128-128c3.773-3.937 6.808-8.616 8.859-13.791l0.101-0.289c2.024-4.793 3.201-10.366 3.201-16.213s-1.176-11.42-3.305-16.495l0.105 0.281z"],"attrs":[],"grid":0,"tags":["corner-down-right-alt"]},"attrs":[],"properties":{"order":4839,"id":845,"name":"corner-down-right-alt","prevSize":32,"code":60008},"setIdx":0,"setId":0,"iconIdx":360},{"icon":{"paths":["M836.693 682.667c-2.458-5.423-5.608-10.075-9.41-14.105l0.023 0.025-197.547-199.253c-7.412-6.377-17.129-10.259-27.753-10.259-23.564 0-42.667 19.103-42.667 42.667 0 10.624 3.883 20.341 10.307 27.809l-0.047-0.056 124.587 124.587h-298.667c-70.692 0-128-57.308-128-128v0-398.080c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 399.787c0 117.821 95.513 213.333 213.333 213.333v0h298.667l-124.587 124.587c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003c7.709 7.648 18.326 12.374 30.047 12.374 0.087 0 0.173-0 0.26-0.001l-0.013 0c11.656-0.051 22.2-4.767 29.869-12.376l-0.003 0.003 197.547-197.547c3.935-3.918 7.109-8.597 9.282-13.798l0.104-0.282c1.97-4.734 3.114-10.234 3.114-16s-1.144-11.266-3.217-16.283l0.104 0.283z"],"attrs":[],"grid":0,"tags":["corner-down-right"]},"attrs":[],"properties":{"order":4840,"id":844,"name":"corner-down-right","prevSize":32,"code":60009},"setIdx":0,"setId":0,"iconIdx":361},{"icon":{"paths":["M896 183.893h-399.787c-117.821-0-213.333 95.513-213.333 213.333v0 298.667l-124.587-126.293c-7.733-7.795-18.45-12.621-30.293-12.621s-22.56 4.826-30.291 12.618l-0.003 0.003c-7.668 7.712-12.407 18.343-12.407 30.080s4.74 22.368 12.409 30.082l-0.002-0.002 197.547 197.547c3.918 3.935 8.597 7.109 13.798 9.282l0.282 0.104c4.771 2.163 10.345 3.423 16.213 3.423s11.443-1.26 16.466-3.525l-0.253 0.102c5.423-2.458 10.075-5.608 14.105-9.41l-0.025 0.023 198.827-197.547c6.377-7.412 10.259-17.129 10.259-27.753 0-23.564-19.103-42.667-42.667-42.667-10.624 0-20.341 3.883-27.809 10.307l0.056-0.047-126.293 124.587v-298.667c0-70.692 57.308-128 128-128v0h399.787c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["corner-left-down"]},"attrs":[],"properties":{"order":4841,"id":843,"name":"corner-left-down","prevSize":32,"code":60010},"setIdx":0,"setId":0,"iconIdx":362},{"icon":{"paths":["M926.293 569.6c-7.733-7.795-18.45-12.621-30.293-12.621s-22.56 4.826-30.291 12.618l-0.003 0.003-124.587 124.587v-341.333c0-94.257-76.41-170.667-170.667-170.667v0h-442.453c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h442.453c47.128 0 85.333 38.205 85.333 85.333v0 341.333l-124.587-124.587c-7.848-8.064-18.806-13.067-30.933-13.067-23.83 0-43.147 19.318-43.147 43.147 0 11.703 4.659 22.317 12.223 30.090l-0.009-0.010 197.12 197.547c4.005 3.779 8.657 6.928 13.762 9.257l0.318 0.13c4.771 2.163 10.345 3.423 16.213 3.423s11.443-1.26 16.466-3.525l-0.253 0.102c5.483-2.278 10.162-5.452 14.079-9.385l0.001-0.001 197.547-197.547c8.19-7.79 13.285-18.769 13.285-30.938 0-11.318-4.407-21.607-11.598-29.244l0.020 0.022z"],"attrs":[],"grid":0,"tags":["corner-right-down"]},"attrs":[],"properties":{"order":4842,"id":842,"name":"corner-right-down","prevSize":32,"code":60011},"setIdx":0,"setId":0,"iconIdx":363},{"icon":{"paths":["M725.333 405.333h-409.173l55.467-55.040c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548v0l-128 128c-3.773 3.937-6.808 8.616-8.859 13.791l-0.101 0.289c-2.024 4.793-3.201 10.366-3.201 16.213s1.176 11.42 3.305 16.495l-0.105-0.281c2.152 5.464 5.187 10.143 8.974 14.095l-0.014-0.015 128 128c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003-55.467-55.040h409.173c23.564 0 42.667 19.103 42.667 42.667v0 170.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-170.667c0-70.692-57.308-128-128-128v0z"],"attrs":[],"grid":0,"tags":["corner-up-left-alt"]},"attrs":[],"properties":{"order":4843,"id":841,"name":"corner-up-left-alt","prevSize":32,"code":60012},"setIdx":0,"setId":0,"iconIdx":364},{"icon":{"paths":["M626.773 282.88h-298.667l124.587-124.587c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003c-7.712-7.668-18.343-12.407-30.080-12.407s-22.368 4.74-30.082 12.409l0.002-0.002-195.84 197.547c-3.935 3.918-7.109 8.597-9.282 13.798l-0.104 0.282c-2.024 4.793-3.201 10.366-3.201 16.213s1.176 11.42 3.305 16.495l-0.105-0.281c2.458 5.423 5.608 10.075 9.41 14.105l-0.023-0.025 197.547 198.827c7.612 7.763 18.155 12.628 29.835 12.8l0.032 0c0.074 0 0.161 0.001 0.248 0.001 23.564 0 42.667-19.103 42.667-42.667 0-11.844-4.826-22.561-12.619-30.291l-0.003-0.003-124.587-126.293h298.667c70.692 0 128 57.308 128 128v0 399.787c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-399.787c0-0.002 0-0.004 0-0.007 0-117.821-95.513-213.333-213.333-213.333-0.6 0-1.2 0.002-1.799 0.007l0.092-0.001z"],"attrs":[],"grid":0,"tags":["corner-up-left"]},"attrs":[],"properties":{"order":4844,"id":840,"name":"corner-up-left","prevSize":32,"code":60013},"setIdx":0,"setId":0,"iconIdx":365},{"icon":{"paths":["M849.92 431.787c-2.152-5.464-5.187-10.143-8.974-14.095l0.014 0.015-128-128c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l0 0 55.467 55.040h-409.173c-70.692 0-128 57.308-128 128v0 170.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-170.667c0-23.564 19.103-42.667 42.667-42.667v0h409.173l-55.467 55.040c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 128-128c3.773-3.937 6.808-8.616 8.859-13.791l0.101-0.289c2.024-4.793 3.201-10.366 3.201-16.213s-1.176-11.42-3.305-16.495l0.105 0.281z"],"attrs":[],"grid":0,"tags":["corner-up-right-alt"]},"attrs":[],"properties":{"order":4845,"id":839,"name":"corner-up-right-alt","prevSize":32,"code":60014},"setIdx":0,"setId":0,"iconIdx":366},{"icon":{"paths":["M836.693 309.333c-2.278-5.483-5.452-10.162-9.385-14.079l-0.001-0.001-197.547-197.547c-7.712-7.668-18.343-12.407-30.080-12.407s-22.368 4.74-30.082 12.409l0.002-0.002c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003 124.587 124.587h-341.333c-94.257-0-170.667 76.41-170.667 170.667v0 442.453c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-442.453c0-47.128 38.205-85.333 85.333-85.333v0h341.333l-124.587 124.587c-7.796 7.733-12.621 18.45-12.621 30.294 0 23.564 19.103 42.667 42.667 42.667 0.087 0 0.174-0 0.262-0.001l-0.013 0c11.712-0.172 22.255-5.037 29.86-12.793l0.007-0.007 197.547-197.12c3.812-4.12 6.968-8.918 9.26-14.179l0.127-0.328c1.97-4.734 3.114-10.234 3.114-16s-1.144-11.266-3.217-16.283l0.104 0.283z"],"attrs":[],"grid":0,"tags":["corner-up-right"]},"attrs":[],"properties":{"order":4846,"id":838,"name":"corner-up-right","prevSize":32,"code":60015},"setIdx":0,"setId":0,"iconIdx":367},{"icon":{"paths":["M405.333 384c-35.346 0-64 28.654-64 64s28.654 64 64 64c35.346 0 64-28.654 64-64v0c0-35.346-28.654-64-64-64v0zM384 597.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM640 341.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM618.667 512c-35.346 0-64 28.654-64 64s28.654 64 64 64c35.346 0 64-28.654 64-64v0c0-35.346-28.654-64-64-64v0zM938.667 469.333h-45.184c-8.641-75.407-38.060-142.673-82.316-197.457l0.567 0.725 32.143-32.143c7.72-7.72 12.495-18.386 12.495-30.167 0-23.562-19.1-42.662-42.662-42.662-11.781 0-22.446 4.775-30.167 12.495l-32.145 32.142c-54.059-43.689-121.325-73.109-194.964-81.584l-1.767-0.165v-45.184c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 45.184c-75.407 8.641-142.673 38.060-197.457 82.316l0.725-0.567-32.143-32.143c-7.72-7.72-18.386-12.495-30.167-12.495-23.562 0-42.663 19.101-42.663 42.663 0 11.781 4.775 22.447 12.496 30.167l32.142 32.143c-43.689 54.059-73.109 121.325-81.584 194.964l-0.165 1.767h-45.184c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h45.184c8.641 75.407 38.060 142.673 82.316 197.457l-0.567-0.725-32.143 32.143c-7.72 7.72-12.495 18.386-12.495 30.167 0 23.562 19.1 42.662 42.662 42.662 11.781 0 22.446-4.775 30.167-12.495l32.145-32.142c54.059 43.689 121.325 73.109 194.964 81.584l1.767 0.165v45.184c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-45.184c75.407-8.641 142.673-38.060 197.457-82.316l-0.725 0.567 32.143 32.143c7.72 7.72 18.386 12.495 30.167 12.495 23.562 0 42.662-19.1 42.662-42.662 0-11.781-4.775-22.446-12.495-30.167v0l-32.142-32.145c43.689-54.059 73.109-121.325 81.584-194.964l0.165-1.767h45.184c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM768 554.667h39.261c-19.612 130.852-121.741 232.982-250.949 252.391l-1.645 0.203v-81.927c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 81.927c-130.852-19.612-232.982-121.741-252.391-250.949l-0.203-1.645h39.261c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-39.261c19.612-130.852 121.741-232.982 250.949-252.391l1.645-0.203v81.927c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-81.927c130.852 19.612 232.982 121.741 252.391 250.949l0.203 1.645h-39.261c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["coronavirus"]},"attrs":[],"properties":{"order":4847,"id":837,"name":"coronavirus","prevSize":32,"code":60016},"setIdx":0,"setId":0,"iconIdx":368},{"icon":{"paths":["M426.667 554.667h-256c-23.564 0-42.667 19.103-42.667 42.667v0 256c0 23.564 19.103 42.667 42.667 42.667v0h256c23.564 0 42.667-19.103 42.667-42.667v0-256c0-23.564-19.103-42.667-42.667-42.667v0zM384 810.667h-170.667v-170.667h170.667zM853.333 128h-256c-23.564 0-42.667 19.103-42.667 42.667v0 256c0 23.564 19.103 42.667 42.667 42.667v0h256c23.564 0 42.667-19.103 42.667-42.667v0-256c0-23.564-19.103-42.667-42.667-42.667v0zM810.667 384h-170.667v-170.667h170.667zM853.333 682.667h-85.333v-85.333c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 85.333h-85.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h85.333v85.333c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-85.333h85.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM426.667 128h-256c-23.564 0-42.667 19.103-42.667 42.667v0 256c0 23.564 19.103 42.667 42.667 42.667v0h256c23.564 0 42.667-19.103 42.667-42.667v0-256c0-23.564-19.103-42.667-42.667-42.667v0zM384 384h-170.667v-170.667h170.667z"],"attrs":[],"grid":0,"tags":["create-dashboard"]},"attrs":[],"properties":{"order":4848,"id":836,"name":"create-dashboard","prevSize":32,"code":60017},"setIdx":0,"setId":0,"iconIdx":369},{"icon":{"paths":["M512 85.333c-235.641 0-426.667 191.025-426.667 426.667s191.025 426.667 426.667 426.667c235.641 0 426.667-191.025 426.667-426.667v0c0-235.641-191.025-426.667-426.667-426.667v0zM512 853.333c-188.513 0-341.333-152.82-341.333-341.333v0c-0-0.125-0-0.272-0-0.42 0-79.067 27.155-151.792 72.648-209.357l-0.541 0.71 100.693 101.12c-1.3 6.768-2.073 14.58-2.133 22.562l-0 0.051v170.667c0 70.692 57.308 128 128 128v0h85.333c30.774-0.257 58.913-11.334 80.846-29.607l-0.206 0.167 85.333 85.333c-56.853 44.95-129.575 72.105-208.64 72.107l-0 0zM426.667 597.333v-110.507l147.627 147.627c-5.603 3.421-12.368 5.474-19.607 5.547l-0.020 0h-85.333c-23.564 0-42.667-19.103-42.667-42.667v0zM781.227 721.067l-98.56-101.12c0.311-3.387 0.489-7.326 0.489-11.307s-0.178-7.919-0.525-11.809l0.036 0.502c0-23.564-19.103-42.667-42.667-42.667v0c-7.259 0.072-14.024 2.126-19.798 5.644l0.171-0.097-170.667-170.667c5.603-3.421 12.368-5.474 19.607-5.547l0.020-0h85.333c23.564 0 42.667 19.103 42.667 42.667v0c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0c0-70.692-57.308-128-128-128v0h-85.333c-30.774 0.257-58.913 11.334-80.846 29.607l0.206-0.167-85.333-85.333c56.853-44.95 129.575-72.105 208.64-72.107l0-0c188.513 0 341.333 152.82 341.333 341.333v0c0 0.125 0 0.272 0 0.42 0 79.067-27.155 151.792-72.648 209.357l0.541-0.71z"],"attrs":[],"grid":0,"tags":["creative-commons-pd"]},"attrs":[],"properties":{"order":4849,"id":835,"name":"creative-commons-pd","prevSize":32,"code":60018},"setIdx":0,"setId":0,"iconIdx":370},{"icon":{"paths":["M853.333 749.653c16.865-27.217 26.86-60.228 26.86-95.573 0-101.326-82.141-183.467-183.467-183.467s-183.467 82.141-183.467 183.467c0 101.326 82.141 183.467 183.467 183.467 0.007 0 0.014-0 0.021-0l-0.001 0c35.34-0.171 68.315-10.147 96.388-27.344l-0.815 0.464 73.387 73.813c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003zM768 725.333c-18.109 17.281-42.693 27.916-69.76 27.916s-51.651-10.635-69.8-27.954l0.040 0.038c-17.774-17.889-28.759-42.542-28.759-69.76s10.985-51.871 28.764-69.765l-0.005 0.005c17.843-17.876 42.51-28.935 69.76-28.935s51.917 11.059 69.758 28.934l0.002 0.002c17.774 17.889 28.759 42.542 28.759 69.76s-10.985 51.871-28.764 69.765l0.005-0.005zM810.667 128h-597.333c-70.692 0-128 57.308-128 128v0 384c0 70.692 57.308 128 128 128v0h170.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-170.667c-23.564 0-42.667-19.103-42.667-42.667v0-256h682.667v42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-170.667c0-70.692-57.308-128-128-128v0zM853.333 298.667h-682.667v-42.667c0-23.564 19.103-42.667 42.667-42.667v0h597.333c23.564 0 42.667 19.103 42.667 42.667v0zM426.667 469.333h-128c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h128c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["credit-card-search"]},"attrs":[],"properties":{"order":4850,"id":834,"name":"credit-card-search","prevSize":32,"code":60019},"setIdx":0,"setId":0,"iconIdx":371},{"icon":{"paths":["M298.667 640h128c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-128c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM810.667 213.333h-597.333c-70.692 0-128 57.308-128 128v0 384c0 70.692 57.308 128 128 128v0h597.333c70.692 0 128-57.308 128-128v0-384c0-70.692-57.308-128-128-128v0zM853.333 725.333c0 23.564-19.103 42.667-42.667 42.667v0h-597.333c-23.564 0-42.667-19.103-42.667-42.667v0-256h682.667zM853.333 384h-682.667v-42.667c0-23.564 19.103-42.667 42.667-42.667v0h597.333c23.564 0 42.667 19.103 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["credit-card"]},"attrs":[],"properties":{"order":4851,"id":833,"name":"credit-card","prevSize":32,"code":60020},"setIdx":0,"setId":0,"iconIdx":372},{"icon":{"paths":["M768 518.4v-390.4c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 390.4c-74.554 22.153-128 90.062-128 170.453 0 0.075 0 0.15 0 0.225l-0-0.012c0 87.467 64.853 247.467 170.667 247.467s170.667-160 170.667-247.467c0-0.063 0-0.138 0-0.213 0-80.392-53.446-148.3-126.744-170.132l-1.256-0.321zM725.333 853.333c-34.133 0-85.333-96.853-85.333-162.133-0.055-1.181-0.087-2.566-0.087-3.958 0-48.1 37.722-87.39 85.197-89.899l0.223-0.009c47.698 2.519 85.42 41.809 85.42 89.909 0 1.392-0.032 2.777-0.094 4.153l0.007-0.195c0 65.28-51.2 162.133-85.333 162.133zM426.667 85.333c-23.564 0-42.667 19.103-42.667 42.667v0 232.96l-42.667 28.587v-261.547c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 261.547l-42.667-28.587v-232.96c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 256c0.079 14.744 7.624 27.709 19.044 35.315l0.156 0.098 108.8 72.96v403.627c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-403.627l108.8-72.96c11.576-7.705 19.121-20.669 19.2-35.401l0-0.012v-256c0-23.564-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["crockery"]},"attrs":[],"properties":{"order":4852,"id":832,"name":"crockery","prevSize":32,"code":60021},"setIdx":0,"setId":0,"iconIdx":373},{"icon":{"paths":["M414.293 695.040c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l-0-0 12.8 12.373h-25.173c-70.692 0-128-57.308-128-128v0-85.333c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 85.333c0 117.821 95.513 213.333 213.333 213.333v0h25.173l-12.8 12.373c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 85.333-85.333c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003zM853.333 512h-42.667v-298.667c0-23.564-19.103-42.667-42.667-42.667v0h-298.667v-42.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 42.667h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h42.667v298.667c0 23.564 19.103 42.667 42.667 42.667v0h298.667v42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM725.333 512h-256v-256h256z"],"attrs":[],"grid":0,"tags":["crop-alt-rotate-left"]},"attrs":[],"properties":{"order":4853,"id":831,"name":"crop-alt-rotate-left","prevSize":32,"code":60022},"setIdx":0,"setId":0,"iconIdx":374},{"icon":{"paths":["M682.667 170.667h-25.173l12.8-12.373c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l-85.333 85.333c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003 85.333 85.333c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003-12.8-12.373h25.173c70.692 0 128 57.308 128 128v0 85.333c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-85.333c0-117.821-95.513-213.333-213.333-213.333v0zM682.667 768h-42.667v-298.667c0-23.564-19.103-42.667-42.667-42.667v0h-298.667v-42.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 42.667h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h42.667v298.667c0 23.564 19.103 42.667 42.667 42.667v0h298.667v42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM554.667 768h-256v-256h256z"],"attrs":[],"grid":0,"tags":["crop-alt-rotate-right"]},"attrs":[],"properties":{"order":4854,"id":830,"name":"crop-alt-rotate-right","prevSize":32,"code":60023},"setIdx":0,"setId":0,"iconIdx":375},{"icon":{"paths":["M810.667 682.667h-42.667v-384c0-23.564-19.103-42.667-42.667-42.667v0h-384v-42.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 42.667h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h42.667v384c0 23.564 19.103 42.667 42.667 42.667v0h384v42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM682.667 682.667h-341.333v-341.333h341.333z"],"attrs":[],"grid":0,"tags":["crop-alt"]},"attrs":[],"properties":{"order":4855,"id":829,"name":"crop-alt","prevSize":32,"code":60024},"setIdx":0,"setId":0,"iconIdx":376},{"icon":{"paths":["M512 469.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM512 85.333c-235.641 0-426.667 191.025-426.667 426.667s191.025 426.667 426.667 426.667c235.641 0 426.667-191.025 426.667-426.667v0c0-235.641-191.025-426.667-426.667-426.667v0zM554.667 850.347v-125.013c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 125.013c-154.513-20.152-275.528-141.167-295.496-293.958l-0.184-1.722h125.013c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-125.013c20.152-154.513 141.167-275.528 293.958-295.496l1.722-0.184v125.013c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-125.013c154.513 20.152 275.528 141.167 295.496 293.958l0.184 1.722h-125.013c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h125.013c-20.152 154.513-141.167 275.528-293.958 295.496l-1.722 0.184z"],"attrs":[],"grid":0,"tags":["crosshair-alt"]},"attrs":[],"properties":{"order":4856,"id":828,"name":"crosshair-alt","prevSize":32,"code":60025},"setIdx":0,"setId":0,"iconIdx":377},{"icon":{"paths":["M896 469.333h-45.653c-20.152-154.513-141.167-275.528-293.958-295.496l-1.722-0.184v-45.653c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 45.653c-154.513 20.152-275.528 141.167-295.496 293.958l-0.184 1.722h-45.653c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h45.653c20.152 154.513 141.167 275.528 293.958 295.496l1.722 0.184v45.653c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-45.653c154.513-20.152 275.528-141.167 295.496-293.958l0.184-1.722h45.653c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM725.333 554.667h38.827c-18.729 107.317-102.177 190.764-207.96 209.271l-1.534 0.222v-38.827c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 38.827c-107.317-18.729-190.764-102.177-209.271-207.96l-0.222-1.534h38.827c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-38.827c18.729-107.317 102.177-190.764 207.96-209.271l1.534-0.222v38.827c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-38.827c107.317 18.729 190.764 102.177 209.271 207.96l0.222 1.534h-38.827c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM512 469.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["crosshair"]},"attrs":[],"properties":{"order":4857,"id":827,"name":"crosshair","prevSize":32,"code":60026},"setIdx":0,"setId":0,"iconIdx":378},{"icon":{"paths":["M896 469.333h-45.653c-20.152-154.513-141.167-275.528-293.958-295.496l-1.722-0.184v-45.653c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 45.653c-154.513 20.152-275.528 141.167-295.496 293.958l-0.184 1.722h-45.653c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h45.653c20.152 154.513 141.167 275.528 293.958 295.496l1.722 0.184v45.653c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-45.653c154.513-20.152 275.528-141.167 295.496-293.958l0.184-1.722h45.653c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM512 768c-141.385 0-256-114.615-256-256s114.615-256 256-256c141.385 0 256 114.615 256 256v0c0 141.385-114.615 256-256 256v0zM512 384c-70.692 0-128 57.308-128 128s57.308 128 128 128c70.692 0 128-57.308 128-128v0c0-70.692-57.308-128-128-128v0zM512 554.667c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667c23.564 0 42.667 19.103 42.667 42.667v0c0 23.564-19.103 42.667-42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["crosshairs"]},"attrs":[],"properties":{"order":4858,"id":826,"name":"crosshairs","prevSize":32,"code":60027},"setIdx":0,"setId":0,"iconIdx":379},{"icon":{"paths":["M886.272 143.542c-7.886-9.52-19.709-15.539-32.938-15.542l-597.334-0c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h545.542l-33.32 170.667h-554.888c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h538.229l-49.604 254.083-269.792 85.187-230.833-72.5 8.687-45.437c0.481-2.405 0.757-5.17 0.757-8 0-23.568-19.105-42.673-42.673-42.673-20.738 0-38.021 14.793-41.872 34.403l-0.044 0.27-15.792 82.771c-0.479 2.4-0.753 5.16-0.753 7.983 0 19.002 12.414 35.104 29.575 40.639l0.302 0.084 279.897 87.898c3.823 1.242 8.223 1.958 12.79 1.958 4.591 0 9.013-0.724 13.159-2.064l-0.302 0.085 306.771-96.853c14.817-4.792 25.924-17.063 28.975-32.247l0.046-0.273 114.354-585.813c0.502-2.457 0.79-5.281 0.79-8.172 0-10.333-3.673-19.808-9.784-27.191l0.057 0.071z"],"attrs":[],"grid":0,"tags":["css3-simple"]},"attrs":[],"properties":{"order":4859,"id":825,"name":"css3-simple","prevSize":32,"code":60028},"setIdx":0,"setId":0,"iconIdx":380},{"icon":{"paths":["M873.387 314.453s0 0 0-3.413l-2.56-6.4c-0.951-1.439-1.933-2.693-3.007-3.862l0.020 0.022c-1.227-1.927-2.491-3.599-3.877-5.162l0.037 0.042-3.84-2.987-6.827-3.413-320-197.547c-6.418-4.070-14.234-6.485-22.613-6.485s-16.195 2.416-22.788 6.589l0.175-0.103-317.44 197.547-3.84 3.413-3.84 2.987c-1.349 1.521-2.614 3.193-3.744 4.959l-0.096 0.161c-1.053 1.147-2.036 2.401-2.917 3.728l-0.070 0.112-2.56 6.4s0 0 0 3.413c-0.2 1.665-0.315 3.592-0.315 5.547s0.114 3.882 0.336 5.777l-0.022-0.23v372.907c-0 0.025-0 0.055-0 0.085 0 15.184 7.932 28.516 19.878 36.078l0.175 0.103 320 197.547c1.839 1.154 3.981 2.040 6.268 2.536l0.132 0.024s2.133 0 3.413 0c3.315 1.089 7.131 1.717 11.093 1.717s7.778-0.628 11.353-1.79l-0.26 0.073s2.133 0 3.413 0c2.419-0.52 4.561-1.406 6.484-2.609l-0.084 0.049 317.867-197.547c12.121-7.665 20.053-20.997 20.053-36.181 0-0.030-0-0.060-0-0.090l0 0.005v-372.907c0.2-1.665 0.315-3.592 0.315-5.547s-0.114-3.882-0.336-5.777l0.022 0.23zM469.333 819.627l-234.667-145.067v-272.213l234.667 144.64zM512 473.173l-238.933-147.627 238.933-147.2 238.933 147.2zM789.333 674.56l-234.667 145.067v-272.64l234.667-144.64z"],"attrs":[],"grid":0,"tags":["cube"]},"attrs":[],"properties":{"order":4860,"id":824,"name":"cube","prevSize":32,"code":60029},"setIdx":0,"setId":0,"iconIdx":381},{"icon":{"paths":["M814.421 211.393c-0.312-0.333-0.406-0.776-0.732-1.102s-0.776-0.425-1.112-0.739c-76.999-76.759-183.245-124.219-300.576-124.219s-223.576 47.46-300.586 124.229l0.011-0.011c-0.336 0.315-0.784 0.411-1.112 0.739s-0.419 0.768-0.732 1.102c-76.782 77.139-124.247 183.515-124.247 300.977 0 235.641 191.025 426.667 426.667 426.667s426.667-191.025 426.667-426.667c0-117.462-47.466-223.838-124.264-300.993l0.016 0.017zM512 853.333c-107.353-0.037-203.093-49.721-265.513-127.339l-0.514-0.661h171.318c23.277 26.224 57.073 42.667 94.708 42.667s71.432-16.443 94.595-42.537l0.113-0.13h171.32c-62.934 78.279-158.676 127.964-266.023 128l-0.006 0zM469.333 640c0-23.564 19.103-42.667 42.667-42.667s42.667 19.103 42.667 42.667c0 23.564-19.103 42.667-42.667 42.667v0c-23.554-0.024-42.642-19.112-42.667-42.664l-0-0.002zM828.169 640.089l-0.44-0.089h-187.729c-0.175-55.202-35.325-102.149-84.443-119.857l-0.891-0.28v-135.862c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 135.862c-50.009 17.989-85.158 64.936-85.333 120.117l-0 0.021-188.169 0.089c-10.383-24.825-18.178-53.665-22.025-83.74l-0.176-1.682h39.703c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-39.703c8.2-63.603 32.904-120.269 69.636-167.043l-0.555 0.733 27.935 27.935c7.72 7.72 18.386 12.495 30.167 12.495 23.562 0 42.662-19.101 42.662-42.662 0-11.781-4.775-22.446-12.496-30.167l-27.932-27.932c46.037-36.164 102.694-60.862 164.585-68.882l1.702-0.18v39.703c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-39.703c63.592 8.201 120.25 32.898 167.021 69.618l-0.734-0.555-27.932 27.932c-7.72 7.72-12.496 18.386-12.496 30.167 0 23.562 19.101 42.662 42.662 42.662 11.781 0 22.446-4.775 30.167-12.495l27.935-27.935c36.176 46.041 60.881 102.707 68.901 164.608l0.18 1.702h-39.703c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h39.703c-4.023 31.758-11.817 60.598-23.024 87.668l0.824-2.246z"],"attrs":[],"grid":0,"tags":["dashboard"]},"attrs":[],"properties":{"order":4861,"id":823,"name":"dashboard","prevSize":32,"code":60030},"setIdx":0,"setId":0,"iconIdx":382},{"icon":{"paths":["M875.52 165.12c-35.184-72.293-108.090-121.232-192.428-121.232-86.485 0-160.95 51.463-194.442 125.437l-0.544 1.342h-189.44c-70.692 0-128 57.308-128 128v0 170.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-170.667c0-23.564 19.103-42.667 42.667-42.667v0h118.613c-20.473 22.461-33.077 52.406-33.28 85.292l-0 0.041c0 70.692 57.308 128 128 128v0h312.747c0.334 0.003 0.729 0.004 1.125 0.004 86.245 0 156.16-69.915 156.16-156.16 0-68.48-44.080-126.665-105.413-147.729l-1.098-0.328zM824.747 384h-312.747c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667v0c23.564 0 42.667-19.103 42.667-42.667v0c-0.005-0.43-0.008-0.938-0.008-1.447 0-70.692 57.308-128 128-128 55.937 0 103.494 35.881 120.909 85.882l0.272 0.898c5.038 14.827 17.602 25.829 33.023 28.549l0.257 0.038c33.619 5.723 58.893 34.636 58.893 69.453 0 0.483-0.005 0.965-0.015 1.445l0.001-0.072c0 39.352-31.901 71.253-71.253 71.253v0zM810.667 554.667c-23.564 0-42.667 19.103-42.667 42.667v0 128c0 23.564-19.103 42.667-42.667 42.667v0h-96.427c-17.013-42.748-51.107-75.588-93.626-90.545l-1.094-0.335c-34.953-72.931-108.19-122.398-192.982-122.398-104.987 0-192.262 75.839-210.028 175.722l-0.19 1.289c-51.554 17.318-88.033 65.199-88.033 121.6 0 70.592 57.144 127.836 127.697 128l0.016 0h312.747c76.289 0 139.801-54.706 153.448-127.029l0.152-0.971h88.32c70.692 0 128-57.308 128-128v0-128c0-23.564-19.103-42.667-42.667-42.667v0zM483.413 896h-312.747c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667v0c23.564 0 42.667-19.103 42.667-42.667v0c-0.005-0.43-0.008-0.938-0.008-1.447 0-70.692 57.308-128 128-128 55.937 0 103.494 35.881 120.909 85.882l0.272 0.898c5.038 14.827 17.602 25.829 33.023 28.549l0.257 0.038c33.619 5.723 58.893 34.636 58.893 69.453 0 0.483-0.005 0.965-0.015 1.445l0.001-0.072c-0 39.352-31.901 71.253-71.253 71.253h0z"],"attrs":[],"grid":0,"tags":["data-sharing"]},"attrs":[],"properties":{"order":4862,"id":822,"name":"data-sharing","prevSize":32,"code":60031},"setIdx":0,"setId":0,"iconIdx":383},{"icon":{"paths":["M341.333 725.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM341.333 469.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM682.667 85.333h-341.333c-94.257 0-170.667 76.41-170.667 170.667v0 512c0 94.257 76.41 170.667 170.667 170.667v0h341.333c94.257 0 170.667-76.41 170.667-170.667v0-512c0-94.257-76.41-170.667-170.667-170.667v0zM768 768c0 47.128-38.205 85.333-85.333 85.333v0h-341.333c-47.128 0-85.333-38.205-85.333-85.333v0-109.227c24.351 14.889 53.792 23.757 85.295 23.893l0.038 0h341.333c31.541-0.136 60.983-9.005 86.067-24.31l-0.734 0.416zM768 512c0 47.128-38.205 85.333-85.333 85.333v0h-341.333c-47.128 0-85.333-38.205-85.333-85.333v0-109.227c24.351 14.889 53.792 23.757 85.295 23.893l0.038 0h341.333c31.541-0.136 60.983-9.005 86.067-24.31l-0.734 0.416zM682.667 341.333h-341.333c-47.128 0-85.333-38.205-85.333-85.333s38.205-85.333 85.333-85.333v0h341.333c47.128 0 85.333 38.205 85.333 85.333s-38.205 85.333-85.333 85.333v0z"],"attrs":[],"grid":0,"tags":["database-alt"]},"attrs":[],"properties":{"order":4863,"id":821,"name":"database-alt","prevSize":32,"code":60032},"setIdx":0,"setId":0,"iconIdx":384},{"icon":{"paths":["M341.333 704c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM512 85.333c-170.667 0-341.333 58.453-341.333 170.667v512c0 112.213 170.667 170.667 341.333 170.667s341.333-58.453 341.333-170.667v-512c0-112.213-170.667-170.667-341.333-170.667zM768 768c0 30.293-97.28 85.333-256 85.333s-256-55.040-256-85.333v-139.52c70.544 34.321 153.465 54.385 241.073 54.385 5.249 0 10.481-0.072 15.696-0.215l-0.768 0.017c4.446 0.126 9.678 0.198 14.927 0.198 87.607 0 170.528-20.064 244.419-55.847l-3.346 1.462zM768 512c0 30.293-97.28 85.333-256 85.333s-256-55.040-256-85.333v-139.52c70.544 34.321 153.465 54.385 241.073 54.385 5.249 0 10.481-0.072 15.696-0.215l-0.768 0.017c4.446 0.126 9.678 0.198 14.927 0.198 87.607 0 170.528-20.064 244.419-55.847l-3.346 1.462zM512 341.333c-158.72 0-256-55.040-256-85.333s97.28-85.333 256-85.333 256 55.040 256 85.333-97.28 85.333-256 85.333zM341.333 448c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["database"]},"attrs":[],"properties":{"order":4864,"id":820,"name":"database","prevSize":32,"code":60033},"setIdx":0,"setId":0,"iconIdx":385},{"icon":{"paths":["M768 85.333c-94.257 0-170.667 76.41-170.667 170.667s76.41 170.667 170.667 170.667c94.257 0 170.667-76.41 170.667-170.667v0c0-94.257-76.41-170.667-170.667-170.667v0zM768 341.333c-47.128 0-85.333-38.205-85.333-85.333s38.205-85.333 85.333-85.333c47.128 0 85.333 38.205 85.333 85.333v0c0 47.128-38.205 85.333-85.333 85.333v0zM640 853.333h-85.333v-85.333c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 85.333h-85.333v-144.213l147.2-73.813c13.992-7.163 23.415-21.462 23.467-37.966l0-0.007v-170.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 144.213l-85.333 42.667v-272.213c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 357.547l-85.333-42.667v-101.547c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 128c0.052 16.512 9.474 30.81 23.226 37.861l0.24 0.112 147.2 73.813v58.88h-170.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h512c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["desert"]},"attrs":[],"properties":{"order":4865,"id":819,"name":"desert","prevSize":32,"code":60034},"setIdx":0,"setId":0,"iconIdx":386},{"icon":{"paths":["M926.293 865.707l-768-768c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293v0l42.667 42.667c-7.809 16.068-12.373 34.953-12.373 54.904 0 0.048 0 0.095 0 0.143l-0-0.007v341.333c0 70.692 57.308 128 128 128v0h128v85.333h-128c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h512c18.182-0.196 33.619-11.734 39.584-27.865l0.096-0.295 58.027 58.453c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003zM213.333 273.493l195.84 195.84h-195.84zM554.667 810.667h-85.333v-85.333h85.333zM256 640c-23.564 0-42.667-19.103-42.667-42.667v0-42.667h281.173l85.333 85.333zM640 810.667v-85.333h25.173l85.333 85.333zM412.16 213.333h355.84c23.564 0 42.667 19.103 42.667 42.667v0 213.333h-57.173c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h57.173v42.667c0.112 0.705 0.175 1.519 0.175 2.347s-0.064 1.641-0.187 2.435l0.011-0.088c-0.549 2.567-0.863 5.517-0.863 8.54 0 20.547 14.524 37.702 33.866 41.758l0.278 0.049h8.533c0.256 0.006 0.558 0.009 0.86 0.009 20.547 0 37.701-14.523 41.758-33.864l0.049-0.278c0.624-4.618 0.98-9.956 0.98-15.377 0-1.945-0.046-3.879-0.136-5.802l0.010 0.272v-341.333c0-70.692-57.308-128-128-128v0h-355.84c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["desktop-alt-slash"]},"attrs":[],"properties":{"order":4866,"id":818,"name":"desktop-alt-slash","prevSize":32,"code":60035},"setIdx":0,"setId":0,"iconIdx":387},{"icon":{"paths":["M810.667 85.333h-597.333c-70.692 0-128 57.308-128 128v0 426.667c0 70.692 57.308 128 128 128v0h128v85.333h-128c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h597.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-128v-85.333h128c70.692 0 128-57.308 128-128v0-426.667c0-70.692-57.308-128-128-128v0zM597.333 853.333h-170.667v-85.333h170.667zM853.333 640c0 23.564-19.103 42.667-42.667 42.667v0h-597.333c-23.564 0-42.667-19.103-42.667-42.667v0-42.667h682.667zM853.333 512h-682.667v-298.667c0-23.564 19.103-42.667 42.667-42.667v0h597.333c23.564 0 42.667 19.103 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["desktop-alt"]},"attrs":[],"properties":{"order":4867,"id":817,"name":"desktop-alt","prevSize":32,"code":60036},"setIdx":0,"setId":0,"iconIdx":388},{"icon":{"paths":["M192 426.667h234.667c70.564-0.17 127.701-57.412 127.701-128 0-54.167-33.646-100.475-81.179-119.166l-0.869-0.301c-28.85-55.747-86.086-93.191-152.068-93.191-81.931 0-150.378 57.733-166.878 134.737l-0.201 1.12c-38.503 16.666-64.954 54.33-64.954 98.172 0 57.895 46.125 105.018 103.632 106.624l0.148 0.003zM192 298.667c23.564 0 42.667-19.103 42.667-42.667v0c0.339-46.871 38.413-84.736 85.331-84.736 37.134 0 68.727 23.719 80.458 56.832l0.184 0.597c5.163 14.65 17.694 25.478 33.026 28.124l0.254 0.036c20.162 3.573 35.296 20.908 35.413 41.801l0 0.013c0 23.564-19.103 42.667-42.667 42.667v0h-234.667c-11.782 0-21.333-9.551-21.333-21.333s9.551-21.333 21.333-21.333v0zM810.667 85.333h-213.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h213.333c23.564 0 42.667 19.103 42.667 42.667v0 298.667h-725.333c-23.564 0-42.667 19.103-42.667 42.667v0 85.333c0 70.692 57.308 128 128 128v0h128v85.333h-128c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h597.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-128v-85.333h128c70.692 0 128-57.308 128-128v0-426.667c0-70.692-57.308-128-128-128v0zM597.333 853.333h-170.667v-85.333h170.667zM853.333 640c0 23.564-19.103 42.667-42.667 42.667v0h-597.333c-23.564 0-42.667-19.103-42.667-42.667v0-42.667h682.667z"],"attrs":[],"grid":0,"tags":["desktop-cloud-alt"]},"attrs":[],"properties":{"order":4868,"id":816,"name":"desktop-cloud-alt","prevSize":32,"code":60037},"setIdx":0,"setId":0,"iconIdx":389},{"icon":{"paths":["M454.827 256h313.173c23.564 0 42.667 19.103 42.667 42.667v0 256c0.001 0.081 0.001 0.177 0.001 0.273 0 7.796-2.224 15.072-6.073 21.229l0.098-0.169c-4.153 6.466-6.621 14.359-6.621 22.828 0 15.099 7.843 28.366 19.677 35.949l0.17 0.102c6.281 4.276 14.034 6.827 22.384 6.827 0.081 0 0.161-0 0.242-0.001l-0.012 0c14.98-0.026 28.146-7.767 35.739-19.461l0.101-0.166c12.31-19.068 19.627-42.365 19.627-67.37 0-0.015-0-0.030-0-0.046l0 0.003v-256c0-70.692-57.308-128-128-128v0h-313.173c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM926.293 865.707l-768-768c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l-0-0 59.733 59.307c-18.194 21.834-29.289 50.14-29.44 81.034l-0 0.033v256c0 70.692 57.308 128 128 128v0h213.333v85.333h-170.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h426.667c18.182-0.196 33.619-11.734 39.584-27.865l0.096-0.295 100.693 101.12c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003zM256 597.333c-23.564 0-42.667-19.103-42.667-42.667v0-256c0.113-7.208 1.996-13.952 5.231-19.848l-0.111 0.222 318.72 318.293zM554.667 768v-85.333h67.84l85.333 85.333z"],"attrs":[],"grid":0,"tags":["desktop-slash"]},"attrs":[],"properties":{"order":4869,"id":815,"name":"desktop-slash","prevSize":32,"code":60038},"setIdx":0,"setId":0,"iconIdx":390},{"icon":{"paths":["M213.333 394.667c-64.801 0-117.333 52.532-117.333 117.333s52.532 117.333 117.333 117.333c64.801 0 117.333-52.532 117.333-117.333v0c0-64.801-52.532-117.333-117.333-117.333v0zM213.333 565.333c-29.455 0-53.333-23.878-53.333-53.333s23.878-53.333 53.333-53.333c29.455 0 53.333 23.878 53.333 53.333v0c0 29.455-23.878 53.333-53.333 53.333v0zM512 394.667c-64.801 0-117.333 52.532-117.333 117.333s52.532 117.333 117.333 117.333c64.801 0 117.333-52.532 117.333-117.333v0c0-64.801-52.532-117.333-117.333-117.333v0zM512 565.333c-29.455 0-53.333-23.878-53.333-53.333s23.878-53.333 53.333-53.333c29.455 0 53.333 23.878 53.333 53.333v0c0 29.455-23.878 53.333-53.333 53.333v0zM810.667 330.667c64.801 0 117.333-52.532 117.333-117.333s-52.532-117.333-117.333-117.333c-64.801 0-117.333 52.532-117.333 117.333v0c0 64.801 52.532 117.333 117.333 117.333v0zM810.667 160c29.455 0 53.333 23.878 53.333 53.333s-23.878 53.333-53.333 53.333c-29.455 0-53.333-23.878-53.333-53.333v0c0-29.455 23.878-53.333 53.333-53.333v0zM810.667 394.667c-64.801 0-117.333 52.532-117.333 117.333s52.532 117.333 117.333 117.333c64.801 0 117.333-52.532 117.333-117.333v0c0-64.801-52.532-117.333-117.333-117.333v0zM810.667 565.333c-29.455 0-53.333-23.878-53.333-53.333s23.878-53.333 53.333-53.333c29.455 0 53.333 23.878 53.333 53.333v0c0 29.455-23.878 53.333-53.333 53.333v0zM213.333 96c-64.801 0-117.333 52.532-117.333 117.333s52.532 117.333 117.333 117.333c64.801 0 117.333-52.532 117.333-117.333v0c0-64.801-52.532-117.333-117.333-117.333v0zM213.333 266.667c-29.455 0-53.333-23.878-53.333-53.333s23.878-53.333 53.333-53.333c29.455 0 53.333 23.878 53.333 53.333v0c0 29.455-23.878 53.333-53.333 53.333v0zM512 693.333c-64.801 0-117.333 52.532-117.333 117.333s52.532 117.333 117.333 117.333c64.801 0 117.333-52.532 117.333-117.333v0c0-64.801-52.532-117.333-117.333-117.333v0zM512 864c-29.455 0-53.333-23.878-53.333-53.333s23.878-53.333 53.333-53.333c29.455 0 53.333 23.878 53.333 53.333v0c0 29.455-23.878 53.333-53.333 53.333v0zM512 96c-64.801 0-117.333 52.532-117.333 117.333s52.532 117.333 117.333 117.333c64.801 0 117.333-52.532 117.333-117.333v0c0-64.801-52.532-117.333-117.333-117.333v0zM512 266.667c-29.455 0-53.333-23.878-53.333-53.333s23.878-53.333 53.333-53.333c29.455 0 53.333 23.878 53.333 53.333v0c0 29.455-23.878 53.333-53.333 53.333v0z"],"attrs":[],"grid":0,"tags":["dialpad-alt"]},"attrs":[],"properties":{"order":4870,"id":814,"name":"dialpad-alt","prevSize":32,"code":60039},"setIdx":0,"setId":0,"iconIdx":391},{"icon":{"paths":["M810.667 128h-597.333c-70.692 0-128 57.308-128 128v0 341.333c0 70.692 57.308 128 128 128v0h256v85.333h-170.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h426.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-170.667v-85.333h256c70.692 0 128-57.308 128-128v0-341.333c0-70.692-57.308-128-128-128v0zM853.333 597.333c0 23.564-19.103 42.667-42.667 42.667v0h-597.333c-23.564 0-42.667-19.103-42.667-42.667v0-341.333c0-23.564 19.103-42.667 42.667-42.667v0h597.333c23.564 0 42.667 19.103 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["desktop"]},"attrs":[],"properties":{"order":4871,"id":813,"name":"desktop","prevSize":32,"code":60040},"setIdx":0,"setId":0,"iconIdx":392},{"icon":{"paths":["M298.667 96h-170.667c-17.577 0.237-31.763 14.423-32 31.977l-0 0.023v170.667c0.237 17.577 14.423 31.763 31.977 32l0.023 0h170.667c17.577-0.237 31.763-14.423 32-31.977l0-0.023v-170.667c-0.237-17.577-14.423-31.763-31.977-32l-0.023-0zM266.667 266.667h-106.667v-106.667h106.667zM896 96h-170.667c-17.577 0.237-31.763 14.423-32 31.977l-0 0.023v170.667c0.237 17.577 14.423 31.763 31.977 32l0.023 0h170.667c17.577-0.237 31.763-14.423 32-31.977l0-0.023v-170.667c-0.237-17.577-14.423-31.763-31.977-32l-0.023-0zM864 266.667h-106.667v-106.667h106.667zM597.333 96h-170.667c-17.577 0.237-31.763 14.423-32 31.977l-0 0.023v170.667c0.237 17.577 14.423 31.763 31.977 32l0.023 0h170.667c17.577-0.237 31.763-14.423 32-31.977l0-0.023v-170.667c-0.237-17.577-14.423-31.763-31.977-32l-0.023-0zM565.333 266.667h-106.667v-106.667h106.667zM298.667 394.667h-170.667c-17.577 0.237-31.763 14.423-32 31.977l-0 0.023v170.667c0.237 17.577 14.423 31.763 31.977 32l0.023 0h170.667c17.577-0.237 31.763-14.423 32-31.977l0-0.023v-170.667c-0.237-17.577-14.423-31.763-31.977-32l-0.023-0zM266.667 565.333h-106.667v-106.667h106.667zM597.333 394.667h-170.667c-17.577 0.237-31.763 14.423-32 31.977l-0 0.023v170.667c0.237 17.577 14.423 31.763 31.977 32l0.023 0h170.667c17.577-0.237 31.763-14.423 32-31.977l0-0.023v-170.667c-0.237-17.577-14.423-31.763-31.977-32l-0.023-0zM565.333 565.333h-106.667v-106.667h106.667zM896 394.667h-170.667c-17.577 0.237-31.763 14.423-32 31.977l-0 0.023v170.667c0.237 17.577 14.423 31.763 31.977 32l0.023 0h170.667c17.577-0.237 31.763-14.423 32-31.977l0-0.023v-170.667c-0.237-17.577-14.423-31.763-31.977-32l-0.023-0zM864 565.333h-106.667v-106.667h106.667zM597.333 693.333h-170.667c-17.577 0.237-31.763 14.423-32 31.977l-0 0.023v170.667c0.237 17.577 14.423 31.763 31.977 32l0.023 0h170.667c17.577-0.237 31.763-14.423 32-31.977l0-0.023v-170.667c-0.237-17.577-14.423-31.763-31.977-32l-0.023-0zM565.333 864h-106.667v-106.667h106.667z"],"attrs":[],"grid":0,"tags":["dialpad"]},"attrs":[],"properties":{"order":4872,"id":812,"name":"dialpad","prevSize":32,"code":60041},"setIdx":0,"setId":0,"iconIdx":393},{"icon":{"paths":["M853.333 441.6l-246.613-316.16c-23.796-24.747-57.184-40.121-94.163-40.121-38.211 0-72.589 16.415-96.465 42.579l-0.092 0.102-245.333 313.6c-13.046 19.877-20.836 44.222-20.907 70.381l-0 0.019c0.77 25.137 8.461 48.33 21.217 67.922l-0.311-0.509 2.56 2.987 244.907 316.16c23.388 24.722 56.425 40.109 93.055 40.109 0.285 0 0.571-0.001 0.855-0.003l-0.044 0c38.162-0.035 72.485-16.438 96.335-42.565l0.092-0.102 244.907-313.6c12.449-19.393 19.844-43.061 19.844-68.457 0-27.032-8.38-52.107-22.683-72.769l0.279 0.425zM786.347 532.907l-241.92 308.053c-8.409 7.763-19.691 12.524-32.084 12.524-10.753 0-20.67-3.584-28.62-9.622l0.117 0.085-242.773-311.893c-3.474-5.739-5.653-12.61-5.97-19.965l-0.003-0.088c0.068-6.974 1.633-13.566 4.389-19.492l-0.122 0.292 241.92-308.053c8.409-7.763 19.691-12.524 32.084-12.524 10.753 0 20.67 3.584 28.62 9.622l-0.117-0.085 240.213 310.613c4.261 6.508 6.804 14.475 6.827 23.034l0 0.006c-0.316 6.403-1.856 12.372-4.389 17.784l0.122-0.29z"],"attrs":[],"grid":0,"tags":["diamond"]},"attrs":[],"properties":{"order":4873,"id":811,"name":"diamond","prevSize":32,"code":60042},"setIdx":0,"setId":0,"iconIdx":394},{"icon":{"paths":["M725.333 85.333h-512c-23.564 0-42.667 19.103-42.667 42.667v0 768c0 23.564 19.103 42.667 42.667 42.667v0h512c70.692 0 128-57.308 128-128v0-597.333c0-70.692-57.308-128-128-128v0zM341.333 853.333h-85.333v-682.667h85.333zM768 810.667c0 23.564-19.103 42.667-42.667 42.667v0h-298.667v-682.667h298.667c23.564 0 42.667 19.103 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["diary-alt"]},"attrs":[],"properties":{"order":4874,"id":810,"name":"diary-alt","prevSize":32,"code":60043},"setIdx":0,"setId":0,"iconIdx":395},{"icon":{"paths":["M725.333 85.333h-512c-23.564 0-42.667 19.103-42.667 42.667v0 682.667c0 23.564 19.103 42.667 42.667 42.667v0h42.667v42.667c0 23.564 19.103 42.667 42.667 42.667v0 0c23.564 0 42.667-19.103 42.667-42.667v0-42.667h384c70.692 0 128-57.308 128-128v0-512c0-70.692-57.308-128-128-128v0zM597.333 768h-341.333v-597.333h341.333zM768 725.333c0 23.564-19.103 42.667-42.667 42.667v0h-42.667v-597.333h42.667c23.564 0 42.667 19.103 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["diary"]},"attrs":[],"properties":{"order":4875,"id":809,"name":"diary","prevSize":32,"code":60044},"setIdx":0,"setId":0,"iconIdx":396},{"icon":{"paths":["M725.333 85.333h-426.667c-117.821 0-213.333 95.513-213.333 213.333v0 426.667c0 117.821 95.513 213.333 213.333 213.333v0h426.667c117.821 0 213.333-95.513 213.333-213.333v0-426.667c0-117.821-95.513-213.333-213.333-213.333v0zM853.333 725.333c0 70.692-57.308 128-128 128v0h-426.667c-70.692 0-128-57.308-128-128v0-426.667c0-70.692 57.308-128 128-128v0h426.667c70.692 0 128 57.308 128 128v0zM341.333 640c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM512 469.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM341.333 298.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM682.667 640c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM682.667 298.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["dice-five"]},"attrs":[],"properties":{"order":4876,"id":808,"name":"dice-five","prevSize":32,"code":60045},"setIdx":0,"setId":0,"iconIdx":397},{"icon":{"paths":["M640 597.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM384 341.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM384 597.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM640 341.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM725.333 85.333h-426.667c-117.821 0-213.333 95.513-213.333 213.333v0 426.667c0 117.821 95.513 213.333 213.333 213.333v0h426.667c117.821 0 213.333-95.513 213.333-213.333v0-426.667c0-117.821-95.513-213.333-213.333-213.333v0zM853.333 725.333c0 70.692-57.308 128-128 128v0h-426.667c-70.692 0-128-57.308-128-128v0-426.667c0-70.692 57.308-128 128-128v0h426.667c70.692 0 128 57.308 128 128v0z"],"attrs":[],"grid":0,"tags":["dice-four"]},"attrs":[],"properties":{"order":4877,"id":807,"name":"dice-four","prevSize":32,"code":60046},"setIdx":0,"setId":0,"iconIdx":398},{"icon":{"paths":["M725.333 85.333h-426.667c-117.821 0-213.333 95.513-213.333 213.333v0 426.667c0 117.821 95.513 213.333 213.333 213.333v0h426.667c117.821 0 213.333-95.513 213.333-213.333v0-426.667c0-117.821-95.513-213.333-213.333-213.333v0zM853.333 725.333c0 70.692-57.308 128-128 128v0h-426.667c-70.692 0-128-57.308-128-128v0-426.667c0-70.692 57.308-128 128-128v0h426.667c70.692 0 128 57.308 128 128v0zM512 469.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["dice-one"]},"attrs":[],"properties":{"order":4878,"id":806,"name":"dice-one","prevSize":32,"code":60047},"setIdx":0,"setId":0,"iconIdx":399},{"icon":{"paths":["M384 469.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM384 640c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM384 298.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM640 298.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM725.333 85.333h-426.667c-117.821 0-213.333 95.513-213.333 213.333v0 426.667c0 117.821 95.513 213.333 213.333 213.333v0h426.667c117.821 0 213.333-95.513 213.333-213.333v0-426.667c0-117.821-95.513-213.333-213.333-213.333v0zM853.333 725.333c0 70.692-57.308 128-128 128v0h-426.667c-70.692 0-128-57.308-128-128v0-426.667c0-70.692 57.308-128 128-128v0h426.667c70.692 0 128 57.308 128 128v0zM640 469.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM640 640c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["dice-six"]},"attrs":[],"properties":{"order":4879,"id":805,"name":"dice-six","prevSize":32,"code":60048},"setIdx":0,"setId":0,"iconIdx":400},{"icon":{"paths":["M512 469.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM341.333 298.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM725.333 85.333h-426.667c-117.821 0-213.333 95.513-213.333 213.333v0 426.667c0 117.821 95.513 213.333 213.333 213.333v0h426.667c117.821 0 213.333-95.513 213.333-213.333v0-426.667c0-117.821-95.513-213.333-213.333-213.333v0zM853.333 725.333c0 70.692-57.308 128-128 128v0h-426.667c-70.692 0-128-57.308-128-128v0-426.667c0-70.692 57.308-128 128-128v0h426.667c70.692 0 128 57.308 128 128v0zM682.667 640c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["dice-three"]},"attrs":[],"properties":{"order":4880,"id":804,"name":"dice-three","prevSize":32,"code":60049},"setIdx":0,"setId":0,"iconIdx":401},{"icon":{"paths":["M384 469.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM725.333 85.333h-426.667c-117.821 0-213.333 95.513-213.333 213.333v0 426.667c0 117.821 95.513 213.333 213.333 213.333v0h426.667c117.821 0 213.333-95.513 213.333-213.333v0-426.667c0-117.821-95.513-213.333-213.333-213.333v0zM853.333 725.333c0 70.692-57.308 128-128 128v0h-426.667c-70.692 0-128-57.308-128-128v0-426.667c0-70.692 57.308-128 128-128v0h426.667c70.692 0 128 57.308 128 128v0zM640 469.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["dice-two"]},"attrs":[],"properties":{"order":4881,"id":803,"name":"dice-two","prevSize":32,"code":60050},"setIdx":0,"setId":0,"iconIdx":402},{"icon":{"paths":["M414.293 435.627l97.707-98.133 97.707 98.133c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003-128-128c-7.733-7.795-18.45-12.621-30.293-12.621s-22.56 4.826-30.291 12.618l-0.003 0.003-128 128c-7.753 7.753-12.548 18.463-12.548 30.293 0 23.661 19.181 42.841 42.841 42.841 11.83 0 22.541-4.795 30.293-12.548l-0 0zM609.707 631.040l-97.707 98.133-97.707-98.133c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l128 128c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 128-128c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l0-0z"],"attrs":[],"grid":0,"tags":["direction"]},"attrs":[],"properties":{"order":4882,"id":802,"name":"direction","prevSize":32,"code":60051},"setIdx":0,"setId":0,"iconIdx":403},{"icon":{"paths":["M901.12 421.547l-298.667-298.667c-23.51-22.342-55.377-36.084-90.453-36.084s-66.943 13.743-90.51 36.137l0.056-0.053-298.667 298.667c-23.13 23.158-37.434 55.135-37.434 90.453s14.304 67.296 37.435 90.455l-0.001-0.001 298.667 298.667c23.158 23.13 55.135 37.434 90.453 37.434s67.296-14.304 90.455-37.435l-0.001 0.001 298.667-298.667c23.13-23.158 37.434-55.135 37.434-90.453s-14.304-67.296-37.435-90.455l0.001 0.001zM840.96 542.293l-298.667 298.667c-7.733 7.795-18.45 12.621-30.293 12.621s-22.56-4.826-30.291-12.618l-0.003-0.003-298.667-298.667c-7.795-7.733-12.621-18.45-12.621-30.293s4.826-22.56 12.618-30.291l0.003-0.003 298.667-298.667c7.733-7.795 18.45-12.621 30.293-12.621s22.56 4.826 30.291 12.618l0.003 0.003 298.667 298.667c7.795 7.733 12.621 18.45 12.621 30.293s-4.826 22.56-12.618 30.291l-0.003 0.003zM606.293 396.373c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l-0-0 12.8 12.373h-153.173c-23.564 0-42.667 19.103-42.667 42.667v0 85.333c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667h110.507l-12.8 12.373c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 85.333-85.333c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003z"],"attrs":[],"grid":0,"tags":["directions"]},"attrs":[],"properties":{"order":4883,"id":801,"name":"directions","prevSize":32,"code":60052},"setIdx":0,"setId":0,"iconIdx":404},{"icon":{"paths":["M432.568 453.539h-0.006c-24.809 0.002-44.92 20.114-44.92 44.923s20.113 44.923 44.923 44.923c24.81 0 44.923-20.113 44.923-44.923s-20.111-44.921-44.92-44.923l-0-0zM592.75 453.539c-1.237-0.111-2.675-0.175-4.128-0.175-27 0-48.888 21.888-48.888 48.888s21.888 48.888 48.888 48.888c27 0 48.888-21.888 48.888-48.888 0-0.001-0-0.002-0-0.003l0 0c0.027-0.595 0.043-1.293 0.043-1.995 0-25.136-19.834-45.639-44.706-46.713l-0.097-0.003zM806.031 85.338h-588.063c-49.714 0.121-89.969 40.451-89.969 90.182 0 0.079 0 0.157 0 0.236l-0-0.012v593.334c-0 0.065-0 0.143-0 0.22 0 49.732 40.254 90.061 89.957 90.183l0.012 0h497.661l-23.26-81.19 56.172 52.224 53.104 49.152 94.354 83.384v-787.308c0-0.066 0-0.145 0-0.224 0-49.731-40.254-90.060-89.957-90.182l-0.012-0zM636.635 658.484v0.003s-15.802-18.872-28.969-35.549c32.703-7.877 60.187-26.506 79.179-51.864l0.258-0.36c-14.524 9.812-31.161 18.523-48.754 25.309l-1.715 0.581c-18.292 8.058-39.644 14.607-61.88 18.61l-1.755 0.262c-16.738 3.232-35.987 5.082-55.668 5.082-20.513 0-40.557-2.009-59.946-5.841l1.953 0.322c-24.703-4.896-46.313-11.414-66.994-19.752l2.478 0.883c-12.66-4.897-23.209-9.912-33.335-15.591l1.298 0.669c-1.318-0.88-2.63-1.318-3.948-2.196-0.683-0.343-1.264-0.783-1.752-1.311l-0.004-0.004c-7.896-4.388-12.292-7.461-12.292-7.461 18.584 25.208 45.117 43.611 75.854 51.576l0.948 0.209c-13.161 16.68-29.401 36.425-29.401 36.425-1.276 0.037-2.778 0.058-4.285 0.058-53.232 0-100.359-26.143-129.24-66.29l-0.324-0.473c1.545-93.585 24.726-181.408 64.735-259.153l-1.543 3.298c33.775-26.72 76.358-43.688 122.795-46.059l0.523-0.021 4.385 5.268c-44.399 11.206-83.106 31.103-115.949 57.911l0.534-0.422s9.656-5.265 25.891-12.727c29.019-13.601 62.694-23.354 98.083-27.499l1.543-0.147c2.206-0.482 4.772-0.798 7.398-0.879l0.065-0.002c14.405-1.98 31.051-3.111 47.962-3.111 14.333 0 28.477 0.812 42.387 2.393l-1.703-0.157c49.236 5.758 93.937 20.684 133.904 43.057l-1.808-0.93c-30.669-25.123-67.235-44.332-107.221-55.258l-2.049-0.477 6.141-7.018c46.96 2.39 89.544 19.359 123.773 46.427l-0.455-0.347c38.47 74.445 61.652 162.267 63.191 255.355l0.006 0.497c-29.475 40.634-76.804 66.756-130.234 66.756-1.429 0-2.854-0.019-4.274-0.056l0.21 0.004z"],"attrs":[],"grid":0,"tags":["discord"]},"attrs":[],"properties":{"order":4884,"id":800,"name":"discord","prevSize":32,"code":60053},"setIdx":0,"setId":0,"iconIdx":405},{"icon":{"paths":["M384 499.627l12.373-12.8 12.373 12.8c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003-12.8-12.373 12.8-12.373c7.609-7.818 12.302-18.507 12.302-30.293 0-23.996-19.453-43.449-43.449-43.449-12.21 0-23.244 5.037-31.137 13.146l-0.009 0.010-12.373 12.8-10.667-12.8c-7.903-8.119-18.936-13.155-31.147-13.155-23.996 0-43.449 19.453-43.449 43.449 0 11.786 4.693 22.476 12.312 30.303l-0.009-0.010 12.8 12.373-12.8 12.373c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003zM640 597.333h-256c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h256c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM512 85.333c-235.641 0-426.667 191.025-426.667 426.667s191.025 426.667 426.667 426.667c235.641 0 426.667-191.025 426.667-426.667v0c0-235.641-191.025-426.667-426.667-426.667v0zM512 853.333c-188.513 0-341.333-152.82-341.333-341.333s152.82-341.333 341.333-341.333c188.513 0 341.333 152.82 341.333 341.333v0c0 188.513-152.82 341.333-341.333 341.333v0zM725.333 353.707c-7.733-7.795-18.45-12.621-30.293-12.621s-22.56 4.826-30.291 12.618l-0.003 0.003-12.373 12.8-12.373-12.8c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l-0-0 12.8 12.373-12.8 12.373c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 12.373-12.8 12.373 12.8c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003-12.8-12.373 12.8-12.373c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003z"],"attrs":[],"grid":0,"tags":["dizzy-meh"]},"attrs":[],"properties":{"order":4885,"id":799,"name":"dizzy-meh","prevSize":32,"code":60054},"setIdx":0,"setId":0,"iconIdx":406},{"icon":{"paths":["M392.533 585.813c-7.806-8.325-18.873-13.512-31.152-13.512-11.215 0-21.42 4.327-29.035 11.403l0.027-0.024c-98.651 87.201-160.801 213.746-161.706 354.826l-0.001 0.161c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0c0.635-116.688 52.365-221.168 133.935-292.296l0.465-0.397c8.325-7.806 13.512-18.873 13.512-31.152 0-11.215-4.327-21.42-11.403-29.035l0.024 0.027zM826.453 783.787c-17.163-48.921-40.287-91.31-69.095-129.134l0.829 1.134c-44.086-56.754-96.469-104.52-155.821-142.315l-2.473-1.472c95.573-61.013 253.44-196.267 253.44-426.667 0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0c0 230.4-195.84 348.587-256 379.307-43.644-23.502-81.304-50.276-115.252-81.067l0.478 0.427h114.773c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-189.867c-16.437-24.557-30.829-52.724-41.774-82.553l-0.892-2.78h360.533c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-381.44c-1.63-12.638-2.56-27.258-2.56-42.095 0-0.201 0-0.402 0.001-0.603l-0 0.031c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0c0 322.987 311.467 460.373 324.693 465.92v0c50.442 24.531 93.844 54.16 132.285 89.146l-0.445-0.399h-115.2c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h189.013c16.586 24.566 30.989 52.745 41.814 82.639l0.853 2.695h-359.68c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h381.44c1.63 12.73 2.56 27.457 2.56 42.402 0 0.093-0 0.186-0 0.279l0-0.014c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0c0.003-0.649 0.005-1.418 0.005-2.187 0-32.31-3.42-63.821-9.919-94.191l0.527 2.938c-4.769-23.741-10.808-44.324-18.402-64.138l0.909 2.698z"],"attrs":[],"grid":0,"tags":["dna"]},"attrs":[],"properties":{"order":4886,"id":798,"name":"dna","prevSize":32,"code":60055},"setIdx":0,"setId":0,"iconIdx":407},{"icon":{"paths":["M375.467 375.467h76.8c4.267 0 8.533-4.267 8.533-8.533v-64c0-4.267-4.267-8.533-8.533-8.533h-76.8c-4.267 0-8.533 4.267-8.533 8.533v68.267c0 0 4.267 4.267 8.533 4.267zM477.867 473.6h76.8c4.267 0 8.533-4.267 8.533-8.533v-68.267c0-4.267-4.267-8.533-8.533-8.533h-76.8c-4.267 0-8.533 4.267-8.533 8.533v68.267c0 4.267 4.267 8.533 8.533 8.533zM477.867 375.467h76.8c4.267 0 8.533-4.267 8.533-8.533v-64c-4.267-4.267-8.533-8.533-8.533-8.533h-76.8c-4.267 0-8.533 4.267-8.533 8.533v68.267c0 0 4.267 4.267 8.533 4.267zM584.533 473.6h76.8c4.267 0 8.533-4.267 8.533-8.533v-68.267c0-4.267-4.267-8.533-8.533-8.533h-76.8c-4.267 0-8.533 4.267-8.533 8.533v68.267c0 4.267 4.267 8.533 8.533 8.533zM477.867 277.333h76.8c4.267 0 8.533-4.267 8.533-8.533v-64c0-4.267-4.267-8.533-8.533-8.533h-76.8c-4.267 0-8.533 4.267-8.533 8.533v68.267c0 4.267 4.267 4.267 8.533 4.267zM162.133 473.6h76.8c4.267 0 8.533-4.267 8.533-8.533v-68.267c0-4.267-4.267-8.533-8.533-8.533h-76.8c-4.267 0-8.533 4.267-8.533 8.533v68.267c4.267 4.267 8.533 8.533 8.533 8.533zM930.133 430.933c-21.333-12.8-46.933-21.333-68.267-17.067-12.8 0-25.6 0-34.133 4.267-8.533-38.4-29.867-72.533-59.733-89.6l-12.8-8.533-8.533 12.8c-12.8 8.533-21.333 25.6-25.6 46.933-8.533 34.133-4.267 68.267 12.8 93.867-21.333 8.533-42.667 12.8-64 17.067h-558.933c-12.8 0-25.6 12.8-25.6 25.6 0 51.2 8.533 98.133 25.6 145.067s46.933 85.333 85.333 110.933c59.733 29.867 123.733 42.667 187.733 38.4 34.133 0 68.267-4.267 102.4-8.533 46.933-8.533 93.867-25.6 136.533-51.2 34.133-21.333 64-46.933 93.867-76.8 38.4-46.933 68.267-98.133 89.6-157.867h8.533c34.133 0 68.267-12.8 93.867-34.133 12.8-8.533 21.333-21.333 25.6-38.4l4.267-8.533-8.533-4.267zM268.8 473.6h72.533c4.267 0 8.533-4.267 8.533-8.533v-68.267c0-4.267-4.267-8.533-8.533-8.533h-72.533c-4.267 0-8.533 4.267-8.533 8.533v68.267c0 4.267 4.267 8.533 8.533 8.533zM268.8 375.467h72.533c4.267 0 8.533-4.267 8.533-8.533v-64c0-4.267-4.267-8.533-8.533-8.533h-72.533c-4.267 0-8.533 4.267-8.533 8.533v68.267c0 0 4.267 4.267 8.533 4.267zM375.467 473.6h76.8c4.267 0 8.533-4.267 8.533-8.533v-68.267c0-4.267-4.267-8.533-8.533-8.533h-76.8c-4.267 0-8.533 4.267-8.533 8.533v68.267c-0 4.267 4.267 8.533 8.533 8.533z"],"attrs":[],"grid":0,"tags":["docker"]},"attrs":[],"properties":{"order":4887,"id":797,"name":"docker","prevSize":32,"code":60056},"setIdx":0,"setId":0,"iconIdx":408},{"icon":{"paths":["M512 597.333c-23.564 0-42.667 19.103-42.667 42.667v0 85.333c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-85.333c0-23.564-19.103-42.667-42.667-42.667v0zM528.213 472.747c-5.263-2.499-11.435-3.959-17.948-3.959-2.401 0-4.755 0.198-7.048 0.579l0.249-0.034-7.68 2.56-7.68 3.84-6.4 5.12c-7.656 7.71-12.387 18.332-12.387 30.060 0 0.382 0.005 0.763 0.015 1.143l-0.001-0.056c-0 0.073-0.001 0.16-0.001 0.247 0 11.721 4.726 22.338 12.377 30.049l-0.003-0.003c3.937 3.773 8.616 6.808 13.791 8.859l0.289 0.101c4.477 2.162 9.736 3.425 15.29 3.425 0.325 0 0.648-0.004 0.971-0.013l-0.048 0.001c0.073 0 0.16 0.001 0.247 0.001 11.721 0 22.338-4.726 30.049-12.377l-0.003 0.003c7.648-7.709 12.374-18.326 12.374-30.047 0-0.087-0-0.173-0.001-0.26l0 0.013c0-0.073 0.001-0.16 0.001-0.247 0-11.721-4.726-22.338-12.377-30.049l0.003 0.003c-4.001-3.646-8.658-6.662-13.76-8.838l-0.32-0.122zM853.333 381.44c-0.496-4.292-1.396-8.191-2.678-11.913l0.118 0.393v-3.84c-2.174-4.59-4.887-8.531-8.128-11.969l0.021 0.023-256-256c-3.415-3.219-7.356-5.932-11.671-7.988l-0.276-0.118h-4.267c-3.819-2.087-8.248-3.713-12.928-4.644l-0.299-0.050h-258.56c-70.692 0-128 57.308-128 128v0 597.333c0 70.692 57.308 128 128 128v0h426.667c70.692 0 128-57.308 128-128v0-426.667s0 0 0-2.56zM597.333 230.827l110.507 110.507h-67.84c-23.564 0-42.667-19.103-42.667-42.667v0zM768 810.667c0 23.564-19.103 42.667-42.667 42.667v0h-426.667c-23.564 0-42.667-19.103-42.667-42.667v0-597.333c0-23.564 19.103-42.667 42.667-42.667v0h213.333v128c0 70.692 57.308 128 128 128v0h128z"],"attrs":[],"grid":0,"tags":["document-info"]},"attrs":[],"properties":{"order":4888,"id":796,"name":"document-info","prevSize":32,"code":60057},"setIdx":0,"setId":0,"iconIdx":409},{"icon":{"paths":["M384 512h256c23.564 0 42.667-19.103 42.667-42.667v0-256c0-23.564-19.103-42.667-42.667-42.667v0h-256c-23.564 0-42.667 19.103-42.667 42.667v0 256c0 23.564 19.103 42.667 42.667 42.667v0zM426.667 256h170.667v170.667h-170.667zM896 426.667h-85.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h85.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM810.667 341.333h85.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-85.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM128 341.333h85.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-85.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM128 512h85.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-85.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM896 597.333h-768c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h768c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM554.667 768h-426.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h426.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["document-layout-center"]},"attrs":[],"properties":{"order":4889,"id":795,"name":"document-layout-center","prevSize":32,"code":60058},"setIdx":0,"setId":0,"iconIdx":410},{"icon":{"paths":["M128 512h256c23.564 0 42.667-19.103 42.667-42.667v0-256c0-23.564-19.103-42.667-42.667-42.667v0h-256c-23.564 0-42.667 19.103-42.667 42.667v0 256c0 23.564 19.103 42.667 42.667 42.667v0zM170.667 256h170.667v170.667h-170.667zM554.667 341.333h341.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-341.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM554.667 768h-426.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h426.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM896 597.333h-768c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h768c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM896 426.667h-341.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h341.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["document-layout-left"]},"attrs":[],"properties":{"order":4890,"id":794,"name":"document-layout-left","prevSize":32,"code":60059},"setIdx":0,"setId":0,"iconIdx":411},{"icon":{"paths":["M554.667 768h-426.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h426.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM128 341.333h341.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-341.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM128 512h341.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-341.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM896 597.333h-768c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h768c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM896 170.667h-256c-23.564 0-42.667 19.103-42.667 42.667v0 256c0 23.564 19.103 42.667 42.667 42.667v0h256c23.564 0 42.667-19.103 42.667-42.667v0-256c0-23.564-19.103-42.667-42.667-42.667v0zM853.333 426.667h-170.667v-170.667h170.667z"],"attrs":[],"grid":0,"tags":["document-layout-right"]},"attrs":[],"properties":{"order":4891,"id":793,"name":"document-layout-right","prevSize":32,"code":60060},"setIdx":0,"setId":0,"iconIdx":412},{"icon":{"paths":["M597.333 469.333h-42.667v-170.667h85.333c23.564 0 42.667 19.103 42.667 42.667v0c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0c0-70.692-57.308-128-128-128v0h-85.333v-85.333c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 85.333h-42.667c-94.257 0-170.667 76.41-170.667 170.667s76.41 170.667 170.667 170.667v0h42.667v170.667h-85.333c-23.564 0-42.667-19.103-42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0c0 70.692 57.308 128 128 128v0h85.333v85.333c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-85.333h42.667c94.257 0 170.667-76.41 170.667-170.667s-76.41-170.667-170.667-170.667v0zM469.333 469.333h-42.667c-47.128 0-85.333-38.205-85.333-85.333s38.205-85.333 85.333-85.333v0h42.667zM597.333 725.333h-42.667v-170.667h42.667c47.128 0 85.333 38.205 85.333 85.333s-38.205 85.333-85.333 85.333v0z"],"attrs":[],"grid":0,"tags":["dollar-alt"]},"attrs":[],"properties":{"order":4892,"id":792,"name":"dollar-alt","prevSize":32,"code":60061},"setIdx":0,"setId":0,"iconIdx":413},{"icon":{"paths":["M597.333 469.333h-170.667c-47.128 0-85.333-38.205-85.333-85.333s38.205-85.333 85.333-85.333v0h213.333c23.564 0 42.667 19.103 42.667 42.667v0c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0c0-70.692-57.308-128-128-128v0h-85.333v-85.333c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 85.333h-42.667c-94.257 0-170.667 76.41-170.667 170.667s76.41 170.667 170.667 170.667v0h170.667c47.128 0 85.333 38.205 85.333 85.333s-38.205 85.333-85.333 85.333v0h-213.333c-23.564 0-42.667-19.103-42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0c0 70.692 57.308 128 128 128v0h85.333v85.333c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-85.333h42.667c94.257 0 170.667-76.41 170.667-170.667s-76.41-170.667-170.667-170.667v0z"],"attrs":[],"grid":0,"tags":["dollar-sign-alt"]},"attrs":[],"properties":{"order":4893,"id":791,"name":"dollar-sign-alt","prevSize":32,"code":60062},"setIdx":0,"setId":0,"iconIdx":414},{"icon":{"paths":["M597.333 469.333h-170.667c-47.128 0-85.333-38.205-85.333-85.333s38.205-85.333 85.333-85.333v0h213.333c23.564 0 42.667 19.103 42.667 42.667v0c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0c0-70.692-57.308-128-128-128v0h-85.333v-85.333c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 85.333h-42.667c-94.257 0-170.667 76.41-170.667 170.667s76.41 170.667 170.667 170.667v0h170.667c47.128 0 85.333 38.205 85.333 85.333s-38.205 85.333-85.333 85.333v0h-213.333c-23.564 0-42.667-19.103-42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0c0 70.692 57.308 128 128 128v0h85.333v85.333c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-85.333h42.667c94.257 0 170.667-76.41 170.667-170.667s-76.41-170.667-170.667-170.667v0z"],"attrs":[],"grid":0,"tags":["dollar-sign"]},"attrs":[],"properties":{"order":4894,"id":790,"name":"dollar-sign","prevSize":32,"code":60063},"setIdx":0,"setId":0,"iconIdx":415},{"icon":{"paths":["M353.707 567.040c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003 128 128c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 128-128c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l0-0-55.040 55.467v-494.507c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 494.507l-55.040-55.467c-7.733-7.795-18.45-12.621-30.293-12.621s-22.56 4.826-30.291 12.618l-0.003 0.003zM768 384h-85.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h85.333c23.564 0 42.667 19.103 42.667 42.667v0 298.667c0 23.564-19.103 42.667-42.667 42.667v0h-512c-23.564 0-42.667-19.103-42.667-42.667v0-298.667c0-23.564 19.103-42.667 42.667-42.667v0h85.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-85.333c-70.692 0-128 57.308-128 128v0 298.667c0 70.692 57.308 128 128 128v0h512c70.692 0 128-57.308 128-128v0-298.667c0-70.692-57.308-128-128-128v0z"],"attrs":[],"grid":0,"tags":["download-alt"]},"attrs":[],"properties":{"order":4895,"id":789,"name":"download-alt","prevSize":32,"code":60064},"setIdx":0,"setId":0,"iconIdx":416},{"icon":{"paths":["M362.667 426.667c-47.128 0-85.333 38.205-85.333 85.333s38.205 85.333 85.333 85.333c47.128 0 85.333-38.205 85.333-85.333v0c0-47.128-38.205-85.333-85.333-85.333v0zM362.667 725.333c-47.128 0-85.333 38.205-85.333 85.333s38.205 85.333 85.333 85.333c47.128 0 85.333-38.205 85.333-85.333v0c0-47.128-38.205-85.333-85.333-85.333v0zM661.333 298.667c47.128 0 85.333-38.205 85.333-85.333s-38.205-85.333-85.333-85.333c-47.128 0-85.333 38.205-85.333 85.333v0c0 47.128 38.205 85.333 85.333 85.333v0zM362.667 128c-47.128 0-85.333 38.205-85.333 85.333s38.205 85.333 85.333 85.333c47.128 0 85.333-38.205 85.333-85.333v0c0-47.128-38.205-85.333-85.333-85.333v0zM661.333 725.333c-47.128 0-85.333 38.205-85.333 85.333s38.205 85.333 85.333 85.333c47.128 0 85.333-38.205 85.333-85.333v0c0-47.128-38.205-85.333-85.333-85.333v0zM661.333 426.667c-47.128 0-85.333 38.205-85.333 85.333s38.205 85.333 85.333 85.333c47.128 0 85.333-38.205 85.333-85.333v0c0-47.128-38.205-85.333-85.333-85.333v0z"],"attrs":[],"grid":0,"tags":["draggabledots"]},"attrs":[],"properties":{"order":4896,"id":788,"name":"draggabledots","prevSize":32,"code":60065},"setIdx":0,"setId":0,"iconIdx":417},{"icon":{"paths":["M512 85.333c-235.641 0-426.667 191.025-426.667 426.667s191.025 426.667 426.667 426.667c235.641 0 426.667-191.025 426.667-426.667v0c0-235.641-191.025-426.667-426.667-426.667v0zM512 170.667c0.040-0 0.088-0 0.135-0 91.288 0 174.143 36.107 235.062 94.82l-0.104-0.1c-58.924 35.268-127.052 66.744-198.58 90.823l-7.5 2.191c-38.668-66.115-79.129-123.157-123.986-176.373l1.532 1.866c27.983-8.367 60.142-13.196 93.423-13.227l0.017-0zM336.64 219.733c42.65 48.578 82.215 102.263 117.006 159.184l2.888 5.083c-76.804 19.878-165.014 31.382-255.88 31.573l-0.12 0h-15.36c25.185-83.479 79.082-151.788 149.962-194.988l1.505-0.852zM256 738.56c-52.968-59.279-85.342-137.94-85.342-224.162 0-0.843 0.003-1.685 0.009-2.527l-0.001 0.129c0-4.267 0-8.533 0-12.373h29.013c106.703-0.983 209.387-16.5 306.703-44.658l-8.037 1.991c13.653 26.027 26.453 52.907 38.827 80.64-70.229 25.146-130.925 60.002-184.105 103.675l1.065-0.848-12.8 10.24c-30.493 27.458-58.384 56.16-84.274 86.616l-1.059 1.278zM512 853.333c-0.222 0.001-0.486 0.001-0.75 0.001-70.932 0-136.759-21.855-191.116-59.198l1.146 0.744c21.112-24.139 42.85-46.148 65.847-66.784l0.713-0.63 13.653-11.52c48.346-40.878 105.025-73.774 166.897-95.689l3.77-1.164c22.928 59.46 43.567 130.972 58.281 204.621l1.452 8.712c-35.162 13.244-75.805 20.911-118.239 20.911-0.582 0-1.163-0.001-1.744-0.004l0.089 0zM709.547 789.76c-16.359-75.183-35.162-138.856-57.943-200.602l3.329 10.309h14.507c0.769-0.198 1.651-0.312 2.56-0.312s1.791 0.114 2.634 0.328l-0.074-0.016h29.44c47.281 0.14 92.585 8.413 134.648 23.492l-2.808-0.879c-24.263 69.372-68.264 126.736-125.229 166.967l-1.064 0.713zM704 512c-8.96 0-17.92 0-26.453 0-2.498-0.332-5.387-0.522-8.32-0.522s-5.822 0.19-8.654 0.557l0.334-0.035c-12.88 0.806-24.733 2.324-36.335 4.55l1.775-0.284h-4.267c-12.373-28.587-25.173-56.32-39.253-85.333 83.932-29.152 156.217-63.74 223.818-105.217l-4.938 2.817c32.407 51.255 51.639 113.639 51.639 180.516 0 1.037-0.005 2.074-0.014 3.109l0.001-0.158c0 7.253 0 14.507 0 21.76-43.201-13.819-92.896-21.784-144.451-21.784-1.717 0-3.432 0.009-5.144 0.026l0.262-0.002z"],"attrs":[],"grid":0,"tags":["dribbble"]},"attrs":[],"properties":{"order":4897,"id":787,"name":"dribbble","prevSize":32,"code":60066},"setIdx":0,"setId":0,"iconIdx":418},{"icon":{"paths":["M810.667 170.667h-426.667c-23.564 0-42.667 19.103-42.667 42.667v0 85.333h-213.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h213.333v170.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667h170.667v298.667c0 23.564 19.103 42.667 42.667 42.667v0h85.333c70.692 0 128-57.308 128-128v0-221.013c50.028-18.062 85.173-65.066 85.333-120.3l0-0.020v-85.333c0-70.692-57.308-128-128-128v0zM768 725.333c0 23.564-19.103 42.667-42.667 42.667v0h-42.667v-256h85.333zM853.333 384c0 23.564-19.103 42.667-42.667 42.667v0h-384v-170.667h256v42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667h42.667c23.564 0 42.667 19.103 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["drill"]},"attrs":[],"properties":{"order":4898,"id":786,"name":"drill","prevSize":32,"code":60067},"setIdx":0,"setId":0,"iconIdx":419},{"icon":{"paths":["M922.027 503.893l-138.667-107.947 139.093-109.227c9.981-7.882 16.328-19.983 16.328-33.567 0-1.1-0.042-2.191-0.123-3.27l0.009 0.144c-1.455-14.477-9.545-26.802-21.142-34.022l-0.192-0.111-219.307-125.013c-6.020-3.448-13.233-5.481-20.92-5.481-10.807 0-20.676 4.018-28.193 10.641l0.047-0.040-136.96 119.467-136.96-119.467c-7.471-6.583-17.34-10.601-28.146-10.601-7.688 0-14.9 2.033-21.13 5.591l0.209-0.11-219.307 125.013c-11.789 7.331-19.878 19.656-21.318 33.943l-0.016 0.19c-0.073 0.936-0.115 2.026-0.115 3.127 0 13.583 6.348 25.684 16.238 33.498l0.090 0.068 139.093 109.227-138.667 106.24c-10.216 7.876-16.733 20.117-16.733 33.88 0 0.99 0.034 1.972 0.1 2.945l-0.007-0.132c1.016 14.615 9.25 27.106 21.13 34.024l0.203 0.109 145.493 85.333v105.387c0.066 15.292 8.167 28.678 20.296 36.161l0.184 0.106 217.173 133.547c6.12 3.594 13.479 5.716 21.333 5.716s15.214-2.123 21.535-5.825l-0.201 0.109 217.173-133.547c12.313-7.588 20.414-20.974 20.48-36.257l0-0.010v-105.813l145.493-83.2c12.083-7.027 20.318-19.518 21.326-33.999l0.007-0.134c0.126-1.23 0.198-2.657 0.198-4.102 0-13.041-5.85-24.715-15.070-32.541l-0.061-0.051zM682.667 180.053l137.813 78.507-108.8 85.333-128-78.507zM636.16 398.507l-124.16 85.333-124.16-85.333 124.16-76.373zM204.373 258.56l136.96-78.507 98.56 85.333-128 78.507zM204.373 531.2l106.667-81.92 128 88.747-94.72 73.813zM686.080 738.56l-174.080 107.52-174.507-107.52v-34.133c3.054 0.782 6.561 1.23 10.172 1.23 9.872 0 18.961-3.353 26.191-8.982l-0.096 0.072 138.24-106.667 138.24 106.667c7.111 5.561 16.173 8.928 26.019 8.96l0.007 0c1.537 0.196 3.315 0.308 5.12 0.308s3.583-0.112 5.328-0.329l-0.208 0.021zM679.68 610.56l-95.147-72.533 128-88.747 107.093 82.773z"],"attrs":[],"grid":0,"tags":["dropbox"]},"attrs":[],"properties":{"order":4899,"id":785,"name":"dropbox","prevSize":32,"code":60068},"setIdx":0,"setId":0,"iconIdx":420},{"icon":{"paths":["M745.813 279.467v0 0l-121.173-121.173c-7.733-7.795-18.45-12.621-30.293-12.621s-22.56 4.826-30.291 12.618l-0.003 0.003c-7.668 7.712-12.407 18.343-12.407 30.080s4.74 22.368 12.409 30.082l-0.002-0.002 90.453 90.453-345.6 345.6-90.453-90.453c-7.712-7.668-18.343-12.407-30.080-12.407s-22.368 4.74-30.082 12.409l0.002-0.002c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003 239.787 239.787c7.709 7.861 18.426 12.749 30.284 12.8l0.010 0c0.074 0 0.161 0.001 0.248 0.001 23.564 0 42.667-19.103 42.667-42.667 0-11.844-4.826-22.561-12.619-30.291l-0.003-0.003-89.173-89.173 345.6-345.6 90.453 90.453c7.715 7.662 18.344 12.397 30.080 12.397 23.577 0 42.691-19.113 42.691-42.691 0-11.842-4.821-22.557-12.608-30.291l-0.002-0.002zM158.293 744.96c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l120.747 120.747c7.709 7.648 18.326 12.374 30.047 12.374 0.087 0 0.173-0 0.26-0.001l-0.013 0c0.073 0 0.16 0.001 0.247 0.001 11.721 0 22.338-4.726 30.049-12.377l-0.003 0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003zM926.293 218.453l-120.747-120.747c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l120.747 120.747c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003z"],"attrs":[],"grid":0,"tags":["dumbbell"]},"attrs":[],"properties":{"order":4900,"id":784,"name":"dumbbell","prevSize":32,"code":60069},"setIdx":0,"setId":0,"iconIdx":421},{"icon":{"paths":["M512 341.333c23.558 0.016 42.65 19.109 42.667 42.665l0 0.002c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0c-0.039-70.651-57.322-127.91-127.979-127.91-70.681 0-127.979 57.298-127.979 127.979 0 37.473 16.106 71.185 41.773 94.59l0.101 0.091c0.427 0.388 6.875 7.25 8.25 9.167 4.643 6.674 7.417 14.951 7.417 23.875s-2.775 17.201-7.508 24.014l0.091-0.139c-4.682 6.747-7.48 15.109-7.48 24.125 0 23.553 19.093 42.646 42.646 42.646 14.537 0 27.376-7.274 35.074-18.38l0.093-0.141c14.031-20.166 22.417-45.174 22.417-72.141 0-27.096-8.466-52.214-22.897-72.854l0.272 0.411c-6.922-8.685-13.778-16.426-21.007-23.8l0.049 0.050c-2.51-2.297-4.732-4.837-6.652-7.602l-0.097-0.148c-4.541-6.681-7.25-14.925-7.25-23.802 0-23.57 19.099-42.68 42.665-42.697l0.002-0zM512 85.333c-164.952 0.015-298.667 133.738-298.667 298.692 0 27.479 3.711 54.091 10.658 79.363l-0.492-2.097c5.091 18.276 21.589 31.462 41.166 31.462 23.562 0 42.662-19.1 42.662-42.662 0-3.868-0.515-7.616-1.48-11.18l0.069 0.299c-4.614-16.557-7.265-35.569-7.265-55.201 0-117.825 95.516-213.341 213.341-213.341 117.822 0 213.336 95.511 213.341 213.331l0 0c-0.195 40.415-11.348 78.185-30.636 110.542l0.552-1-152.041 317.125c-15.054 25.651-42.478 42.614-73.868 42.667l-0.008 0c-46.869-0.64-84.693-38.465-85.333-85.273l-0.001-0.061c-0-0.001-0-0.001-0-0.002 0-15.698 4.255-30.401 11.675-43.021l-0.217 0.399c3.606-6.131 5.737-13.504 5.737-21.376 0-23.58-19.115-42.695-42.695-42.695-15.708 0-29.435 8.483-36.849 21.118l-0.109 0.201c-14.411 24.498-22.924 53.966-22.924 85.421 0 94.228 76.387 170.615 170.615 170.615 63.988 0 119.748-35.225 148.948-87.342l0.443-0.861 152.042-317.124c25.148-42.833 40-94.339 40-149.315 0-164.953-133.715-298.675-298.666-298.685l-0.001-0z"],"attrs":[],"grid":0,"tags":["ear"]},"attrs":[],"properties":{"order":4901,"id":783,"name":"ear","prevSize":32,"code":60070},"setIdx":0,"setId":0,"iconIdx":422},{"icon":{"paths":["M213.333 768h180.907c0.073 0 0.16 0.001 0.247 0.001 11.721 0 22.338-4.726 30.049-12.377l-0.003 0.003 295.253-295.68 121.173-118.613c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003-180.907-183.040c-7.733-7.795-18.45-12.621-30.293-12.621s-22.56 4.826-30.291 12.618l-0.003 0.003-120.32 120.747-296.107 295.68c-7.648 7.709-12.374 18.326-12.374 30.047 0 0.087 0 0.173 0.001 0.26l-0-0.013v180.907c0 23.564 19.103 42.667 42.667 42.667v0zM629.76 188.16l120.747 120.747-60.587 60.587-120.747-120.747zM256 561.92l253.013-253.013 120.747 120.747-253.013 253.013h-120.747zM896 853.333h-768c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h768c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["edit-alt"]},"attrs":[],"properties":{"order":4902,"id":782,"name":"edit-alt","prevSize":32,"code":60071},"setIdx":0,"setId":0,"iconIdx":423},{"icon":{"paths":["M896 512c-23.564 0-42.667 19.103-42.667 42.667v0 256c0 23.564-19.103 42.667-42.667 42.667v0h-597.333c-23.564 0-42.667-19.103-42.667-42.667v0-597.333c0-23.564 19.103-42.667 42.667-42.667v0h256c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-256c-70.692 0-128 57.308-128 128v0 597.333c0 70.692 57.308 128 128 128v0h597.333c70.692 0 128-57.308 128-128v0-256c0-23.564-19.103-42.667-42.667-42.667v0zM256 544.427v180.907c0 23.564 19.103 42.667 42.667 42.667v0h180.907c0.073 0 0.16 0.001 0.247 0.001 11.721 0 22.338-4.726 30.049-12.377l-0.003 0.003 295.253-295.68 121.173-118.613c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003-180.907-183.040c-7.733-7.795-18.45-12.621-30.293-12.621s-22.56 4.826-30.291 12.618l-0.003 0.003-120.32 120.747-296.107 295.68c-7.648 7.709-12.374 18.326-12.374 30.047 0 0.087 0 0.173 0.001 0.26l-0-0.013zM715.093 188.16l120.747 120.747-60.587 60.587-120.747-120.747zM341.333 561.92l253.013-253.013 120.747 120.747-253.013 253.013h-120.747z"],"attrs":[],"grid":0,"tags":["edit"]},"attrs":[],"properties":{"order":4903,"id":781,"name":"edit","prevSize":32,"code":60072},"setIdx":0,"setId":0,"iconIdx":424},{"icon":{"paths":["M362.667 725.333c-46.933 0-85.333 38.4-85.333 85.333s38.4 85.333 85.333 85.333 85.333-38.4 85.333-85.333-38.4-85.333-85.333-85.333zM661.333 298.667c46.933 0 85.333-38.4 85.333-85.333s-38.4-85.333-85.333-85.333-85.333 38.4-85.333 85.333 38.4 85.333 85.333 85.333zM362.667 426.667c-46.933 0-85.333 38.4-85.333 85.333s38.4 85.333 85.333 85.333 85.333-38.4 85.333-85.333-38.4-85.333-85.333-85.333zM661.333 426.667c-46.933 0-85.333 38.4-85.333 85.333s38.4 85.333 85.333 85.333 85.333-38.4 85.333-85.333-38.4-85.333-85.333-85.333zM661.333 725.333c-46.933 0-85.333 38.4-85.333 85.333s38.4 85.333 85.333 85.333 85.333-38.4 85.333-85.333-38.4-85.333-85.333-85.333zM362.667 128c-46.933 0-85.333 38.4-85.333 85.333s38.4 85.333 85.333 85.333 85.333-38.4 85.333-85.333-38.4-85.333-85.333-85.333z"],"attrs":[],"grid":0,"tags":["elipsis-double-v-alt"]},"attrs":[],"properties":{"order":4904,"id":780,"name":"elipsis-double-v-alt","prevSize":32,"code":60073},"setIdx":0,"setId":0,"iconIdx":425},{"icon":{"paths":["M512 426.667c-47.128 0-85.333 38.205-85.333 85.333s38.205 85.333 85.333 85.333c47.128 0 85.333-38.205 85.333-85.333v0c0-47.128-38.205-85.333-85.333-85.333v0zM213.333 426.667c-47.128 0-85.333 38.205-85.333 85.333s38.205 85.333 85.333 85.333c47.128 0 85.333-38.205 85.333-85.333v0c0-47.128-38.205-85.333-85.333-85.333v0zM810.667 426.667c-47.128 0-85.333 38.205-85.333 85.333s38.205 85.333 85.333 85.333c47.128 0 85.333-38.205 85.333-85.333v0c0-47.128-38.205-85.333-85.333-85.333v0z"],"attrs":[],"grid":0,"tags":["ellipsis-h"]},"attrs":[],"properties":{"order":4905,"id":779,"name":"ellipsis-h","prevSize":32,"code":60074},"setIdx":0,"setId":0,"iconIdx":426},{"icon":{"paths":["M512 298.667c47.128 0 85.333-38.205 85.333-85.333s-38.205-85.333-85.333-85.333c-47.128 0-85.333 38.205-85.333 85.333v0c0 47.128 38.205 85.333 85.333 85.333v0zM512 725.333c-47.128 0-85.333 38.205-85.333 85.333s38.205 85.333 85.333 85.333c47.128 0 85.333-38.205 85.333-85.333v0c0-47.128-38.205-85.333-85.333-85.333v0zM512 426.667c-47.128 0-85.333 38.205-85.333 85.333s38.205 85.333 85.333 85.333c47.128 0 85.333-38.205 85.333-85.333v0c0-47.128-38.205-85.333-85.333-85.333v0z"],"attrs":[],"grid":0,"tags":["ellipsis-v"]},"attrs":[],"properties":{"order":4906,"id":778,"name":"ellipsis-v","prevSize":32,"code":60075},"setIdx":0,"setId":0,"iconIdx":427},{"icon":{"paths":["M640 469.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667c-23.564 0-42.667 19.103-42.667 42.667v0c0 23.564 19.103 42.667 42.667 42.667v0zM384 469.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667c-23.564 0-42.667 19.103-42.667 42.667v0c0 23.564 19.103 42.667 42.667 42.667v0zM512 85.333c-235.641 0-426.667 191.025-426.667 426.667s191.025 426.667 426.667 426.667c235.641 0 426.667-191.025 426.667-426.667v0c0-235.641-191.025-426.667-426.667-426.667v0zM512 853.333c-188.513 0-341.333-152.82-341.333-341.333s152.82-341.333 341.333-341.333c188.513 0 341.333 152.82 341.333 341.333v0c0 188.513-152.82 341.333-341.333 341.333v0zM694.613 549.547c-7.885-9.788-19.87-15.998-33.305-15.998-10.021 0-19.235 3.455-26.516 9.238l0.088-0.067c-17.126 14.077-30.127 32.584-37.301 53.777l-0.246 0.836h-155.733c-7.27-22.501-20.297-41.451-37.359-55.741l-0.187-0.153c-6.826-4.841-15.327-7.738-24.504-7.738-13.558 0-25.639 6.324-33.455 16.183l-0.068 0.088c-5.796 7.222-9.302 16.499-9.302 26.594 0 13.107 5.91 24.833 15.21 32.66l0.065 0.053c6.664 7.493 10.735 17.421 10.735 28.299 0 0.852-0.025 1.697-0.074 2.537l0.005-0.116c0.008 0.318 0.012 0.692 0.012 1.068 0 11.305-4.034 21.668-10.74 29.728l0.061-0.075c-10.394 7.868-17.040 20.214-17.040 34.113 0 23.564 19.103 42.667 42.667 42.667 10.602 0 20.301-3.867 27.764-10.268l-0.057 0.048c16.28-14.385 28.66-32.822 35.59-53.742l0.25-0.871h156.16c7.173 22.626 20.39 41.633 37.758 55.724l0.216 0.169c6.782 4.786 15.213 7.658 24.314 7.68l0.006 0c13.459-0.064 25.436-6.35 33.213-16.126l0.067-0.087c5.796-7.222 9.302-16.499 9.302-26.594 0-13.107-5.91-24.833-15.21-32.66l-0.065-0.053c-6.664-7.493-10.735-17.421-10.735-28.299 0-0.852 0.025-1.697 0.074-2.537l-0.005 0.116c-0.008-0.318-0.012-0.692-0.012-1.068 0-11.305 4.034-21.668 10.74-29.728l-0.061 0.075c10.096-7.88 16.526-20.049 16.526-33.721 0-9.835-3.328-18.893-8.919-26.11l0.073 0.098z"],"attrs":[],"grid":0,"tags":["emoji"]},"attrs":[],"properties":{"order":4907,"id":777,"name":"emoji","prevSize":32,"code":60076},"setIdx":0,"setId":0,"iconIdx":428},{"icon":{"paths":["M598.272 298.667h42.667c23.551 0.032 42.635 19.115 42.667 42.664l0 0.003v42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667c-0.080-70.66-57.339-127.92-127.992-128l-42.674-0c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM427.605 682.667h-42.667c-23.551-0.032-42.635-19.115-42.667-42.664l-0-0.003v-42.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 42.667c0.080 70.66 57.339 127.92 127.992 128l42.674 0c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM896.939 640c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-128v-21.333c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 21.333h-128c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h221.196c-10.374 41.33-28.45 77.441-52.76 108.428l0.471-0.623c-9.501-12.202-18.405-25.926-26.098-40.392l-0.746-1.537c-7.227-13.881-21.505-23.197-37.958-23.197-23.558 0-42.655 19.097-42.655 42.655 0 7.104 1.737 13.803 4.809 19.694l-0.112-0.236c12.446 23.83 26.032 44.35 41.457 63.314l-0.535-0.679c-29.338 21.519-64.009 37.762-101.557 46.514l-1.908 0.375c-19.291 4.365-33.479 21.36-33.479 41.668 0 23.566 19.104 42.67 42.67 42.67 3.194 0 6.306-0.351 9.3-1.016l-0.284 0.053c56.353-12.724 105.746-36.786 147.784-69.793l-0.797 0.603c41.561 32.41 91.292 56.469 145.504 68.697l2.488 0.472c2.761 0.636 5.932 1.001 9.187 1.001 23.565 0 42.667-19.103 42.667-42.667 0-20.309-14.189-37.304-33.194-41.612l-0.286-0.054c-39.75-9.016-74.726-25.136-105.218-47.093l0.851 0.583c38.008-46.492 65.223-103.267 76.965-165.508l0.364-2.317zM386.208 479.688c4.84 18.646 21.521 32.191 41.364 32.191 23.567 0 42.671-19.105 42.671-42.671 0-3.632-0.454-7.157-1.307-10.523l0.063 0.295-74.979-299.937c-10.938-42.672-49.053-73.708-94.417-73.708s-83.479 31.036-94.27 73.033l-0.147 0.675-74.979 299.937c-0.79 3.071-1.244 6.597-1.244 10.228 0 23.567 19.105 42.671 42.671 42.671 19.844 0 36.524-13.545 41.299-31.894l0.066-0.297 23.919-95.688h125.37zM258.253 298.667l29.726-118.917c1.827-4.734 6.341-8.032 11.625-8.032s9.798 3.297 11.596 7.947l0.029 0.085 29.727 118.917z"],"attrs":[],"grid":0,"tags":["english-to-chinese"]},"attrs":[],"properties":{"order":4908,"id":776,"name":"english-to-chinese","prevSize":32,"code":60077},"setIdx":0,"setId":0,"iconIdx":429},{"icon":{"paths":["M810.667 256c-23.564 0-42.667 19.103-42.667 42.667v0 170.667c0 23.564-19.103 42.667-42.667 42.667v0h-409.173l55.467-55.040c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l-128 128c-3.773 3.937-6.808 8.616-8.859 13.791l-0.101 0.289c-2.024 4.793-3.201 10.366-3.201 16.213s1.176 11.42 3.305 16.495l-0.105-0.281c2.152 5.464 5.187 10.143 8.974 14.095l-0.014-0.015 128 128c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003-55.467-55.040h409.173c70.692 0 128-57.308 128-128v0-170.667c0-23.564-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["enter"]},"attrs":[],"properties":{"order":4909,"id":775,"name":"enter","prevSize":32,"code":60078},"setIdx":0,"setId":0,"iconIdx":430},{"icon":{"paths":["M725.333 298.667h42.667v42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-42.667v-42.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 42.667h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM896 469.333c-23.564 0-42.667 19.103-42.667 42.667v0 256c0 23.564-19.103 42.667-42.667 42.667v0h-597.333c-23.564 0-42.667-19.103-42.667-42.667v0-409.173l250.88 251.307c23.158 23.13 55.135 37.434 90.453 37.434s67.296-14.304 90.455-37.435l-0.001 0.001 105.387-105.387c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l-105.387 105.387c-7.69 7.542-18.235 12.197-29.867 12.197s-22.177-4.655-29.874-12.203l0.007 0.007-251.307-250.88h323.84c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-341.333c-70.692 0-128 57.308-128 128v0 426.667c0 70.692 57.308 128 128 128v0h597.333c70.692 0 128-57.308 128-128v0-256c0-23.564-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["envelope-add"]},"attrs":[],"properties":{"order":4910,"id":774,"name":"envelope-add","prevSize":32,"code":60079},"setIdx":0,"setId":0,"iconIdx":431},{"icon":{"paths":["M810.667 170.667h-597.333c-70.692 0-128 57.308-128 128v0 426.667c0 70.692 57.308 128 128 128v0h597.333c70.692 0 128-57.308 128-128v0-426.667c0-70.692-57.308-128-128-128v0zM213.333 256h597.333c23.564 0 42.667 19.103 42.667 42.667v0l-341.333 208.213-341.333-208.213c0-23.564 19.103-42.667 42.667-42.667v0zM853.333 725.333c0 23.564-19.103 42.667-42.667 42.667v0h-597.333c-23.564 0-42.667-19.103-42.667-42.667v0-329.387l319.147 194.987c6.12 3.594 13.479 5.716 21.333 5.716s15.214-2.123 21.535-5.825l-0.201 0.109 320.853-194.987z"],"attrs":[],"grid":0,"tags":["envelope-alt"]},"attrs":[],"properties":{"order":4911,"id":773,"name":"envelope-alt","prevSize":32,"code":60080},"setIdx":0,"setId":0,"iconIdx":432},{"icon":{"paths":["M746.667 565.76c0.523 0.005 1.141 0.007 1.759 0.007 117.821 0 213.333-95.513 213.333-213.333s-95.513-213.333-213.333-213.333c-117.821 0-213.333 95.513-213.333 213.333 0 58.789 23.78 112.025 62.246 150.611l-0.005-0.005c38.225 38.345 90.943 62.223 149.239 62.719l0.095 0.001zM837.12 442.88c-23.127 22.947-54.98 37.128-90.146 37.128-19.958 0-38.849-4.568-55.684-12.714l0.763 0.333 170.667-170.667c7.814 16.073 12.382 34.964 12.382 54.922 0 35.59-14.525 67.787-37.971 90.987l-0.011 0.011zM656.213 261.973c23.143-23.171 55.12-37.515 90.447-37.547l0.006-0c19.902 0.191 38.661 4.895 55.363 13.134l-0.75-0.334-170.667 170.667c-7.814-16.073-12.382-34.964-12.382-54.922 0-35.59 14.525-67.787 37.971-90.987l0.011-0.011zM874.667 608.427c-23.564 0-42.667 19.103-42.667 42.667v0 170.667c0 23.564-19.103 42.667-42.667 42.667v0h-597.333c-23.564 0-42.667-19.103-42.667-42.667v0-409.173l250.88 250.88c23.045 23.073 54.849 37.393 89.997 37.547l0.029 0c0.099 0 0.216 0 0.333 0 36.006 0 68.54-14.867 91.798-38.797l0.029-0.030c7.418-7.666 11.989-18.126 11.989-29.653s-4.571-21.987-12-29.665l0.011 0.012c-7.753-7.924-18.556-12.837-30.507-12.837s-22.753 4.913-30.499 12.83l-0.008 0.008c-7.69 7.542-18.235 12.197-29.867 12.197s-22.177-4.655-29.874-12.203l0.007 0.007-252.16-250.453h195.84c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-213.333c-70.692 0-128 57.308-128 128v0 426.667c0 70.692 57.308 128 128 128v0h597.333c70.692 0 128-57.308 128-128v0-170.667c0-23.564-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["envelope-block"]},"attrs":[],"properties":{"order":4912,"id":772,"name":"envelope-block","prevSize":32,"code":60081},"setIdx":0,"setId":0,"iconIdx":433},{"icon":{"paths":["M896 651.093c-23.564 0-42.667 19.103-42.667 42.667v0 128c0 23.564-19.103 42.667-42.667 42.667v0h-597.333c-23.564 0-42.667-19.103-42.667-42.667v0-409.173l250.88 251.307c23.001 22.819 54.634 36.968 89.571 37.12l0.029 0c0.064 0 0.14 0 0.216 0 22.274 0 43.22-5.69 61.462-15.695l-0.665 0.334c13.398-7.372 22.326-21.397 22.326-37.506 0-7.527-1.949-14.599-5.37-20.738l0.111 0.217c-7.372-13.398-21.397-22.326-37.506-22.326-7.527 0-14.599 1.949-20.738 5.37l0.217-0.111c-5.655 2.959-12.353 4.694-19.456 4.694-11.506 0-21.949-4.555-29.623-11.96l0.013 0.012-251.307-250.88h281.173c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-298.667c-70.692 0-128 57.308-128 128v0 426.667c0 70.692 57.308 128 128 128v0h597.333c70.692 0 128-57.308 128-128v0-128c0-23.564-19.103-42.667-42.667-42.667v0zM896 139.093h-213.333c-23.564 0-42.667 19.103-42.667 42.667v0 341.333c0.040 23.534 19.127 42.597 42.667 42.597 9.098 0 17.532-2.848 24.457-7.701l-0.137 0.091 82.347-55.040 81.493 54.613c7.030 4.949 15.736 7.962 25.138 8.106l0.035 0c6.348-0.030 12.358-1.442 17.757-3.95l-0.263 0.11c14.937-6.834 25.136-21.635 25.173-38.822l0-0.005v-341.333c0-23.564-19.103-42.667-42.667-42.667v0zM853.333 442.88l-40.107-26.88c-6.699-4.582-14.977-7.318-23.893-7.318s-17.194 2.735-24.040 7.412l0.147-0.095-40.107 26.88v-218.453h128z"],"attrs":[],"grid":0,"tags":["envelope-bookmark"]},"attrs":[],"properties":{"order":4913,"id":771,"name":"envelope-bookmark","prevSize":32,"code":60082},"setIdx":0,"setId":0,"iconIdx":434},{"icon":{"paths":["M695.040 371.627c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 170.667-170.667c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l-0 0-140.373 140.8-55.040-55.467c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l-0-0zM896 341.333c-23.564 0-42.667 19.103-42.667 42.667v0 384c0 23.564-19.103 42.667-42.667 42.667v0h-597.333c-23.564 0-42.667-19.103-42.667-42.667v0-409.173l250.88 251.307c23.1 22.917 54.905 37.088 90.021 37.12l0.006 0c35.999-0.191 68.543-14.827 92.162-38.402l-0.002 0.002 73.387-73.387c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l-74.667 74.667c-7.69 7.542-18.235 12.197-29.867 12.197s-22.177-4.655-29.874-12.203l0.007 0.007-251.307-250.88h238.507c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-256c-70.692 0-128 57.308-128 128v0 426.667c0 70.692 57.308 128 128 128v0h597.333c70.692 0 128-57.308 128-128v0-384c0-23.564-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["envelope-check"]},"attrs":[],"properties":{"order":4914,"id":770,"name":"envelope-check","prevSize":32,"code":60083},"setIdx":0,"setId":0,"iconIdx":435},{"icon":{"paths":["M481.707 375.040c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 85.333-85.333c7.668-7.712 12.407-18.343 12.407-30.080s-4.74-22.368-12.409-30.082l0.002 0.002c-7.733-7.795-18.45-12.621-30.293-12.621s-22.56 4.826-30.291 12.618l-0.003 0.003-12.373 12.373v-117.333c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 117.333l-12.373-12.373c-7.733-7.795-18.45-12.621-30.293-12.621s-22.56 4.826-30.291 12.618l-0.003 0.003c-7.668 7.712-12.407 18.343-12.407 30.080s4.74 22.368 12.409 30.082l-0.002-0.002zM682.667 472.747h-341.333c-70.692 0-128 57.308-128 128v0 213.333c0 70.692 57.308 128 128 128v0h341.333c70.692 0 128-57.308 128-128v0-213.333c0-70.692-57.308-128-128-128v0zM664.747 558.080l-122.88 124.587c-7.69 7.542-18.235 12.197-29.867 12.197s-22.177-4.655-29.874-12.203l0.007 0.007-122.88-124.587zM725.333 814.080c0 23.564-19.103 42.667-42.667 42.667v0h-341.333c-23.564 0-42.667-19.103-42.667-42.667v0-195.84l122.88 122.88c23.158 23.13 55.135 37.434 90.453 37.434s67.296-14.304 90.455-37.435l-0.001 0.001 122.88-122.88z"],"attrs":[],"grid":0,"tags":["envelope-download-alt"]},"attrs":[],"properties":{"order":4915,"id":769,"name":"envelope-download-alt","prevSize":32,"code":60084},"setIdx":0,"setId":0,"iconIdx":436},{"icon":{"paths":["M874.667 597.333c-23.564 0-42.667 19.103-42.667 42.667v0 170.667c0 23.564-19.103 42.667-42.667 42.667v0h-597.333c-23.564 0-42.667-19.103-42.667-42.667v0-409.173l250.88 251.307c23.158 23.13 55.135 37.434 90.453 37.434s67.296-14.304 90.455-37.435l-0.001 0.001 69.973-69.973c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l-69.973 69.973c-7.69 7.542-18.235 12.197-29.867 12.197s-22.177-4.655-29.874-12.203l0.007 0.007-251.307-250.88h281.173c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-298.667c-70.692 0-128 57.308-128 128v0 426.667c0 70.692 57.308 128 128 128v0h597.333c70.692 0 128-57.308 128-128v0-170.667c0-23.564-19.103-42.667-42.667-42.667v0zM947.627 311.040c-7.733-7.795-18.45-12.621-30.293-12.621s-22.56 4.826-30.291 12.618l-0.003 0.003-55.040 55.467v-238.507c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 238.507l-55.040-55.467c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l128 128c3.937 3.773 8.616 6.808 13.791 8.859l0.289 0.101c4.771 2.163 10.345 3.423 16.213 3.423s11.443-1.26 16.466-3.525l-0.253 0.102c5.464-2.152 10.143-5.187 14.095-8.974l-0.015 0.014 128-128c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003z"],"attrs":[],"grid":0,"tags":["envelope-download"]},"attrs":[],"properties":{"order":4916,"id":768,"name":"envelope-download","prevSize":32,"code":60085},"setIdx":0,"setId":0,"iconIdx":437},{"icon":{"paths":["M597.333 491.093h103.253c0.073 0 0.16 0.001 0.247 0.001 11.721 0 22.338-4.726 30.049-12.377l-0.003 0.003 195.413-195.413c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003-103.253-103.253c-7.733-7.795-18.45-12.621-30.293-12.621s-22.56 4.826-30.291 12.618l-0.003 0.003-195.413 195.413c-7.522 7.877-12.204 18.523-12.373 30.26l-0 0.033v103.253c0 23.564 19.103 42.667 42.667 42.667v0zM640 363.093l152.747-152.747 42.667 42.667-152.747 152.747h-42.667zM896 448.427c-23.564 0-42.667 19.103-42.667 42.667v0 298.667c0 23.564-19.103 42.667-42.667 42.667v0h-597.333c-23.564 0-42.667-19.103-42.667-42.667v0-410.027l250.88 251.307c23.22 23.514 55.456 38.078 91.093 38.078s67.873-14.564 91.080-38.065l0.013-0.013c7.542-7.69 12.197-18.235 12.197-29.867s-4.655-22.177-12.203-29.874l0.007 0.007c-7.753-7.924-18.556-12.837-30.507-12.837s-22.753 4.913-30.499 12.83l-0.008 0.008c-7.69 7.542-18.235 12.197-29.867 12.197s-22.177-4.655-29.874-12.203l0.007 0.007-252.16-251.733h195.84c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-213.333c-70.692 0-128 57.308-128 128v0 426.667c0 70.692 57.308 128 128 128v0h597.333c70.692 0 128-57.308 128-128v0-298.667c0-23.564-19.103-42.667-42.667-42.667v-0z"],"attrs":[],"grid":0,"tags":["envelope-edit"]},"attrs":[],"properties":{"order":4917,"id":767,"name":"envelope-edit","prevSize":32,"code":60086},"setIdx":0,"setId":0,"iconIdx":438},{"icon":{"paths":["M896 576c-23.564 0-42.667 19.103-42.667 42.667v0 170.667c0 23.564-19.103 42.667-42.667 42.667v0h-597.333c-23.564 0-42.667-19.103-42.667-42.667v0-409.173l250.88 250.88c23.158 23.13 55.135 37.434 90.453 37.434s67.296-14.304 90.455-37.435l-0.001 0.001 153.173-152.747c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l0-0-152.747 153.173c-7.733 7.795-18.45 12.621-30.293 12.621s-22.56-4.826-30.291-12.618l-0.003-0.003-250.88-250.88h494.507c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-512c-70.692 0-128 57.308-128 128v0 426.667c0 70.692 57.308 128 128 128v0h597.333c70.692 0 128-57.308 128-128v0-170.667c0-23.564-19.103-42.667-42.667-42.667v0zM896 106.667c-23.564 0-42.667 19.103-42.667 42.667v0 170.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-170.667c0-23.564-19.103-42.667-42.667-42.667v0zM887.467 405.333c-2.882 0.513-5.459 1.403-7.832 2.632l0.152-0.072c-2.93 1.020-5.469 2.319-7.79 3.912l0.11-0.072-6.4 5.12c-7.522 7.877-12.204 18.523-12.373 30.26l-0 0.033c-0.1 1.214-0.157 2.627-0.157 4.053s0.057 2.84 0.169 4.238l-0.012-0.184c0.433 3.025 1.331 5.757 2.627 8.249l-0.067-0.142c1.020 2.93 2.319 5.469 3.912 7.79l-0.072-0.11c1.693 2.39 3.374 4.477 5.17 6.456l-0.050-0.056c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 5.12-6.4c1.521-2.211 2.82-4.75 3.77-7.453l0.070-0.227c1.229-2.35 2.127-5.082 2.544-7.969l0.016-0.137c0.1-1.214 0.157-2.627 0.157-4.053s-0.057-2.84-0.169-4.238l0.012 0.184c0.006-0.257 0.009-0.56 0.009-0.864 0-23.564-19.103-42.667-42.667-42.667-3.024 0-5.974 0.315-8.82 0.913l0.278-0.049z"],"attrs":[],"grid":0,"tags":["envelope-exclamation"]},"attrs":[],"properties":{"order":4918,"id":766,"name":"envelope-exclamation","prevSize":32,"code":60087},"setIdx":0,"setId":0,"iconIdx":439},{"icon":{"paths":["M896 576c-23.564 0-42.667 19.103-42.667 42.667v0 170.667c0 23.564-19.103 42.667-42.667 42.667v0h-597.333c-23.564 0-42.667-19.103-42.667-42.667v0-409.173l250.88 250.88c23.158 23.13 55.135 37.434 90.453 37.434s67.296-14.304 90.455-37.435l-0.001 0.001 153.173-152.747c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l0-0-152.747 153.173c-7.733 7.795-18.45 12.621-30.293 12.621s-22.56-4.826-30.291-12.618l-0.003-0.003-250.88-250.88h494.507c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-512c-70.692 0-128 57.308-128 128v0 426.667c0 70.692 57.308 128 128 128v0h597.333c70.692 0 128-57.308 128-128v0-170.667c0-23.564-19.103-42.667-42.667-42.667v0zM896 192c11.771-0.169 22.416-4.851 30.311-12.39l-0.017 0.016 5.12-6.827c1.617-2.068 2.923-4.477 3.791-7.085l0.049-0.169c1.445-2.207 2.612-4.762 3.368-7.488l0.045-0.192c0.1-1.277 0.157-2.765 0.157-4.267s-0.057-2.99-0.169-4.463l0.012 0.196c-0.169-11.771-4.851-22.416-12.39-30.311l0.016 0.017c-7.733-7.795-18.45-12.621-30.293-12.621s-22.56 4.826-30.291 12.618l-0.003 0.003c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003c7.877 7.522 18.523 12.204 30.26 12.373l0.033 0zM896 234.667c-23.564 0-42.667 19.103-42.667 42.667v0 170.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-170.667c0-23.564-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["envelope-info"]},"attrs":[],"properties":{"order":4919,"id":765,"name":"envelope-info","prevSize":32,"code":60088},"setIdx":0,"setId":0,"iconIdx":440},{"icon":{"paths":["M874.667 554.667c-23.564 0-42.667 19.103-42.667 42.667v0 170.667c0 23.564-19.103 42.667-42.667 42.667v0h-597.333c-23.564 0-42.667-19.103-42.667-42.667v0-409.173l250.88 251.307c23.1 22.917 54.905 37.088 90.021 37.12l0.006 0c0.096 0 0.209 0 0.323 0 35.797 0 68.161-14.694 91.391-38.38l0.020-0.020 37.973-37.547c4.917-6.862 7.863-15.427 7.863-24.68 0-23.564-19.103-42.667-42.667-42.667-9.361 0-18.017 3.014-25.052 8.126l0.123-0.085-39.68 38.827c-7.69 7.542-18.235 12.197-29.867 12.197s-22.177-4.655-29.874-12.203l0.007 0.007-251.307-252.16h195.84c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-213.333c-70.692 0-128 57.308-128 128v0 426.667c0 70.692 57.308 128 128 128v0h597.333c70.692 0 128-57.308 128-128v0-170.667c0-23.564-19.103-42.667-42.667-42.667v0zM919.467 170.667c-25.514-24.623-60.291-39.794-98.612-39.794-24.505 0-47.561 6.204-67.683 17.126l0.748-0.372c-19.28-10.802-42.309-17.164-66.824-17.164-76.583 0-138.667 62.083-138.667 138.667 0 37.957 15.251 72.352 39.959 97.392l-0.015-0.015 136.96 133.12c7.877 7.522 18.523 12.204 30.26 12.373l0.033 0c0.073 0 0.16 0.001 0.247 0.001 11.721 0 22.338-4.726 30.049-12.377l-0.003 0.003 135.253-135.253c23.781-24.912 38.416-58.734 38.416-95.974 0-38.102-15.32-72.625-40.136-97.747l0.014 0.014zM859.307 303.787l-105.387 105.387-104.96-105.387c-9.501-9.658-15.367-22.917-15.367-37.547 0-29.577 23.977-53.553 53.553-53.553 14.948 0 28.465 6.124 38.18 16l0.007 0.007c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c9.765-9.26 22.991-14.954 37.547-14.954s27.782 5.694 37.571 14.977l-0.024-0.023c8.953 9.577 14.45 22.483 14.45 36.673 0 15.049-6.183 28.653-16.148 38.412l-0.009 0.009z"],"attrs":[],"grid":0,"tags":["envelope-heart"]},"attrs":[],"properties":{"order":4920,"id":764,"name":"envelope-heart","prevSize":32,"code":60089},"setIdx":0,"setId":0,"iconIdx":441},{"icon":{"paths":["M874.667 317.44v-50.347c0-70.692-57.308-128-128-128s-128 57.308-128 128v0 50.347c-50.028 18.062-85.173 65.066-85.333 120.3l-0 0.020v85.333c0 70.692 57.308 128 128 128v0h170.667c70.692 0 128-57.308 128-128v0-85.333c-0.16-55.254-35.305-102.258-84.442-120.038l-0.891-0.282zM704 267.093c0-23.564 19.103-42.667 42.667-42.667s42.667 19.103 42.667 42.667v0 42.667h-85.333zM874.667 523.093c0 23.564-19.103 42.667-42.667 42.667v0h-170.667c-23.564 0-42.667-19.103-42.667-42.667v0-85.333c0-23.564 19.103-42.667 42.667-42.667v0h170.667c23.564 0 42.667 19.103 42.667 42.667v0zM874.667 736.427c-23.564 0-42.667 19.103-42.667 42.667v0 42.667c0 23.564-19.103 42.667-42.667 42.667v0h-597.333c-23.564 0-42.667-19.103-42.667-42.667v0-409.173l250.88 250.88c7.736 7.789 18.452 12.611 30.293 12.611 23.577 0 42.691-19.113 42.691-42.691 0-11.736-4.735-22.365-12.4-30.082l0.002 0.002-251.307-250.88h238.507c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-256c-70.692 0-128 57.308-128 128v0 426.667c0 70.692 57.308 128 128 128v0h597.333c70.692 0 128-57.308 128-128v0-42.667c0-23.564-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["envelope-lock"]},"attrs":[],"properties":{"order":4921,"id":763,"name":"envelope-lock","prevSize":32,"code":60090},"setIdx":0,"setId":0,"iconIdx":442},{"icon":{"paths":["M896 341.333c-23.564 0-42.667 19.103-42.667 42.667v0 341.333c0 23.564-19.103 42.667-42.667 42.667v0h-597.333c-23.564 0-42.667-19.103-42.667-42.667v0-409.173l250.88 250.88c23.158 23.13 55.135 37.434 90.453 37.434s67.296-14.304 90.455-37.435l-0.001 0.001 153.173-152.747c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l0-0-152.747 153.173c-7.733 7.795-18.45 12.621-30.293 12.621s-22.56-4.826-30.291-12.618l-0.003-0.003-250.88-250.88h323.84c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-341.333c-70.692 0-128 57.308-128 128v0 426.667c0 70.692 57.308 128 128 128v0h597.333c70.692 0 128-57.308 128-128v0-341.333c0-23.564-19.103-42.667-42.667-42.667v0zM725.333 256h170.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-170.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["envelope-minus"]},"attrs":[],"properties":{"order":4922,"id":762,"name":"envelope-minus","prevSize":32,"code":60091},"setIdx":0,"setId":0,"iconIdx":443},{"icon":{"paths":["M862.293 376.32v0 0 0l-264.96-257.707c-21.613-20.579-50.928-33.239-83.2-33.239s-61.588 12.661-83.25 33.286l0.050-0.047-264.96 256c-23.030 20.179-37.6 49.525-37.973 82.281l-0.001 0.065v366.080c0.958 64.066 53.117 115.634 117.321 115.634 0.454 0 0.908-0.003 1.361-0.008l-0.069 0.001h530.773c0.384 0.005 0.838 0.007 1.292 0.007 64.204 0 116.363-51.567 117.32-115.544l0.001-0.090v-366.080c-0.072-31.535-12.946-60.049-33.699-80.632l-0.008-0.008zM488.107 180.053c6.275-5.751 14.673-9.275 23.893-9.275s17.618 3.524 23.92 9.299l-0.026-0.024 232.107 225.28-233.387 225.28c-6.275 5.751-14.673 9.275-23.893 9.275s-17.618-3.524-23.92-9.299l0.026 0.024-230.827-225.28zM810.667 823.040c-1.146 16.973-15.195 30.306-32.357 30.306-0.324 0-0.648-0.005-0.97-0.014l0.047 0.001h-530.773c-0.275 0.008-0.598 0.013-0.923 0.013-17.163 0-31.211-13.334-32.352-30.207l-0.005-0.099v-338.773l172.8 166.4-70.827 68.267c-7.668 7.712-12.407 18.343-12.407 30.080s4.74 22.368 12.409 30.082l-0.002-0.002c7.749 8.118 18.639 13.179 30.711 13.227l0.009 0c11.445-0.047 21.818-4.593 29.453-11.959l75.507-72.521c17.736 11.004 39.253 17.526 62.293 17.526s44.557-6.522 62.805-17.821l-0.512 0.295 75.52 72.533c7.622 7.354 17.995 11.9 29.431 11.947l0.009 0c12.081-0.048 22.971-5.109 30.704-13.21l0.016-0.017c7.668-7.712 12.407-18.343 12.407-30.080s-4.74-22.368-12.409-30.082l0.002 0.002-71.253-68.267 170.667-166.4z"],"attrs":[],"grid":0,"tags":["envelope-open"]},"attrs":[],"properties":{"order":4923,"id":761,"name":"envelope-open","prevSize":32,"code":60092},"setIdx":0,"setId":0,"iconIdx":444},{"icon":{"paths":["M715.52 229.12c6.055 3.499 13.32 5.563 21.067 5.563 15.716 0 29.448-8.497 36.851-21.148l0.109-0.202c7.514-12.844 21.241-21.334 36.951-21.334 0.060 0 0.119 0 0.179 0l-0.009-0c23.564 0 42.667 19.103 42.667 42.667s-19.103 42.667-42.667 42.667v0c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0c70.657-0.047 127.918-57.336 127.918-128 0-70.692-57.308-128-128-128-47.128 0-88.308 25.47-110.524 63.396l-0.327 0.604c-3.613 6.133-5.748 13.511-5.748 21.388 0 15.791 8.578 29.578 21.329 36.956l0.205 0.11zM896 576c-23.564 0-42.667 19.103-42.667 42.667v0 170.667c0 23.564-19.103 42.667-42.667 42.667v0h-597.333c-23.564 0-42.667-19.103-42.667-42.667v0-409.173l250.88 251.307c23.158 23.13 55.135 37.434 90.453 37.434s67.296-14.304 90.455-37.435l-0.001 0.001 69.973-69.973c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l-69.973 69.973c-7.69 7.542-18.235 12.197-29.867 12.197s-22.177-4.655-29.874-12.203l0.007 0.007-251.307-250.88h323.84c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-341.333c-70.692 0-128 57.308-128 128v0 426.667c0 70.692 57.308 128 128 128v0h597.333c70.692 0 128-57.308 128-128v0-170.667c0-23.564-19.103-42.667-42.667-42.667v0zM780.373 417.707c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003 6.4 5.12c2.211 1.521 4.75 2.82 7.453 3.77l0.227 0.070c2.221 1.157 4.798 2.047 7.514 2.535l0.166 0.025h8.533c0.074 0 0.161 0.001 0.248 0.001 23.564 0 42.667-19.103 42.667-42.667 0-11.844-4.826-22.561-12.619-30.291l-0.003-0.003c-7.69-7.544-18.236-12.2-29.87-12.2-12.056 0-22.945 5.001-30.704 13.041l-0.012 0.013z"],"attrs":[],"grid":0,"tags":["envelope-question"]},"attrs":[],"properties":{"order":4924,"id":760,"name":"envelope-question","prevSize":32,"code":60093},"setIdx":0,"setId":0,"iconIdx":445},{"icon":{"paths":["M353.707 264.96l85.333 85.333c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003-12.8-12.373h153.173c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-153.173l12.8-12.373c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l-85.333 85.333c-3.773 3.937-6.808 8.616-8.859 13.791l-0.101 0.289c-2.024 4.793-3.201 10.366-3.201 16.213s1.176 11.42 3.305 16.495l-0.105-0.281c2.152 5.464 5.187 10.143 8.974 14.095l-0.014-0.015zM682.667 448h-341.333c-70.692 0-128 57.308-128 128v0 213.333c0 70.692 57.308 128 128 128v0h341.333c70.692 0 128-57.308 128-128v0-213.333c0-70.692-57.308-128-128-128v0zM664.747 533.333l-122.88 122.88c-7.69 7.542-18.235 12.197-29.867 12.197s-22.177-4.655-29.874-12.203l0.007 0.007-122.88-122.88zM725.333 789.333c0 23.564-19.103 42.667-42.667 42.667v0h-341.333c-23.564 0-42.667-19.103-42.667-42.667v0-195.84l122.88 122.453c22.815 23.436 54.668 37.974 89.916 37.974 0.189 0 0.377-0 0.566-0.001l-0.029 0c35.333-0.032 67.31-14.375 90.452-37.545l0.001-0.001 122.88-122.88z"],"attrs":[],"grid":0,"tags":["envelope-receive"]},"attrs":[],"properties":{"order":4925,"id":759,"name":"envelope-receive","prevSize":32,"code":60094},"setIdx":0,"setId":0,"iconIdx":446},{"icon":{"paths":["M874.667 608.427c-23.564 0-42.667 19.103-42.667 42.667v0 170.667c0 23.564-19.103 42.667-42.667 42.667v0h-597.333c-23.564 0-42.667-19.103-42.667-42.667v0-409.173l250.88 250.88c23.045 23.073 54.849 37.393 89.997 37.547l0.029 0c0.099 0 0.216 0 0.333 0 36.006 0 68.54-14.867 91.798-38.797l0.029-0.030c7.418-7.666 11.989-18.126 11.989-29.653s-4.571-21.987-12-29.665l0.011 0.012c-7.753-7.924-18.556-12.837-30.507-12.837s-22.753 4.913-30.499 12.83l-0.008 0.008c-7.69 7.542-18.235 12.197-29.867 12.197s-22.177-4.655-29.874-12.203l0.007 0.007-252.16-250.453h195.84c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-213.333c-70.692 0-128 57.308-128 128v0 426.667c0 70.692 57.308 128 128 128v0h597.333c70.692 0 128-57.308 128-128v0-170.667c0-23.564-19.103-42.667-42.667-42.667v0zM917.333 139.093c-23.564 0-42.667 19.103-42.667 42.667v0 0c-35.21-26.637-79.733-42.667-128-42.667-117.821 0-213.333 95.513-213.333 213.333s95.513 213.333 213.333 213.333v0c54.154-0.207 103.514-20.56 141.014-53.947l-0.214 0.187c8.985-7.884 14.626-19.39 14.626-32.213 0-23.63-19.156-42.786-42.786-42.786-10.807 0-20.678 4.006-28.209 10.615l0.049-0.042c-22.482 20.004-52.273 32.225-84.919 32.225-70.692 0-128-57.308-128-128s57.308-128 128-128c37.947 0 72.037 16.512 95.476 42.744l0.109 0.124h-52.48c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h128c23.564 0 42.667-19.103 42.667-42.667v0-128c-0.241-23.38-19.25-42.24-42.665-42.24-0.001 0-0.002 0-0.002 0l0-0z"],"attrs":[],"grid":0,"tags":["envelope-redo"]},"attrs":[],"properties":{"order":4926,"id":758,"name":"envelope-redo","prevSize":32,"code":60095},"setIdx":0,"setId":0,"iconIdx":447},{"icon":{"paths":["M947.627 439.040l-73.813-73.387c17.165-27.43 27.452-60.698 27.733-96.35l0-0.077c-0.243-101.378-82.482-183.466-183.893-183.466-101.561 0-183.893 82.332-183.893 183.893 0 101.411 82.089 183.65 183.443 183.893l0.023 0c35.633-0.003 68.93-10.001 97.241-27.344l-0.814 0.464 73.387 73.813c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c8.055-7.772 13.057-18.662 13.057-30.72s-5.002-22.948-13.044-30.708l-0.013-0.012zM787.2 341.333c-18.109 17.281-42.693 27.916-69.76 27.916s-51.651-10.635-69.8-27.954l0.040 0.038c-17.921-17.785-29.014-42.428-29.014-69.661 0-0.11 0-0.22 0.001-0.329l-0 0.017c-0.009-0.508-0.015-1.107-0.015-1.708 0-54.524 44.083-98.752 98.552-98.986l0.022-0c0.093-0 0.203-0 0.312-0 27.233 0 51.876 11.093 69.655 29.008l0.006 0.006c17.915 17.654 29.014 42.183 29.014 69.304 0 0.085-0 0.17-0 0.255l0-0.013c0.019 0.72 0.030 1.567 0.030 2.417 0 27.248-11.105 51.902-29.036 69.683l-0.007 0.007zM874.667 597.333c-23.564 0-42.667 19.103-42.667 42.667v0 170.667c0 23.564-19.103 42.667-42.667 42.667v0h-597.333c-23.564 0-42.667-19.103-42.667-42.667v0-409.173l250.88 251.307c23.158 23.13 55.135 37.434 90.453 37.434s67.296-14.304 90.455-37.435l-0.001 0.001 58.88-60.587c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l0-0-58.88 60.587c-7.69 7.542-18.235 12.197-29.867 12.197s-22.177-4.655-29.874-12.203l0.007 0.007-251.307-250.88h195.84c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-213.333c-70.692 0-128 57.308-128 128v0 426.667c0 70.692 57.308 128 128 128v0h597.333c70.692 0 128-57.308 128-128v0-170.667c0-23.564-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["envelope-search"]},"attrs":[],"properties":{"order":4927,"id":757,"name":"envelope-search","prevSize":32,"code":60096},"setIdx":0,"setId":0,"iconIdx":448},{"icon":{"paths":["M682.667 448h-341.333c-70.692 0-128 57.308-128 128v0 213.333c0 70.692 57.308 128 128 128v0h341.333c70.692 0 128-57.308 128-128v0-213.333c0-70.692-57.308-128-128-128v0zM664.747 533.333l-122.88 122.88c-7.69 7.542-18.235 12.197-29.867 12.197s-22.177-4.655-29.874-12.203l0.007 0.007-122.88-122.88zM725.333 789.333c0 23.564-19.103 42.667-42.667 42.667v0h-341.333c-23.564 0-42.667-19.103-42.667-42.667v0-195.84l122.88 122.453c22.815 23.436 54.668 37.974 89.916 37.974 0.189 0 0.377-0 0.566-0.001l-0.029 0c35.333-0.032 67.31-14.375 90.452-37.545l0.001-0.001 122.88-122.88zM384 277.333h153.173l-12.8 12.373c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 85.333-85.333c3.773-3.937 6.808-8.616 8.859-13.791l0.101-0.289c2.024-4.793 3.201-10.366 3.201-16.213s-1.176-11.42-3.305-16.495l0.105 0.281c-2.152-5.464-5.187-10.143-8.974-14.095l0.014 0.015-85.333-85.333c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l-0-0 12.8 12.373h-153.173c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["envelope-send"]},"attrs":[],"properties":{"order":4928,"id":756,"name":"envelope-send","prevSize":32,"code":60097},"setIdx":0,"setId":0,"iconIdx":449},{"icon":{"paths":["M853.333 597.333c-23.564 0-42.667 19.103-42.667 42.667v0 170.667c0 23.564-19.103 42.667-42.667 42.667v0h-597.333c-23.564 0-42.667-19.103-42.667-42.667v0-409.173l250.88 251.307c23.1 22.917 54.905 37.088 90.021 37.12l0.006 0c35.999-0.191 68.543-14.827 92.162-38.402l-0.002 0.002 73.387-73.387c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l-74.667 74.667c-7.69 7.542-18.235 12.197-29.867 12.197s-22.177-4.655-29.874-12.203l0.007 0.007-251.307-250.88h238.507c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-256c-70.692 0-128 57.308-128 128v0 426.667c0 70.692 57.308 128 128 128v0h597.333c70.692 0 128-57.308 128-128v0-170.667c0-23.564-19.103-42.667-42.667-42.667v0zM853.333 341.333c-18.957 0.064-36.446 6.3-50.575 16.802l0.228-0.162-74.667-34.133 82.347-37.547c12.169 7.502 26.854 12.065 42.582 12.372l0.085 0.001c47.128 0 85.333-38.205 85.333-85.333s-38.205-85.333-85.333-85.333c-47.128 0-85.333 38.205-85.333 85.333v0l-81.067 37.12c-13.071-9.406-29.27-15.239-46.802-15.783l-0.131-0.003c-47.128 0-85.333 38.205-85.333 85.333s38.205 85.333 85.333 85.333v0c0.011 0 0.024 0 0.037 0 14.407 0 27.926-3.798 39.612-10.447l-0.396 0.207 89.6 42.667c5.679 42.113 41.392 74.24 84.609 74.24 47.128 0 85.333-38.205 85.333-85.333s-38.205-85.333-85.333-85.333c-0.045 0-0.091 0-0.136 0l0.007-0z"],"attrs":[],"grid":0,"tags":["envelope-share"]},"attrs":[],"properties":{"order":4929,"id":755,"name":"envelope-share","prevSize":32,"code":60098},"setIdx":0,"setId":0,"iconIdx":450},{"icon":{"paths":["M922.88 218.453c-7.264-5.913-16.631-9.495-26.834-9.495-3.19 0-6.299 0.35-9.29 1.014l0.284-0.053c-7.547 1.735-16.213 2.729-25.112 2.729-25.843 0-49.728-8.386-69.082-22.584l0.327 0.229c-6.96-5.134-15.707-8.217-25.173-8.217s-18.213 3.083-25.291 8.3l0.117-0.083c-19.027 13.97-42.912 22.356-68.755 22.356-8.899 0-17.565-0.994-25.894-2.878l0.782 0.149c-2.693-0.605-5.786-0.951-8.96-0.951-23.564 0-42.667 19.103-42.667 42.667 0 0.034 0 0.069 0 0.103l-0-0.005v141.227c-0 0.127-0 0.277-0 0.427 0 64.118 30.613 121.085 78.019 157.084l0.488 0.355 66.987 49.493c6.96 5.134 15.707 8.217 25.173 8.217s18.213-3.083 25.291-8.3l-0.117 0.083 66.987-49.493c47.894-36.354 78.507-93.322 78.507-157.44 0-0.15-0-0.3-0.001-0.45l0 0.023v-141.227c0-0.043 0-0.094 0-0.145 0-13.34-6.122-25.25-15.71-33.074l-0.077-0.061zM853.333 392.96c0.007 0.451 0.010 0.983 0.010 1.517 0 35.48-16.592 67.084-42.441 87.477l-0.236 0.18-42.667 29.867-42.667-30.72c-26.085-20.572-42.677-52.177-42.677-87.657 0-0.533 0.004-1.066 0.011-1.597l-0.001 0.080v-93.44c31.42-1.296 60.612-9.672 86.393-23.562l-1.060 0.522c24.722 13.368 53.913 21.744 84.936 23.027l0.398 0.013zM896 648.96c-23.564 0-42.667 19.103-42.667 42.667v0 128c0 23.564-19.103 42.667-42.667 42.667v0h-597.333c-23.564 0-42.667-19.103-42.667-42.667v0-407.040l250.88 250.88c23.045 23.073 54.849 37.393 89.997 37.547l0.029 0c0.096 0 0.209 0 0.323 0 35.797 0 68.161-14.694 91.391-38.38l0.020-0.020-29.867-30.293-31.573-29.013c-7.69 7.542-18.235 12.197-29.867 12.197s-22.177-4.655-29.874-12.203l0.007 0.007-251.307-250.88h238.507c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-256c-70.692 0-128 57.308-128 128v0 426.667c0 70.692 57.308 128 128 128v0h597.333c70.692 0 128-57.308 128-128v0-128c0-23.564-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["envelope-shield"]},"attrs":[],"properties":{"order":4930,"id":754,"name":"envelope-shield","prevSize":32,"code":60099},"setIdx":0,"setId":0,"iconIdx":451},{"icon":{"paths":["M581.973 415.573l-12.373 73.813c-0.566 3.251-0.89 6.994-0.89 10.813 0 22.501 11.238 42.378 28.407 54.324l0.217 0.143c10.148 7.465 22.893 11.947 36.684 11.947 11.299 0 21.895-3.008 31.032-8.267l-0.302 0.16 60.587-34.56 61.44 33.707c8.88 5.166 19.544 8.216 30.92 8.216 13.34 0 25.701-4.193 35.837-11.334l-0.197 0.132c16.874-12.141 27.732-31.723 27.732-53.842 0-3.737-0.31-7.403-0.906-10.971l0.053 0.386-12.373-73.813 51.2-52.053c11.666-11.852 18.869-28.126 18.869-46.083 0-32.556-23.677-59.582-54.751-64.797l-0.385-0.053-69.12-10.24-31.147-66.133c-10.429-22.033-32.48-37.002-58.027-37.002s-47.598 14.968-57.861 36.613l-0.166 0.388-31.147 66.133-69.12 10.24c-31.459 5.269-55.136 32.295-55.136 64.851 0 17.957 7.203 34.231 18.877 46.091l-0.008-0.009zM660.053 324.693c21.642-3.369 39.471-17.105 48.473-35.879l0.167-0.387 16.64-35.413 16.64 35.413c9.302 19.149 27.039 32.943 48.245 36.636l0.395 0.057 42.667 5.973-31.147 31.573c-11.617 12.030-18.775 28.432-18.775 46.506 0 3.767 0.311 7.461 0.908 11.058l-0.054-0.391 6.827 42.667-33.707-18.347c-8.851-5.019-19.44-7.976-30.72-7.976s-21.869 2.958-31.035 8.14l0.315-0.164-33.707 18.347 6.827-42.667c0.561-3.226 0.882-6.942 0.882-10.732 0-17.923-7.176-34.17-18.812-46.025l0.010 0.010-31.147-32zM896 651.093c-23.564 0-42.667 19.103-42.667 42.667v0 128c0 23.564-19.103 42.667-42.667 42.667v0h-597.333c-23.564 0-42.667-19.103-42.667-42.667v0-409.173l250.88 250.88c22.777 23.181 54.46 37.547 89.498 37.547 0.036 0 0.071-0 0.107-0l11.514 0c21.922-1.96 38.977-20.242 38.977-42.507 0-1.258-0.054-2.503-0.161-3.733l0.011 0.16c-1.941-21.939-20.232-39.014-42.51-39.014-1.407 0-2.799 0.068-4.171 0.201l0.174-0.014c-1.227 0.133-2.65 0.209-4.091 0.209-11.277 0-21.467-4.654-28.754-12.147l-0.009-0.009-251.307-251.733h153.173c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-170.667c-70.692 0-128 57.308-128 128v0 426.667c0 70.692 57.308 128 128 128v0h597.333c70.692 0 128-57.308 128-128v0-128c0-23.564-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["envelope-star"]},"attrs":[],"properties":{"order":4931,"id":753,"name":"envelope-star","prevSize":32,"code":60100},"setIdx":0,"setId":0,"iconIdx":452},{"icon":{"paths":["M896 469.333c-23.564 0-42.667 19.103-42.667 42.667v0 256c0 23.564-19.103 42.667-42.667 42.667v0h-597.333c-23.564 0-42.667-19.103-42.667-42.667v0-409.173l250.88 251.307c23.1 22.917 54.905 37.088 90.021 37.12l0.006 0c35.999-0.191 68.543-14.827 92.162-38.402l-0.002 0.002 73.387-73.387c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l-74.667 74.667c-7.69 7.542-18.235 12.197-29.867 12.197s-22.177-4.655-29.874-12.203l0.007 0.007-251.307-250.88h323.84c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-341.333c-70.692 0-128 57.308-128 128v0 426.667c0 70.692 57.308 128 128 128v0h597.333c70.692 0 128-57.308 128-128v0-256c0-23.564-19.103-42.667-42.667-42.667v0zM870.827 256l55.467-55.040c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l-0 0-55.040 55.467-55.040-55.467c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l-0-0 55.467 55.040-55.467 55.040c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 55.040-55.467 55.040 55.467c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003z"],"attrs":[],"grid":0,"tags":["envelope-times"]},"attrs":[],"properties":{"order":4932,"id":752,"name":"envelope-times","prevSize":32,"code":60101},"setIdx":0,"setId":0,"iconIdx":453},{"icon":{"paths":["M682.667 472.747h-341.333c-70.692 0-128 57.308-128 128v0 213.333c0 70.692 57.308 128 128 128v0h341.333c70.692 0 128-57.308 128-128v0-213.333c0-70.692-57.308-128-128-128v0zM664.747 558.080l-122.88 124.587c-7.69 7.542-18.235 12.197-29.867 12.197s-22.177-4.655-29.874-12.203l0.007 0.007-122.88-124.587zM725.333 814.080c0 23.564-19.103 42.667-42.667 42.667v0h-341.333c-23.564 0-42.667-19.103-42.667-42.667v0-195.84l122.88 122.88c23.158 23.13 55.135 37.434 90.453 37.434s67.296-14.304 90.455-37.435l-0.001 0.001 122.88-122.88zM456.96 239.787l12.373-12.373v117.333c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-117.333l12.373 12.373c7.736 7.789 18.452 12.611 30.293 12.611 23.577 0 42.691-19.113 42.691-42.691 0-11.736-4.735-22.365-12.4-30.082l0.002 0.002-85.333-85.333c-7.733-7.795-18.45-12.621-30.293-12.621s-22.56 4.826-30.291 12.618l-0.003 0.003-85.333 85.333c-7.668 7.712-12.407 18.343-12.407 30.080s4.74 22.368 12.409 30.082l-0.002-0.002c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003z"],"attrs":[],"grid":0,"tags":["envelope-upload-alt"]},"attrs":[],"properties":{"order":4933,"id":751,"name":"envelope-upload-alt","prevSize":32,"code":60102},"setIdx":0,"setId":0,"iconIdx":454},{"icon":{"paths":["M874.667 597.333c-23.564 0-42.667 19.103-42.667 42.667v0 170.667c0 23.564-19.103 42.667-42.667 42.667v0h-597.333c-23.564 0-42.667-19.103-42.667-42.667v0-409.173l250.88 251.307c23.158 23.13 55.135 37.434 90.453 37.434s67.296-14.304 90.455-37.435l-0.001 0.001 69.973-69.973c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l-69.973 69.973c-7.69 7.542-18.235 12.197-29.867 12.197s-22.177-4.655-29.874-12.203l0.007 0.007-251.307-250.88h281.173c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-298.667c-70.692 0-128 57.308-128 128v0 426.667c0 70.692 57.308 128 128 128v0h597.333c70.692 0 128-57.308 128-128v0-170.667c0-23.564-19.103-42.667-42.667-42.667v0zM947.627 225.707l-128-128c-3.937-3.773-8.616-6.808-13.791-8.859l-0.289-0.101c-4.793-2.024-10.366-3.201-16.213-3.201s-11.42 1.176-16.495 3.305l0.281-0.105c-5.464 2.152-10.143 5.187-14.095 8.974l0.015-0.014-128 128c-7.753 7.753-12.548 18.463-12.548 30.293 0 23.661 19.181 42.841 42.841 42.841 11.83 0 22.541-4.795 30.293-12.548l-0 0 55.040-55.467v238.507c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-238.507l55.040 55.467c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003z"],"attrs":[],"grid":0,"tags":["envelope-upload"]},"attrs":[],"properties":{"order":4934,"id":750,"name":"envelope-upload","prevSize":32,"code":60103},"setIdx":0,"setId":0,"iconIdx":455},{"icon":{"paths":["M810.667 170.667h-597.333c-70.692 0-128 57.308-128 128v0 426.667c0 70.692 57.308 128 128 128v0h597.333c70.692 0 128-57.308 128-128v0-426.667c0-70.692-57.308-128-128-128v0zM793.173 256l-250.88 250.88c-7.733 7.795-18.45 12.621-30.293 12.621s-22.56-4.826-30.291-12.618l-0.003-0.003-250.88-250.88zM853.333 725.333c0 23.564-19.103 42.667-42.667 42.667v0h-597.333c-23.564 0-42.667-19.103-42.667-42.667v0-409.173l250.88 250.88c23.158 23.13 55.135 37.434 90.453 37.434s67.296-14.304 90.455-37.435l-0.001 0.001 250.88-250.88z"],"attrs":[],"grid":0,"tags":["envelope"]},"attrs":[],"properties":{"order":4935,"id":749,"name":"envelope","prevSize":32,"code":60104},"setIdx":0,"setId":0,"iconIdx":456},{"icon":{"paths":["M725.333 922.88h-512c-70.692 0-128-57.308-128-128v0-341.333c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 341.333c0 117.821 95.513 213.333 213.333 213.333v0h512c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM896 154.88h-597.333c-70.692 0-128 57.308-128 128v0 426.667c0 70.692 57.308 128 128 128v0h597.333c70.692 0 128-57.308 128-128v0-426.667c0-70.692-57.308-128-128-128v0zM878.507 240.213l-250.88 250.88c-7.733 7.795-18.45 12.621-30.293 12.621s-22.56-4.826-30.291-12.618l-0.003-0.003-250.88-250.88zM938.667 709.547c0 23.564-19.103 42.667-42.667 42.667v0h-597.333c-23.564 0-42.667-19.103-42.667-42.667v0-410.88l250.88 250.88c23.158 23.13 55.135 37.434 90.453 37.434s67.296-14.304 90.455-37.435l-0.001 0.001 250.88-250.88z"],"attrs":[],"grid":0,"tags":["envelopes"]},"attrs":[],"properties":{"order":4936,"id":748,"name":"envelopes","prevSize":32,"code":60105},"setIdx":0,"setId":0,"iconIdx":457},{"icon":{"paths":["M640 554.667h-256c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h256c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM640 384h-256c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h256c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM512 85.333c-235.641 0-426.667 191.025-426.667 426.667s191.025 426.667 426.667 426.667c235.641 0 426.667-191.025 426.667-426.667v0c0-235.641-191.025-426.667-426.667-426.667v0zM512 853.333c-188.513 0-341.333-152.82-341.333-341.333s152.82-341.333 341.333-341.333c188.513 0 341.333 152.82 341.333 341.333v0c0 188.513-152.82 341.333-341.333 341.333v0z"],"attrs":[],"grid":0,"tags":["equal-circle"]},"attrs":[],"properties":{"order":4937,"id":747,"name":"equal-circle","prevSize":32,"code":60106},"setIdx":0,"setId":0,"iconIdx":458},{"icon":{"paths":["M853.333 341.333v0l-256-224.427c-22.54-20.227-52.493-32.594-85.333-32.594s-62.793 12.368-85.453 32.7l0.119-0.105-256 224.427c-26.239 23.54-42.671 57.556-42.671 95.409 0 0.358 0.001 0.715 0.004 1.072l-0-0.055v372.907c0 70.692 57.308 128 128 128v0h512c70.692 0 128-57.308 128-128v0-373.333c0.001-0.176 0.001-0.385 0.001-0.593 0-37.852-16.43-71.867-42.548-95.301l-0.12-0.105zM597.333 853.333h-170.667v-213.333c0-23.564 19.103-42.667 42.667-42.667v0h85.333c23.564 0 42.667 19.103 42.667 42.667v0zM810.667 810.667c0 23.564-19.103 42.667-42.667 42.667v0h-85.333v-213.333c0-70.692-57.308-128-128-128v0h-85.333c-70.692 0-128 57.308-128 128v0 213.333h-85.333c-23.564 0-42.667-19.103-42.667-42.667v0-373.333c0.017-12.731 5.606-24.153 14.46-31.96l0.047-0.040 256-224c7.473-6.59 17.347-10.613 28.16-10.613s20.687 4.023 28.207 10.653l-0.047-0.040 256 224c8.9 7.847 14.49 19.269 14.507 31.997l0 0.003z"],"attrs":[],"grid":0,"tags":["estate"]},"attrs":[],"properties":{"order":4938,"id":746,"name":"estate","prevSize":32,"code":60107},"setIdx":0,"setId":0,"iconIdx":459},{"icon":{"paths":["M512 42.667c-259.206 0-469.333 210.128-469.333 469.333s210.128 469.333 469.333 469.333c259.206 0 469.333-210.128 469.333-469.333v0c0-259.206-210.128-469.333-469.333-469.333v0zM512 896c-212.077 0-384-171.923-384-384s171.923-384 384-384c212.077 0 384 171.923 384 384v0c0 212.077-171.923 384-384 384v0zM537.173 327.253c45.92 1.209 86.286 23.959 111.506 58.476l0.281 0.404c7.874 10.252 20.137 16.795 33.928 16.795 9.744 0 18.725-3.266 25.908-8.764l-0.102 0.075c10.216-7.876 16.733-20.117 16.733-33.881 0-9.954-3.409-19.112-9.123-26.37l0.069 0.091c-41.136-55.287-105.879-91.019-179.019-92.158l-0.181-0.002c-101.926 3.059-187.481 69.844-218.391 161.738l-0.489 1.676h-62.293c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h42.667c0 7.253 0 14.080 0 21.333s0 14.080 0 21.333h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h62.293c31.4 93.57 116.954 160.355 218.527 163.405l0.353 0.008c73.321-1.141 138.064-36.873 178.77-91.556l0.43-0.604c8.389-7.813 13.619-18.922 13.619-31.252 0-23.564-19.103-42.667-42.667-42.667-16.771 0-31.282 9.676-38.255 23.75l-0.112 0.249c-25.501 34.921-65.866 57.671-111.599 58.876l-0.188 0.004c-54.39-2.215-100.899-33.878-124.204-79.39l-0.383-0.823h99.413c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-125.867c-1.047-6.156-1.811-13.505-2.121-20.971l-0.012-0.362c0.322-7.828 1.086-15.177 2.276-22.382l-0.143 1.049h125.867c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-99.413c24.208-45.474 70.602-76.308 124.351-78.074l0.236-0.006z"],"attrs":[],"grid":0,"tags":["euro-circle"]},"attrs":[],"properties":{"order":4939,"id":745,"name":"euro-circle","prevSize":32,"code":60108},"setIdx":0,"setId":0,"iconIdx":460},{"icon":{"paths":["M819.2 742.827c-45.218 64.935-118.456 107.639-201.81 110.495l-0.43 0.012c-114.347 0-213.333-85.333-256-213.333h236.373c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-253.867c0-14.080-2.133-28.587-2.133-42.667s0-28.587 2.133-42.667h253.867c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-235.947c42.667-128 141.227-213.333 256-213.333 83.622 3.009 156.678 45.681 201.262 109.671l0.551 0.836c7.527 12.79 21.225 21.239 36.896 21.239 23.564 0 42.667-19.103 42.667-42.667 0-11.172-4.294-21.342-11.322-28.948l0.026 0.029c-60.44-86.481-158.619-142.99-270.125-145.487l-0.382-0.007c-160.427 0-298.667 121.173-344.32 298.667h-101.973c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h87.467c0 14.080 0 28.587 0 42.667s0 28.587 0 42.667h-87.467c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h101.973c46.507 177.493 183.893 298.667 344.32 298.667 111.888-2.503 210.066-59.012 269.783-144.402l0.723-1.092c3.628-6.142 5.771-13.535 5.771-21.427 0-23.564-19.103-42.667-42.667-42.667-12.392 0-23.55 5.283-31.345 13.719l-0.026 0.029z"],"attrs":[],"grid":0,"tags":["euro"]},"attrs":[],"properties":{"order":4940,"id":744,"name":"euro","prevSize":32,"code":60109},"setIdx":0,"setId":0,"iconIdx":461},{"icon":{"paths":["M926.293 396.373l-170.667-170.667c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l-0-0 98.133 97.707h-494.507c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h597.333c17.632-0.091 32.726-10.863 39.149-26.172l0.105-0.281c2.109-4.883 3.336-10.568 3.336-16.539 0-11.682-4.695-22.267-12.3-29.972l0.004 0.005zM725.333 554.667h-597.333c-17.632 0.091-32.726 10.863-39.149 26.172l-0.105 0.281c-2.109 4.883-3.336 10.568-3.336 16.539 0 11.682 4.695 22.267 12.3 29.972l-0.004-0.005 170.667 170.667c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003-98.133-97.707h494.507c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["exchange-alt"]},"attrs":[],"properties":{"order":4941,"id":743,"name":"exchange-alt","prevSize":32,"code":60110},"setIdx":0,"setId":0,"iconIdx":462},{"icon":{"paths":["M768 426.667c0-23.564-19.103-42.667-42.667-42.667v0h-494.507l98.133-97.707c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l-170.667 170.667c-7.601 7.7-12.296 18.286-12.296 29.968 0 5.971 1.227 11.656 3.442 16.817l-0.106-0.278c6.527 15.59 21.621 26.363 39.242 26.453l0.012 0h597.333c23.564 0 42.667-19.103 42.667-42.667v0zM935.253 581.12c-6.527-15.59-21.621-26.363-39.242-26.453l-0.012-0h-597.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h494.507l-98.133 97.707c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 170.667-170.667c7.601-7.7 12.296-18.286 12.296-29.968 0-5.971-1.227-11.656-3.442-16.817l0.106 0.278z"],"attrs":[],"grid":0,"tags":["exchange"]},"attrs":[],"properties":{"order":4942,"id":742,"name":"exchange","prevSize":32,"code":60111},"setIdx":0,"setId":0,"iconIdx":463},{"icon":{"paths":["M512 597.333c-29.455 0-53.333 23.878-53.333 53.333s23.878 53.333 53.333 53.333c29.455 0 53.333-23.878 53.333-53.333v0c0-29.455-23.878-53.333-53.333-53.333v0zM512 533.333c23.564 0 42.667-19.103 42.667-42.667v0-128c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 128c0 23.564 19.103 42.667 42.667 42.667v0zM512 85.333c-235.641 0-426.667 191.025-426.667 426.667s191.025 426.667 426.667 426.667c235.641 0 426.667-191.025 426.667-426.667v0c-0.27-235.533-191.134-426.396-426.641-426.667l-0.026-0zM512 853.333c-188.513 0-341.333-152.82-341.333-341.333s152.82-341.333 341.333-341.333c188.513 0 341.333 152.82 341.333 341.333v0c-0.223 188.424-152.91 341.111-341.312 341.333l-0.021 0z"],"attrs":[],"grid":0,"tags":["exclamation-circle"]},"attrs":[],"properties":{"order":4943,"id":741,"name":"exclamation-circle","prevSize":32,"code":60112},"setIdx":0,"setId":0,"iconIdx":464},{"icon":{"paths":["M512 298.667c-23.564 0-42.667 19.103-42.667 42.667v0 170.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-170.667c0-23.564-19.103-42.667-42.667-42.667v0zM512 640c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM926.293 322.56l-224.853-224.853c-7.877-7.522-18.523-12.204-30.26-12.373l-0.033-0h-318.293c-11.771 0.169-22.416 4.851-30.311 12.39l0.017-0.016-224.853 224.853c-7.522 7.877-12.204 18.523-12.373 30.26l-0 0.033v318.293c0.169 11.771 4.851 22.416 12.39 30.311l-0.016-0.017 224.853 224.853c7.877 7.522 18.523 12.204 30.26 12.373l0.033 0h318.293c11.771-0.169 22.416-4.851 30.311-12.39l-0.017 0.016 224.853-224.853c7.522-7.877 12.204-18.523 12.373-30.26l0-0.033v-318.293c-0.169-11.771-4.851-22.416-12.39-30.311l0.016 0.017zM853.333 653.227l-200.107 200.107h-282.453l-200.107-200.107v-282.453l200.107-200.107h282.453l200.107 200.107z"],"attrs":[],"grid":0,"tags":["exclamation-octagon"]},"attrs":[],"properties":{"order":4944,"id":740,"name":"exclamation-octagon","prevSize":32,"code":60113},"setIdx":0,"setId":0,"iconIdx":465},{"icon":{"paths":["M512 682.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM967.253 745.387l-343.467-597.333c-22.316-39.453-63.992-65.648-111.787-65.648s-89.471 26.195-111.455 65.012l-0.331 0.636-341.333 597.333c-11.246 18.663-17.899 41.196-17.899 65.283 0 70.385 56.81 127.502 127.079 127.997l0.047 0h687.787c0.375 0.004 0.818 0.006 1.261 0.006 70.692 0 128-57.308 128-128 0-24.088-6.654-46.622-18.224-65.864l0.322 0.578zM893.44 830.72c-7.456 13.083-21.312 21.761-37.194 21.761-0.124 0-0.248-0.001-0.371-0.002l0.019 0h-687.787c-0.105 0.001-0.228 0.001-0.352 0.001-15.883 0-29.738-8.678-37.084-21.552l-0.11-0.21c-3.594-6.12-5.716-13.479-5.716-21.333s2.123-15.214 5.825-21.535l-0.109 0.201 341.333-597.333c7.227-13.89 21.512-23.212 37.973-23.212s30.746 9.323 37.861 22.976l0.112 0.236 343.467 597.333c4.444 6.627 7.092 14.782 7.092 23.556 0 7.304-1.836 14.18-5.070 20.191l0.112-0.227zM512 341.333c-23.564 0-42.667 19.103-42.667 42.667v0 170.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-170.667c0-23.564-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["exclamation-triangle"]},"attrs":[],"properties":{"order":4945,"id":739,"name":"exclamation-triangle","prevSize":32,"code":60114},"setIdx":0,"setId":0,"iconIdx":466},{"icon":{"paths":["M512 597.333c23.564 0 42.667-19.103 42.667-42.667v0-256c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 256c0 23.564 19.103 42.667 42.667 42.667v0zM512 768c29.455 0 53.333-23.878 53.333-53.333s-23.878-53.333-53.333-53.333c-29.455 0-53.333 23.878-53.333 53.333v0c0 29.455 23.878 53.333 53.333 53.333v0z"],"attrs":[],"grid":0,"tags":["exclamation"]},"attrs":[],"properties":{"order":4946,"id":738,"name":"exclamation","prevSize":32,"code":60115},"setIdx":0,"setId":0,"iconIdx":467},{"icon":{"paths":["M407.040 321.707h-42.667c-23.564-0-42.667 19.103-42.667 42.667v0 42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM659.627 574.293c-23.564 0-42.667 19.103-42.667 42.667v0c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h42.667c23.564 0 42.667-19.103 42.667-42.667v0-42.667c0-23.564-19.103-42.667-42.667-42.667v0zM896 321.707h-193.707v-193.707c0-23.564-19.103-42.667-42.667-42.667v0h-531.627c-23.564 0-42.667 19.103-42.667 42.667v0 531.627c0 23.564 19.103 42.667 42.667 42.667v0h193.707v193.707c-0 23.564 19.103 42.667 42.667 42.667v0h531.627c23.564 0 42.667-19.103 42.667-42.667v0-531.627c0-23.564-19.103-42.667-42.667-42.667v0zM853.333 853.333h-446.293v-151.040c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0h-151.040v-446.293h446.293v151.040c-23.564-0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667h-0c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0h151.040z"],"attrs":[],"grid":0,"tags":["exclude"]},"attrs":[],"properties":{"order":4947,"id":737,"name":"exclude","prevSize":32,"code":60116},"setIdx":0,"setId":0,"iconIdx":468},{"icon":{"paths":["M170.667 512c0 23.564 19.103 42.667 42.667 42.667v0h323.84l-98.133 97.707c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 170.667-170.667c3.773-3.937 6.808-8.616 8.859-13.791l0.101-0.289c2.024-4.793 3.201-10.366 3.201-16.213s-1.176-11.42-3.305-16.495l0.105 0.281c-2.152-5.464-5.187-10.143-8.974-14.095l0.014 0.015-170.667-170.667c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l0 0 98.133 97.707h-323.84c-23.564 0-42.667 19.103-42.667 42.667v0zM725.333 85.333h-426.667c-70.692 0-128 57.308-128 128v0 128c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-128c0-23.564 19.103-42.667 42.667-42.667v0h426.667c23.564 0 42.667 19.103 42.667 42.667v0 597.333c0 23.564-19.103 42.667-42.667 42.667v0h-426.667c-23.564 0-42.667-19.103-42.667-42.667v0-128c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 128c0 70.692 57.308 128 128 128v0h426.667c70.692 0 128-57.308 128-128v0-597.333c0-70.692-57.308-128-128-128v0z"],"attrs":[],"grid":0,"tags":["exit"]},"attrs":[],"properties":{"order":4948,"id":736,"name":"exit","prevSize":32,"code":60117},"setIdx":0,"setId":0,"iconIdx":469},{"icon":{"paths":["M417.707 545.707l-247.040 247.467v-67.84c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 170.667c0.073 5.873 1.322 11.435 3.52 16.489l-0.107-0.275c4.422 10.46 12.58 18.618 22.76 22.935l0.28 0.105c4.778 2.092 10.34 3.34 16.186 3.413l0.027 0h170.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-67.84l247.467-247.040c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l0-0zM935.253 111.787c-4.422-10.46-12.58-18.618-22.76-22.935l-0.28-0.105c-4.778-2.092-10.34-3.34-16.186-3.413l-0.027-0h-170.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h67.84l-247.467 247.040c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 247.040-247.467v67.84c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-170.667c-0.073-5.873-1.322-11.435-3.52-16.489l0.107 0.275z"],"attrs":[],"grid":0,"tags":["expand-alt"]},"attrs":[],"properties":{"order":4949,"id":735,"name":"expand-alt","prevSize":32,"code":60118},"setIdx":0,"setId":0,"iconIdx":470},{"icon":{"paths":["M396.373 567.040l-225.707 226.133v-67.84c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 170.667c0.073 5.873 1.322 11.435 3.52 16.489l-0.107-0.275c4.422 10.46 12.58 18.618 22.76 22.935l0.28 0.105c4.778 2.092 10.34 3.34 16.186 3.413l0.027 0h170.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-67.84l226.133-225.707c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l0-0zM230.827 170.667h67.84c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-170.667c-5.873 0.073-11.435 1.322-16.489 3.52l0.275-0.107c-10.46 4.422-18.618 12.58-22.935 22.76l-0.105 0.28c-2.092 4.778-3.34 10.34-3.413 16.186l-0 0.027v170.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-67.84l225.707 226.133c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003zM896 682.667c-23.564 0-42.667 19.103-42.667 42.667v0 67.84l-225.707-226.133c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l-0-0 226.133 225.707h-67.84c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h170.667c5.873-0.073 11.435-1.322 16.489-3.52l-0.275 0.107c10.46-4.422 18.618-12.58 22.935-22.76l0.105-0.28c2.092-4.778 3.34-10.34 3.413-16.186l0-0.027v-170.667c0-23.564-19.103-42.667-42.667-42.667v0zM935.253 111.787c-4.422-10.46-12.58-18.618-22.76-22.935l-0.28-0.105c-4.778-2.092-10.34-3.34-16.186-3.413l-0.027-0h-170.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h67.84l-226.133 225.707c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 225.707-226.133v67.84c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-170.667c-0.073-5.873-1.322-11.435-3.52-16.489l0.107 0.275z"],"attrs":[],"grid":0,"tags":["expand-arrows-alt"]},"attrs":[],"properties":{"order":4950,"id":734,"name":"expand-arrows-alt","prevSize":32,"code":60119},"setIdx":0,"setId":0,"iconIdx":471},{"icon":{"paths":["M896 341.333c23.564 0 42.667-19.103 42.667-42.667v0-170.667c-0.073-5.873-1.322-11.435-3.52-16.489l0.107 0.275c-4.422-10.46-12.58-18.618-22.76-22.935l-0.28-0.105c-4.778-2.092-10.34-3.34-16.186-3.413l-0.027-0h-170.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h67.84l-281.173 281.173-281.173-281.173h67.84c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-170.667c-5.873 0.073-11.435 1.322-16.489 3.52l0.275-0.107c-10.46 4.422-18.618 12.58-22.935 22.76l-0.105 0.28c-2.092 4.778-3.34 10.34-3.413 16.186l-0 0.027v170.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-67.84l281.173 281.173-281.173 281.173v-67.84c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 170.667c0.073 5.873 1.322 11.435 3.52 16.489l-0.107-0.275c4.422 10.46 12.58 18.618 22.76 22.935l0.28 0.105c4.778 2.092 10.34 3.34 16.186 3.413l0.027 0h170.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-67.84l281.173-281.173 281.173 281.173h-67.84c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h170.667c5.873-0.073 11.435-1.322 16.489-3.52l-0.275 0.107c10.46-4.422 18.618-12.58 22.935-22.76l0.105-0.28c2.092-4.778 3.34-10.34 3.413-16.186l0-0.027v-170.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 67.84l-281.173-281.173 281.173-281.173v67.84c0 23.564 19.103 42.667 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["expand-arrows"]},"attrs":[],"properties":{"order":4951,"id":733,"name":"expand-arrows","prevSize":32,"code":60120},"setIdx":0,"setId":0,"iconIdx":472},{"icon":{"paths":["M469.333 512h-341.333c-23.564 0-42.667 19.103-42.667 42.667v0 341.333c0 23.564 19.103 42.667 42.667 42.667v0h341.333c23.564 0 42.667-19.103 42.667-42.667v0-341.333c0-23.564-19.103-42.667-42.667-42.667v0zM426.667 853.333h-256v-256h256zM935.253 111.787c-4.422-10.46-12.58-18.618-22.76-22.935l-0.28-0.105c-4.778-2.092-10.34-3.34-16.186-3.413l-0.027-0h-256c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h153.173l-226.133 225.707c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 225.707-226.133v153.173c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-256c-0.073-5.873-1.322-11.435-3.52-16.489l0.107 0.275z"],"attrs":[],"grid":0,"tags":["expand-from-corner"]},"attrs":[],"properties":{"order":4952,"id":732,"name":"expand-from-corner","prevSize":32,"code":60121},"setIdx":0,"setId":0,"iconIdx":473},{"icon":{"paths":["M391.253 433.92c0.073 0 0.16 0.001 0.247 0.001 11.721 0 22.338-4.726 30.049-12.377l-0.003 0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003-190.72-190.293h67.84c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-170.667c-5.873 0.073-11.435 1.322-16.489 3.52l0.275-0.107c-10.46 4.422-18.618 12.58-22.935 22.76l-0.105 0.28c-2.092 4.778-3.34 10.34-3.413 16.186l-0 0.027v170.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-67.84l190.293 190.72c7.709 7.648 18.326 12.374 30.047 12.374 0.087 0 0.173-0 0.26-0.001l-0.013 0zM663.040 360.96c-7.733-7.795-18.45-12.621-30.293-12.621s-22.56 4.826-30.291 12.618l-0.003 0.003-241.493 241.493c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003c7.709 7.648 18.326 12.374 30.047 12.374 0.087 0 0.173-0 0.26-0.001l-0.013 0c0.073 0 0.16 0.001 0.247 0.001 11.721 0 22.338-4.726 30.049-12.377l-0.003 0.003 241.493-241.493c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003zM896 682.667c-23.564 0-42.667 19.103-42.667 42.667v0 67.84l-190.293-190.72c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l0 0 190.72 190.293h-67.84c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h170.667c5.873-0.073 11.435-1.322 16.489-3.52l-0.275 0.107c10.46-4.422 18.618-12.58 22.935-22.76l0.105-0.28c2.092-4.778 3.34-10.34 3.413-16.186l0-0.027v-170.667c0-23.564-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["expand-left"]},"attrs":[],"properties":{"order":4953,"id":731,"name":"expand-left","prevSize":32,"code":60122},"setIdx":0,"setId":0,"iconIdx":474},{"icon":{"paths":["M362.667 601.6l-192 192v-68.267c0-25.6-17.067-42.667-42.667-42.667s-42.667 17.067-42.667 42.667v170.667c0 4.267 0 12.8 4.267 17.067 4.267 8.533 12.8 17.067 21.333 21.333 4.267 4.267 12.8 4.267 17.067 4.267h170.667c25.6 0 42.667-17.067 42.667-42.667s-17.067-42.667-42.667-42.667h-68.267l192-192c17.067-17.067 17.067-42.667 0-59.733s-42.667-17.067-59.733 0zM925.867 98.133c0 0 0 0 0 0-8.533-8.533-21.333-12.8-29.867-12.8h-170.667c-25.6 0-42.667 17.067-42.667 42.667s17.067 42.667 42.667 42.667h68.267l-192 192c-17.067 17.067-17.067 42.667 0 59.733v0c8.533 8.533 17.067 12.8 29.867 12.8s21.333-4.267 29.867-12.8l192-192v68.267c0 25.6 17.067 42.667 42.667 42.667s42.667-17.067 42.667-42.667v-170.667c0-8.533-4.267-21.333-12.8-29.867zM661.333 601.6l-238.933-238.933c-17.067-17.067-42.667-17.067-59.733 0s-17.067 42.667 0 59.733l243.2 243.2c8.533 8.533 17.067 12.8 29.867 12.8s21.333-4.267 29.867-12.8c12.8-17.067 12.8-46.933-4.267-64 0 0 0 0 0 0z"],"attrs":[],"grid":0,"tags":["expand-right"]},"attrs":[],"properties":{"order":4954,"id":730,"name":"expand-right","prevSize":32,"code":60123},"setIdx":0,"setId":0,"iconIdx":475},{"icon":{"paths":["M371.627 328.96l97.707-98.133v409.173c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-409.173l97.707 98.133c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003-170.667-170.667c-3.937-3.773-8.616-6.808-13.791-8.859l-0.289-0.101c-4.793-2.024-10.366-3.201-16.213-3.201s-11.42 1.176-16.495 3.305l0.281-0.105c-5.464 2.152-10.143 5.187-14.095 8.974l0.015-0.014-170.667 170.667c-7.753 7.753-12.548 18.463-12.548 30.293 0 23.661 19.181 42.841 42.841 42.841 11.83 0 22.541-4.795 30.293-12.548l0-0zM896 597.333c-23.564 0-42.667 19.103-42.667 42.667v0 170.667c0 23.564-19.103 42.667-42.667 42.667v0h-597.333c-23.564 0-42.667-19.103-42.667-42.667v0-170.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 170.667c0 70.692 57.308 128 128 128v0h597.333c70.692 0 128-57.308 128-128v0-170.667c0-23.564-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["export"]},"attrs":[],"properties":{"order":4955,"id":729,"name":"export","prevSize":32,"code":60124},"setIdx":0,"setId":0,"iconIdx":476},{"icon":{"paths":["M469.333 256h-170.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h170.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM810.667 85.333h-597.333c-70.692 0-128 57.308-128 128v0 597.333c0 70.692 57.308 128 128 128v0h597.333c70.692 0 128-57.308 128-128v0-597.333c0-70.692-57.308-128-128-128v0zM170.667 793.173v-579.84c0-23.564 19.103-42.667 42.667-42.667v0h579.84zM853.333 810.667c0 23.564-19.103 42.667-42.667 42.667v0h-579.84l622.507-622.507zM554.667 725.333h42.667v42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-42.667v-42.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 42.667h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["exposure-alt"]},"attrs":[],"properties":{"order":4956,"id":728,"name":"exposure-alt","prevSize":32,"code":60125},"setIdx":0,"setId":0,"iconIdx":477},{"icon":{"paths":["M469.333 298.667h-42.667v-42.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 42.667h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h42.667v42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM554.667 768h170.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-170.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM810.667 85.333h-597.333c-70.692 0-128 57.308-128 128v0 597.333c0 70.692 57.308 128 128 128v0h597.333c70.692 0 128-57.308 128-128v0-597.333c0-70.692-57.308-128-128-128v0zM170.667 793.173v-579.84c0-23.564 19.103-42.667 42.667-42.667v0h579.84zM853.333 810.667c0 23.564-19.103 42.667-42.667 42.667v0h-579.84l622.507-622.507z"],"attrs":[],"grid":0,"tags":["exposure-increase"]},"attrs":[],"properties":{"order":4957,"id":727,"name":"exposure-increase","prevSize":32,"code":60126},"setIdx":0,"setId":0,"iconIdx":478},{"icon":{"paths":["M768 461.653c-23.564 0-42.667 19.103-42.667 42.667v0 306.347c0 23.564-19.103 42.667-42.667 42.667v0h-469.333c-23.564 0-42.667-19.103-42.667-42.667v0-469.333c0-23.564 19.103-42.667 42.667-42.667v0h306.347c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-306.347c-70.692 0-128 57.308-128 128v0 469.333c0 70.692 57.308 128 128 128v0h469.333c70.692 0 128-57.308 128-128v0-306.347c0-23.564-19.103-42.667-42.667-42.667v0zM935.253 111.787c-4.422-10.46-12.58-18.618-22.76-22.935l-0.28-0.105c-4.778-2.092-10.34-3.34-16.186-3.413l-0.027-0h-256c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h153.173l-439.467 439.040c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 439.040-439.467v153.173c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-256c-0.073-5.873-1.322-11.435-3.52-16.489l0.107 0.275z"],"attrs":[],"grid":0,"tags":["external-link-alt"]},"attrs":[],"properties":{"order":4958,"id":726,"name":"external-link-alt","prevSize":32,"code":60127},"setIdx":0,"setId":0,"iconIdx":479},{"icon":{"paths":["M466.773 259.413c13.465-2.172 28.988-3.414 44.8-3.414 0.15 0 0.3 0 0.45 0l-0.023-0c135.68 0 263.253 97.707 337.493 256-13.082 27.629-25.875 50.558-39.96 72.581l1.56-2.608c-4.281 6.539-6.828 14.548-6.828 23.152 0 0.111 0 0.221 0.001 0.331l-0-0.017c0.246 23.376 19.253 42.231 42.664 42.231 15.532 0 29.126-8.299 36.588-20.705l0.107-0.193c18.073-27.883 35.345-60.118 49.946-93.781l1.681-4.352c2.193-4.968 3.47-10.762 3.47-16.853s-1.277-11.885-3.577-17.127l0.107 0.274c-86.187-200.107-248.32-324.267-423.253-324.267-0.496-0.003-1.083-0.004-1.67-0.004-20.521 0-40.606 1.864-60.095 5.433l2.032-0.309c-20.581 3.594-36.025 21.327-36.025 42.667 0 23.902 19.377 43.279 43.279 43.279 2.562 0 5.073-0.223 7.513-0.65l-0.259 0.038zM158.293 97.707c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l-0-0 132.267 131.84c-58.96 56.815-106.642 124.869-139.666 200.773l-1.561 4.027c-2.251 5.026-3.562 10.893-3.562 17.067s1.311 12.040 3.67 17.338l-0.108-0.271c86.187 200.107 248.32 324.267 423.253 324.267 80.328-0.573 154.831-25.028 216.894-66.607l-1.428 0.901 138.24 138.667c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003zM429.653 489.813l104.533 104.533c-6.377 1.899-13.705 2.992-21.288 2.992-0.316 0-0.632-0.002-0.947-0.006l0.048 0c-47.128 0-85.333-38.205-85.333-85.333v0c-0.003-0.267-0.005-0.583-0.005-0.899 0-7.583 1.093-14.91 3.13-21.834l-0.138 0.546zM512 768c-135.68 0-263.253-97.707-337.067-256 28.964-63.039 67.73-116.689 114.97-161.491l0.23-0.216 75.52 76.373c-13.214 23.67-20.994 51.93-20.994 82.007 0 94.257 76.41 170.667 170.667 170.667 30.077 0 58.337-7.78 82.877-21.438l-0.869 0.444 67.84 66.987c-43.849 26.235-96.601 42.003-152.986 42.665l-0.187 0.002z"],"attrs":[],"grid":0,"tags":["eye-slash"]},"attrs":[],"properties":{"order":4959,"id":725,"name":"eye-slash","prevSize":32,"code":60128},"setIdx":0,"setId":0,"iconIdx":480},{"icon":{"paths":["M935.253 494.933c-86.187-200.107-248.32-324.267-423.253-324.267s-337.067 124.16-423.253 324.267c-2.251 5.026-3.562 10.893-3.562 17.067s1.311 12.040 3.67 17.338l-0.108-0.271c86.187 200.107 248.32 324.267 423.253 324.267s337.067-124.16 423.253-324.267c2.251-5.026 3.562-10.893 3.562-17.067s-1.311-12.040-3.67-17.338l0.108 0.271zM512 768c-135.253 0-263.253-97.707-337.067-256 73.813-158.293 201.813-256 337.067-256s263.253 97.707 337.067 256c-73.813 158.293-201.813 256-337.067 256zM512 341.333c-94.257 0-170.667 76.41-170.667 170.667s76.41 170.667 170.667 170.667c94.257 0 170.667-76.41 170.667-170.667v0c0-94.257-76.41-170.667-170.667-170.667v0zM512 597.333c-47.128 0-85.333-38.205-85.333-85.333s38.205-85.333 85.333-85.333c47.128 0 85.333 38.205 85.333 85.333v0c0 47.128-38.205 85.333-85.333 85.333v0z"],"attrs":[],"grid":0,"tags":["eye"]},"attrs":[],"properties":{"order":4960,"id":724,"name":"eye","prevSize":32,"code":60129},"setIdx":0,"setId":0,"iconIdx":481},{"icon":{"paths":["M645.12 226.987h80.213v-135.68c-34.561-3.804-74.638-5.975-115.222-5.975-0.593 0-1.185 0-1.778 0.001l0.093-0c-116.053 0-195.413 70.827-195.413 200.533v111.787h-130.987v151.893h130.987v389.12h157.013v-389.12h130.56l19.627-151.893h-150.187v-96.853c0-44.8 11.947-73.813 75.093-73.813z"],"attrs":[],"grid":0,"tags":["facebook-f"]},"attrs":[],"properties":{"order":4961,"id":723,"name":"facebook-f","prevSize":32,"code":60130},"setIdx":0,"setId":0,"iconIdx":482},{"icon":{"paths":["M511.625 42.685c-4.911-0.191-10.677-0.3-16.468-0.3-250.12 0-452.882 202.762-452.882 452.882 0 1.392 0.006 2.782 0.019 4.171l-0.002-0.212c-0.023 1.688-0.036 3.68-0.036 5.675 0 130.534 56.033 247.98 145.359 329.598l0.344 0.31 2.207 72.125c1.338 41.357 35.186 74.375 76.745 74.375 0.002 0 0.004-0 0.006-0l-0 0c11.217-0.015 21.872-2.406 31.493-6.696l-0.493 0.197 81.958-36.125c39.169 10.849 84.145 17.085 130.577 17.085 0.412 0 0.825-0 1.237-0.001l-0.064 0c4.913 0.191 10.682 0.3 16.476 0.3 250.139 0 452.917-202.778 452.917-452.917 0-1.38-0.006-2.758-0.018-4.135l0.001 0.21c0.011-1.166 0.017-2.544 0.017-3.924 0-250.139-202.778-452.917-452.917-452.917-5.794 0-11.562 0.109-17.302 0.324l0.828-0.025zM511.625 870.435c-0.36 0.001-0.787 0.002-1.213 0.002-39.569 0-77.862-5.462-114.166-15.672l2.963 0.712c-5.994-1.682-12.877-2.648-19.986-2.648-11.242 0-21.919 2.417-31.54 6.76l0.484-0.195-73.125 32.25-1.917-63.708c-0.917-21.649-10.613-40.866-25.595-54.312l-0.072-0.063c-73.731-66.558-119.87-162.474-119.87-269.166 0-1.817 0.013-3.631 0.040-5.442l-0.003 0.274c-0.004-0.601-0.006-1.311-0.006-2.023 0-204.054 165.418-369.472 369.472-369.472 5.112 0 10.199 0.104 15.26 0.309l-0.726-0.023c3.762-0.137 8.181-0.214 12.618-0.214 205.131 0 371.423 166.292 371.423 371.423s-166.292 371.423-371.423 371.423c-4.437 0-8.856-0.078-13.256-0.232l0.638 0.018zM670.959 366.31l-98.667 117.542-142.792-87.75c-6.349-3.967-14.061-6.319-22.322-6.319-13.097 0-24.813 5.912-32.625 15.214l-0.053 0.065-130.208 155.165c-6.259 7.374-10.065 17.001-10.065 27.518 0 23.554 19.094 42.647 42.647 42.647 13.13 0 24.874-5.933 32.697-15.265l0.054-0.066 106.581-126.959 142.792 87.709c6.354 3.975 14.074 6.332 22.344 6.332 13.084 0 24.79-5.9 32.603-15.184l0.053-0.065 122.292-145.749c6.314-7.391 10.155-17.059 10.155-27.624 0-23.554-19.094-42.647-42.647-42.647-13.178 0-24.961 5.977-32.784 15.369l-0.056 0.069z"],"attrs":[],"grid":0,"tags":["facebook-messenger-alt"]},"attrs":[],"properties":{"order":4962,"id":722,"name":"facebook-messenger-alt","prevSize":32,"code":60131},"setIdx":0,"setId":0,"iconIdx":483},{"icon":{"paths":["M512 85.333c-4.455-0.173-9.686-0.271-14.94-0.271-227.394 0-411.733 184.339-411.733 411.733 0 0.845 0.003 1.69 0.008 2.534l-0.001-0.13c-0.020 1.496-0.031 3.263-0.031 5.033 0 119.399 51.572 226.753 133.655 301.003l0.35 0.311c6.65 5.942 10.976 14.365 11.516 23.801l0.004 0.092v75.947c0.795 18.456 15.95 33.118 34.53 33.118 4.947 0 9.65-1.039 13.905-2.911l-0.222 0.087 85.333-37.12c3.357-1.307 7.244-2.064 11.307-2.064s7.949 0.757 11.525 2.138l-0.219-0.074c36.679 10.297 78.8 16.216 122.303 16.216 0.503 0 1.006-0.001 1.508-0.002l-0.078 0c0.19 0 0.415 0 0.64 0 229.044 0 414.72-185.677 414.72-414.72 0-228.819-185.312-414.356-414.046-414.72l-0.035-0zM768 403.627l-125.013 198.827c-11.517 18.075-31.455 29.891-54.154 29.891-14.495 0-27.864-4.819-38.593-12.941l0.16 0.116-99.84-74.667c-4.225-3.196-9.568-5.12-15.36-5.12s-11.135 1.924-15.424 5.167l0.064-0.047-134.827 102.4c-3.35 2.603-7.615 4.174-12.247 4.174-11.075 0-20.053-8.978-20.053-20.053 0-4.094 1.227-7.901 3.333-11.075l-0.046 0.074 125.013-198.827c11.517-18.075 31.455-29.891 54.154-29.891 14.495 0 27.864 4.819 38.593 12.941l-0.16-0.116 99.84 74.667c4.225 3.196 9.568 5.12 15.36 5.12s11.135-1.924 15.424-5.167l-0.064 0.047 134.827-102.4c3.35-2.603 7.615-4.174 12.247-4.174 11.075 0 20.053 8.978 20.053 20.053 0 4.094-1.227 7.901-3.333 11.075l0.046-0.074z"],"attrs":[],"grid":0,"tags":["facebook-messenger"]},"attrs":[],"properties":{"order":4963,"id":721,"name":"facebook-messenger","prevSize":32,"code":60132},"setIdx":0,"setId":0,"iconIdx":484},{"icon":{"paths":["M891.733 85.333h-759.467c-25.921-0-46.933 21.013-46.933 46.933h0v759.467c-0 25.921 21.013 46.933 46.933 46.933h408.747v-330.667h-110.933v-128h110.933v-96c-0.51-4.724-0.801-10.205-0.801-15.753 0-85.774 69.533-155.307 155.307-155.307 3.885 0 7.737 0.143 11.551 0.423l-0.51-0.030c1.58-0.010 3.449-0.016 5.32-0.016 33.149 0 65.862 1.866 98.039 5.498l-3.946-0.362v115.2h-67.84c-53.76 0-64 25.6-64 62.72v82.347h128l-16.64 128h-111.36v331.947h217.6c25.921 0 46.933-21.013 46.933-46.933v0-759.467c0-25.921-21.013-46.933-46.933-46.933v0z"],"attrs":[],"grid":0,"tags":["facebook"]},"attrs":[],"properties":{"order":4964,"id":720,"name":"facebook","prevSize":32,"code":60133},"setIdx":0,"setId":0,"iconIdx":485},{"icon":{"paths":["M874.667 128h-298.667c-70.692 0-128 57.308-128 128v0 597.333c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-298.667h256c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-256v-213.333c0-23.564 19.103-42.667 42.667-42.667v0h298.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM234.667 128c-70.692 0-128 57.308-128 128s57.308 128 128 128c70.692 0 128-57.308 128-128v0c0-70.692-57.308-128-128-128v0zM234.667 298.667c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667c23.564 0 42.667 19.103 42.667 42.667v0c0 23.564-19.103 42.667-42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["fahrenheit"]},"attrs":[],"properties":{"order":4965,"id":719,"name":"fahrenheit","prevSize":32,"code":60134},"setIdx":0,"setId":0,"iconIdx":486},{"icon":{"paths":["M669.44 384c-5.633-29.491-20.96-54.708-42.476-72.804l-0.191-0.156c-22.375-19.614-51.882-31.578-84.184-31.578-0.404 0-0.808 0.002-1.211 0.006l0.062-0h-336.64c-0.582-0.010-1.27-0.015-1.958-0.015-38.26 0-72.599 16.786-96.054 43.395l-0.121 0.14v2.56c-18.425 22.019-29.614 50.643-29.614 81.88 0 6.791 0.529 13.458 1.547 19.962l-0.093-0.722 37.547 213.333c10.933 60.52 63.208 105.828 126.065 105.828 0.68 0 1.359-0.005 2.037-0.016l-0.102 0.001h338.773c39.135-0.091 74.131-17.73 97.55-45.463l0.157-0.19c17.705-21.779 28.428-49.853 28.428-80.432 0-7.915-0.718-15.661-2.093-23.179l0.119 0.784zM523.947 362.667l-99.84 112.64c-7.851 8.802-19.225 14.317-31.887 14.317-10.276 0-19.703-3.632-27.068-9.683l0.074 0.059-144.64-117.333zM613.547 645.973c-7.806 9.326-19.414 15.247-32.407 15.36l-0.019 0h-338.773c-0.184 0.003-0.402 0.005-0.62 0.005-21.003 0-38.462-15.176-42.009-35.16l-0.038-0.258-34.56-199.253 146.347 119.467c21.835 17.866 50.033 28.693 80.76 28.693 38.103 0 72.317-16.648 95.765-43.068l0.115-0.132 100.693-113.493 34.133 193.28c0.382 2.143 0.6 4.611 0.6 7.129 0 10.475-3.775 20.069-10.039 27.495l0.052-0.064zM904.96 448h-85.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h85.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM904.96 362.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-128c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["fast-mail-alt"]},"attrs":[],"properties":{"order":4966,"id":718,"name":"fast-mail-alt","prevSize":32,"code":60135},"setIdx":0,"setId":0,"iconIdx":487},{"icon":{"paths":["M204.373 448h-85.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h85.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM920.32 326.827v-2.56c-23.653-28.754-59.236-46.95-99.070-46.95-0.721 0-1.44 0.006-2.158 0.018l0.108-0.001h-338.347c-0.342-0.003-0.745-0.005-1.15-0.005-32.301 0-61.808 11.965-84.33 31.705l0.147-0.126c-21.451 18.967-36.286 44.981-40.87 74.39l-0.090 0.703-37.547 213.333c-1.222 6.643-1.922 14.288-1.922 22.096 0 31.493 11.373 60.329 30.237 82.626l-0.155-0.188c23.576 27.923 58.572 45.562 97.691 45.653l0.016 0h338.773c0.575 0.009 1.255 0.015 1.935 0.015 62.857 0 115.132-45.308 125.948-105.048l0.117-0.78 37.547-213.333c1.093-6.284 1.718-13.521 1.718-20.903 0-30.674-10.79-58.828-28.781-80.874l0.183 0.231zM803.413 362.667l-145.067 117.76c-7.253 5.884-16.598 9.446-26.774 9.446-12.779 0-24.245-5.618-32.065-14.518l-0.041-0.048-99.413-112.64zM823.893 625.92c-3.585 20.242-21.043 35.418-42.046 35.418-0.218 0-0.436-0.002-0.653-0.005l0.033 0h-338.347c-13.013-0.113-24.621-6.034-32.372-15.293l-0.054-0.067c-6.211-7.362-9.986-16.955-9.986-27.431 0-2.518 0.218-4.986 0.637-7.384l-0.037 0.255 34.133-193.28 100.267 113.493c23.573 26.698 57.88 43.449 96.099 43.449 30.628 0 58.743-10.757 80.774-28.699l-0.233 0.184 146.773-119.893zM247.040 277.333h-128c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h128c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["fast-mail"]},"attrs":[],"properties":{"order":4967,"id":717,"name":"fast-mail","prevSize":32,"code":60136},"setIdx":0,"setId":0,"iconIdx":488},{"icon":{"paths":["M938.667 412.587c-5.546-15.728-19.622-27.083-36.531-28.575l-0.162-0.012-242.773-35.413-108.8-220.587c-7.071-14.361-21.602-24.069-38.4-24.069s-31.329 9.707-38.289 23.819l-0.111 0.25-108.8 220.16-242.773 35.84c-16.295 2.38-29.452 13.684-34.473 28.712l-0.087 0.301c-1.181 3.729-1.862 8.018-1.862 12.465 0 11.798 4.788 22.477 12.527 30.201l0.001 0.001 176.213 170.667-42.667 242.347c-0.602 2.687-0.947 5.773-0.947 8.939 0 23.564 19.103 42.667 42.667 42.667 7.72 0 14.961-2.050 21.208-5.636l-0.208 0.11 217.6-113.92 217.6 113.92c5.609 3.221 12.331 5.12 19.497 5.12 0.046 0 0.091-0 0.137-0l-0.007 0c0.045 0 0.099 0 0.152 0 9.401 0 18.091-3.040 25.142-8.191l-0.121 0.084c10.845-7.836 17.82-20.446 17.82-34.685 0-2.823-0.274-5.582-0.797-8.251l0.044 0.27-42.667-242.347 176.213-170.667c9.255-7.876 15.087-19.534 15.087-32.554 0-3.899-0.523-7.676-1.503-11.265l0.070 0.299zM676.267 583.253c-7.986 7.762-12.941 18.606-12.941 30.608 0 2.451 0.207 4.853 0.603 7.19l-0.035-0.252 30.72 179.2-160.427-85.333c-5.848-2.957-12.748-4.689-20.053-4.689s-14.205 1.732-20.313 4.807l0.26-0.119-160.427 85.333 30.72-179.2c0.361-2.086 0.568-4.488 0.568-6.939 0-12.002-4.955-22.846-12.931-30.598l-0.010-0.010-128-128 179.627-26.027c14.318-2.046 26.186-10.949 32.315-23.22l0.112-0.247 75.947-162.56 80.213 162.987c6.241 12.517 18.109 21.421 32.198 23.44l0.228 0.027 179.627 26.027z"],"attrs":[],"grid":0,"tags":["favorite"]},"attrs":[],"properties":{"order":4968,"id":716,"name":"favorite","prevSize":32,"code":60137},"setIdx":0,"setId":0,"iconIdx":489},{"icon":{"paths":["M938.667 42.667h-298.667c-0.127-0.001-0.277-0.001-0.427-0.001-50.86 0-93.202 36.471-102.299 84.687l-0.102 0.647-39.253 215.467c-1.056 5.567-1.66 11.97-1.66 18.514 0 25.508 9.174 48.874 24.403 66.977l-0.13-0.159c19.368 22.917 48.085 37.41 80.19 37.547l0.024 0h124.587l-10.667 28.16c-5.665 14.575-8.948 31.446-8.948 49.083 0 76.065 61.057 137.869 136.834 139.075l0.114 0.001c0.1 0.001 0.219 0.001 0.337 0.001 17.227 0 32.070-10.21 38.807-24.909l0.109-0.266 95.573-215.893c2.070-4.364 3.445-9.443 3.832-14.795l0.008-0.138v-341.333c0-23.564-19.103-42.667-42.667-42.667v0zM896 415.147l-78.080 176.213c-7.739-4.264-14.162-10.006-19.083-16.894l-0.117-0.172c-6.015-8.425-9.617-18.932-9.617-30.28 0-6.916 1.338-13.52 3.769-19.566l-0.125 0.353 16.213-42.667c3.036-7.648 4.797-16.508 4.797-25.78 0-15.619-4.995-30.071-13.476-41.845l0.146 0.212c-13.299-18.685-34.879-30.725-59.272-30.725-0.312 0-0.624 0.002-0.935 0.006l0.047-0h-140.373c-0.016 0-0.036 0-0.055 0-5.937 0-11.258-2.636-14.857-6.802l-0.021-0.025c-2.553-3.474-4.086-7.836-4.086-12.556 0-1.14 0.089-2.26 0.262-3.352l-0.016 0.121 39.253-213.333c-0.029-0.389-0.045-0.844-0.045-1.302 0-10.368 8.405-18.773 18.773-18.773 0.316 0 0.63 0.008 0.942 0.023l-0.044-0.002h256zM424.107 556.8h-123.307l10.667-28.16c5.461-14.33 8.623-30.903 8.623-48.214 0-76.701-62.083-138.901-138.739-139.093l-0.018-0c-0.1-0.001-0.219-0.001-0.337-0.001-17.227 0-32.070 10.21-38.807 24.909l-0.109 0.266-95.573 215.893c-2.34 5.007-3.745 10.861-3.84 17.033l-0 0.034v341.333c0 23.564 19.103 42.667 42.667 42.667v0h298.667c0.127 0.001 0.277 0.001 0.427 0.001 50.86 0 93.202-36.471 102.299-84.687l0.102-0.647 39.253-213.333c1.056-5.567 1.66-11.97 1.66-18.514 0-25.508-9.174-48.874-24.403-66.977l0.13 0.159c-18.349-24.665-46.792-40.934-79.097-42.655l-0.263-0.011zM403.627 880.213c-1.477 9.020-9.214 15.818-18.539 15.818-0.383 0-0.762-0.011-1.139-0.034l0.052 0.002h-256v-287.147l78.080-176.213c7.739 4.264 14.162 10.006 19.083 16.894l0.117 0.172c6.015 8.425 9.617 18.932 9.617 30.28 0 6.916-1.338 13.52-3.769 19.566l0.125-0.353-16.213 42.667c-3.036 7.648-4.797 16.508-4.797 25.78 0 15.619 4.995 30.071 13.476 41.845l-0.146-0.212c13.246 19.172 35.106 31.574 59.862 31.574 0.105 0 0.21-0 0.315-0.001l-0.016 0h140.373c0.016-0 0.036-0 0.055-0 5.937 0 11.258 2.636 14.857 6.802l0.021 0.025c2.553 3.474 4.086 7.836 4.086 12.556 0 1.14-0.089 2.26-0.262 3.352l0.016-0.121z"],"attrs":[],"grid":0,"tags":["feedback"]},"attrs":[],"properties":{"order":4969,"id":715,"name":"feedback","prevSize":32,"code":60138},"setIdx":0,"setId":0,"iconIdx":490},{"icon":{"paths":["M512 298.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM268.963 688.384c-12.844 7.514-21.334 21.241-21.334 36.951 0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667c0-7.855-2.123-15.215-5.826-21.536l0.109 0.201c-7.515-12.843-21.241-21.332-36.95-21.332-7.855 0-15.213 2.122-21.534 5.825l0.201-0.109zM755.037 688.384c-6.12-3.594-13.479-5.717-21.335-5.717-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c15.71 0 29.436-8.49 36.842-21.132l0.109-0.201c3.594-6.12 5.717-13.479 5.717-21.334 0-15.709-8.49-29.435-21.132-36.839l-0.201-0.109zM879.375 569.293v-0.020c-37.457-35.275-88.065-56.952-143.735-56.952-17.522 0-34.543 2.148-50.813 6.194l1.444-0.304-17.897-32.522c35.304-37.887 56.975-88.884 56.975-144.943 0-100.148-69.164-184.141-162.332-206.82l-1.456-0.3c-14.724-3.601-31.627-5.666-49.013-5.666-50.662 0-97.229 17.538-133.959 46.873l0.431-0.332c-49.142 39.249-80.353 99.163-80.353 166.367 0 0.164 0 0.328 0.001 0.491l-0-0.025c-0 0.014-0 0.030-0 0.046 0 56.091 21.961 107.052 57.753 144.755l-0.087-0.092-17.854 32c-14.7-3.623-31.576-5.702-48.937-5.702-117.559 0-212.86 95.301-212.86 212.86 0 21.771 3.268 42.778 9.341 62.558l-0.398-1.508c19.52 63.304 65.788 113.156 125.267 137.133l1.442 0.513c23.126 9.425 49.959 14.896 78.069 14.896 95.335 0 175.974-62.919 202.658-149.498l0.398-1.502 36.979 0.604c27.445 87.739 107.959 150.313 203.097 150.375l0.007 0c96.17-0.105 177.48-63.61 204.39-150.963l0.402-1.516c5.83-18.435 9.19-39.637 9.19-61.623 0-61.386-26.189-116.656-68.004-155.245l-0.144-0.132zM856.812 761.085c-16.097 53.731-65.097 92.216-123.085 92.216-23.576 0-45.665-6.361-64.647-17.461l0.607 0.328c-27.469-16.108-47.997-41.536-57.426-71.854l-0.24-0.896c-10.742-35.495-43.136-60.903-81.473-60.958l-0.006-0h-37.083c-38.338 0.055-70.728 25.452-81.322 60.335l-0.157 0.603c-16.424 52.544-64.651 90.013-121.63 90.013-16.877 0-32.987-3.287-47.723-9.257l0.853 0.305c-48.136-19.020-81.57-65.144-81.57-119.076 0-70.526 57.172-127.698 127.698-127.698 10.383 0 20.476 1.239 30.14 3.577l-0.872-0.178c5.927 1.496 12.731 2.354 19.736 2.354 31.14 0 58.319-16.964 72.798-42.154l0.216-0.408 18.583-32.146c7.142-12.191 11.36-26.845 11.36-42.485 0-22.714-8.896-43.35-23.394-58.614l0.035 0.037c-21.194-22.652-34.209-53.187-34.209-86.761 0-40.293 18.746-76.208 47.992-99.499l0.258-0.199c21.697-17.576 49.637-28.218 80.063-28.218 70.523 0 127.692 57.17 127.692 127.692 0 33.615-12.989 64.197-34.222 86.999l0.071-0.077c-14.471 15.26-23.37 35.928-23.37 58.674 0 15.622 4.197 30.263 11.526 42.858l-0.219-0.407 18.563 32.125c14.77 25.603 41.999 42.559 73.188 42.559 6.949 0 13.701-0.842 20.16-2.429l-0.578 0.12c8.826-2.181 18.958-3.432 29.382-3.432 70.403 0 127.476 57.073 127.476 127.476 0 12.808-1.889 25.176-5.404 36.838l0.234-0.903z"],"attrs":[],"grid":0,"tags":["fidget-spinner"]},"attrs":[],"properties":{"order":4970,"id":714,"name":"fidget-spinner","prevSize":32,"code":60139},"setIdx":0,"setId":0,"iconIdx":491},{"icon":{"paths":["M384 426.667h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM384 512c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h256c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM853.333 381.44c-0.496-4.292-1.396-8.191-2.678-11.913l0.118 0.393v-3.84c-2.174-4.59-4.887-8.531-8.128-11.969l0.021 0.023-256-256c-3.415-3.219-7.356-5.932-11.671-7.988l-0.276-0.118c-0.577-0.086-1.243-0.136-1.92-0.136s-1.343 0.049-1.994 0.145l0.074-0.009c-4.056-2.368-8.817-4.028-13.894-4.674l-0.186-0.019h-258.133c-70.692 0-128 57.308-128 128v0 597.333c0 70.692 57.308 128 128 128v0h426.667c70.692 0 128-57.308 128-128v0-426.667s0 0 0-2.56zM597.333 230.827l110.507 110.507h-67.84c-23.564 0-42.667-19.103-42.667-42.667v0zM768 810.667c0 23.564-19.103 42.667-42.667 42.667v0h-426.667c-23.564 0-42.667-19.103-42.667-42.667v0-597.333c0-23.564 19.103-42.667 42.667-42.667v0h213.333v128c0 70.692 57.308 128 128 128v0h128zM640 682.667h-256c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h256c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["file-alt"]},"attrs":[],"properties":{"order":4971,"id":713,"name":"file-alt","prevSize":32,"code":60140},"setIdx":0,"setId":0,"iconIdx":492},{"icon":{"paths":["M853.333 381.44c-0.496-4.292-1.396-8.191-2.678-11.913l0.118 0.393v-3.84c-2.174-4.59-4.887-8.531-8.128-11.969l0.021 0.023-256-256c-3.415-3.219-7.356-5.932-11.671-7.988l-0.276-0.118h-3.84c-4.056-2.368-8.817-4.028-13.894-4.674l-0.186-0.019h-258.133c-70.692 0-128 57.308-128 128v0 597.333c0 70.692 57.308 128 128 128v0h426.667c70.692 0 128-57.308 128-128v0-426.667s0 0 0-2.56zM597.333 230.827l110.507 110.507h-67.84c-23.564 0-42.667-19.103-42.667-42.667v0zM768 810.667c0 23.564-19.103 42.667-42.667 42.667v0h-426.667c-23.564 0-42.667-19.103-42.667-42.667v0-597.333c0-23.564 19.103-42.667 42.667-42.667v0h213.333v128c0 70.692 57.308 128 128 128v0h128z"],"attrs":[],"grid":0,"tags":["file-blank"]},"attrs":[],"properties":{"order":4972,"id":712,"name":"file-blank","prevSize":32,"code":60141},"setIdx":0,"setId":0,"iconIdx":493},{"icon":{"paths":["M298.667 341.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM512 853.333h-298.667c-23.564 0-42.667-19.103-42.667-42.667v0-597.333c0-23.564 19.103-42.667 42.667-42.667v0h213.333v128c0 70.692 57.308 128 128 128v0h128v42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-85.333s0 0 0-2.56c-0.496-4.292-1.396-8.191-2.678-11.913l0.118 0.393v-3.84c-2.174-4.59-4.887-8.531-8.128-11.969l0.021 0.023-256-256c-3.415-3.219-7.356-5.932-11.671-7.988l-0.276-0.118c-0.577-0.086-1.243-0.136-1.92-0.136s-1.343 0.049-1.994 0.145l0.074-0.009-13.653-4.693h-258.56c-70.692 0-128 57.308-128 128v0 597.333c0 70.692 57.308 128 128 128v0h298.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM512 230.827l110.507 110.507h-67.84c-23.564 0-42.667-19.103-42.667-42.667v0zM888.747 647.253c-31.336-29.933-73.89-48.356-120.747-48.356s-89.411 18.422-120.814 48.419l0.067-0.064c-30.845 30.878-49.92 73.518-49.92 120.612 0 94.257 76.41 170.667 170.667 170.667s170.667-76.41 170.667-170.667c0-47.095-19.076-89.735-49.922-120.614l0.002 0.002zM682.667 768c0-47.128 38.205-85.333 85.333-85.333v0c7.779 0.104 15.26 1.187 22.385 3.132l-0.625-0.146-104.107 104.107c-1.8-6.5-2.883-13.981-2.986-21.699l-0.001-0.061zM828.16 828.16c-15.359 14.971-36.372 24.205-59.541 24.205-7.806 0-15.367-1.048-22.551-3.011l0.599 0.139 103.68-103.253c1.8 6.5 2.883 13.981 2.986 21.699l0.001 0.061c-0.102 23.523-9.706 44.783-25.169 60.156l-0.004 0.004zM469.333 768c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-170.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM554.667 512h-256c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h256c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["file-block-alt"]},"attrs":[],"properties":{"order":4973,"id":711,"name":"file-block-alt","prevSize":32,"code":60142},"setIdx":0,"setId":0,"iconIdx":494},{"icon":{"paths":["M320 426.667h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM490.667 682.667h-170.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h170.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM490.667 512h-170.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h170.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM785.92 400.213c2.109-4.883 3.336-10.568 3.336-16.539 0-11.682-4.695-22.267-12.3-29.972l0.004 0.005-256-256c-3.415-3.219-7.356-5.932-11.671-7.988l-0.276-0.118c-0.577-0.086-1.243-0.136-1.92-0.136s-1.343 0.049-1.994 0.145l0.074-0.009-11.947-4.267h-258.56c-70.692 0-128 57.308-128 128v0 597.333c0 70.692 57.308 128 128 128v0h256c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-256c-23.564 0-42.667-19.103-42.667-42.667v0-597.333c0-23.564 19.103-42.667 42.667-42.667v0h213.333v128c0 70.692 57.308 128 128 128v0h170.667c17.632-0.091 32.726-10.863 39.149-26.172l0.105-0.281zM576 341.333c-23.564 0-42.667-19.103-42.667-42.667v0-67.84l110.507 110.507zM874.667 512h-213.333c-23.564 0-42.667 19.103-42.667 42.667v0 341.333c0.045 16.18 9.088 30.237 22.388 37.435l0.226 0.112c5.664 2.969 12.373 4.711 19.489 4.711 8.615 0 16.634-2.553 23.341-6.944l-0.163 0.1 84.053-55.467 85.333 55.467c6.126 3.603 13.495 5.732 21.36 5.732 23.029 0 41.797-18.245 42.637-41.069l0.002-0.077v-341.333c0-23.564-19.103-42.667-42.667-42.667v0zM832 815.787l-40.107-26.88c-6.699-4.582-14.977-7.318-23.893-7.318s-17.194 2.735-24.040 7.412l0.147-0.095-40.107 26.88v-218.453h128z"],"attrs":[],"grid":0,"tags":["file-bookmark-alt"]},"attrs":[],"properties":{"order":4974,"id":710,"name":"file-bookmark-alt","prevSize":32,"code":60143},"setIdx":0,"setId":0,"iconIdx":495},{"icon":{"paths":["M490.667 853.333h-256c-23.564 0-42.667-19.103-42.667-42.667v0-597.333c0-23.564 19.103-42.667 42.667-42.667v0h213.333v128c0 70.692 57.308 128 128 128v0h128v213.333c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-256s0 0 0-2.56c-0.496-4.292-1.396-8.191-2.678-11.913l0.118 0.393v-3.84c-2.174-4.59-4.887-8.531-8.128-11.969l0.021 0.023-256-256c-3.415-3.219-7.356-5.932-11.671-7.988l-0.276-0.118c-0.641-0.118-1.379-0.185-2.133-0.185s-1.492 0.067-2.209 0.197l0.075-0.011c-3.819-2.087-8.248-3.713-12.928-4.644l-0.299-0.050h-258.56c-70.692 0-128 57.308-128 128v0 597.333c0 70.692 57.308 128 128 128v0h256c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM533.333 230.827l110.507 110.507h-67.84c-23.564 0-42.667-19.103-42.667-42.667v0zM320 597.333h256c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-256c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM490.667 682.667h-170.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h170.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM320 426.667h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM904.96 695.040c-7.733-7.795-18.45-12.621-30.293-12.621s-22.56 4.826-30.291 12.618l-0.003 0.003-140.373 140.8-55.040-55.467c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l85.333 85.333c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 170.667-170.667c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003z"],"attrs":[],"grid":0,"tags":["file-check-alt"]},"attrs":[],"properties":{"order":4975,"id":709,"name":"file-check-alt","prevSize":32,"code":60144},"setIdx":0,"setId":0,"iconIdx":496},{"icon":{"paths":["M853.333 381.44c-0.496-4.292-1.396-8.191-2.678-11.913l0.118 0.393v-3.84c-2.174-4.59-4.887-8.531-8.128-11.969l0.021 0.023-256-256c-3.415-3.219-7.356-5.932-11.671-7.988l-0.276-0.118c-0.577-0.086-1.243-0.136-1.92-0.136s-1.343 0.049-1.994 0.145l0.074-0.009c-4.056-2.368-8.817-4.028-13.894-4.674l-0.186-0.019h-258.133c-70.692 0-128 57.308-128 128v0 597.333c0 70.692 57.308 128 128 128v0h426.667c70.692 0 128-57.308 128-128v0-426.667s0 0 0-2.56zM597.333 230.827l110.507 110.507h-67.84c-23.564 0-42.667-19.103-42.667-42.667v0zM768 810.667c0 23.564-19.103 42.667-42.667 42.667v0h-426.667c-23.564 0-42.667-19.103-42.667-42.667v0-597.333c0-23.564 19.103-42.667 42.667-42.667v0h213.333v128c0 70.692 57.308 128 128 128v0h128zM609.707 524.373l-140.373 140.8-55.040-55.467c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l85.333 85.333c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 170.667-170.667c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l0-0z"],"attrs":[],"grid":0,"tags":["file-check"]},"attrs":[],"properties":{"order":4976,"id":708,"name":"file-check","prevSize":32,"code":60145},"setIdx":0,"setId":0,"iconIdx":497},{"icon":{"paths":["M926.293 865.707l-72.96-73.813c0-4.693 0-8.96 0-13.227 0-64.801-52.532-117.333-117.333-117.333v0h-14.507l-61.44-61.44c3.473-1.617 7.538-2.56 11.825-2.56 0.043 0 0.086 0 0.129 0l-0.007-0h138.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-64v-42.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 42.667c-24.001 2.187-45.526 11.321-62.945 25.349l0.225-0.175-56.32-56.747c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l-0-0 72.96 75.093c0 4.693 0 8.96 0 13.227 0 64.801 52.532 117.333 117.333 117.333v0h14.507l61.44 61.44c-3.473 1.617-7.538 2.56-11.825 2.56-0.043 0-0.086-0-0.129-0l0.007 0h-138.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h64v42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667c24.591-2.312 46.582-11.919 64.187-26.605l-0.187 0.152 56.32 56.747c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.421-7.667 11.994-18.129 11.994-29.659 0-12.164-5.090-23.139-13.257-30.911l-0.018-0.017zM426.667 810.667h-213.333c-23.564 0-42.667-19.103-42.667-42.667v0-597.333c0-23.564 19.103-42.667 42.667-42.667v0h256v170.667c0 23.564 19.103 42.667 42.667 42.667v0h213.333c17.632-0.091 32.726-10.863 39.149-26.172l0.105-0.281c2.109-4.883 3.336-10.568 3.336-16.539 0-11.682-4.695-22.267-12.3-29.972l0.004 0.005-213.333-213.333c-3.415-3.219-7.356-5.932-11.671-7.988l-0.276-0.118h-3.84c-3.42-1.726-7.402-3.191-11.566-4.19l-0.381-0.077h-301.227c-70.692 0-128 57.308-128 128v0 597.333c0 70.692 57.308 128 128 128v0h213.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM554.667 188.16l67.84 67.84h-67.84z"],"attrs":[],"grid":0,"tags":["file-contract-dollar"]},"attrs":[],"properties":{"order":4977,"id":707,"name":"file-contract-dollar","prevSize":32,"code":60146},"setIdx":0,"setId":0,"iconIdx":498},{"icon":{"paths":["M563.2 640c-8.533 4.267-17.067 4.267-25.6 8.533-4.267-8.533-8.533-17.067-12.8-21.333-34.133-29.867-85.333-34.133-128-8.533-34.133 21.333-55.467 64-55.467 106.667 0 21.333 21.333 42.667 42.667 38.4 0 0 0 0 0 0 21.333 0 42.667-21.333 42.667-42.667 0-12.8 4.267-21.333 12.8-29.867 4.267 0 8.533-4.267 12.8-4.267v0c-12.8 25.6-4.267 55.467 21.333 72.533 8.533 4.267 12.8 4.267 21.333 4.267 17.067 0 34.133-8.533 46.933-21.333 4.267-4.267 12.8-8.533 21.333-12.8 4.267 17.067 21.333 34.133 42.667 34.133h34.133c25.6 0 42.667-17.067 42.667-42.667 0-21.333-17.067-38.4-38.4-42.667-4.267-8.533-4.267-12.8-12.8-21.333-12.8-12.8-42.667-21.333-68.267-17.067zM853.333 379.733c0-4.267 0-8.533-4.267-12.8 0 0 0-4.267 0-4.267 0-4.267-4.267-8.533-8.533-12.8l-256-256c-4.267-4.267-8.533-4.267-12.8-8.533 0 0-4.267 0-4.267 0-4.267 0-8.533 0-12.8-4.267 0 0 0 0-4.267 0h-251.733c-72.533 4.267-128 59.733-128 132.267v597.333c0 72.533 55.467 128 128 128h426.667c72.533 0 128-55.467 128-128v-430.933c0 4.267 0 4.267 0 0zM597.333 230.4l110.933 110.933h-68.267c-25.6 0-42.667-17.067-42.667-42.667v-68.267zM768 810.667c0 25.6-17.067 42.667-42.667 42.667h-426.667c-25.6 0-42.667-17.067-42.667-42.667v-597.333c0-25.6 17.067-42.667 42.667-42.667h213.333v128c0 72.533 55.467 128 128 128h128v384zM384 426.667h42.667c25.6 0 42.667-17.067 42.667-42.667s-17.067-42.667-42.667-42.667h-42.667c-25.6 0-42.667 17.067-42.667 42.667s17.067 42.667 42.667 42.667z"],"attrs":[],"grid":0,"tags":["file-contract"]},"attrs":[],"properties":{"order":4978,"id":706,"name":"file-contract","prevSize":32,"code":60147},"setIdx":0,"setId":0,"iconIdx":499},{"icon":{"paths":["M682.667 853.333h-341.333c-70.692 0-128-57.308-128-128v0-426.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 426.667c0 117.821 95.513 213.333 213.333 213.333v0h341.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM426.667 554.667c0 23.564 19.103 42.667 42.667 42.667v0h213.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-213.333c-23.564 0-42.667 19.103-42.667 42.667v0zM896 381.44c-0.496-4.292-1.396-8.191-2.678-11.913l0.118 0.393v-3.84c-2.174-4.59-4.887-8.531-8.128-11.969l0.021 0.023-256-256c-3.415-3.219-7.356-5.932-11.671-7.988l-0.276-0.118c-0.577-0.086-1.243-0.136-1.92-0.136s-1.343 0.049-1.994 0.145l0.074-0.009c-4.056-2.368-8.817-4.028-13.894-4.674l-0.186-0.019h-172.8c-70.692 0-128 57.308-128 128v0 426.667c0 70.692 57.308 128 128 128v0h341.333c70.692 0 128-57.308 128-128v0-256s0 0 0-2.56zM640 230.827l110.507 110.507h-67.84c-23.564 0-42.667-19.103-42.667-42.667v0zM810.667 640c0 23.564-19.103 42.667-42.667 42.667v0h-341.333c-23.564 0-42.667-19.103-42.667-42.667v0-426.667c0-23.564 19.103-42.667 42.667-42.667v0h128v128c0.125 15.341 2.93 29.989 7.968 43.552l-0.288-0.885h-93.013c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h341.333z"],"attrs":[],"grid":0,"tags":["file-copy-alt"]},"attrs":[],"properties":{"order":4979,"id":705,"name":"file-copy-alt","prevSize":32,"code":60148},"setIdx":0,"setId":0,"iconIdx":500},{"icon":{"paths":["M341.333 341.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM554.667 853.333h-298.667c-23.564 0-42.667-19.103-42.667-42.667v0-597.333c0-23.564 19.103-42.667 42.667-42.667v0h213.333v128c0 70.692 57.308 128 128 128v0h128v85.333c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-128s0 0 0-2.56c-0.496-4.292-1.396-8.191-2.678-11.913l0.118 0.393v-3.84c-2.174-4.59-4.887-8.531-8.128-11.969l0.021 0.023-256-256c-3.415-3.219-7.356-5.932-11.671-7.988l-0.276-0.118c-0.641-0.118-1.379-0.185-2.133-0.185s-1.492 0.067-2.209 0.197l0.075-0.011c-3.819-2.087-8.248-3.713-12.928-4.644l-0.299-0.050h-258.56c-70.692 0-128 57.308-128 128v0 597.333c0 70.692 57.308 128 128 128v0h298.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM554.667 230.827l110.507 110.507h-67.84c-23.564 0-42.667-19.103-42.667-42.667v0zM597.333 512h-256c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h256c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM883.627 780.373c-7.733-7.795-18.45-12.621-30.293-12.621s-22.56 4.826-30.291 12.618l-0.003 0.003-12.373 12.8v-110.507c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 110.507l-12.373-12.8c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l85.333 85.333c3.937 3.773 8.616 6.808 13.791 8.859l0.289 0.101c4.771 2.163 10.345 3.423 16.213 3.423s11.443-1.26 16.466-3.525l-0.253 0.102c5.464-2.152 10.143-5.187 14.095-8.974l-0.015 0.014 85.333-85.333c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003zM512 768c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-170.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["file-download-alt"]},"attrs":[],"properties":{"order":4980,"id":704,"name":"file-download-alt","prevSize":32,"code":60149},"setIdx":0,"setId":0,"iconIdx":501},{"icon":{"paths":["M853.333 381.44c-0.496-4.292-1.396-8.191-2.678-11.913l0.118 0.393v-3.84c-2.174-4.59-4.887-8.531-8.128-11.969l0.021 0.023-256-256c-3.415-3.219-7.356-5.932-11.671-7.988l-0.276-0.118h-4.267c-3.819-2.087-8.248-3.713-12.928-4.644l-0.299-0.050h-258.56c-70.692 0-128 57.308-128 128v0 597.333c0 70.692 57.308 128 128 128v0h426.667c70.692 0 128-57.308 128-128v0-426.667s0 0 0-2.56zM597.333 230.827l110.507 110.507h-67.84c-23.564 0-42.667-19.103-42.667-42.667v0zM768 810.667c0 23.564-19.103 42.667-42.667 42.667v0h-426.667c-23.564 0-42.667-19.103-42.667-42.667v0-597.333c0-23.564 19.103-42.667 42.667-42.667v0h213.333v128c0 70.692 57.308 128 128 128v0h128zM567.040 609.707l-12.373 12.8v-110.507c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 110.507l-12.373-12.8c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l85.333 85.333c3.937 3.773 8.616 6.808 13.791 8.859l0.289 0.101c4.771 2.163 10.345 3.423 16.213 3.423s11.443-1.26 16.466-3.525l-0.253 0.102c5.464-2.152 10.143-5.187 14.095-8.974l-0.015 0.014 85.333-85.333c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l0-0z"],"attrs":[],"grid":0,"tags":["file-download"]},"attrs":[],"properties":{"order":4981,"id":703,"name":"file-download","prevSize":32,"code":60150},"setIdx":0,"setId":0,"iconIdx":502},{"icon":{"paths":["M883.627 712.96l-103.253-103.253c-7.733-7.795-18.45-12.621-30.293-12.621s-22.56 4.826-30.291 12.618l-0.003 0.003-152.747 152.747c-7.648 7.709-12.374 18.326-12.374 30.047 0 0.087 0 0.173 0.001 0.26l-0-0.013v103.253c0 23.564 19.103 42.667 42.667 42.667v0h103.253c0.073 0 0.16 0.001 0.247 0.001 11.721 0 22.338-4.726 30.049-12.377l-0.003 0.003 152.747-152.747c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003zM682.667 853.333h-42.667v-42.667l110.080-110.080 42.667 42.667zM426.667 853.333h-170.667c-23.564 0-42.667-19.103-42.667-42.667v0-597.333c0-23.564 19.103-42.667 42.667-42.667v0h213.333v128c0 70.692 57.308 128 128 128v0h128v42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-85.333s0 0 0-2.56c-0.496-4.292-1.396-8.191-2.678-11.913l0.118 0.393v-3.84c-2.174-4.59-4.887-8.531-8.128-11.969l0.021 0.023-256-256c-3.415-3.219-7.356-5.932-11.671-7.988l-0.276-0.118c-0.577-0.086-1.243-0.136-1.92-0.136s-1.343 0.049-1.994 0.145l0.074-0.009-13.653-4.693h-258.56c-70.692 0-128 57.308-128 128v0 597.333c0 70.692 57.308 128 128 128v0h170.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM554.667 230.827l110.507 110.507h-67.84c-23.564 0-42.667-19.103-42.667-42.667v0zM341.333 597.333h256c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-256c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM341.333 426.667h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM426.667 682.667h-85.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h85.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["file-edit-alt"]},"attrs":[],"properties":{"order":4982,"id":702,"name":"file-edit-alt","prevSize":32,"code":60151},"setIdx":0,"setId":0,"iconIdx":503},{"icon":{"paths":["M384 426.667h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM640 512h-256c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h256c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM640 682.667h-256c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h256c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM840.96 865.707c-1.923-1.746-4.010-3.427-6.193-4.98l-0.207-0.14c-2.211-1.521-4.75-2.82-7.453-3.77l-0.227-0.070-7.68-3.413c-2.457-0.503-5.282-0.79-8.174-0.79-5.984 0-11.681 1.232-16.85 3.456l0.277-0.106c-10.747 3.967-19.073 12.293-22.954 22.774l-0.086 0.266c-2.18 4.493-3.454 9.774-3.454 15.352 0 0.603 0.015 1.203 0.044 1.799l-0.003-0.084c-0.002 0.149-0.003 0.325-0.003 0.502 0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667c0-6.039-1.254-11.784-3.517-16.991l0.107 0.276c-2.298-5.422-5.314-10.079-8.995-14.119l0.035 0.039zM853.333 381.44c-0.496-4.292-1.396-8.191-2.678-11.913l0.118 0.393v-3.84c-2.174-4.59-4.887-8.531-8.128-11.969l0.021 0.023-256-256c-3.415-3.219-7.356-5.932-11.671-7.988l-0.276-0.118c-0.577-0.086-1.243-0.136-1.92-0.136s-1.343 0.049-1.994 0.145l0.074-0.009c-4.056-2.368-8.817-4.028-13.894-4.674l-0.186-0.019h-258.133c-70.692 0-128 57.308-128 128v0 597.333c0 70.692 57.308 128 128 128v0h341.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-341.333c-23.564 0-42.667-19.103-42.667-42.667v0-597.333c0-23.564 19.103-42.667 42.667-42.667v0h213.333v128c0 70.692 57.308 128 128 128v0h128v85.333c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-128s0 0 0-2.56zM640 341.333c-23.564 0-42.667-19.103-42.667-42.667v0-67.84l110.507 110.507zM810.667 640c-23.564 0-42.667 19.103-42.667 42.667v0 85.333c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-85.333c0-23.564-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["file-exclamation-alt"]},"attrs":[],"properties":{"order":4983,"id":701,"name":"file-exclamation-alt","prevSize":32,"code":60152},"setIdx":0,"setId":0,"iconIdx":504},{"icon":{"paths":["M551.253 709.12c-1.020-2.93-2.319-5.469-3.912-7.79l0.072 0.11c-1.693-2.39-3.374-4.477-5.17-6.456l0.050 0.056c-7.7-7.601-18.286-12.296-29.968-12.296-5.971 0-11.656 1.227-16.817 3.442l0.278-0.106c-5.464 2.152-10.143 5.187-14.095 8.974l0.015-0.014c-1.746 1.923-3.427 4.010-4.98 6.193l-0.14 0.207c-1.521 2.211-2.82 4.75-3.77 7.453l-0.070 0.227c-1.157 2.221-2.047 4.798-2.535 7.514l-0.025 0.166c-0.091 1.276-0.142 2.765-0.142 4.267s0.052 2.99 0.153 4.466l-0.011-0.199c-0.008 0.275-0.012 0.599-0.012 0.923 0 5.554 1.263 10.813 3.518 15.505l-0.093-0.215c2.298 5.422 5.314 10.079 8.995 14.119l-0.035-0.039c7.568 7.51 17.94 12.204 29.408 12.373l0.032 0c0.275 0.008 0.599 0.012 0.923 0.012 5.554 0 10.813-1.263 15.505-3.518l-0.215 0.093c10.747-3.967 19.073-12.293 22.954-22.774l0.086-0.266c2.162-4.477 3.425-9.736 3.425-15.29 0-0.325-0.004-0.648-0.013-0.971l0.001 0.048c0.091-1.276 0.142-2.765 0.142-4.267s-0.052-2.99-0.153-4.466l0.011 0.199c-0.801-2.918-1.969-5.473-3.478-7.785l0.064 0.105zM853.333 381.44c-0.496-4.292-1.396-8.191-2.678-11.913l0.118 0.393v-3.84c-2.174-4.59-4.887-8.531-8.128-11.969l0.021 0.023-256-256c-3.415-3.219-7.356-5.932-11.671-7.988l-0.276-0.118h-3.84c-4.056-2.368-8.817-4.028-13.894-4.674l-0.186-0.019h-258.133c-70.692 0-128 57.308-128 128v0 597.333c0 70.692 57.308 128 128 128v0h426.667c70.692 0 128-57.308 128-128v0-426.667s0 0 0-2.56zM597.333 230.827l110.507 110.507h-67.84c-23.564 0-42.667-19.103-42.667-42.667v0zM768 810.667c0 23.564-19.103 42.667-42.667 42.667v0h-426.667c-23.564 0-42.667-19.103-42.667-42.667v0-597.333c0-23.564 19.103-42.667 42.667-42.667v0h213.333v128c0 70.692 57.308 128 128 128v0h128zM512 469.333c-23.564 0-42.667 19.103-42.667 42.667v0 85.333c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-85.333c0-23.564-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["file-exclamation"]},"attrs":[],"properties":{"order":4984,"id":700,"name":"file-exclamation","prevSize":32,"code":60153},"setIdx":0,"setId":0,"iconIdx":505},{"icon":{"paths":["M892.587 666.453c-2.298-5.422-5.314-10.079-8.995-14.119l0.035 0.039-128-128c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l-0-0 55.467 55.040h-238.507c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h238.507l-55.467 55.040c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 128-128c3.844-3.895 6.891-8.588 8.869-13.807l0.091-0.273c2.024-4.793 3.201-10.366 3.201-16.213s-1.176-11.42-3.305-16.495l0.105 0.281zM597.333 853.333h-341.333c-23.564 0-42.667-19.103-42.667-42.667v0-597.333c0-23.564 19.103-42.667 42.667-42.667v0h213.333v128c0 70.692 57.308 128 128 128v0h170.667c17.632-0.091 32.726-10.863 39.149-26.172l0.105-0.281c2.109-4.883 3.336-10.568 3.336-16.539 0-11.682-4.695-22.267-12.3-29.972l0.004 0.005-256-256c-3.415-3.219-7.356-5.932-11.671-7.988l-0.276-0.118h-3.84l-11.947-4.267h-258.56c-70.692 0-128 57.308-128 128v0 597.333c0 70.692 57.308 128 128 128v0h341.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM554.667 230.827l110.507 110.507h-67.84c-23.564 0-42.667-19.103-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["file-export"]},"attrs":[],"properties":{"order":4985,"id":699,"name":"file-export","prevSize":32,"code":60154},"setIdx":0,"setId":0,"iconIdx":506},{"icon":{"paths":["M384 426.667h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM606.313 528.479l-71.396 91.813-37.041-33.333c-7.526-6.796-17.547-10.955-28.54-10.955-13.442 0-25.432 6.218-33.25 15.935l-0.064 0.083-85.333 106.667c-5.882 7.252-9.444 16.594-9.444 26.768 0 23.559 19.099 42.658 42.658 42.658 13.496 0 25.528-6.267 33.345-16.050l0.066-0.085 57.083-71.354 37.5 33.749c7.527 6.798 17.551 10.958 28.547 10.958 13.65 0 25.803-6.411 33.612-16.385l0.070-0.093 99.563-128c5.601-7.151 8.981-16.274 8.981-26.188 0-23.565-19.103-42.669-42.669-42.669-13.652 0-25.807 6.412-33.617 16.388l-0.070 0.093zM852.802 381.367c-0.599-10.715-5.030-20.294-11.933-27.48l0.014 0.014-0.062-0.081-256.052-256.036c-3.454-3.34-7.492-6.104-11.94-8.119l-0.266-0.108c-1.276-0.597-2.603-0.935-3.945-1.408-3.35-1.219-7.227-2.040-11.258-2.291l-0.12-0.006c-0.898-0.056-1.661-0.519-2.573-0.519h-256c-70.66 0.080-127.92 57.339-128 127.992l-0 0.008v597.333c0.080 70.66 57.339 127.92 127.992 128l426.674 0c70.66-0.080 127.92-57.339 128-127.992l0-0.008v-426.667c0-0.935-0.469-1.713-0.531-2.633zM597.333 231l110.333 110.333h-67.667c-23.551-0.032-42.635-19.115-42.667-42.664l-0-0.003zM768 810.667c-0.032 23.551-19.115 42.635-42.664 42.667l-0.003 0h-426.667c-23.551-0.032-42.635-19.115-42.667-42.664l-0-0.003v-597.333c0.032-23.551 19.115-42.635 42.664-42.667l0.003-0h213.333v128c0.080 70.66 57.339 127.92 127.992 128l128.008 0z"],"attrs":[],"grid":0,"tags":["file-graph"]},"attrs":[],"properties":{"order":4986,"id":698,"name":"file-graph","prevSize":32,"code":60155},"setIdx":0,"setId":0,"iconIdx":507},{"icon":{"paths":["M853.333 381.44c-0.496-4.292-1.396-8.191-2.678-11.913l0.118 0.393v-3.84c-2.174-4.59-4.887-8.531-8.128-11.969l0.021 0.023-256-256c-3.415-3.219-7.356-5.932-11.671-7.988l-0.276-0.118h-4.267c-3.819-2.087-8.248-3.713-12.928-4.644l-0.299-0.050h-258.56c-70.692 0-128 57.308-128 128v0 597.333c0 70.692 57.308 128 128 128v0h426.667c70.692 0 128-57.308 128-128v0-426.667s0 0 0-2.56zM597.333 230.827l110.507 110.507h-67.84c-23.564 0-42.667-19.103-42.667-42.667v0zM768 810.667c0 23.564-19.103 42.667-42.667 42.667v0h-426.667c-23.564 0-42.667-19.103-42.667-42.667v0-597.333c0-23.564 19.103-42.667 42.667-42.667v0h213.333v128c0 70.692 57.308 128 128 128v0h128zM512 483.84c-17.211-9.552-37.744-15.175-59.589-15.175-68.807 0-124.587 55.779-124.587 124.587 0 35.064 14.486 66.745 37.799 89.385l0.030 0.029 116.053 116.053c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 116.053-116.053c23.344-22.669 37.829-54.35 37.829-89.415 0-68.807-55.779-124.587-124.587-124.587-21.846 0-42.378 5.623-60.229 15.5l0.64-0.325zM597.333 566.187c7.090 7.101 11.474 16.905 11.474 27.733s-4.384 20.632-11.475 27.734l0.001-0.001-85.333 85.333-85.333-85.333c-7.090-7.101-11.474-16.905-11.474-27.733s4.384-20.632 11.475-27.734l-0.001 0.001c7.101-7.090 16.905-11.474 27.733-11.474s20.632 4.384 27.734 11.475l-0.001-0.001c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.056-6.839 16.689-11.055 27.307-11.055s20.251 4.216 27.317 11.064l-0.010-0.010z"],"attrs":[],"grid":0,"tags":["file-heart"]},"attrs":[],"properties":{"order":4987,"id":697,"name":"file-heart","prevSize":32,"code":60156},"setIdx":0,"setId":0,"iconIdx":508},{"icon":{"paths":["M469.333 853.333h-213.333c-23.564 0-42.667-19.103-42.667-42.667v0-597.333c0-23.564 19.103-42.667 42.667-42.667v0h213.333v128c0 70.692 57.308 128 128 128v0h128v85.333c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-128s0 0 0-2.56c-0.496-4.292-1.396-8.191-2.678-11.913l0.118 0.393v-3.84c-2.297-4.721-5-8.788-8.166-12.444l0.060 0.071-256-256c-3.585-3.107-7.653-5.81-12.041-7.96l-0.332-0.147c-0.577-0.086-1.243-0.136-1.92-0.136s-1.343 0.049-1.994 0.145l0.074-0.009-13.227-4.267h-258.56c-70.692 0-128 57.308-128 128v0 597.333c0 70.692 57.308 128 128 128v0h213.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM554.667 230.827l110.507 110.507h-67.84c-23.564 0-42.667-19.103-42.667-42.667v0zM810.667 640h-238.507l55.467-55.040c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l-128 128c-3.646 4.001-6.662 8.658-8.838 13.76l-0.122 0.32c-2.024 4.793-3.201 10.366-3.201 16.213s1.176 11.42 3.305 16.495l-0.105-0.281c2.069 5.492 5.116 10.185 8.964 14.084l-0.004-0.004 128 128c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003-55.467-55.040h238.507c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["file-import"]},"attrs":[],"properties":{"order":4988,"id":696,"name":"file-import","prevSize":32,"code":60157},"setIdx":0,"setId":0,"iconIdx":509},{"icon":{"paths":["M640 682.667h-256c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h256c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM384 426.667h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM640 512h-256c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h256c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM840.96 652.373c-3.937-3.773-8.616-6.808-13.791-8.859l-0.289-0.101c-4.762-2.214-10.337-3.505-16.213-3.505s-11.451 1.291-16.456 3.606l0.243-0.101c-5.464 2.152-10.143 5.187-14.095 8.974l0.015-0.014c-3.646 4.001-6.662 8.658-8.838 13.76l-0.122 0.32c-2.109 4.883-3.336 10.568-3.336 16.539 0 11.682 4.695 22.267 12.3 29.972l-0.004-0.005c7.709 7.648 18.326 12.374 30.047 12.374 0.087 0 0.173-0 0.26-0.001l-0.013 0c5.873-0.073 11.435-1.322 16.489-3.52l-0.275 0.107c5.422-2.298 10.079-5.314 14.119-8.995l-0.039 0.035c7.601-7.7 12.296-18.286 12.296-29.968 0-5.971-1.227-11.656-3.442-16.817l0.106 0.278c-2.298-5.422-5.314-10.079-8.995-14.119l0.035 0.039zM853.333 381.44c-0.496-4.292-1.396-8.191-2.678-11.913l0.118 0.393v-3.84c-2.174-4.59-4.887-8.531-8.128-11.969l0.021 0.023-256-256c-3.415-3.219-7.356-5.932-11.671-7.988l-0.276-0.118c-0.577-0.086-1.243-0.136-1.92-0.136s-1.343 0.049-1.994 0.145l0.074-0.009c-4.056-2.368-8.817-4.028-13.894-4.674l-0.186-0.019h-258.133c-70.692 0-128 57.308-128 128v0 597.333c0 70.692 57.308 128 128 128v0h341.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-341.333c-23.564 0-42.667-19.103-42.667-42.667v0-597.333c0-23.564 19.103-42.667 42.667-42.667v0h213.333v128c0 70.692 57.308 128 128 128v0h128v85.333c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-128s0 0 0-2.56zM640 341.333c-23.564 0-42.667-19.103-42.667-42.667v0-67.84l110.507 110.507zM810.667 768c-23.564 0-42.667 19.103-42.667 42.667v0 85.333c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-85.333c0-23.564-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["file-info-alt"]},"attrs":[],"properties":{"order":4989,"id":695,"name":"file-info-alt","prevSize":32,"code":60158},"setIdx":0,"setId":0,"iconIdx":510},{"icon":{"paths":["M938.667 466.773c-0.496-4.292-1.396-8.191-2.678-11.913l0.118 0.393v-3.84c-2.174-4.59-4.887-8.531-8.128-11.969l0.021 0.023-256-256c-3.415-3.219-7.356-5.932-11.671-7.988l-0.276-0.118h-4.267c-3.819-2.087-8.248-3.713-12.928-4.644l-0.299-0.050h-429.227c-70.692 0-128 57.308-128 128v0 426.667c0 70.692 57.308 128 128 128v0h597.333c70.692 0 128-57.308 128-128v0-256s0 0 0-2.56zM682.667 316.16l110.507 110.507h-67.84c-23.564 0-42.667-19.103-42.667-42.667v0zM853.333 725.333c0 23.564-19.103 42.667-42.667 42.667v0h-597.333c-23.564 0-42.667-19.103-42.667-42.667v0-426.667c0-23.564 19.103-42.667 42.667-42.667v0h384v128c0 70.692 57.308 128 128 128v0h128zM298.667 512h170.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-170.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM298.667 597.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h426.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["file-landscape-alt"]},"attrs":[],"properties":{"order":4990,"id":694,"name":"file-landscape-alt","prevSize":32,"code":60159},"setIdx":0,"setId":0,"iconIdx":511},{"icon":{"paths":["M938.667 466.773c-0.496-4.292-1.396-8.191-2.678-11.913l0.118 0.393v-3.84c-2.174-4.59-4.887-8.531-8.128-11.969l0.021 0.023-256-256c-3.415-3.219-7.356-5.932-11.671-7.988l-0.276-0.118h-4.267c-3.819-2.087-8.248-3.713-12.928-4.644l-0.299-0.050h-429.227c-70.692 0-128 57.308-128 128v0 426.667c0 70.692 57.308 128 128 128v0h597.333c70.692 0 128-57.308 128-128v0-256s0 0 0-2.56zM682.667 316.16l110.507 110.507h-67.84c-23.564 0-42.667-19.103-42.667-42.667v0zM853.333 725.333c0 23.564-19.103 42.667-42.667 42.667v0h-597.333c-23.564 0-42.667-19.103-42.667-42.667v0-426.667c0-23.564 19.103-42.667 42.667-42.667v0h384v128c0 70.692 57.308 128 128 128v0h128z"],"attrs":[],"grid":0,"tags":["file-landscape"]},"attrs":[],"properties":{"order":4991,"id":693,"name":"file-landscape","prevSize":32,"code":60160},"setIdx":0,"setId":0,"iconIdx":512},{"icon":{"paths":["M938.667 466.773c-0.496-4.292-1.396-8.191-2.678-11.913l0.118 0.393v-3.84c-2.174-4.59-4.887-8.531-8.128-11.969l0.021 0.023-256-256c-3.415-3.219-7.356-5.932-11.671-7.988l-0.276-0.118h-3.84c-4.056-2.368-8.817-4.028-13.894-4.674l-0.186-0.019h-187.307c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h142.507v128c0 70.692 57.308 128 128 128v0h128v142.507c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-185.173s0 0 0-2.56zM725.333 426.667c-23.564 0-42.667-19.103-42.667-42.667v0-67.84l110.507 110.507zM158.293 97.707c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l-0-0 38.827 38.4c-31.118 23.516-51.057 60.401-51.2 101.95l-0 0.023v426.667c0 70.692 57.308 128 128 128v0h579.84l72.533 72.96c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003zM213.333 768c-23.564 0-42.667-19.103-42.667-42.667v0-426.667c0.196-18.182 11.734-33.619 27.865-39.584l0.295-0.096 509.013 509.013z"],"attrs":[],"grid":0,"tags":["file-lanscape-slash"]},"attrs":[],"properties":{"order":4992,"id":692,"name":"file-lanscape-slash","prevSize":32,"code":60161},"setIdx":0,"setId":0,"iconIdx":513},{"icon":{"paths":["M768 768c-23.564 0-42.667 19.103-42.667 42.667v0c0 23.564-19.103 42.667-42.667 42.667v0h-426.667c-23.564 0-42.667-19.103-42.667-42.667v0-597.333c0-23.564 19.103-42.667 42.667-42.667v0h213.333v128c0 70.692 57.308 128 128 128v0h128v42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-85.333s0 0 0-2.56c-0.496-4.292-1.396-8.191-2.678-11.913l0.118 0.393c0.086-0.577 0.136-1.243 0.136-1.92s-0.049-1.343-0.145-1.994l0.009 0.074c-2.174-4.59-4.887-8.531-8.128-11.969l0.021 0.023-256-256c-3.415-3.219-7.356-5.932-11.671-7.988l-0.276-0.118h-4.267c-3.691-2.022-7.967-3.641-12.478-4.634l-0.322-0.060h-258.987c-70.692 0-128 57.308-128 128v0 597.333c0 70.692 57.308 128 128 128v0h426.667c70.692 0 128-57.308 128-128v0c0-23.564-19.103-42.667-42.667-42.667v0zM554.667 230.827l110.507 110.507h-67.84c-23.564 0-42.667-19.103-42.667-42.667v0zM853.333 597.333h-106.667c-0.073-0-0.16-0.001-0.247-0.001-11.721 0-22.338 4.726-30.049 12.377l0.003-0.003-52.907 53.333-119.467-136.533c-7.862-8.974-19.345-14.61-32.144-14.61-11.772 0-22.43 4.767-30.15 12.477l0-0-72.533 72.96h-67.84c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h85.333c0.073 0 0.16 0.001 0.247 0.001 11.721 0 22.338-4.726 30.049-12.377l-0.003 0.003 55.040-53.333 119.467 136.533c7.568 8.595 18.463 14.106 30.651 14.505l0.069 0.002c0.073 0 0.16 0.001 0.247 0.001 11.721 0 22.338-4.726 30.049-12.377l-0.003 0.003 71.68-72.96h89.173c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["file-medical-alt"]},"attrs":[],"properties":{"order":4993,"id":691,"name":"file-medical-alt","prevSize":32,"code":60162},"setIdx":0,"setId":0,"iconIdx":514},{"icon":{"paths":["M597.333 597.333h-42.667v-42.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 42.667h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h42.667v42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM853.333 381.44c-0.496-4.292-1.396-8.191-2.678-11.913l0.118 0.393v-3.84c-2.174-4.59-4.887-8.531-8.128-11.969l0.021 0.023-256-256c-3.415-3.219-7.356-5.932-11.671-7.988l-0.276-0.118h-3.84c-4.056-2.368-8.817-4.028-13.894-4.674l-0.186-0.019h-258.133c-70.692 0-128 57.308-128 128v0 597.333c0 70.692 57.308 128 128 128v0h426.667c70.692 0 128-57.308 128-128v0-426.667s0 0 0-2.56zM597.333 230.827l110.507 110.507h-67.84c-23.564 0-42.667-19.103-42.667-42.667v0zM768 810.667c0 23.564-19.103 42.667-42.667 42.667v0h-426.667c-23.564 0-42.667-19.103-42.667-42.667v0-597.333c0-23.564 19.103-42.667 42.667-42.667v0h213.333v128c0 70.692 57.308 128 128 128v0h128z"],"attrs":[],"grid":0,"tags":["file-medical"]},"attrs":[],"properties":{"order":4994,"id":690,"name":"file-medical","prevSize":32,"code":60163},"setIdx":0,"setId":0,"iconIdx":515},{"icon":{"paths":["M341.333 341.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM554.667 853.333h-298.667c-23.564 0-42.667-19.103-42.667-42.667v0-597.333c0-23.564 19.103-42.667 42.667-42.667v0h213.333v128c0 70.692 57.308 128 128 128v0h128v213.333c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-256s0 0 0-2.56c-0.496-4.292-1.396-8.191-2.678-11.913l0.118 0.393v-3.84c-2.174-4.59-4.887-8.531-8.128-11.969l0.021 0.023-256-256c-3.415-3.219-7.356-5.932-11.671-7.988l-0.276-0.118c-0.641-0.118-1.379-0.185-2.133-0.185s-1.492 0.067-2.209 0.197l0.075-0.011c-3.819-2.087-8.248-3.713-12.928-4.644l-0.299-0.050h-258.56c-70.692 0-128 57.308-128 128v0 597.333c0 70.692 57.308 128 128 128v0h298.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM554.667 230.827l110.507 110.507h-67.84c-23.564 0-42.667-19.103-42.667-42.667v0zM853.333 768h-170.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h170.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM554.667 682.667h-213.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h213.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM597.333 512h-256c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h256c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["file-minus-alt"]},"attrs":[],"properties":{"order":4995,"id":689,"name":"file-minus-alt","prevSize":32,"code":60164},"setIdx":0,"setId":0,"iconIdx":516},{"icon":{"paths":["M426.667 853.333h-213.333c-23.564 0-42.667-19.103-42.667-42.667v0-597.333c0-23.564 19.103-42.667 42.667-42.667v0h213.333v128c0 70.692 57.308 128 128 128v0h170.667c17.632-0.091 32.726-10.863 39.149-26.172l0.105-0.281c2.109-4.883 3.336-10.568 3.336-16.539 0-11.682-4.695-22.267-12.3-29.972l0.004 0.005-256-256c-3.415-3.219-7.356-5.932-11.671-7.988l-0.276-0.118c-0.577-0.086-1.243-0.136-1.92-0.136s-1.343 0.049-1.994 0.145l0.074-0.009-11.947-4.267h-258.56c-70.692 0-128 57.308-128 128v0 597.333c0 70.692 57.308 128 128 128v0h213.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM512 230.827l110.507 110.507h-67.84c-23.564 0-42.667-19.103-42.667-42.667v0zM554.667 554.667c0-23.564-19.103-42.667-42.667-42.667v0h-213.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h213.333c23.564 0 42.667-19.103 42.667-42.667v0zM298.667 426.667h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM298.667 682.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h85.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM853.333 647.68v-7.68c0-70.692-57.308-128-128-128s-128 57.308-128 128v0 7.68c-50.028 18.062-85.173 65.066-85.333 120.3l-0 0.020v42.667c0 70.692 57.308 128 128 128v0h170.667c70.692 0 128-57.308 128-128v0-42.667c-0.16-55.254-35.305-102.258-84.442-120.038l-0.891-0.282zM725.333 597.333c23.564 0 42.667 19.103 42.667 42.667v0h-85.333c0-23.564 19.103-42.667 42.667-42.667v0zM853.333 810.667c0 23.564-19.103 42.667-42.667 42.667v0h-170.667c-23.564 0-42.667-19.103-42.667-42.667v0-42.667c0-23.564 19.103-42.667 42.667-42.667v0h170.667c23.564 0 42.667 19.103 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["file-lock-alt"]},"attrs":[],"properties":{"order":4996,"id":688,"name":"file-lock-alt","prevSize":32,"code":60165},"setIdx":0,"setId":0,"iconIdx":517},{"icon":{"paths":["M597.333 597.333h-170.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h170.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM853.333 381.44c-0.496-4.292-1.396-8.191-2.678-11.913l0.118 0.393v-3.84c-2.174-4.59-4.887-8.531-8.128-11.969l0.021 0.023-256-256c-3.415-3.219-7.356-5.932-11.671-7.988l-0.276-0.118h-3.84c-4.056-2.368-8.817-4.028-13.894-4.674l-0.186-0.019h-258.133c-70.692 0-128 57.308-128 128v0 597.333c0 70.692 57.308 128 128 128v0h426.667c70.692 0 128-57.308 128-128v0-426.667s0 0 0-2.56zM597.333 230.827l110.507 110.507h-67.84c-23.564 0-42.667-19.103-42.667-42.667v0zM768 810.667c0 23.564-19.103 42.667-42.667 42.667v0h-426.667c-23.564 0-42.667-19.103-42.667-42.667v0-597.333c0-23.564 19.103-42.667 42.667-42.667v0h213.333v128c0 70.692 57.308 128 128 128v0h128z"],"attrs":[],"grid":0,"tags":["file-minus"]},"attrs":[],"properties":{"order":4997,"id":687,"name":"file-minus","prevSize":32,"code":60166},"setIdx":0,"setId":0,"iconIdx":518},{"icon":{"paths":["M896 810.667h-263.68c-13.196-36.33-41.323-64.457-76.764-77.37l-0.89-0.283v-93.013h128c70.692 0 128-57.308 128-128v0-170.667s0 0 0-2.56c-0.496-4.292-1.396-8.191-2.678-11.913l0.118 0.393v-3.84c-2.174-4.59-4.887-8.531-8.128-11.969l0.021 0.023-256-256c-3.415-3.219-7.356-5.932-11.671-7.988l-0.276-0.118c-0.577-0.086-1.243-0.136-1.92-0.136s-1.343 0.049-1.994 0.145l0.074-0.009c-4.056-2.368-8.817-4.028-13.894-4.674l-0.186-0.019h-172.8c-70.692 0-128 57.308-128 128v0 341.333c0 70.692 57.308 128 128 128v0h128v93.013c-36.33 13.196-64.457 41.323-77.37 76.764l-0.283 0.89h-263.68c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h263.68c18.382 49.611 65.296 84.33 120.32 84.33s101.938-34.719 120.032-83.444l0.288-0.886h263.68c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM554.667 188.16l110.507 110.507h-67.84c-23.564 0-42.667-19.103-42.667-42.667v0zM341.333 554.667c-23.564 0-42.667-19.103-42.667-42.667v0-341.333c0-23.564 19.103-42.667 42.667-42.667v0h128v128c0 70.692 57.308 128 128 128v0h128v128c0 23.564-19.103 42.667-42.667 42.667v0zM512 896c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667c23.564 0 42.667 19.103 42.667 42.667v0c0 23.564-19.103 42.667-42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["file-network"]},"attrs":[],"properties":{"order":4998,"id":686,"name":"file-network","prevSize":32,"code":60167},"setIdx":0,"setId":0,"iconIdx":519},{"icon":{"paths":["M853.333 768h-42.667v-42.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 42.667h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h42.667v42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM554.667 853.333h-298.667c-23.564 0-42.667-19.103-42.667-42.667v0-597.333c0-23.564 19.103-42.667 42.667-42.667v0h213.333v128c0 70.692 57.308 128 128 128v0h128v128c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-170.667s0 0 0-2.56c-0.496-4.292-1.396-8.191-2.678-11.913l0.118 0.393v-3.84c-2.174-4.59-4.887-8.531-8.128-11.969l0.021 0.023-256-256c-3.415-3.219-7.356-5.932-11.671-7.988l-0.276-0.118c-0.641-0.118-1.379-0.185-2.133-0.185s-1.492 0.067-2.209 0.197l0.075-0.011c-3.819-2.087-8.248-3.713-12.928-4.644l-0.299-0.050h-258.56c-70.692 0-128 57.308-128 128v0 597.333c0 70.692 57.308 128 128 128v0h298.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM554.667 230.827l110.507 110.507h-67.84c-23.564 0-42.667-19.103-42.667-42.667v0zM341.333 341.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM554.667 682.667h-213.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h213.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM597.333 512h-256c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h256c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["file-plus-alt"]},"attrs":[],"properties":{"order":4999,"id":685,"name":"file-plus-alt","prevSize":32,"code":60168},"setIdx":0,"setId":0,"iconIdx":520},{"icon":{"paths":["M853.333 381.44c-0.496-4.292-1.396-8.191-2.678-11.913l0.118 0.393v-3.84c-2.174-4.59-4.887-8.531-8.128-11.969l0.021 0.023-256-256c-3.415-3.219-7.356-5.932-11.671-7.988l-0.276-0.118c-0.577-0.086-1.243-0.136-1.92-0.136s-1.343 0.049-1.994 0.145l0.074-0.009c-4.056-2.368-8.817-4.028-13.894-4.674l-0.186-0.019h-258.133c-70.692 0-128 57.308-128 128v0 597.333c0 70.692 57.308 128 128 128v0h426.667c70.692 0 128-57.308 128-128v0-426.667s0 0 0-2.56zM597.333 230.827l110.507 110.507h-67.84c-23.564 0-42.667-19.103-42.667-42.667v0zM768 810.667c0 23.564-19.103 42.667-42.667 42.667v0h-426.667c-23.564 0-42.667-19.103-42.667-42.667v0-597.333c0-23.564 19.103-42.667 42.667-42.667v0h213.333v128c0 70.692 57.308 128 128 128v0h128zM597.333 597.333h-42.667v-42.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 42.667h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h42.667v42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["file-plus"]},"attrs":[],"properties":{"order":5000,"id":684,"name":"file-plus","prevSize":32,"code":60169},"setIdx":0,"setId":0,"iconIdx":521},{"icon":{"paths":["M536.32 737.707c-7.712-7.668-18.343-12.407-30.080-12.407s-22.368 4.74-30.082 12.409l0.002-0.002c-3.88 3.95-7.045 8.619-9.274 13.787l-0.113 0.293c-1.884 4.813-2.976 10.386-2.976 16.213s1.092 11.4 3.082 16.525l-0.106-0.311c2.458 5.423 5.608 10.075 9.41 14.105l-0.023-0.025c3.822 3.733 8.354 6.76 13.372 8.856l0.282 0.104c4.908 2.147 10.626 3.401 16.635 3.413l0.005 0c23.473-0.121 42.454-19.177 42.454-42.666 0-5.848-1.176-11.421-3.305-16.495l0.105 0.281c-2.167-5.524-5.358-10.222-9.373-14.067l-0.014-0.013zM853.333 381.44c-0.496-4.292-1.396-8.191-2.678-11.913l0.118 0.393v-3.84c-2.174-4.59-4.887-8.531-8.128-11.969l0.021 0.023-256-256c-3.415-3.219-7.356-5.932-11.671-7.988l-0.276-0.118h-3.84c-4.056-2.368-8.817-4.028-13.894-4.674l-0.186-0.019h-258.133c-70.692 0-128 57.308-128 128v0 597.333c0 70.692 57.308 128 128 128v0h426.667c70.692 0 128-57.308 128-128v0-426.667s0 0 0-2.56zM597.333 230.827l110.507 110.507h-67.84c-23.564 0-42.667-19.103-42.667-42.667v0zM768 810.667c0 23.564-19.103 42.667-42.667 42.667v0h-426.667c-23.564 0-42.667-19.103-42.667-42.667v0-597.333c0-23.564 19.103-42.667 42.667-42.667v0h213.333v128c0 70.692 57.308 128 128 128v0h128zM506.453 426.667c-0.024-0-0.053-0-0.082-0-47.128 0-88.308 25.47-110.524 63.396l-0.327 0.604c-4.177 6.48-6.66 14.395-6.66 22.89 0 23.564 19.103 42.667 42.667 42.667 16.334 0 30.524-9.178 37.694-22.659l0.112-0.23c7.514-12.844 21.241-21.334 36.951-21.334 0.060 0 0.119 0 0.179 0l-0.009-0c23.564 0 42.667 19.103 42.667 42.667s-19.103 42.667-42.667 42.667v0c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0c70.692 0 128-57.308 128-128s-57.308-128-128-128v0z"],"attrs":[],"grid":0,"tags":["file-question"]},"attrs":[],"properties":{"order":5001,"id":683,"name":"file-question","prevSize":32,"code":60170},"setIdx":0,"setId":0,"iconIdx":522},{"icon":{"paths":["M597.333 554.667c0-23.564-19.103-42.667-42.667-42.667v0h-213.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h213.333c23.564 0 42.667-19.103 42.667-42.667v0zM469.333 853.333h-213.333c-23.564 0-42.667-19.103-42.667-42.667v0-597.333c0-23.564 19.103-42.667 42.667-42.667v0h213.333v128c0 70.692 57.308 128 128 128v0h128v42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-85.333s0 0 0-2.56c-0.442-4.264-1.345-8.168-2.67-11.872l0.11 0.352v-3.84c-2.049-4.631-4.778-8.59-8.109-11.949l0.003 0.003-256-256c-3.415-3.219-7.356-5.932-11.671-7.988l-0.276-0.118h-3.84c-3.928-2.337-8.539-3.993-13.462-4.672l-0.192-0.022h-258.56c-70.692 0-128 57.308-128 128v0 597.333c0 70.692 57.308 128 128 128v0h213.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM554.667 230.827l110.507 110.507h-67.84c-23.564 0-42.667-19.103-42.667-42.667v0zM853.333 597.333c-17.281 0.116-32.111 10.488-38.719 25.329l-0.108 0.271c-25.388-15.802-56.141-25.288-89.088-25.599l-0.085-0.001c-0.073-0-0.159-0-0.245-0-94.257 0-170.667 76.41-170.667 170.667s76.41 170.667 170.667 170.667c43.368 0 82.958-16.176 113.066-42.823l-0.18 0.157c8.985-7.884 14.626-19.39 14.626-32.213 0-23.63-19.156-42.786-42.786-42.786-10.807 0-20.678 4.006-28.209 10.615l0.049-0.042c-14.885 13.372-34.626 21.601-56.287 21.76l-0.033 0c-46.533-0.774-83.958-38.677-83.958-85.322 0-47.128 38.205-85.333 85.333-85.333 15.154 0 29.386 3.95 41.721 10.877l-0.429-0.222h-9.387c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h94.72c23.564 0 42.667-19.103 42.667-42.667v0-96c0-23.564-19.103-42.667-42.667-42.667v0zM341.333 426.667h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM341.333 682.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h85.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["file-redo-alt"]},"attrs":[],"properties":{"order":5002,"id":682,"name":"file-redo-alt","prevSize":32,"code":60171},"setIdx":0,"setId":0,"iconIdx":523},{"icon":{"paths":["M557.653 512h-213.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h213.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM600.32 853.333h-341.333c-23.564 0-42.667-19.103-42.667-42.667v0-597.333c0-23.564 19.103-42.667 42.667-42.667v0h213.333v128c0 70.692 57.308 128 128 128v0h128v42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-85.333c0.088-0.385 0.139-0.826 0.139-1.28s-0.051-0.895-0.146-1.32l0.008 0.040c-0.396-4.248-1.457-8.154-3.080-11.751l0.093 0.231v-3.84c-2.174-4.59-4.887-8.531-8.128-11.969l0.021 0.023-256-256c-3.506-3.3-7.6-6.027-12.099-8l-0.274-0.107s-2.133 0-3.413 0c-3.932-2.316-8.539-3.969-13.453-4.67l-0.2-0.023h-256c-70.692 0-128 57.308-128 128v0 597.333c0 70.692 57.308 128 128 128v0h341.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM557.653 230.827l110.080 110.507h-67.413c-23.564 0-42.667-19.103-42.667-42.667v0zM795.307 865.707c-1.923-1.746-4.010-3.427-6.193-4.98l-0.207-0.14c-4.399-2.9-9.54-5.115-15.053-6.343l-0.307-0.057c-2.518-0.528-5.413-0.83-8.377-0.83-11.709 0-22.317 4.717-30.026 12.354l0.003-0.003c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003c7.667 7.606 18.211 12.323 29.857 12.373l0.010 0c0.064 0 0.139 0.001 0.214 0.001 23.564 0 42.667-19.103 42.667-42.667 0-5.848-1.176-11.421-3.305-16.495l0.105 0.281c-2.458-5.423-5.608-10.075-9.41-14.105l0.023 0.025zM557.653 682.667h-213.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h213.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM765.013 554.667c-0.024-0-0.053-0-0.082-0-47.128 0-88.308 25.47-110.524 63.396l-0.327 0.604c-3.58 6.123-5.694 13.481-5.694 21.333 0 23.645 19.168 42.814 42.814 42.814 15.793 0 29.589-8.552 37.010-21.277l0.11-0.203c7.515-12.843 21.241-21.333 36.95-21.333 23.564 0 42.667 19.103 42.667 42.667s-19.103 42.667-42.667 42.667c-0.090 0-0.18-0-0.27-0.001l0.014 0c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0c70.692 0 128-57.308 128-128s-57.308-128-128-128v0zM344.32 426.667h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["file-question-alt"]},"attrs":[],"properties":{"order":5003,"id":681,"name":"file-question-alt","prevSize":32,"code":60172},"setIdx":0,"setId":0,"iconIdx":524},{"icon":{"paths":["M926.293 865.707l-768-768c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293v0l72.96 72.533v579.84c0 70.692 57.308 128 128 128v0h426.667c41.572-0.143 78.457-20.082 101.74-50.878l0.233-0.322 38.4 38.827c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003zM725.333 853.333h-426.667c-23.564 0-42.667-19.103-42.667-42.667v0-494.507l509.013 509.013c-6.062 16.426-21.498 27.964-39.656 28.16l-0.024 0zM369.493 170.667h142.507v128c0 70.692 57.308 128 128 128v0h128v142.507c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-185.173s0 0 0-2.56c-0.496-4.292-1.396-8.191-2.678-11.913l0.118 0.393v-3.84c-2.174-4.59-4.887-8.531-8.128-11.969l0.021 0.023-256-256c-3.415-3.219-7.356-5.932-11.671-7.988l-0.276-0.118h-3.84l-13.653-4.693h-187.733c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM597.333 230.827l110.507 110.507h-67.84c-23.564 0-42.667-19.103-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["file-slash"]},"attrs":[],"properties":{"order":5004,"id":680,"name":"file-slash","prevSize":32,"code":60173},"setIdx":0,"setId":0,"iconIdx":525},{"icon":{"paths":["M597.333 512h-256c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h256c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM828.16 810.667l55.467-55.040c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548v0l-55.040 55.467-55.040-55.467c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l-0-0 55.467 55.040-55.467 55.040c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 55.040-55.467 55.040 55.467c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003zM512 853.333h-256c-23.564 0-42.667-19.103-42.667-42.667v0-597.333c0-23.564 19.103-42.667 42.667-42.667v0h213.333v128c0 70.692 57.308 128 128 128v0h128v128c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-170.667s0 0 0-2.56c-0.496-4.292-1.396-8.191-2.678-11.913l0.118 0.393v-3.84c-2.174-4.59-4.887-8.531-8.128-11.969l0.021 0.023-256-256c-3.415-3.219-7.356-5.932-11.671-7.988l-0.276-0.118c-0.641-0.118-1.379-0.185-2.133-0.185s-1.492 0.067-2.209 0.197l0.075-0.011c-3.819-2.087-8.248-3.713-12.928-4.644l-0.299-0.050h-258.56c-70.692 0-128 57.308-128 128v0 597.333c0 70.692 57.308 128 128 128v0h256c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM554.667 230.827l110.507 110.507h-67.84c-23.564 0-42.667-19.103-42.667-42.667v0zM341.333 341.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM512 682.667h-170.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h170.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["file-times-alt"]},"attrs":[],"properties":{"order":5005,"id":679,"name":"file-times-alt","prevSize":32,"code":60174},"setIdx":0,"setId":0,"iconIdx":526},{"icon":{"paths":["M448 853.333h-213.333c-23.564 0-42.667-19.103-42.667-42.667v0-597.333c0-23.564 19.103-42.667 42.667-42.667v0h213.333v128c0 70.692 57.308 128 128 128v0h128c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667s0 0 0-2.56c-0.496-4.292-1.396-8.191-2.678-11.913l0.118 0.393v-3.84c-2.174-4.59-4.887-8.531-8.128-11.969l0.021 0.023-256-256c-3.415-3.219-7.356-5.932-11.671-7.988l-0.276-0.118c-0.577-0.086-1.243-0.136-1.92-0.136s-1.343 0.049-1.994 0.145l0.074-0.009-13.653-4.693h-258.56c-70.692 0-128 57.308-128 128v0 597.333c0 70.692 57.308 128 128 128v0h213.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM533.333 230.827l110.507 110.507h-67.84c-23.564 0-42.667-19.103-42.667-42.667v0zM320 341.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM901.547 591.36c-7.264-5.913-16.631-9.495-26.834-9.495-3.19 0-6.299 0.35-9.29 1.014l0.284-0.053c-7.325 1.615-15.739 2.54-24.369 2.54-26.122 0-50.264-8.475-69.828-22.824l0.331 0.231c-6.96-5.134-15.707-8.217-25.173-8.217s-18.213 3.083-25.291 8.3l0.117-0.083c-19.273 14.101-43.446 22.563-69.595 22.563-8.594 0-16.975-0.914-25.051-2.65l0.78 0.14c-2.696-0.606-5.793-0.954-8.971-0.954-23.564 0-42.667 19.103-42.667 42.667 0 0.335 0.004 0.67 0.012 1.003l-0.001-0.050v99.84c-0 0.126-0 0.276-0 0.426 0 63.989 30.623 120.827 78.013 156.656l0.494 0.358 66.56 47.36c7.042 5.327 15.947 8.533 25.6 8.533s18.558-3.206 25.707-8.611l-0.107 0.078 66.56-49.493c47.442-35.85 77.936-91.959 78.506-155.215l0.001-0.092v-101.12c-0.090-13.235-6.193-25.027-15.71-32.792l-0.077-0.061zM832 725.333c0.005 0.39 0.008 0.85 0.008 1.311 0 35.542-16.587 67.209-42.441 87.684l-0.233 0.178-42.667 30.72-42.667-30.72c-26.088-20.653-42.674-52.321-42.674-87.862 0-0.461 0.003-0.921 0.008-1.381l-0.001 0.070v-54.613c31.463-1.455 60.636-9.972 86.381-23.989l-1.048 0.522c24.698 13.495 53.87 22.012 84.892 23.45l0.442 0.016zM448 684.8h-128c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h128c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM490.667 514.133h-170.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h170.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["file-shield-alt"]},"attrs":[],"properties":{"order":5006,"id":678,"name":"file-shield-alt","prevSize":32,"code":60175},"setIdx":0,"setId":0,"iconIdx":527},{"icon":{"paths":["M627.627 524.373c-7.733-7.795-18.45-12.621-30.293-12.621s-22.56 4.826-30.291 12.618l-0.003 0.003-55.040 55.467-55.040-55.467c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l-0-0 55.467 55.040-55.467 55.040c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 55.040-55.467 55.040 55.467c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003-55.467-55.040 55.467-55.040c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003zM853.333 381.44c-0.496-4.292-1.396-8.191-2.678-11.913l0.118 0.393v-3.84c-2.174-4.59-4.887-8.531-8.128-11.969l0.021 0.023-256-256c-3.415-3.219-7.356-5.932-11.671-7.988l-0.276-0.118h-4.267c-3.819-2.087-8.248-3.713-12.928-4.644l-0.299-0.050h-258.56c-70.692 0-128 57.308-128 128v0 597.333c0 70.692 57.308 128 128 128v0h426.667c70.692 0 128-57.308 128-128v0-426.667s0 0 0-2.56zM597.333 230.827l110.507 110.507h-67.84c-23.564 0-42.667-19.103-42.667-42.667v0zM768 810.667c0 23.564-19.103 42.667-42.667 42.667v0h-426.667c-23.564 0-42.667-19.103-42.667-42.667v0-597.333c0-23.564 19.103-42.667 42.667-42.667v0h213.333v128c0 70.692 57.308 128 128 128v0h128z"],"attrs":[],"grid":0,"tags":["file-times"]},"attrs":[],"properties":{"order":5007,"id":677,"name":"file-times","prevSize":32,"code":60176},"setIdx":0,"setId":0,"iconIdx":528},{"icon":{"paths":["M576 533.333c0-23.564-19.103-42.667-42.667-42.667v0h-213.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h213.333c23.564 0 42.667-19.103 42.667-42.667v0zM789.333 746.667c-18.957 0.064-36.446 6.3-50.575 16.802l0.228-0.162-74.667-34.133 81.493-37.547c12.169 7.502 26.854 12.065 42.582 12.372l0.085 0.001c47.128 0 85.333-38.205 85.333-85.333s-38.205-85.333-85.333-85.333c-47.128 0-85.333 38.205-85.333 85.333v0l-80.64 37.12c-13.728-9.842-30.865-15.738-49.379-15.738-47.128 0-85.333 38.205-85.333 85.333s38.205 85.333 85.333 85.333c1.010 0 2.016-0.018 3.018-0.052l-0.145 0.004c0.011 0 0.024 0 0.037 0 14.407 0 27.926-3.798 39.612-10.447l-0.396 0.207 89.6 42.667c5.089 42.715 41.097 75.518 84.767 75.518 47.128 0 85.333-38.205 85.333-85.333 0-46.929-37.883-85.010-84.736-85.331l-0.031-0zM448 832h-213.333c-23.564 0-42.667-19.103-42.667-42.667v0-597.333c0-23.564 19.103-42.667 42.667-42.667v0h213.333v128c0 70.692 57.308 128 128 128v0h128c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667s0 0 0-2.56c-0.496-4.292-1.396-8.191-2.678-11.913l0.118 0.393v-3.84c-2.174-4.59-4.887-8.531-8.128-11.969l0.021 0.023-256-256c-3.415-3.219-7.356-5.932-11.671-7.988l-0.276-0.118c-0.641-0.118-1.379-0.185-2.133-0.185s-1.492 0.067-2.209 0.197l0.075-0.011c-3.228-1.215-6.985-2.117-10.885-2.542l-0.209-0.018h-260.693c-70.692 0-128 57.308-128 128v0 597.333c0 70.692 57.308 128 128 128v0h213.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM533.333 209.493l110.507 110.507h-67.84c-23.564 0-42.667-19.103-42.667-42.667v0zM320 661.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM320 405.333h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["file-share-alt"]},"attrs":[],"properties":{"order":5008,"id":676,"name":"file-share-alt","prevSize":32,"code":60177},"setIdx":0,"setId":0,"iconIdx":529},{"icon":{"paths":["M512 853.333h-298.667c-23.564 0-42.667-19.103-42.667-42.667v0-597.333c0-23.564 19.103-42.667 42.667-42.667v0h213.333v128c0 70.692 57.308 128 128 128v0h128v42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-85.333s0 0 0-2.56c-0.496-4.292-1.396-8.191-2.678-11.913l0.118 0.393v-3.84c-2.174-4.59-4.887-8.531-8.128-11.969l0.021 0.023-256-256c-3.415-3.219-7.356-5.932-11.671-7.988l-0.276-0.118c-0.577-0.086-1.243-0.136-1.92-0.136s-1.343 0.049-1.994 0.145l0.074-0.009c-4.056-2.368-8.817-4.028-13.894-4.674l-0.186-0.019h-258.133c-70.692 0-128 57.308-128 128v0 597.333c0 70.692 57.308 128 128 128v0h298.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM512 230.827l110.507 110.507h-67.84c-23.564 0-42.667-19.103-42.667-42.667v0zM298.667 341.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM926.293 865.707l-49.92-49.493c12.211-20.95 19.419-46.114 19.419-72.961 0-40.266-16.215-76.746-42.471-103.264l0.012 0.012c-27.116-28.055-65.084-45.473-107.12-45.473-82.239 0-148.907 66.668-148.907 148.907 0 0.987 0.010 1.971 0.029 2.954l-0.002-0.147c-0.002 0.25-0.002 0.546-0.002 0.842 0 81.532 66.095 147.627 147.627 147.627 26.145 0 50.702-6.796 72.002-18.719l-0.746 0.384 49.493 49.92c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003zM791.040 791.040c-11.729 11.050-27.578 17.841-45.013 17.841s-33.284-6.791-45.046-17.871l0.033 0.031c-11.332-11.528-18.332-27.345-18.347-44.797l-0-0.003c-0.002-0.194-0.003-0.424-0.003-0.653 0-17.465 7.187-33.25 18.765-44.561l0.012-0.012c10.985-10.927 25.972-17.839 42.572-18.344l0.095-0.002c1.15-0.075 2.494-0.118 3.848-0.118 34.639 0 62.72 28.081 62.72 62.72 0 0.342-0.003 0.683-0.008 1.023l0.001-0.051c-0.379 17.624-7.824 33.439-19.606 44.781l-0.020 0.019zM554.667 512h-256c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h256c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM469.333 768c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-170.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["file-search-alt"]},"attrs":[],"properties":{"order":5009,"id":675,"name":"file-search-alt","prevSize":32,"code":60178},"setIdx":0,"setId":0,"iconIdx":530},{"icon":{"paths":["M853.333 381.44c-0.496-4.292-1.396-8.191-2.678-11.913l0.118 0.393v-3.84c-2.174-4.59-4.887-8.531-8.128-11.969l0.021 0.023-256-256c-3.415-3.219-7.356-5.932-11.671-7.988l-0.276-0.118h-3.84l-13.653-4.693h-258.56c-70.692 0-128 57.308-128 128v0 597.333c0 70.692 57.308 128 128 128v0h426.667c70.692 0 128-57.308 128-128v0-426.667s0 0 0-2.56zM597.333 230.827l110.507 110.507h-110.507zM768 810.667c0 23.564-19.103 42.667-42.667 42.667v0h-426.667c-23.564 0-42.667-19.103-42.667-42.667v0-597.333c0-23.564 19.103-42.667 42.667-42.667v0h213.333v213.333c0 23.564 19.103 42.667 42.667 42.667v0h213.333z"],"attrs":[],"grid":0,"tags":["file"]},"attrs":[],"properties":{"order":5010,"id":674,"name":"file","prevSize":32,"code":60179},"setIdx":0,"setId":0,"iconIdx":531},{"icon":{"paths":["M542.293 481.707c-3.937-3.773-8.616-6.808-13.791-8.859l-0.289-0.101c-4.793-2.024-10.366-3.201-16.213-3.201s-11.42 1.176-16.495 3.305l0.281-0.105c-5.464 2.152-10.143 5.187-14.095 8.974l0.015-0.014-85.333 85.333c-7.753 7.753-12.548 18.463-12.548 30.293 0 23.661 19.181 42.841 42.841 42.841 11.83 0 22.541-4.795 30.293-12.548l-0 0 12.373-12.8v110.507c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-110.507l12.373 12.8c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003zM853.333 381.44c-0.496-4.292-1.396-8.191-2.678-11.913l0.118 0.393v-3.84c-2.174-4.59-4.887-8.531-8.128-11.969l0.021 0.023-256-256c-3.415-3.219-7.356-5.932-11.671-7.988l-0.276-0.118h-4.267c-3.819-2.087-8.248-3.713-12.928-4.644l-0.299-0.050h-258.56c-70.692 0-128 57.308-128 128v0 597.333c0 70.692 57.308 128 128 128v0h426.667c70.692 0 128-57.308 128-128v0-426.667s0 0 0-2.56zM597.333 230.827l110.507 110.507h-67.84c-23.564 0-42.667-19.103-42.667-42.667v0zM768 810.667c0 23.564-19.103 42.667-42.667 42.667v0h-426.667c-23.564 0-42.667-19.103-42.667-42.667v0-597.333c0-23.564 19.103-42.667 42.667-42.667v0h213.333v128c0 70.692 57.308 128 128 128v0h128z"],"attrs":[],"grid":0,"tags":["file-upload"]},"attrs":[],"properties":{"order":5011,"id":673,"name":"file-upload","prevSize":32,"code":60180},"setIdx":0,"setId":0,"iconIdx":532},{"icon":{"paths":["M810.667 85.333h-597.333c-70.692 0-128 57.308-128 128v0 49.92c-0 0.013-0 0.029-0 0.044 0 18.503 3.926 36.089 10.99 51.97l-0.324-0.815v2.56c6.358 14.241 14.83 26.401 25.169 36.689l262.831 261.125v281.173c-0 0.025-0 0.055-0 0.085 0 15.184 7.932 28.516 19.878 36.078l0.175 0.103c6.387 4.017 14.153 6.4 22.476 6.4 0.048 0 0.096-0 0.144-0l-0.007 0c7.017-0.043 13.619-1.774 19.436-4.805l-0.236 0.112 170.667-85.333c13.992-7.163 23.415-21.462 23.467-37.966l0-0.007v-195.84l261.12-261.12c10.343-10.292 18.815-22.453 24.869-35.935l0.304-0.758v-2.56c7.295-14.966 11.797-32.49 12.369-51.005l0.005-0.195v-49.92c0-70.692-57.308-128-128-128v0zM567.040 567.040c-7.648 7.709-12.374 18.326-12.374 30.047 0 0.087 0 0.173 0.001 0.26l-0-0.013v186.88l-85.333 42.667v-229.547c0-0.073 0.001-0.16 0.001-0.247 0-11.721-4.726-22.338-12.377-30.049l0.003 0.003-226.133-225.707h562.347zM853.333 256h-682.667v-42.667c0-23.564 19.103-42.667 42.667-42.667v0h597.333c23.564 0 42.667 19.103 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["filter"]},"attrs":[],"properties":{"order":5012,"id":672,"name":"filter","prevSize":32,"code":60181},"setIdx":0,"setId":0,"iconIdx":533},{"icon":{"paths":["M820.053 256h-279.893c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h279.893c18.38 0 33.28 14.9 33.28 33.28v-0 33.28h-161.28c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h101.12l-29.867 29.44c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 80.213-80.213c9.568-9.534 17.341-20.863 22.773-33.439l0.267-0.694v-4.267c6.767-13.299 10.96-28.924 11.515-45.471l0.005-0.182v-42.667c0.004-0.381 0.007-0.83 0.007-1.281 0-65.596-53.057-118.801-118.597-119.039l-0.023-0zM158.293 97.707c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l-0-0 121.6 121.173c-29.602 21.394-48.641 55.817-48.641 94.686 0 0.162 0 0.324 0.001 0.486l-0-0.025v42.667c0.013 17.021 3.785 33.158 10.531 47.629l-0.291-0.696v2.56c5.756 13.401 13.522 24.859 23.057 34.577l-0.017-0.017 230.827 230.4v164.267c-0 0.025-0 0.055-0 0.085 0 15.184 7.932 28.516 19.878 36.078l0.175 0.103c6.387 4.017 14.153 6.4 22.476 6.4 0.048 0 0.096-0 0.144-0l-0.007 0c7.017-0.043 13.619-1.774 19.436-4.805l-0.236 0.112 151.893-75.947c13.992-7.163 23.415-21.462 23.467-37.966l0-0.007v-85.333l192.427 192.853c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003zM256 374.613c-0.001-0.074-0.001-0.162-0.001-0.25 0-13.928 8.782-25.806 21.11-30.397l0.224-0.073 3.84-2.56 66.56 66.56h-91.733zM600.32 685.653c-7.648 7.709-12.374 18.326-12.374 30.047 0 0.087 0 0.173 0.001 0.26l-0-0.013v77.653l-66.56 33.28v-110.933c0-0.073 0.001-0.16 0.001-0.247 0-11.721-4.726-22.338-12.377-30.049l0.003 0.003-192.853-192.427h116.907l180.053 180.053z"],"attrs":[],"grid":0,"tags":["filter-slash"]},"attrs":[],"properties":{"order":5013,"id":671,"name":"filter-slash","prevSize":32,"code":60182},"setIdx":0,"setId":0,"iconIdx":534},{"icon":{"paths":["M981.333 424.107c-0.496-4.292-1.396-8.191-2.678-11.913l0.118 0.393v-3.84c-2.174-4.59-4.887-8.531-8.128-11.969l0.021 0.023-256-256c-3.415-3.219-7.356-5.932-11.671-7.988l-0.276-0.118h-3.84c-4.056-2.368-8.817-4.028-13.894-4.674l-0.186-0.019h-343.467c-70.692 0-128 57.308-128 128v0 42.667h-42.667c-70.692 0-128 57.308-128 128v0 341.333c0 70.692 57.308 128 128 128v0h512c70.692 0 128-57.308 128-128v0-42.667h42.667c70.692 0 128-57.308 128-128v0-170.667s0 0 0-2.56zM725.333 273.493l110.507 110.507h-67.84c-23.564 0-42.667-19.103-42.667-42.667v0zM725.333 768c0 23.564-19.103 42.667-42.667 42.667v0h-512c-23.564 0-42.667-19.103-42.667-42.667v0-341.333c0-23.564 19.103-42.667 42.667-42.667v0h42.667v213.333c0 70.692 57.308 128 128 128v0h384zM896 597.333c0 23.564-19.103 42.667-42.667 42.667v0h-512c-23.564 0-42.667-19.103-42.667-42.667v0-341.333c0-23.564 19.103-42.667 42.667-42.667v0h298.667v128c0 70.692 57.308 128 128 128v0h128z"],"attrs":[],"grid":0,"tags":["files-landscapes"]},"attrs":[],"properties":{"order":5014,"id":670,"name":"files-landscapes","prevSize":32,"code":60183},"setIdx":0,"setId":0,"iconIdx":535},{"icon":{"paths":["M896 85.333c-23.564 0-42.667 19.103-42.667 42.667v0 85.333h-85.333v-85.333c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 42.667h-341.333v-42.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 85.333h-85.333v-85.333c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 768c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-85.333h85.333v85.333c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667h341.333v42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-85.333h85.333v85.333c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-768c0-23.564-19.103-42.667-42.667-42.667v0zM256 725.333h-85.333v-85.333h85.333zM256 554.667h-85.333v-85.333h85.333zM256 384h-85.333v-85.333h85.333zM682.667 768h-341.333v-213.333h341.333zM682.667 469.333h-341.333v-213.333h341.333zM853.333 725.333h-85.333v-85.333h85.333zM853.333 554.667h-85.333v-85.333h85.333zM853.333 384h-85.333v-85.333h85.333z"],"attrs":[],"grid":0,"tags":["film"]},"attrs":[],"properties":{"order":5015,"id":669,"name":"film","prevSize":32,"code":60184},"setIdx":0,"setId":0,"iconIdx":536},{"icon":{"paths":["M858.027 746.24l-218.027-373.76v-201.813h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-341.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h42.667v201.813l-218.027 373.76c-10.935 18.461-17.396 40.689-17.396 64.427 0 70.658 57.252 127.945 127.898 128l469.339 0c70.651-0.055 127.903-57.342 127.903-128 0-23.738-6.462-45.966-17.722-65.022l0.326 0.596zM463.36 404.907c3.61-5.98 5.809-13.17 5.973-20.861l0.001-0.046v-213.333h85.333v213.333c0.084 7.883 2.294 15.233 6.081 21.526l-0.107-0.192 36.693 64h-170.667zM784.213 831.573c-7.472 12.771-21.083 21.236-36.679 21.333l-0.014 0h-469.333c-15.61-0.097-29.222-8.562-36.584-21.132l-0.109-0.201c-3.594-6.12-5.716-13.479-5.716-21.333s2.123-15.214 5.825-21.535l-0.109 0.201 135.253-234.24h270.933l136.533 234.667c3.594 6.12 5.716 13.479 5.716 21.333s-2.123 15.214-5.825 21.535l0.109-0.201zM426.667 640c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM597.333 682.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["flask"]},"attrs":[],"properties":{"order":5016,"id":668,"name":"flask","prevSize":32,"code":60185},"setIdx":0,"setId":0,"iconIdx":537},{"icon":{"paths":["M807.68 497.92c0.081-0.64 0.127-1.381 0.127-2.133s-0.046-1.493-0.136-2.22l0.009 0.087c-32.489-76.161-91.728-135.677-165.638-167.745l-2.042-0.789v-154.453h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-341.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h42.667v154.453c-75.605 33.684-134.311 93.913-165.205 168.571l-0.768 2.095c-0.081 0.64-0.127 1.381-0.127 2.133s0.046 1.493 0.136 2.22l-0.009-0.087c-15.38 36.159-24.32 78.218-24.32 122.366 0 176.731 143.269 320 320 320s320-143.269 320-320c0-44.147-8.94-86.206-25.108-124.466l0.788 2.1zM439.893 395.093c17.225-5.741 29.426-21.71 29.44-40.532l0-0.002v-183.893h85.333v183.893c0.014 18.823 12.215 34.793 29.139 40.446l0.301 0.087c43.773 14.451 80.542 40.202 108.046 73.827l0.327 0.413h-360.96c27.831-34.038 64.6-59.789 106.737-73.77l1.636-0.47zM512 853.333c-129.505-0.242-234.424-105.161-234.667-234.643l-0-0.023c0.075-22.842 3.5-44.855 9.808-65.614l-0.422 1.614h450.56c5.887 19.145 9.311 41.158 9.387 63.96l0 0.040c-0.242 129.505-105.161 234.424-234.643 234.667l-0.023 0zM597.333 682.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM426.667 640c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["flask-potion"]},"attrs":[],"properties":{"order":5017,"id":667,"name":"flask-potion","prevSize":32,"code":60186},"setIdx":0,"setId":0,"iconIdx":538},{"icon":{"paths":["M768 810.667h-512c-70.692 0-128-57.308-128-128v0-341.333c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 341.333c0 117.821 95.513 213.333 213.333 213.333v0h512c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM597.333 469.333h-170.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h170.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM981.333 424.107c-0.496-4.292-1.396-8.191-2.678-11.913l0.118 0.393v-3.84c-2.174-4.59-4.887-8.531-8.128-11.969l0.021 0.023-256-256c-3.415-3.219-7.356-5.932-11.671-7.988l-0.276-0.118h-3.84c-4.056-2.368-8.817-4.028-13.894-4.674l-0.186-0.019h-343.467c-70.692 0-128 57.308-128 128v0 341.333c0 70.692 57.308 128 128 128v0h512c70.692 0 128-57.308 128-128v0-170.667s0 0 0-2.56zM725.333 273.493l110.507 110.507h-67.84c-23.564 0-42.667-19.103-42.667-42.667v0zM896 597.333c0 23.564-19.103 42.667-42.667 42.667v0h-512c-23.564 0-42.667-19.103-42.667-42.667v0-341.333c0-23.564 19.103-42.667 42.667-42.667v0h298.667v128c0 70.692 57.308 128 128 128v0h128zM426.667 384h85.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-85.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["files-landscapes-alt"]},"attrs":[],"properties":{"order":5018,"id":666,"name":"files-landscapes-alt","prevSize":32,"code":60187},"setIdx":0,"setId":0,"iconIdx":539},{"icon":{"paths":["M563.627 243.2c1.537 0.196 3.315 0.308 5.12 0.308s3.583-0.112 5.328-0.329l-0.208 0.021 82.773-20.907c18.745-4.768 32.388-21.496 32.388-41.41 0-3.627-0.453-7.149-1.305-10.512l0.063 0.295c-4.768-18.745-21.496-32.388-41.41-32.388-3.627 0-7.149 0.453-10.512 1.305l0.295-0.063-81.493 19.627c-21.428 2.645-37.853 20.738-37.853 42.667 0 23.733 19.24 42.973 42.973 42.973 1.804 0 3.583-0.111 5.329-0.327l-0.209 0.021zM405.76 384h-85.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h85.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM576.427 384c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h85.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM315.307 305.067h10.24l82.773-20.48c19.095-4.768 33.016-21.772 33.016-42.027 0-23.89-19.366-43.256-43.256-43.256-3.635 0-7.165 0.448-10.538 1.293l0.298-0.063-82.773 20.48c-21.428 2.645-37.853 20.738-37.853 42.667 0 23.733 19.24 42.973 42.973 42.973 1.804 0 3.583-0.111 5.329-0.327l-0.209 0.021zM170.667 448.427c23.564 0 42.667-19.103 42.667-42.667v0-85.333c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 85.333c0 23.564 19.103 42.667 42.667 42.667v0zM879.787 94.293c-7.36-6.207-16.951-9.979-27.422-9.979-3.286 0-6.485 0.371-9.557 1.075l0.287-0.055-42.667 10.24c-18.745 4.768-32.388 21.496-32.388 41.41 0 3.627 0.453 7.149 1.305 10.512l-0.063-0.295c4.747 18.773 21.489 32.445 41.424 32.445 0.437 0 0.872-0.007 1.306-0.020l-0.064 0.002c4.772 18.739 21.497 32.377 41.407 32.377 23.097 0 41.907-18.352 42.644-41.27l0.002-0.068v-42.667c0-0.068 0.001-0.149 0.001-0.23 0-13.532-6.3-25.593-16.127-33.41l-0.087-0.067zM853.333 298.667c-23.564 0-42.667 19.103-42.667 42.667v0 48.64c-12.596 7.57-20.894 21.163-20.894 36.693 0 23.56 19.095 42.659 42.653 42.667l20.907 0c23.564 0 42.667-19.103 42.667-42.667v0-85.333c0-23.564-19.103-42.667-42.667-42.667v0zM853.333 554.667h-682.667c-23.564 0-42.667 19.103-42.667 42.667v0 128c-0.012 0.37-0.018 0.806-0.018 1.243 0 19.935 13.671 36.677 32.15 41.361l0.295 0.063 682.667 170.667c1.537 0.196 3.315 0.308 5.12 0.308s3.583-0.112 5.328-0.329l-0.208 0.021c23.564 0 42.667-19.103 42.667-42.667v0-298.667c0-23.564-19.103-42.667-42.667-42.667v0zM810.667 841.387l-597.333-149.333v-52.053h597.333z"],"attrs":[],"grid":0,"tags":["flip-h-alt"]},"attrs":[],"properties":{"order":5019,"id":665,"name":"flip-h-alt","prevSize":32,"code":60188},"setIdx":0,"setId":0,"iconIdx":540},{"icon":{"paths":["M896 469.333h-768c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h768c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM466.347 384h64c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-64c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM658.347 341.333c0 23.564 19.103 42.667 42.667 42.667v0h24.32c17.632-0.091 32.726-10.863 39.149-26.172l0.105-0.281c2.109-4.883 3.336-10.568 3.336-16.539 0-11.682-4.695-22.267-12.3-29.972l0.004 0.005-28.16-27.733c-7.712-7.668-18.343-12.407-30.080-12.407s-22.368 4.74-30.082 12.409l0.002-0.002c-7.73 7.723-12.512 18.395-12.512 30.185 0 6.877 1.627 13.374 4.517 19.127l-0.112-0.246c-0.466 2.641-0.773 5.732-0.852 8.881l-0.002 0.079zM497.067 203.52l14.933-15.36 34.56 34.56c7.712 7.668 18.343 12.407 30.080 12.407s22.368-4.74 30.082-12.409l-0.002 0.002c7.668-7.712 12.407-18.343 12.407-30.080s-4.74-22.368-12.409-30.082l0.002 0.002-45.227-45.227c-3.123-3.27-6.792-5.985-10.867-8.005l-0.226-0.102c-7.062-14.388-21.606-24.117-38.423-24.117-11.832 0-22.539 4.816-30.268 12.595l-0.002 0.002-45.227 45.227c-7.753 7.753-12.548 18.463-12.548 30.293 0 23.661 19.181 42.841 42.841 42.841 11.83 0 22.541-4.795 30.293-12.548l-0 0zM725.333 640h-426.667c-17.632 0.091-32.726 10.863-39.149 26.172l-0.105 0.281c-2.109 4.883-3.336 10.568-3.336 16.539 0 11.682 4.695 22.267 12.3 29.972l-0.004-0.005 213.333 213.333c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 213.333-213.333c7.601-7.7 12.296-18.286 12.296-29.968 0-5.971-1.227-11.656-3.442-16.817l0.106 0.278c-6.527-15.59-21.621-26.363-39.242-26.453l-0.012-0zM512 835.84l-110.507-110.507h221.013zM300.8 384c0.073 0 0.16 0.001 0.247 0.001 11.721 0 22.338-4.726 30.049-12.377l-0.003 0.003 45.227-47.36c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l-45.227 45.227c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003c7.474 8.496 18.195 13.982 30.204 14.504l0.089 0.003z"],"attrs":[],"grid":0,"tags":["flip-h"]},"attrs":[],"properties":{"order":5020,"id":664,"name":"flip-h","prevSize":32,"code":60189},"setIdx":0,"setId":0,"iconIdx":541},{"icon":{"paths":["M210.773 522.24c-2.984-0.745-6.409-1.173-9.935-1.173-20.352 0-37.375 14.249-41.639 33.315l-0.053 0.284-20.907 82.773c-0.572 2.62-0.9 5.629-0.9 8.715 0 20.253 14.112 37.211 33.039 41.576l0.287 0.056c3.068 0.789 6.589 1.241 10.217 1.241 19.914 0 36.642-13.643 41.346-32.093l0.064-0.295 20.907-82.773c0.745-2.984 1.173-6.409 1.173-9.935 0-20.352-14.249-37.375-33.315-41.639l-0.284-0.053zM936.107 843.093l-170.667-682.667c-4.638-18.345-20.717-31.809-40.040-32.425l-0.067-0.002h-128c-23.564 0-42.667 19.103-42.667 42.667v0 682.667c0 23.564 19.103 42.667 42.667 42.667v0h298.667c0.068 0 0.149 0.001 0.23 0.001 13.532 0 25.593-6.3 33.41-16.127l0.067-0.087c6.207-7.36 9.979-16.951 9.979-27.422 0-3.286-0.371-6.485-1.075-9.557l0.055 0.287zM640 810.667v-597.333h52.053l149.333 597.333zM273.067 273.92c-3.187-0.853-6.845-1.342-10.618-1.342-19.951 0-36.704 13.693-41.372 32.194l-0.063 0.295-20.48 82.773c-0.789 3.068-1.241 6.589-1.241 10.217 0 19.914 13.643 36.642 32.093 41.346l0.295 0.064h10.24c0.37 0.012 0.806 0.018 1.243 0.018 19.935 0 36.677-13.671 41.361-32.15l0.063-0.295 20.48-82.773c0.584-2.648 0.919-5.689 0.919-8.808 0-20.106-13.908-36.965-32.628-41.479l-0.291-0.059zM320.427 213.333h85.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-85.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM180.907 810.667c0.195-1.537 0.306-3.316 0.306-5.12 0-23.733-19.24-42.973-42.973-42.973-21.929 0-40.021 16.425-42.646 37.644l-0.021 0.209-10.24 42.667c-0.833 3.15-1.311 6.766-1.311 10.495 0 9.918 3.384 19.046 9.061 26.292l-0.070-0.093c7.883 9.929 19.953 16.239 33.497 16.239 0.524 0 1.046-0.009 1.565-0.028l-0.075 0.002h42.667c1.537 0.195 3.316 0.306 5.12 0.306 23.733 0 42.973-19.24 42.973-42.973 0-21.929-16.425-40.021-37.644-42.646l-0.209-0.021zM426.667 277.76c-23.564 0-42.667 19.103-42.667 42.667v0 85.333c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-85.333c0-23.564-19.103-42.667-42.667-42.667v0zM426.667 533.76c-23.564 0-42.667 19.103-42.667 42.667v0 85.333c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-85.333c0-23.564-19.103-42.667-42.667-42.667v0zM426.667 789.76c-15.533 0.003-29.126 8.305-36.586 20.714l-0.107 0.193h-48.64c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h85.333c23.564 0 42.667-19.103 42.667-42.667v0-20.907c0-23.564-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["flip-v-alt"]},"attrs":[],"properties":{"order":5021,"id":663,"name":"flip-v-alt","prevSize":32,"code":60190},"setIdx":0,"setId":0,"iconIdx":542},{"icon":{"paths":["M554.667 853.333h-298.667c-23.564 0-42.667-19.103-42.667-42.667v0-597.333c0-23.564 19.103-42.667 42.667-42.667v0h213.333v128c0 70.692 57.308 128 128 128v0h128v85.333c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-128s0 0 0-2.56c-0.496-4.292-1.396-8.191-2.678-11.913l0.118 0.393v-3.84c-2.174-4.59-4.887-8.531-8.128-11.969l0.021 0.023-256-256c-3.415-3.219-7.356-5.932-11.671-7.988l-0.276-0.118c-0.577-0.086-1.243-0.136-1.92-0.136s-1.343 0.049-1.994 0.145l0.074-0.009c-4.056-2.368-8.817-4.028-13.894-4.674l-0.186-0.019h-258.133c-70.692 0-128 57.308-128 128v0 597.333c0 70.692 57.308 128 128 128v0h298.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM554.667 230.827l110.507 110.507h-67.84c-23.564 0-42.667-19.103-42.667-42.667v0zM341.333 341.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM597.333 512h-256c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h256c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM883.627 737.707l-85.333-85.333c-3.937-3.773-8.616-6.808-13.791-8.859l-0.289-0.101c-4.793-2.024-10.366-3.201-16.213-3.201s-11.42 1.176-16.495 3.305l0.281-0.105c-5.464 2.152-10.143 5.187-14.095 8.974l0.015-0.014-85.333 85.333c-7.753 7.753-12.548 18.463-12.548 30.293 0 23.661 19.181 42.841 42.841 42.841 11.83 0 22.541-4.795 30.293-12.548l-0 0 12.373-12.8v110.507c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-110.507l12.373 12.8c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003zM512 768c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-170.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["file-upload-alt"]},"attrs":[],"properties":{"order":5022,"id":662,"name":"file-upload-alt","prevSize":32,"code":60191},"setIdx":0,"setId":0,"iconIdx":543},{"icon":{"paths":["M361.292 358.167l-0.096 0.078-0.091 0.089zM786 350.208c-2.881-2.78-6.098-5.247-9.573-7.325l-0.241-0.133c-6.19-3.703-13.656-5.893-21.632-5.893-16.547 0-30.892 9.423-37.964 23.195l-0.112 0.24c-15.302 29.759-35.304 54.929-59.32 75.558l-0.328 0.275c3.607-19.362 5.676-41.644 5.687-64.408l0-0.009c0-0.133 0-0.291 0-0.449 0-137.643-74.795-257.817-185.959-322.094l-1.791-0.955c-6.050-3.49-13.306-5.55-21.043-5.55-22.6 0-41.097 17.57-42.575 39.796l-0.007 0.129c-5.151 84.755-44.826 159.333-105.011 210.521l-0.425 0.353-9.833 8c-32.813 22.271-60.807 48.569-84.178 78.638l-0.613 0.82c-51.775 64.777-83.083 147.884-83.083 238.302 0 159.689 97.655 296.57 236.503 354.181l2.54 0.934c4.77 2.004 10.314 3.168 16.13 3.168 23.55 0 42.642-19.091 42.642-42.642 0-0.009-0-0.019-0-0.028l0 0.001c-0.033-4.774-0.808-9.355-2.215-13.65l0.090 0.317c-6.354-22.957-10.006-49.318-10.006-76.532 0-11.836 0.691-23.511 2.034-34.987l-0.133 1.394c40.936 76.133 104.488 135.613 181.578 170.397l2.422 0.978c5.107 2.343 11.080 3.709 17.371 3.709 4.7 0 9.223-0.762 13.45-2.17l-0.3 0.087c155.587-51.335 265.895-195.397 265.895-365.223 0-104.775-41.987-199.744-110.054-268.998l0.053 0.054zM619.396 897.667c-74.535-38.355-129.861-105.186-152.112-185.746l-0.492-2.087c-2.867-11.034-5.552-24.982-7.453-39.177l-0.213-1.948c-2.579-18.14-16.252-32.468-33.831-35.996l-0.273-0.046c-2.437-0.503-5.238-0.792-8.106-0.792-0.022 0-0.044 0-0.065 0l0.003-0c-0.005-0-0.010-0-0.015-0-15.724 0-29.46 8.509-36.855 21.174l-0.109 0.202c-32.411 54.967-51.558 121.107-51.558 191.718 0 3.366 0.044 6.722 0.13 10.067l-0.010-0.494c-70.327-55.048-115.104-139.943-115.104-235.295 0-70.509 24.484-135.299 65.413-186.332l-0.454 0.586c18.789-24.252 40.803-44.854 65.646-61.574l0.999-0.634c1.2-0.779 2.233-1.547 3.215-2.373l-0.048 0.040s12.659-10.474 13.091-10.714c59.412-50.48 102.941-118.009 123.088-194.998l0.592-2.663c56.847 52.667 92.312 127.717 92.312 211.050 0 49.026-12.275 95.186-33.92 135.572l0.753-1.539c-3.052 5.729-4.844 12.529-4.844 19.747 0 23.57 19.107 42.677 42.677 42.677 4.522 0 8.879-0.703 12.969-2.006l-0.302 0.083c67.144-21.469 123.323-61.449 164.231-113.919l0.561-0.748c32.157 46.936 51.353 104.954 51.353 167.455 0 126.33-78.425 234.342-189.245 278.007l-2.026 0.703z"],"attrs":[],"grid":0,"tags":["fire"]},"attrs":[],"properties":{"order":5023,"id":661,"name":"fire","prevSize":32,"code":60192},"setIdx":0,"setId":0,"iconIdx":544},{"icon":{"paths":["M839.68 293.547c-25.322-13.577-55.399-21.554-87.339-21.554-19.217 0-37.759 2.887-55.217 8.252l1.33-0.352c-4.89-99.066-86.401-177.537-186.24-177.537s-181.35 78.471-186.223 177.101l-0.017 0.436c-16.495-5.152-35.461-8.12-55.12-8.12-31.405 0-61.042 7.574-87.182 20.995l1.075-0.502c-59.739 31.876-99.705 93.793-99.705 165.044 0 81.229 51.944 150.327 124.427 175.888l1.305 0.401c-21.112 29.72-33.852 66.678-34.133 106.598l-0 0.069c0.208 11.46 1.286 22.508 3.172 33.279l-0.185-1.279c15.064 88.415 91.109 154.88 182.679 154.88 0.127 0 0.254-0 0.381-0l-0.020 0c4.085 0.298 8.849 0.467 13.653 0.467s9.569-0.17 14.288-0.503l-0.635 0.036c50.253-8.122 93.046-35.111 121.675-73.323l0.352-0.49c29.235 38.040 71.996 64.428 120.973 71.973l1.053 0.134c4.085 0.298 8.849 0.467 13.653 0.467s9.569-0.17 14.288-0.503l-0.635 0.036c102.647-0.122 185.812-83.362 185.812-186.027 0-40.123-12.703-77.279-34.306-107.667l0.387 0.573c74.248-25.554 126.643-94.805 126.643-176.294 0-71.371-40.193-133.355-99.178-164.551l-1.012-0.488zM441.173 210.773c18.36-17.605 43.327-28.445 70.827-28.445s52.467 10.84 70.863 28.479l-0.036-0.034c18.73 18.757 30.312 44.655 30.312 73.258 0 14.528-2.988 28.358-8.383 40.91l0.258-0.674-11.093 25.173-28.16 24.747c-15.985-5.673-34.425-9.086-53.621-9.385l-0.139-0.002c-24.866 0.025-48.478 5.363-69.772 14.94l1.078-0.434-23.893-55.040c-5.417-12.049-8.573-26.119-8.573-40.925 0-28.39 11.601-54.070 30.322-72.558l0.011-0.010zM180.907 502.613c-5.722-12.286-9.060-26.671-9.060-41.837 0-55.847 45.273-101.12 101.12-101.12 25.194 0 48.235 9.213 65.94 24.455l-0.132-0.111 20.907 18.347 14.933 34.133c-20.557 27.264-33.017 61.645-33.28 98.925l-0 0.062c-0.242 2.874-0.38 6.221-0.38 9.6s0.138 6.725 0.408 10.034l-0.029-0.434h-23.467l-35.84 3.413c-3.183 0.356-6.874 0.558-10.612 0.558-39.413 0-73.559-22.548-90.243-55.449l-0.265-0.576zM462.507 762.027c-10.563 45.677-50.895 79.208-99.059 79.208-49.39 0-90.544-35.26-99.663-81.98l-0.104-0.641c-0.195-2.681-0.307-5.807-0.307-8.96s0.111-6.279 0.33-9.376l-0.024 0.416c0.334-36.348 20.124-68 49.447-85.079l0.473-0.255 21.76-15.36 38.827-4.267c24.197 33.379 59.5 57.42 100.401 66.766l1.146 0.22zM512 620.8c-47.128 0-85.333-38.205-85.333-85.333s38.205-85.333 85.333-85.333c47.128 0 85.333 38.205 85.333 85.333v0c0 47.128-38.205 85.333-85.333 85.333v0zM760.32 758.187c-8.325 47.926-49.603 83.906-99.284 83.906-5.316 0-10.535-0.412-15.629-1.206l0.566 0.073c-42.355-6.135-75.943-37.566-85.202-78.25l-0.131-0.684-5.973-25.6 8.96-39.253c40.039-13.306 72.662-39.844 93.437-74.325l0.429-0.768 21.333 12.8h3.84l28.16 16.64c30.801 17.829 51.19 50.624 51.19 88.181 0 6.536-0.617 12.927-1.797 19.12l0.101-0.634zM843.093 502.187c-16.969 33.745-51.238 56.54-90.852 56.747l-0.028 0h-10.24l-27.307-4.267-32-17.493c-0.064-43.28-16.229-82.773-42.823-112.82l0.157 0.18 18.347-15.787 26.88-24.747c17.775-15.857 41.349-25.547 67.186-25.547 55.847 0 101.12 45.273 101.12 101.12 0 16.298-3.856 31.695-10.704 45.329l0.265-0.582z"],"attrs":[],"grid":0,"tags":["flower"]},"attrs":[],"properties":{"order":5024,"id":660,"name":"flower","prevSize":32,"code":60193},"setIdx":0,"setId":0,"iconIdx":545},{"icon":{"paths":["M341.333 853.333h-128c-23.564 0-42.667-19.103-42.667-42.667v0-128c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 128c0 70.692 57.308 128 128 128v0h128c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM128 384c23.564 0 42.667-19.103 42.667-42.667v0-128c0-23.564 19.103-42.667 42.667-42.667v0h128c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-128c-70.692 0-128 57.308-128 128v0 128c0 23.564 19.103 42.667 42.667 42.667v0zM810.667 85.333h-128c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h128c23.564 0 42.667 19.103 42.667 42.667v0 128c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-128c0-70.692-57.308-128-128-128v0zM682.667 512c0-23.564-19.103-42.667-42.667-42.667v0h-85.333v-85.333c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 85.333h-85.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h85.333v85.333c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-85.333h85.333c23.564 0 42.667-19.103 42.667-42.667v0zM896 640c-23.564 0-42.667 19.103-42.667 42.667v0 128c0 23.564-19.103 42.667-42.667 42.667v0h-128c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h128c70.692 0 128-57.308 128-128v0-128c0-23.564-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["focus-add"]},"attrs":[],"properties":{"order":5025,"id":659,"name":"focus-add","prevSize":32,"code":60194},"setIdx":0,"setId":0,"iconIdx":546},{"icon":{"paths":["M324.267 647.68c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l45.227 45.227c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003zM162.56 417.28l-45.227 45.227c-3.27 3.123-5.985 6.792-8.005 10.867l-0.102 0.226c-14.388 7.062-24.117 21.606-24.117 38.423 0 11.832 4.816 22.539 12.595 30.268l0.002 0.002 45.227 45.227c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003-15.36-14.933 34.56-34.56c6.377-7.412 10.259-17.129 10.259-27.753 0-23.564-19.103-42.667-42.667-42.667-10.624 0-20.341 3.883-27.809 10.307l0.056-0.047zM341.333 450.987c-23.564 0-42.667 19.103-42.667 42.667v0 64c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-64c0-23.564-19.103-42.667-42.667-42.667v0zM926.293 481.707l-213.333-213.333c-7.7-7.601-18.286-12.296-29.968-12.296-5.971 0-11.656 1.227-16.817 3.442l0.278-0.106c-15.59 6.527-26.363 21.621-26.453 39.242l-0 0.012v426.667c0.091 17.632 10.863 32.726 26.172 39.149l0.281 0.105c4.477 2.162 9.736 3.425 15.29 3.425 0.325 0 0.648-0.004 0.971-0.013l-0.048 0.001c0.073 0 0.16 0.001 0.247 0.001 11.721 0 22.338-4.726 30.049-12.377l-0.003 0.003 213.333-213.333c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003zM725.333 622.507v-221.013l110.507 110.507zM512 85.333c-23.564 0-42.667 19.103-42.667 42.667v0 768c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-768c0-23.564-19.103-42.667-42.667-42.667v0zM357.547 259.413c-4.883-2.109-10.568-3.336-16.539-3.336-11.682 0-22.267 4.695-29.972 12.3l0.005-0.004-27.733 30.293c-7.668 7.712-12.407 18.343-12.407 30.080s4.74 22.368 12.409 30.082l-0.002-0.002c7.612 7.763 18.155 12.628 29.835 12.8l0.032 0c7.017-0.043 13.619-1.774 19.436-4.805l-0.236 0.112c2.711 0.613 5.824 0.964 9.019 0.964 23.564 0 42.667-19.103 42.667-42.667 0-0.789-0.021-1.574-0.064-2.353l0.005 0.108v-24.32c-0.091-17.632-10.863-32.726-26.172-39.149l-0.281-0.105z"],"attrs":[],"grid":0,"tags":["flip-v"]},"attrs":[],"properties":{"order":5026,"id":658,"name":"flip-v","prevSize":32,"code":60195},"setIdx":0,"setId":0,"iconIdx":547},{"icon":{"paths":["M341.333 85.333h-213.333c-23.564 0-42.667 19.103-42.667 42.667v0 213.333c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-170.667h170.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM341.333 853.333h-170.667v-170.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 213.333c0 23.564 19.103 42.667 42.667 42.667v0h213.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM896 85.333h-213.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h170.667v170.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-213.333c0-23.564-19.103-42.667-42.667-42.667v0zM896 640c-23.564 0-42.667 19.103-42.667 42.667v0 170.667h-170.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h213.333c23.564 0 42.667-19.103 42.667-42.667v0-213.333c0-23.564-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["focus"]},"attrs":[],"properties":{"order":5027,"id":657,"name":"focus","prevSize":32,"code":60196},"setIdx":0,"setId":0,"iconIdx":548},{"icon":{"paths":["M609.707 460.373l-140.373 140.8-55.040-55.467c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l85.333 85.333c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 170.667-170.667c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l0-0zM810.667 234.667h-267.947l-13.653-42.667c-18.102-50.141-65.281-85.334-120.68-85.334-0.174 0-0.347 0-0.52 0.001l0.027-0h-194.56c-70.692 0-128 57.308-128 128v0 554.667c0 70.692 57.308 128 128 128v0h597.333c70.692 0 128-57.308 128-128v0-426.667c0-70.692-57.308-128-128-128v0zM853.333 789.333c0 23.564-19.103 42.667-42.667 42.667v0h-597.333c-23.564 0-42.667-19.103-42.667-42.667v0-554.667c0-23.564 19.103-42.667 42.667-42.667v0h194.56c0.033-0 0.071-0 0.11-0 18.678 0 34.552 12.002 40.333 28.714l0.090 0.3 23.040 69.973c5.871 17.012 21.745 29.013 40.423 29.013 0.039 0 0.077-0 0.116-0l-0.006 0h298.667c23.564 0 42.667 19.103 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["folder-check"]},"attrs":[],"properties":{"order":5028,"id":656,"name":"folder-check","prevSize":32,"code":60197},"setIdx":0,"setId":0,"iconIdx":549},{"icon":{"paths":["M567.040 588.373l-12.373 12.8v-110.507c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 110.507l-12.373-12.8c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l85.333 85.333c3.937 3.773 8.616 6.808 13.791 8.859l0.289 0.101c4.771 2.163 10.345 3.423 16.213 3.423s11.443-1.26 16.466-3.525l-0.253 0.102c5.464-2.152 10.143-5.187 14.095-8.974l-0.015 0.014 85.333-85.333c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l0-0zM810.667 234.667h-267.947l-13.653-42.667c-18.102-50.141-65.281-85.334-120.68-85.334-0.174 0-0.347 0-0.52 0.001l0.027-0h-194.56c-70.692 0-128 57.308-128 128v0 554.667c0 70.692 57.308 128 128 128v0h597.333c70.692 0 128-57.308 128-128v0-426.667c0-70.692-57.308-128-128-128v0zM853.333 789.333c0 23.564-19.103 42.667-42.667 42.667v0h-597.333c-23.564 0-42.667-19.103-42.667-42.667v0-554.667c0-23.564 19.103-42.667 42.667-42.667v0h194.56c0.033-0 0.071-0 0.11-0 18.678 0 34.552 12.002 40.333 28.714l0.090 0.3 23.040 69.973c5.871 17.012 21.745 29.013 40.423 29.013 0.039 0 0.077-0 0.116-0l-0.006 0h298.667c23.564 0 42.667 19.103 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["folder-download"]},"attrs":[],"properties":{"order":5029,"id":655,"name":"folder-download","prevSize":32,"code":60198},"setIdx":0,"setId":0,"iconIdx":550},{"icon":{"paths":["M551.253 687.787c-1.020-2.93-2.319-5.469-3.912-7.79l0.072 0.11c-1.693-2.39-3.374-4.477-5.17-6.456l0.050 0.056-6.4-5.12-7.68-3.84c-2.35-1.229-5.082-2.127-7.969-2.544l-0.137-0.016c-2.518-0.528-5.413-0.83-8.377-0.83-11.709 0-22.317 4.717-30.026 12.354l0.003-0.003-5.12 6.4c-1.521 2.211-2.82 4.75-3.77 7.453l-0.070 0.227c-1.157 2.221-2.047 4.798-2.535 7.514l-0.025 0.166c-0.1 1.277-0.157 2.765-0.157 4.267s0.057 2.99 0.169 4.463l-0.012-0.196c0.073 5.873 1.322 11.435 3.52 16.489l-0.107-0.275c2.298 5.422 5.314 10.079 8.995 14.119l-0.035-0.039c7.731 7.781 18.438 12.597 30.27 12.597 5.856 0 11.437-1.18 16.518-3.315l-0.281 0.105c5.376-2.639 10.006-5.769 14.144-9.443l-0.064 0.056c3.617-4.074 6.748-8.704 9.224-13.716l0.163-0.364c1.404-4.048 2.215-8.714 2.215-13.57 0-0.93-0.030-1.853-0.088-2.769l0.006 0.125c0.1-1.277 0.157-2.765 0.157-4.267s-0.057-2.99-0.169-4.463l0.012 0.196c-0.801-2.918-1.969-5.473-3.478-7.785l0.064 0.105zM512 448c-23.564 0-42.667 19.103-42.667 42.667v0 85.333c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-85.333c0-23.564-19.103-42.667-42.667-42.667v0zM810.667 234.667h-267.947l-13.653-42.667c-18.102-50.141-65.281-85.334-120.68-85.334-0.174 0-0.347 0-0.52 0.001l0.027-0h-194.56c-70.692 0-128 57.308-128 128v0 554.667c0 70.692 57.308 128 128 128v0h597.333c70.692 0 128-57.308 128-128v0-426.667c0-70.692-57.308-128-128-128v0zM853.333 789.333c0 23.564-19.103 42.667-42.667 42.667v0h-597.333c-23.564 0-42.667-19.103-42.667-42.667v0-554.667c0-23.564 19.103-42.667 42.667-42.667v0h194.56c0.033-0 0.071-0 0.11-0 18.678 0 34.552 12.002 40.333 28.714l0.090 0.3 23.040 69.973c5.871 17.012 21.745 29.013 40.423 29.013 0.039 0 0.077-0 0.116-0l-0.006 0h298.667c23.564 0 42.667 19.103 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["folder-exclamation"]},"attrs":[],"properties":{"order":5030,"id":654,"name":"folder-exclamation","prevSize":32,"code":60199},"setIdx":0,"setId":0,"iconIdx":551},{"icon":{"paths":["M512 419.84c-16.971-9.229-37.164-14.655-58.624-14.655-68.807 0-124.587 55.779-124.587 124.587 0 34.589 14.095 65.886 36.856 88.46l0.008 0.008 116.053 116.053c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 116.053-116.053c22.769-22.582 36.864-53.879 36.864-88.468 0-68.807-55.779-124.587-124.587-124.587-21.46 0-41.653 5.426-59.282 14.981l0.658-0.326zM597.333 557.653l-85.333 85.333-85.333-85.333c-7.090-7.101-11.474-16.905-11.474-27.733s4.384-20.632 11.475-27.734l-0.001 0.001c7.101-7.090 16.905-11.474 27.733-11.474s20.632 4.384 27.734 11.475l-0.001-0.001c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c6.971-6.441 16.326-10.391 26.604-10.391 21.679 0 39.253 17.574 39.253 39.253 0 10.278-3.95 19.634-10.415 26.631l0.024-0.026zM810.667 234.667h-267.947l-13.653-42.667c-18.102-50.141-65.281-85.334-120.68-85.334-0.174 0-0.347 0-0.52 0.001l0.027-0h-194.56c-70.692 0-128 57.308-128 128v0 554.667c0 70.692 57.308 128 128 128v0h597.333c70.692 0 128-57.308 128-128v0-426.667c0-70.692-57.308-128-128-128v0zM853.333 789.333c0 23.564-19.103 42.667-42.667 42.667v0h-597.333c-23.564 0-42.667-19.103-42.667-42.667v0-554.667c0-23.564 19.103-42.667 42.667-42.667v0h194.56c0.033-0 0.071-0 0.11-0 18.678 0 34.552 12.002 40.333 28.714l0.090 0.3 23.040 69.973c5.871 17.012 21.745 29.013 40.423 29.013 0.039 0 0.077-0 0.116-0l-0.006 0h298.667c23.564 0 42.667 19.103 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["folder-heart"]},"attrs":[],"properties":{"order":5031,"id":653,"name":"folder-heart","prevSize":32,"code":60200},"setIdx":0,"setId":0,"iconIdx":552},{"icon":{"paths":["M512 576c-23.564 0-42.667 19.103-42.667 42.667v0 85.333c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-85.333c0-23.564-19.103-42.667-42.667-42.667v0zM810.667 234.667h-267.947l-13.653-42.667c-18.102-50.141-65.281-85.334-120.68-85.334-0.174 0-0.347 0-0.52 0.001l0.027-0h-194.56c-70.692 0-128 57.308-128 128v0 554.667c0 70.692 57.308 128 128 128v0h597.333c70.692 0 128-57.308 128-128v0-426.667c0-70.692-57.308-128-128-128v0zM853.333 789.333c0 23.564-19.103 42.667-42.667 42.667v0h-597.333c-23.564 0-42.667-19.103-42.667-42.667v0-554.667c0-23.564 19.103-42.667 42.667-42.667v0h194.56c0.033-0 0.071-0 0.11-0 18.678 0 34.552 12.002 40.333 28.714l0.090 0.3 23.040 69.973c5.871 17.012 21.745 29.013 40.423 29.013 0.039 0 0.077-0 0.116-0l-0.006 0h298.667c23.564 0 42.667 19.103 42.667 42.667v0zM542.293 460.373c-7.7-7.601-18.286-12.296-29.968-12.296-5.971 0-11.656 1.227-16.817 3.442l0.278-0.106c-5.492 2.069-10.185 5.116-14.084 8.964l0.004-0.004c-7.522 7.877-12.204 18.523-12.373 30.26l-0 0.033c0.051 11.656 4.767 22.2 12.376 29.869l-0.003-0.003c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.606-7.667 12.323-18.211 12.373-29.857l0-0.010c-0.073-5.873-1.322-11.435-3.52-16.489l0.107 0.275c-2.069-5.492-5.116-10.185-8.964-14.084l0.004 0.004z"],"attrs":[],"grid":0,"tags":["folder-info"]},"attrs":[],"properties":{"order":5032,"id":652,"name":"folder-info","prevSize":32,"code":60201},"setIdx":0,"setId":0,"iconIdx":553},{"icon":{"paths":["M170.667 170.667h194.56c0.033-0 0.071-0 0.11-0 18.678 0 34.552 12.002 40.333 28.714l0.090 0.3 23.040 69.973c5.871 17.012 21.745 29.013 40.423 29.013 0.039 0 0.077-0 0.116-0l-0.006 0h298.667c23.564 0 42.667 19.103 42.667 42.667v0c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0c0-70.692-57.308-128-128-128v0h-267.947l-13.653-42.667c-18.102-50.141-65.281-85.334-120.68-85.334-0.174 0-0.347 0-0.52 0.001l0.027-0h-194.56c-70.692 0-128 57.308-128 128v0 554.667c0 70.692 57.308 128 128 128v0h256c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-256c-23.564 0-42.667-19.103-42.667-42.667v0-554.667c0-23.564 19.103-42.667 42.667-42.667v0zM896 647.68v-50.347c0-70.692-57.308-128-128-128s-128 57.308-128 128v0 50.347c-50.028 18.062-85.173 65.066-85.333 120.3l-0 0.020v85.333c0 70.692 57.308 128 128 128v0h170.667c70.692 0 128-57.308 128-128v0-85.333c-0.16-55.254-35.305-102.258-84.442-120.038l-0.891-0.282zM725.333 597.333c0-23.564 19.103-42.667 42.667-42.667s42.667 19.103 42.667 42.667v0 42.667h-85.333zM896 853.333c0 23.564-19.103 42.667-42.667 42.667v0h-170.667c-23.564 0-42.667-19.103-42.667-42.667v0-85.333c0-23.564 19.103-42.667 42.667-42.667v0h170.667c23.564 0 42.667 19.103 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["folder-lock"]},"attrs":[],"properties":{"order":5033,"id":651,"name":"folder-lock","prevSize":32,"code":60202},"setIdx":0,"setId":0,"iconIdx":554},{"icon":{"paths":["M597.333 533.333h-42.667v-42.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 42.667h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h42.667v42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM810.667 234.667h-267.947l-13.653-42.667c-18.102-50.141-65.281-85.334-120.68-85.334-0.174 0-0.347 0-0.52 0.001l0.027-0h-194.56c-70.692 0-128 57.308-128 128v0 554.667c0 70.692 57.308 128 128 128v0h597.333c70.692 0 128-57.308 128-128v0-426.667c0-70.692-57.308-128-128-128v0zM853.333 789.333c0 23.564-19.103 42.667-42.667 42.667v0h-597.333c-23.564 0-42.667-19.103-42.667-42.667v0-554.667c0-23.564 19.103-42.667 42.667-42.667v0h194.56c0.033-0 0.071-0 0.11-0 18.678 0 34.552 12.002 40.333 28.714l0.090 0.3 23.040 69.973c5.871 17.012 21.745 29.013 40.423 29.013 0.039 0 0.077-0 0.116-0l-0.006 0h298.667c23.564 0 42.667 19.103 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["folder-medical"]},"attrs":[],"properties":{"order":5034,"id":650,"name":"folder-medical","prevSize":32,"code":60203},"setIdx":0,"setId":0,"iconIdx":555},{"icon":{"paths":["M597.333 533.333h-170.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h170.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM810.667 234.667h-267.947l-13.653-42.667c-18.102-50.141-65.281-85.334-120.68-85.334-0.174 0-0.347 0-0.52 0.001l0.027-0h-194.56c-70.692 0-128 57.308-128 128v0 554.667c0 70.692 57.308 128 128 128v0h597.333c70.692 0 128-57.308 128-128v0-426.667c0-70.692-57.308-128-128-128v0zM853.333 789.333c0 23.564-19.103 42.667-42.667 42.667v0h-597.333c-23.564 0-42.667-19.103-42.667-42.667v0-554.667c0-23.564 19.103-42.667 42.667-42.667v0h194.56c0.033-0 0.071-0 0.11-0 18.678 0 34.552 12.002 40.333 28.714l0.090 0.3 23.040 69.973c5.871 17.012 21.745 29.013 40.423 29.013 0.039 0 0.077-0 0.116-0l-0.006 0h298.667c23.564 0 42.667 19.103 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["folder-minus"]},"attrs":[],"properties":{"order":5035,"id":649,"name":"folder-minus","prevSize":32,"code":60204},"setIdx":0,"setId":0,"iconIdx":556},{"icon":{"paths":["M896 768h-263.68c-13.196-36.33-41.323-64.457-76.764-77.37l-0.89-0.283v-93.013h156.587c54.807-0.241 99.172-44.606 99.413-99.39l0-0.023v-227.84c-0.241-54.807-44.606-99.172-99.39-99.413l-0.023-0h-170.667l-5.547-17.493c-13.53-39.164-49.7-66.957-92.482-67.838l-0.104-0.002h-128c-0.381-0.005-0.831-0.008-1.281-0.008-54.993 0-99.601 44.462-99.839 99.399l-0 0.023v313.173c0.241 54.807 44.606 99.172 99.39 99.413l0.023 0h156.587v93.013c-36.33 13.196-64.457 41.323-77.37 76.764l-0.283 0.89h-263.68c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h263.68c18.382 49.611 65.296 84.33 120.32 84.33s101.938-34.719 120.032-83.444l0.288-0.886h263.68c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM312.747 512c-7.776 0-14.080-6.304-14.080-14.080v-313.173c0-7.776 6.304-14.080 14.080-14.080v0h128c0.070-0.001 0.152-0.002 0.235-0.002 6.253 0 11.554 4.076 13.391 9.716l0.028 0.1 15.36 46.507c5.86 17.032 21.744 29.051 40.436 29.051 0.634 0 1.266-0.014 1.893-0.041l-0.089 0.003h199.253c7.776 0 14.080 6.304 14.080 14.080v0 227.84c0 7.776-6.304 14.080-14.080 14.080v0zM512 853.333c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667c23.564 0 42.667 19.103 42.667 42.667v0c0 23.564-19.103 42.667-42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["folder-network"]},"attrs":[],"properties":{"order":5036,"id":648,"name":"folder-network","prevSize":32,"code":60205},"setIdx":0,"setId":0,"iconIdx":557},{"icon":{"paths":["M971.947 442.453c-7.885-9.665-19.795-15.787-33.135-15.787-0.051 0-0.102 0-0.153 0l0.008-0h-85.333v-42.667c0-70.692-57.308-128-128-128v0h-267.947l-13.653-42.667c-18.102-50.141-65.281-85.334-120.68-85.334-0.174 0-0.347 0-0.52 0.001l0.027-0h-151.893c-70.692 0-128 57.308-128 128v0 512c0 70.692 57.308 128 128 128v0h614.4c60.71-0.183 111.461-42.602 124.422-99.408l0.165-0.859 71.68-317.013c0.547-2.564 0.861-5.509 0.861-8.528 0-10.617-3.878-20.329-10.295-27.795l0.047 0.057zM229.12 777.387c-4.434 19.198-21.383 33.293-41.624 33.293-0.367 0-0.732-0.005-1.096-0.014l0.054 0.001h-15.787c-23.564 0-42.667-19.103-42.667-42.667v0-512c0-23.564 19.103-42.667 42.667-42.667v0h151.893c0.664-0.037 1.442-0.058 2.224-0.058 18.699 0 34.589 12.029 40.353 28.771l0.090 0.3 23.040 69.973c5.635 16.395 20.539 28.132 38.3 29.009l0.1 0.004h298.667c23.564 0 42.667 19.103 42.667 42.667v0 42.667h-426.667c-0.31-0.008-0.676-0.013-1.042-0.013-20.241 0-37.19 14.095-41.568 33.005l-0.056 0.288zM826.453 777.387c-4.434 19.198-21.383 33.293-41.624 33.293-0.367 0-0.732-0.005-1.096-0.014l0.054 0.001h-476.16c2.054-4.311 3.683-9.319 4.637-14.563l0.056-0.37 63.147-283.733h512z"],"attrs":[],"grid":0,"tags":["folder-open"]},"attrs":[],"properties":{"order":5037,"id":647,"name":"folder-open","prevSize":32,"code":60206},"setIdx":0,"setId":0,"iconIdx":558},{"icon":{"paths":["M597.333 533.333h-42.667v-42.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 42.667h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h42.667v42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM810.667 234.667h-267.947l-13.653-42.667c-18.102-50.141-65.281-85.334-120.68-85.334-0.174 0-0.347 0-0.52 0.001l0.027-0h-194.56c-70.692 0-128 57.308-128 128v0 554.667c0 70.692 57.308 128 128 128v0h597.333c70.692 0 128-57.308 128-128v0-426.667c0-70.692-57.308-128-128-128v0zM853.333 789.333c0 23.564-19.103 42.667-42.667 42.667v0h-597.333c-23.564 0-42.667-19.103-42.667-42.667v0-554.667c0-23.564 19.103-42.667 42.667-42.667v0h194.56c0.033-0 0.071-0 0.11-0 18.678 0 34.552 12.002 40.333 28.714l0.090 0.3 23.040 69.973c5.871 17.012 21.745 29.013 40.423 29.013 0.039 0 0.077-0 0.116-0l-0.006 0h298.667c23.564 0 42.667 19.103 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["folder-plus"]},"attrs":[],"properties":{"order":5038,"id":646,"name":"folder-plus","prevSize":32,"code":60207},"setIdx":0,"setId":0,"iconIdx":559},{"icon":{"paths":["M536.32 695.467c-1.826-2.154-3.935-3.992-6.288-5.48l-0.112-0.066-7.253-3.84-8.107-3.413c-2.412-0.484-5.184-0.761-8.021-0.761-11.886 0-22.638 4.861-30.374 12.703l-0.005 0.005c-3.896 3.804-7.062 8.336-9.279 13.38l-0.107 0.274c-1.896 4.653-2.997 10.052-2.997 15.708 0 0.328 0.004 0.654 0.011 0.98l-0.001-0.048c0.051 11.656 4.767 22.2 12.376 29.869l-0.003-0.003c3.804 3.896 8.336 7.062 13.38 9.279l0.274 0.107c4.653 1.896 10.052 2.997 15.708 2.997 0.328 0 0.654-0.004 0.98-0.011l-0.048 0.001c0.155 0.002 0.339 0.003 0.523 0.003 5.649 0 11.042-1.098 15.977-3.092l-0.286 0.102c5.317-2.325 9.849-5.491 13.645-9.378l0.008-0.008c7.763-7.612 12.628-18.155 12.8-29.835l0-0.032c-0.012-6.014-1.266-11.732-3.52-16.916l0.107 0.276c-2.27-5.046-5.442-9.311-9.347-12.766l-0.039-0.034zM506.453 384c-0.024-0-0.053-0-0.082-0-47.128 0-88.308 25.47-110.524 63.396l-0.327 0.604c-4.177 6.48-6.66 14.395-6.66 22.89 0 23.564 19.103 42.667 42.667 42.667 16.334 0 30.524-9.178 37.694-22.659l0.112-0.23c7.474-13.011 21.291-21.632 37.121-21.632 23.564 0 42.667 19.103 42.667 42.667 0 0.105-0 0.21-0.001 0.314l0-0.016c0 23.564-19.103 42.667-42.667 42.667v0c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0c70.692 0 128-57.308 128-128s-57.308-128-128-128v0zM810.667 234.667h-267.947l-13.653-42.667c-18.102-50.141-65.281-85.334-120.68-85.334-0.174 0-0.347 0-0.52 0.001l0.027-0h-194.56c-70.692 0-128 57.308-128 128v0 554.667c0 70.692 57.308 128 128 128v0h597.333c70.692 0 128-57.308 128-128v0-426.667c0-70.692-57.308-128-128-128v0zM853.333 789.333c0 23.564-19.103 42.667-42.667 42.667v0h-597.333c-23.564 0-42.667-19.103-42.667-42.667v0-554.667c0-23.564 19.103-42.667 42.667-42.667v0h194.56c0.033-0 0.071-0 0.11-0 18.678 0 34.552 12.002 40.333 28.714l0.090 0.3 23.040 69.973c5.871 17.012 21.745 29.013 40.423 29.013 0.039 0 0.077-0 0.116-0l-0.006 0h298.667c23.564 0 42.667 19.103 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["folder-question"]},"attrs":[],"properties":{"order":5039,"id":645,"name":"folder-question","prevSize":32,"code":60208},"setIdx":0,"setId":0,"iconIdx":560},{"icon":{"paths":["M926.293 865.707l-768-768c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l-0-0 59.733 59.307c-18.194 21.834-29.289 50.14-29.44 81.034l-0 0.033v469.333c0 70.692 57.308 128 128 128v0h512c20.045-0.123 38.962-4.834 55.79-13.134l-0.75 0.334 42.667 42.667c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.668-7.712 12.407-18.343 12.407-30.080s-4.74-22.368-12.409-30.082l0.002 0.002zM256 810.667c-23.564 0-42.667-19.103-42.667-42.667v0-469.333c0.113-7.208 1.996-13.952 5.231-19.848l-0.111 0.222 532.053 531.627zM453.12 256c17.59 0.989 32.257 12.494 37.881 28.288l0.093 0.298 23.040 69.973c5.741 17.225 21.71 29.426 40.532 29.44l213.335 0c23.564 0 42.667 19.103 42.667 42.667v0 185.173c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-185.173c0-70.692-57.308-128-128-128v0h-182.613l-13.653-42.667c-17.337-48.225-61.499-82.611-114.036-85.321l-0.311-0.013c-0.637-0.034-1.383-0.053-2.133-0.053-23.594 0-42.72 19.126-42.72 42.72 0 22.843 17.929 41.499 40.483 42.662l0.104 0.004z"],"attrs":[],"grid":0,"tags":["folder-slash"]},"attrs":[],"properties":{"order":5040,"id":644,"name":"folder-slash","prevSize":32,"code":60209},"setIdx":0,"setId":0,"iconIdx":561},{"icon":{"paths":["M627.627 460.373c-7.733-7.795-18.45-12.621-30.293-12.621s-22.56 4.826-30.291 12.618l-0.003 0.003-55.040 55.467-55.040-55.467c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l-0-0 55.467 55.040-55.467 55.040c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 55.040-55.467 55.040 55.467c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003-55.467-55.040 55.467-55.040c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003zM810.667 234.667h-267.947l-13.653-42.667c-18.102-50.141-65.281-85.334-120.68-85.334-0.174 0-0.347 0-0.52 0.001l0.027-0h-194.56c-70.692 0-128 57.308-128 128v0 554.667c0 70.692 57.308 128 128 128v0h597.333c70.692 0 128-57.308 128-128v0-426.667c0-70.692-57.308-128-128-128v0zM853.333 789.333c0 23.564-19.103 42.667-42.667 42.667v0h-597.333c-23.564 0-42.667-19.103-42.667-42.667v0-554.667c0-23.564 19.103-42.667 42.667-42.667v0h194.56c0.033-0 0.071-0 0.11-0 18.678 0 34.552 12.002 40.333 28.714l0.090 0.3 23.040 69.973c5.871 17.012 21.745 29.013 40.423 29.013 0.039 0 0.077-0 0.116-0l-0.006 0h298.667c23.564 0 42.667 19.103 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["folder-times"]},"attrs":[],"properties":{"order":5041,"id":643,"name":"folder-times","prevSize":32,"code":60210},"setIdx":0,"setId":0,"iconIdx":562},{"icon":{"paths":["M542.293 460.373c-3.937-3.773-8.616-6.808-13.791-8.859l-0.289-0.101c-4.793-2.024-10.366-3.201-16.213-3.201s-11.42 1.176-16.495 3.305l0.281-0.105c-5.464 2.152-10.143 5.187-14.095 8.974l0.015-0.014-85.333 85.333c-7.753 7.753-12.548 18.463-12.548 30.293 0 23.661 19.181 42.841 42.841 42.841 11.83 0 22.541-4.795 30.293-12.548l-0 0 12.373-12.8v110.507c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-110.507l12.373 12.8c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003zM810.667 234.667h-267.947l-13.653-42.667c-18.102-50.141-65.281-85.334-120.68-85.334-0.174 0-0.347 0-0.52 0.001l0.027-0h-194.56c-70.692 0-128 57.308-128 128v0 554.667c0 70.692 57.308 128 128 128v0h597.333c70.692 0 128-57.308 128-128v0-426.667c0-70.692-57.308-128-128-128v0zM853.333 789.333c0 23.564-19.103 42.667-42.667 42.667v0h-597.333c-23.564 0-42.667-19.103-42.667-42.667v0-554.667c0-23.564 19.103-42.667 42.667-42.667v0h194.56c0.033-0 0.071-0 0.11-0 18.678 0 34.552 12.002 40.333 28.714l0.090 0.3 23.040 69.973c5.871 17.012 21.745 29.013 40.423 29.013 0.039 0 0.077-0 0.116-0l-0.006 0h298.667c23.564 0 42.667 19.103 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["folder-upload"]},"attrs":[],"properties":{"order":5042,"id":642,"name":"folder-upload","prevSize":32,"code":60211},"setIdx":0,"setId":0,"iconIdx":563},{"icon":{"paths":["M810.667 234.667h-267.947l-13.653-42.667c-18.102-50.141-65.281-85.334-120.68-85.334-0.174 0-0.347 0-0.52 0.001l0.027-0h-194.56c-70.692 0-128 57.308-128 128v0 554.667c0 70.692 57.308 128 128 128v0h597.333c70.692 0 128-57.308 128-128v0-426.667c0-70.692-57.308-128-128-128v0zM853.333 789.333c0 23.564-19.103 42.667-42.667 42.667v0h-597.333c-23.564 0-42.667-19.103-42.667-42.667v0-554.667c0-23.564 19.103-42.667 42.667-42.667v0h194.56c0.033-0 0.071-0 0.11-0 18.678 0 34.552 12.002 40.333 28.714l0.090 0.3 23.040 69.973c5.871 17.012 21.745 29.013 40.423 29.013 0.039 0 0.077-0 0.116-0l-0.006 0h298.667c23.564 0 42.667 19.103 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["folder"]},"attrs":[],"properties":{"order":5043,"id":641,"name":"folder","prevSize":32,"code":60212},"setIdx":0,"setId":0,"iconIdx":564},{"icon":{"paths":["M896 853.333h-42.667v-725.333c0-23.564-19.103-42.667-42.667-42.667v0h-149.333c-15.61 0.097-29.222 8.562-36.584 21.132l-0.109 0.201-435.627 746.667h-61.013c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h170.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-11.093l149.333-256h331.093v256h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h170.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM768 512h-281.173l198.827-341.333h82.347z"],"attrs":[],"grid":0,"tags":["font"]},"attrs":[],"properties":{"order":5044,"id":640,"name":"font","prevSize":32,"code":60213},"setIdx":0,"setId":0,"iconIdx":565},{"icon":{"paths":["M931.84 237.227c-6.043-37.798-23.49-70.743-48.646-96.006l0.006 0.006c-25.257-25.15-58.202-42.597-95.004-48.508l-0.996-0.132c-26.135-4.155-56.27-6.529-86.959-6.529-49.257 0-97.086 6.115-142.768 17.627l4.021-0.858c-3.277 0.679-6.132 1.562-8.866 2.681l0.333-0.121c-112.361 28.92-208.932 85.501-285.432 162.125l-0.008 0.008c-76.936 77.045-133.792 174.163-162.032 282.82l-0.955 4.327c0 2.56 0 5.12-2.133 8.107-10.654 41.742-16.769 89.661-16.769 139.009 0 30.747 2.374 60.94 6.949 90.405l-0.419-3.28c6.489 36.997 23.857 69.143 48.637 93.863l0.003 0.003c25.257 25.15 58.202 42.597 95.004 48.508l0.996 0.132c26.641 4.555 57.363 7.191 88.688 7.253l0.059 0c49.522-0.295 97.421-6.658 143.173-18.38l-4.079 0.886h5.973c220.737-57.227 391.213-227.42 447.892-443.681l0.962-4.319c0-2.56 0-5.12 2.133-8.107 10.756-41.935 16.929-90.077 16.929-139.66 0-31.122-2.432-61.676-7.117-91.482l0.428 3.303zM698.453 170.667c0.699-0.004 1.525-0.006 2.352-0.006 25.691 0 50.874 2.175 75.374 6.351l-2.633-0.371c3.997 0.856 7.423 1.885 10.731 3.152l-0.491-0.165-58.453 58.88-65.707-65.707c12.8-2.133 26.027-2.133 38.827-2.133zM327.253 327.253c62.441-62.113 139.948-109.14 226.558-135.117l3.842-0.99 107.52 107.52-91.733 91.733-31.147-31.147c-7.733-7.795-18.45-12.621-30.293-12.621s-22.56 4.826-30.291 12.618l-0.003 0.003c-7.668 7.712-12.407 18.343-12.407 30.080s4.74 22.368 12.409 30.082l-0.002-0.002 31.147 31.147-62.293 61.44-31.147-31.147c-7.712-7.668-18.343-12.407-30.080-12.407s-22.368 4.74-30.082 12.409l0.002-0.002c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003 31.147 31.147-91.733 92.587-107.093-107.093c26.685-90.613 73.598-168.291 135.712-230.859l-0.032 0.032zM179.627 783.787c-1.102-2.817-2.13-6.243-2.9-9.766l-0.087-0.474c-4.46-24.716-7.010-53.164-7.010-82.208 0-11.158 0.376-22.227 1.117-33.197l-0.080 1.485 67.84 65.707zM250.453 847.36c-3.997-0.856-7.423-1.885-10.731-3.152l0.491 0.165 58.453-58.88 65.707 67.84c-9.484 0.66-20.554 1.037-31.712 1.037-29.044 0-57.493-2.55-85.134-7.439l2.925 0.429zM696.747 696.747c-62.535 62.082-140.214 108.995-227.002 134.708l-3.825 0.972-107.093-107.093 91.733-91.733 31.147 31.147c7.736 7.789 18.452 12.611 30.293 12.611 23.577 0 42.691-19.113 42.691-42.691 0-11.736-4.735-22.365-12.4-30.082l0.002 0.002-30.293-31.147 61.44-61.44 31.147 31.147c7.709 7.648 18.326 12.374 30.047 12.374 0.087 0 0.173-0 0.26-0.001l-0.013 0c23.487-0.102 42.488-19.165 42.488-42.666 0-11.844-4.826-22.56-12.618-30.291l-0.003-0.003-31.147-31.147 91.733-92.587 107.093 107.093c-26.685 90.613-73.598 168.291-135.712 230.859l0.032-0.032zM853.333 364.373l-67.84-65.707 58.88-58.453c1.102 2.817 2.13 6.243 2.9 9.766l0.087 0.474c4.46 24.716 7.010 53.164 7.010 82.208 0 11.158-0.376 22.227-1.117 33.197l0.080-1.485z"],"attrs":[],"grid":0,"tags":["football-american"]},"attrs":[],"properties":{"order":5045,"id":639,"name":"football-american","prevSize":32,"code":60214},"setIdx":0,"setId":0,"iconIdx":566},{"icon":{"paths":["M931.84 237.227c-6.043-37.798-23.49-70.743-48.646-96.006l0.006 0.006c-25.257-25.15-58.202-42.597-95.004-48.508l-0.996-0.132c-25.289-3.675-54.488-5.774-84.177-5.774-340.502 0-616.533 276.031-616.533 616.533 0 29.423 2.061 58.364 6.047 86.688l-0.376-3.261c6.043 37.798 23.49 70.743 48.646 96.006l-0.006-0.006c25.257 25.15 58.202 42.597 95.004 48.508l0.996 0.132c26.641 4.555 57.363 7.191 88.688 7.253l0.059 0c168.806-1.241 321.195-70.508 431.311-181.711l0.049-0.049c111.883-110.195 181.201-263.334 181.201-432.663 0-30.7-2.279-60.868-6.676-90.344l0.408 3.328zM179.627 783.787c-1.102-2.817-2.13-6.243-2.9-9.766l-0.087-0.474c-3.413-22.404-5.363-48.254-5.363-74.559 0-145.537 59.679-277.136 155.899-371.659l0.077-0.075c94.836-95.71 225.935-155.349 370.966-156.585l0.234-0.002c0.699-0.004 1.525-0.006 2.352-0.006 25.691 0 50.874 2.175 75.374 6.351l-2.633-0.371c3.997 0.856 7.423 1.885 10.731 3.152l-0.491-0.165-210.347 210.773-31.147-31.147c-7.733-7.795-18.45-12.621-30.293-12.621s-22.56 4.826-30.291 12.618l-0.003 0.003c-7.668 7.712-12.407 18.343-12.407 30.080s4.74 22.368 12.409 30.082l-0.002-0.002 31.147 31.147-62.293 61.44-31.147-31.147c-7.712-7.668-18.343-12.407-30.080-12.407s-22.368 4.74-30.082 12.409l0.002-0.002c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003 31.147 31.147zM696.747 698.453c-94.648 95.368-225.789 154.404-370.717 154.404-26.666 0-52.865-1.999-78.456-5.854l2.88 0.357c-3.997-0.856-7.423-1.885-10.731-3.152l0.491 0.165 210.347-210.773 31.147 31.147c7.736 7.789 18.452 12.611 30.293 12.611 23.577 0 42.691-19.113 42.691-42.691 0-11.736-4.735-22.365-12.4-30.082l0.002 0.002-30.293-31.147 61.44-61.44 31.147 31.147c7.709 7.648 18.326 12.374 30.047 12.374 0.087 0 0.173-0 0.26-0.001l-0.013 0c23.487-0.102 42.488-19.165 42.488-42.666 0-11.844-4.826-22.56-12.618-30.291l-0.003-0.003-31.147-31.147 210.773-210.347c1.102 2.817 2.13 6.243 2.9 9.766l0.087 0.474c3.345 22.179 5.255 47.772 5.255 73.812 0 145.484-59.635 277.040-155.795 371.556l-0.074 0.073z"],"attrs":[],"grid":0,"tags":["football-ball"]},"attrs":[],"properties":{"order":5046,"id":638,"name":"football-ball","prevSize":32,"code":60215},"setIdx":0,"setId":0,"iconIdx":567},{"icon":{"paths":["M856.32 260.693c-46.288-63.396-108.429-112.641-180.668-142.342l-2.798-1.018c-47.578-19.914-102.865-31.482-160.854-31.482-235.46 0-426.372 190.73-426.666 426.121l-0 0.028c0 8.107 0 16.213 0 23.893 4.034 70.312 24.597 135.046 57.827 191.422l-1.080-1.982c54.988 95.254 143.116 166.175 248.286 197.624l3.021 0.776c33.788 9.508 72.591 14.974 112.669 14.974 2.090 0 4.177-0.015 6.26-0.044l-0.316 0.004c0.556 0.003 1.213 0.004 1.87 0.004 27.721 0 54.789-2.798 80.937-8.126l-2.594 0.441c178.214-35.404 314.905-178.003 341.055-356.513l0.278-2.313c3.045-17.942 4.899-38.747 5.118-59.943l0.002-0.217c0.002-0.509 0.004-1.112 0.004-1.715 0-93.991-30.918-180.761-83.138-250.695l0.788 1.103zM770.987 293.547l-45.653 122.027-69.12 18.773-101.547-72.107v-78.933l106.24-77.227c44.247 21.637 81.488 51.101 111.353 86.931l0.434 0.536zM597.333 497.92l-33.28 99.413h-104.533l-32.853-99.413 85.333-61.013zM512 170.667c16.879 0.195 33.265 1.584 49.282 4.087l-1.922-0.247-47.36 34.133-47.36-34.133c14.095-2.256 30.481-3.645 47.155-3.838l0.205-0.002zM208.213 357.12l17.067 56.32-48.213 33.707c6.67-33.892 17.456-64.033 32.029-91.878l-0.882 1.851zM266.667 748.373l58.88 2.133 15.787 56.747c-28.434-16.956-52.957-36.455-74.574-58.784l-0.092-0.096zM341.333 665.6l-134.4-4.693c-16.044-30.804-27.732-66.617-33.075-104.47l-0.205-1.77 106.24-74.24 61.44 26.453 37.973 117.76zM378.027 429.653l-66.56-29.867-38.827-128c25.589-26.119 55.302-48.068 88.112-64.819l1.915-0.887 106.667 77.227v78.933zM554.667 850.347c-12.189 1.528-26.294 2.399-40.603 2.399-25.363 0-50.085-2.739-73.889-7.937l2.279 0.417-35.413-124.587 35.413-37.973h130.987l28.587 42.667zM657.493 820.48l19.627-52.48 58.027 2.987c-22.774 19.285-48.767 35.849-76.842 48.64l-2.092 0.853zM805.12 687.36l-132.693-4.693-30.293-46.933 37.973-117.76 64.427-17.493 100.693 85.333c-8.849 38.429-23.123 72.349-42.208 102.96l0.821-1.413zM807.253 438.613l20.48-54.613c11.335 26.565 19.344 57.361 22.51 89.578l0.104 1.302z"],"attrs":[],"grid":0,"tags":["football"]},"attrs":[],"properties":{"order":5047,"id":637,"name":"football","prevSize":32,"code":60216},"setIdx":0,"setId":0,"iconIdx":568},{"icon":{"paths":["M925.867 322.987c-7.693-7.561-18.252-12.229-29.9-12.229-3.469 0-6.842 0.414-10.071 1.196l0.291-0.060c-8.398 2.007-18.090 3.242-28.041 3.412l-0.119 0.002c-70.692 0-128-57.308-128-128v0c0.134-9.902 1.37-19.447 3.593-28.608l-0.179 0.875c0.753-2.998 1.185-6.441 1.185-9.984 0-23.564-19.103-42.667-42.667-42.667-3.293 0-6.499 0.373-9.578 1.079l0.287-0.055c-86.575 19.6-152.111 90.609-163.305 178.584l-0.108 1.042c-21.306-6.325-45.807-10.053-71.151-10.239l-0.102-0.001c-0.043-0-0.094-0-0.145-0-128.287 0-234.535 94.364-253.119 217.467l-0.175 1.413c-63.535 18.112-109.274 75.645-109.274 143.86 0 60.886 36.438 113.261 88.696 136.509l0.951 0.378c5.046 2.059 10.896 3.302 17.022 3.413l0.045 0.001c0.103 0.001 0.226 0.001 0.348 0.001 23.564 0 42.667-19.103 42.667-42.667 0-17.524-10.565-32.581-25.673-39.148l-0.276-0.107c-22.766-9.878-38.401-32.161-38.401-58.096 0-0.126 0-0.251 0.001-0.377l-0 0.019c0-35.346 28.654-64 64-64v0c23.564 0 42.667-19.103 42.667-42.667v0c0-94.257 76.41-170.667 170.667-170.667v0c0.040-0 0.086-0 0.133-0 34.622 0 66.787 10.52 93.473 28.537l-0.593-0.377c30.689 20.394 54.047 49.676 66.609 84.147l0.378 1.187c5.038 14.827 17.602 25.829 33.023 28.549l0.257 0.038c49.89 5.56 88.331 47.496 88.331 98.411 0 35.402-18.584 66.463-46.53 83.96l-0.415 0.242c-11.737 7.768-19.372 20.912-19.372 35.84 0 23.659 19.18 42.839 42.839 42.839 8.732 0 16.853-2.612 23.626-7.098l-0.159 0.099c49.2-33.602 81.075-89.424 81.075-152.69 0-0.62-0.003-1.239-0.009-1.857l0.001 0.094c0.002-0.3 0.003-0.655 0.003-1.011 0-30.848-7.739-59.889-21.382-85.286l0.473 0.963c74.531-21.297 131.336-80.655 148.629-155.164l0.278-1.422c0.532-2.529 0.837-5.434 0.837-8.411 0-12.339-5.238-23.455-13.611-31.245l-0.026-0.024zM730.027 443.307c-2.683 0.23-5.806 0.361-8.96 0.361s-6.277-0.131-9.364-0.388l0.404 0.027c-8.447-5.873-18.104-11.423-28.23-16.135l-1.21-0.505c-18.153-39.183-44.511-71.829-77.048-96.833l-0.605-0.447c0-5.12 0-10.667 0-15.787-0-0.002-0-0.005-0-0.008 0-38.848 17.306-73.654 44.63-97.129l0.17-0.143c13.952 93.524 86.955 166.528 179.309 180.336l1.171 0.144c-23.649 28.5-59.077 46.516-98.714 46.516-0.546 0-1.091-0.003-1.636-0.010l0.083 0.001zM474.027 611.413c-6.699-4.582-14.977-7.318-23.893-7.318s-17.194 2.735-24.040 7.412l0.147-0.095c-6.4 3.413-106.24 71.253-106.24 177.92 0 70.692 57.308 128 128 128s128-57.308 128-128v0c0-106.667-100.267-174.933-104.107-177.92zM448 832c-23.564 0-42.667-19.103-42.667-42.667v0c2.875-34.108 18.726-64.041 42.537-85.22l0.13-0.113c23.94 21.292 39.792 51.225 42.635 84.863l0.032 0.47c0 23.564-19.103 42.667-42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["forecastcloud-moon-tear"]},"attrs":[],"properties":{"order":5048,"id":636,"name":"forecastcloud-moon-tear","prevSize":32,"code":60217},"setIdx":0,"setId":0,"iconIdx":569},{"icon":{"paths":["M637.44 279.893h152.747l-33.707 34.133c-7.668 7.712-12.407 18.343-12.407 30.080s4.74 22.368 12.409 30.082l-0.002-0.002c7.712 7.668 18.343 12.407 30.080 12.407s22.368-4.74 30.082-12.409l-0.002 0.002 106.667-106.667c7.668-7.712 12.407-18.343 12.407-30.080s-4.74-22.368-12.409-30.082l0.002 0.002-106.667-106.667c-7.412-6.377-17.129-10.259-27.753-10.259-23.564 0-42.667 19.103-42.667 42.667 0 10.624 3.883 20.341 10.307 27.809l-0.047-0.056 33.707 33.707h-152.747c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM829.44 554.667c-9.387 0-19.2-2.987-28.587-5.12-21.902-4.865-40.587-10.588-58.643-17.576l2.75 0.936c-8.677-3.257-18.705-5.142-29.174-5.142-33.468 0-62.435 19.267-76.416 47.314l-0.223 0.495-9.387 19.2c-43.295-24.339-80.587-52.66-113.523-85.363l0.030 0.030c-32.673-32.906-60.995-70.199-83.986-110.901l-1.347-2.593 17.92-11.947c28.542-14.205 47.808-43.172 47.808-76.64 0-10.468-1.885-20.497-5.334-29.763l0.192 0.59c-5.868-15.079-11.586-33.757-16.055-52.915l-0.585-2.978c-2.133-9.387-3.84-19.2-5.12-29.013-10.754-60.726-63.13-106.254-126.139-106.254-0.654 0-1.307 0.005-1.959 0.015l0.099-0.001h-128c-0.357-0.004-0.779-0.006-1.202-0.006-70.692 0-128 57.308-128 128 0 6.172 0.437 12.242 1.281 18.18l-0.079-0.681c48.095 367.748 336.77 655.549 700.837 701.876l4.017 0.417h16.213c0.056 0 0.122 0 0.188 0 32.752 0 62.631-12.301 85.269-32.536l-0.124 0.109c26.238-23.54 42.668-57.555 42.668-95.407 0-0.209-0-0.417-0.001-0.625l0 0.032v-128c-1.124-61.764-45.825-112.764-104.599-123.613l-0.788-0.121zM850.773 810.667c-0.017 12.731-5.606 24.153-14.46 31.96l-0.047 0.040c-7.878 6.831-18.231 10.994-29.556 10.994-1.914 0-3.8-0.119-5.652-0.35l0.221 0.022c-328.712-43.345-585.857-301.508-627.254-627.021l-0.373-3.593c-0.173-1.507-0.272-3.254-0.272-5.023 0-11.447 4.136-21.929 10.995-30.031l-0.056 0.068c7.847-8.9 19.269-14.49 31.997-14.507l0.003-0h128c0.283-0.007 0.615-0.011 0.949-0.011 20.394 0 37.446 14.308 41.665 33.434l0.052 0.283q2.56 17.493 6.4 34.56c5.721 25.899 12.474 48.010 20.728 69.374l-1.101-3.241-59.733 27.733c-14.801 6.91-24.874 21.669-24.874 38.78 0 6.52 1.463 12.699 4.078 18.226l-0.11-0.259c62.648 132.060 166.607 236.019 294.925 297.065l3.741 1.602c4.793 2.024 10.366 3.201 16.213 3.201s11.42-1.176 16.495-3.305l-0.281 0.105c10.842-3.955 19.439-11.858 24.21-21.927l0.11-0.259 26.453-59.733c17.866 6.724 40.404 13.471 63.467 18.851l3.947 0.776q17.067 3.84 34.56 6.4c19.409 4.271 33.717 21.324 33.717 41.718 0 0.334-0.004 0.667-0.011 0.999l0.001-0.049z"],"attrs":[],"grid":0,"tags":["forwaded-call"]},"attrs":[],"properties":{"order":5049,"id":635,"name":"forwaded-call","prevSize":32,"code":60218},"setIdx":0,"setId":0,"iconIdx":570},{"icon":{"paths":["M881.92 413.44l-284.587-164.267c-16.288-9.519-35.861-15.14-56.747-15.14-62.839 0-113.794 50.878-113.92 113.688l-0 0.012-170.667-98.56c-16.288-9.519-35.861-15.14-56.747-15.14-62.839 0-113.794 50.878-113.92 113.688l-0 0.012v328.533c-0.001 0.174-0.002 0.38-0.002 0.586 0 41.576 22.611 77.871 56.206 97.259l0.542 0.289c16.321 9.917 36.053 15.787 57.156 15.787 0.006 0 0.012-0 0.018-0l-0.001 0c20.909-0.115 40.465-5.804 57.289-15.653l-0.542 0.293 170.667-98.56c-0.001 0.154-0.001 0.336-0.001 0.518 0 41.717 22.593 78.157 56.21 97.753l0.538 0.289c16.329 9.636 35.98 15.329 56.96 15.329s40.631-5.693 57.491-15.618l-0.531 0.289 284.587-164.267c34.197-20.086 56.791-56.684 56.791-98.56s-22.594-78.474-56.257-98.269l-0.534-0.291zM426.667 577.707l-213.333 122.88c-4.050 2.334-8.907 3.711-14.085 3.711-15.593 0-28.269-12.484-28.581-28.002l-0-0.029v-328.533c0.312-15.547 12.989-28.031 28.581-28.031 5.178 0 10.035 1.377 14.224 3.785l-0.139-0.074 213.333 122.88zM839.253 535.040l-284.587 165.973c-4.119 2.33-9.046 3.703-14.293 3.703s-10.174-1.373-14.441-3.779l0.147 0.076c-8.478-4.959-14.082-14.019-14.082-24.389 0-0.126 0.001-0.252 0.002-0.377l-0 0.019v-328.533c-0.001-0.106-0.002-0.232-0.002-0.358 0-10.369 5.604-19.429 13.949-24.317l0.133-0.072c4.204-2.267 9.173-3.668 14.454-3.839l0.053-0.001c0.069-0.001 0.151-0.001 0.233-0.001 5.115 0 9.895 1.428 13.966 3.908l-0.119-0.067 284.587 164.267c8.595 5.037 14.276 14.228 14.276 24.747s-5.681 19.71-14.141 24.674l-0.135 0.073z"],"attrs":[],"grid":0,"tags":["forward"]},"attrs":[],"properties":{"order":5050,"id":634,"name":"forward","prevSize":32,"code":60219},"setIdx":0,"setId":0,"iconIdx":571},{"icon":{"paths":["M356.693 654.080c-9.337 7.879-15.226 19.588-15.226 32.672 0 10.306 3.654 19.759 9.738 27.134l-0.058-0.073c7.882 9.459 19.666 15.435 32.846 15.435 10.422 0 19.971-3.736 27.38-9.943l-0.067 0.054c27.277-22.134 62.42-35.536 100.693-35.536s73.416 13.403 100.992 35.771l-0.298-0.234c7.343 6.152 16.892 9.888 27.314 9.888 13.18 0 24.964-5.976 32.791-15.366l0.056-0.069c6.025-7.302 9.68-16.755 9.68-27.061 0-13.084-5.89-24.793-15.163-32.62l-0.064-0.052c-42.1-34.061-96.295-54.681-155.307-54.681s-113.207 20.62-155.775 55.047l0.468-0.366zM384 469.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667c-23.564 0-42.667 19.103-42.667 42.667v0c0 23.564 19.103 42.667 42.667 42.667v0zM512 85.333c-235.641 0-426.667 191.025-426.667 426.667s191.025 426.667 426.667 426.667c235.641 0 426.667-191.025 426.667-426.667v0c0-235.641-191.025-426.667-426.667-426.667v0zM512 853.333c-188.513 0-341.333-152.82-341.333-341.333s152.82-341.333 341.333-341.333c188.513 0 341.333 152.82 341.333 341.333v0c0 188.513-152.82 341.333-341.333 341.333v0zM640 384c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["frown"]},"attrs":[],"properties":{"order":5051,"id":633,"name":"frown","prevSize":32,"code":60220},"setIdx":0,"setId":0,"iconIdx":572},{"icon":{"paths":["M896 768h-85.333v-128c0-23.564-19.103-42.667-42.667-42.667v0h-213.333v-115.627l48.213 25.173c5.737 3.062 12.547 4.86 19.777 4.86 23.564 0 42.667-19.103 42.667-42.667 0-2.47-0.21-4.891-0.613-7.246l0.036 0.253-17.067-101.12 73.387-72.107c7.936-7.755 12.857-18.566 12.857-30.526 0-4.328-0.645-8.506-1.843-12.443l0.079 0.302c-5.108-15.329-18.265-26.633-34.329-28.986l-0.231-0.028-100.267-15.787-46.933-92.16c-7.071-14.361-21.602-24.069-38.4-24.069s-31.329 9.707-38.289 23.819l-0.111 0.25-46.933 92.16-101.973 14.933c-16.295 2.38-29.452 13.684-34.473 28.712l-0.087 0.301c-1.119 3.634-1.764 7.812-1.764 12.141 0 11.96 4.921 22.771 12.849 30.518l0.008 0.008 75.093 72.96-17.067 101.12c-0.367 2.103-0.577 4.524-0.577 6.994 0 23.564 19.103 42.667 42.667 42.667 7.23 0 14.040-1.798 20.008-4.972l-0.231 0.112 48.213-25.173v115.627h-213.333c-23.564 0-42.667 19.103-42.667 42.667v0 128h-85.333c-23.564 0-42.667 19.103-42.667 42.667v0 85.333c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667h170.667v42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-85.333c0-23.564-19.103-42.667-42.667-42.667v0h-85.333v-85.333h426.667v85.333h-85.333c-23.564 0-42.667 19.103-42.667 42.667v0 85.333c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667h170.667v42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-85.333c0-23.564-19.103-42.667-42.667-42.667v0zM512 368.213c-7.353 0.038-14.255 1.93-20.275 5.231l0.222-0.111-34.133 17.92 6.4-38.4c0.361-2.086 0.568-4.488 0.568-6.939 0-12.002-4.955-22.846-12.931-30.598l-0.010-0.010-27.733-27.307 38.4-5.547c14.242-1.955 26.088-10.696 32.315-22.8l0.112-0.24 17.067-34.987 17.067 34.987c6.339 12.344 18.185 21.085 32.204 23.015l0.223 0.025 38.4 5.547-27.733 27.307c-7.986 7.762-12.941 18.606-12.941 30.608 0 2.451 0.207 4.853 0.603 7.19l-0.035-0.252 6.4 38.4-34.133-17.92c-5.798-3.19-12.701-5.082-20.042-5.12l-0.012-0z"],"attrs":[],"grid":0,"tags":["game-structure"]},"attrs":[],"properties":{"order":5052,"id":632,"name":"game-structure","prevSize":32,"code":60221},"setIdx":0,"setId":0,"iconIdx":573},{"icon":{"paths":["M768 298.667h-14.933c9.332-18.683 14.835-40.687 14.933-63.967l0-0.033c0.001-0.192 0.001-0.42 0.001-0.647 0-82.239-66.668-148.907-148.907-148.907-42.023 0-79.981 17.408-107.055 45.405l-0.040 0.041c-27.114-28.039-65.071-45.447-107.095-45.447-82.239 0-148.907 66.668-148.907 148.907 0 0.227 0.001 0.455 0.002 0.682l-0-0.035c0.099 23.313 5.601 45.317 15.318 64.856l-0.385-0.856h-14.933c-70.692 0-128 57.308-128 128v0 85.333c0 23.564 19.103 42.667 42.667 42.667v0h42.667v256c0 70.692 57.308 128 128 128v0h341.333c70.692 0 128-57.308 128-128v0-256h42.667c23.564 0 42.667-19.103 42.667-42.667v0-85.333c0-70.692-57.308-128-128-128v0zM469.333 853.333h-128c-23.564 0-42.667-19.103-42.667-42.667v0-256h170.667zM469.333 469.333h-256v-42.667c0-23.564 19.103-42.667 42.667-42.667v0h213.333zM469.333 298.667h-64c-35.346 0-64-28.654-64-64s28.654-64 64-64c35.346 0 64 28.654 64 64v0zM554.667 234.667c0-35.346 28.654-64 64-64s64 28.654 64 64c0 35.346-28.654 64-64 64v0h-64zM725.333 810.667c0 23.564-19.103 42.667-42.667 42.667v0h-128v-298.667h170.667zM810.667 469.333h-256v-85.333h213.333c23.564 0 42.667 19.103 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["gift"]},"attrs":[],"properties":{"order":5053,"id":631,"name":"gift","prevSize":32,"code":60222},"setIdx":0,"setId":0,"iconIdx":574},{"icon":{"paths":["M429.667 874.791c-0.004-23.563-19.106-42.664-42.67-42.664-2.731 0-5.403 0.257-7.992 0.747l0.266-0.042c-55.854 10.25-126.375 11.792-145.125-40.875-17.031-41.775-43.887-76.559-77.799-102.615l-0.576-0.425c-2.709-1.485-5.033-3.031-7.213-4.75l0.109 0.083c-6.258-16.178-21.655-27.46-39.698-27.542l-0.010-0h-0.208c-0.005-0-0.010-0-0.015-0-23.488 0-42.542 18.986-42.651 42.448l-0 0.010c-0.167 34.792 34.603 57.083 48.708 64.625 16.207 16.282 29.477 35.503 38.938 56.793l0.479 1.207c15.542 43.667 60.708 109.917 190.542 101.376 0.043 1.5 0.083 2.917 0.104 4.208l0.187 11.417c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0l-0.208-13.583c-0.208-8.086-0.5-19.794-0.5-50.419zM884.792 229.415c1.354-5.333 2.688-11.25 3.855-17.917 1.767-11.56 2.777-24.897 2.777-38.47 0-36.803-7.422-71.873-20.852-103.794l0.658 1.763c-4.759-11.713-14.216-20.674-25.97-24.661l-0.301-0.089c-15.189-5.125-71.271-15.209-178.521 53.333-40.719-9.999-87.465-15.735-135.552-15.735s-94.833 5.736-139.593 16.56l4.041-0.825c-106.813-67.538-162.605-58.373-177.647-53.54-12.37 3.919-22.104 12.992-26.835 24.632l-0.102 0.285c-12.844 30.294-20.309 65.525-20.309 102.499 0 14.368 1.127 28.474 3.298 42.232l-0.198-1.523c1.042 5.458 2.167 10.5 3.334 15.125-33.447 44.168-53.577 100.033-53.577 160.599 0 0.976 0.005 1.951 0.016 2.924l-0.001-0.148c-0.009 0.936-0.014 2.043-0.014 3.151 0 12.743 0.663 25.331 1.957 37.731l-0.131-1.549c14.251 196.375 142.251 255.334 231.437 275.584-1.854 5.333-3.541 11.041-5.041 17.083-0.77 3.032-1.212 6.514-1.212 10.098 0 23.57 19.107 42.676 42.676 42.676 19.905 0 36.628-13.628 41.346-32.062l0.064-0.296c2.889-14.779 9.976-27.573 19.953-37.453l0.006-0.006c8.941-7.857 14.554-19.315 14.554-32.085 0-21.861-16.45-39.88-37.646-42.354l-0.199-0.019c-147.375-16.833-211.354-76.875-220.979-209-0.925-8.574-1.452-18.519-1.452-28.588 0-1.024 0.005-2.047 0.016-3.068l-0.001 0.156c-0.015-0.881-0.024-1.922-0.024-2.964 0-42.783 14.79-82.113 39.536-113.153l-0.283 0.367c2.799-3.651 5.535-6.869 8.419-9.945l-0.065 0.070c6.734-7.511 10.852-17.488 10.852-28.428 0-5.495-1.039-10.746-2.931-15.57l0.1 0.29c-2.588-6.648-4.879-14.598-6.477-22.796l-0.148-0.912c-1.252-7.855-1.967-16.912-1.967-26.137 0-15.196 1.941-29.939 5.588-43.994l-0.267 1.214c39.346 11.308 73.662 28.539 103.91 50.949l-0.87-0.616c6.706 4.522 14.968 7.219 23.86 7.219 4.076 0 8.019-0.567 11.756-1.625l-0.303 0.073c39.466-11.138 84.79-17.541 131.609-17.541 46.876 0 92.253 6.419 135.3 18.425l-3.534-0.842c3.402 0.97 7.309 1.528 11.347 1.528 8.994 0 17.341-2.767 24.237-7.497l-0.146 0.095c29.258-21.891 63.419-39.261 100.339-50.21l2.286-0.582c3.464 12.909 5.453 27.729 5.453 43.014 0 8.579-0.627 17.012-1.837 25.255l0.113-0.936c-1.742 9.838-4.242 18.54-7.532 26.842l0.323-0.925c-1.792 4.534-2.83 9.786-2.83 15.28 0 10.939 4.117 20.917 10.887 28.468l-0.035-0.040c3.292 3.708 6.583 7.708 9.542 11.458 24.007 29.811 38.533 68.138 38.533 109.857 0 1.515-0.019 3.025-0.057 4.531l0.004-0.223c0.005 0.623 0.007 1.359 0.007 2.096 0 10.944-0.585 21.751-1.727 32.392l0.115-1.321c-9.396 130.375-73.625 190.458-221.687 207.333-21.395 2.507-37.839 20.53-37.839 42.393 0 12.779 5.618 24.247 14.52 32.066l0.048 0.041c10.288 10.143 17.43 23.454 19.842 38.35l0.053 0.4c2.523 9.595 3.972 20.61 3.972 31.964 0 1.053-0.012 2.103-0.037 3.15l0.003-0.156v99.584c-0.418 27.624-0.418 48.332-0.418 57.833 0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0c0-9.25 0-29.542 0.417-57.167v-100.25c0.022-1.128 0.035-2.459 0.035-3.792 0-18.539-2.422-36.513-6.967-53.621l0.329 1.454c-1.642-7.28-3.347-13.22-5.339-19.027l0.381 1.277c132.626-22.637 232.318-136.716 232.333-274.082l0-0.002c1.254-11.451 1.969-24.731 1.969-38.179 0-0.962-0.004-1.924-0.011-2.885l0.001 0.147c0.022-1.25 0.034-2.725 0.034-4.203 0-60.109-20.275-115.483-54.36-159.656l0.451 0.608z"],"attrs":[],"grid":0,"tags":["github-alt"]},"attrs":[],"properties":{"order":5054,"id":630,"name":"github-alt","prevSize":32,"code":60223},"setIdx":0,"setId":0,"iconIdx":575},{"icon":{"paths":["M512 95.859c-235.644 0.010-426.667 191.039-426.667 426.685 0 187.375 120.779 346.54 288.731 403.891l3.003 0.891c21.333 3.734 29.333-9.065 29.333-20.267 0-10.133-0.534-43.733-0.534-79.466-107.2 19.733-134.934-26.132-143.467-50.132-9.906-24.023-24.804-44.229-43.508-60.082l-0.226-0.186c-14.933-8-36.267-27.733-0.534-28.266 28.365 3.165 52.257 19.814 65.378 43.299l0.222 0.433c15.89 28.147 45.603 46.84 79.683 46.84 16.378 0 31.748-4.317 45.033-11.876l-0.45 0.236c1.974-22.547 12.012-42.434 27.173-57.038l0.028-0.027c-94.933-10.667-194.133-47.468-194.133-210.667-0.011-0.698-0.017-1.522-0.017-2.348 0-43.371 16.628-82.859 43.856-112.436l-0.106 0.117c-5.567-15.233-8.786-32.82-8.786-51.159 0-22.406 4.806-43.689 13.443-62.876l-0.39 0.968s35.732-11.2 117.333 43.733c31.979-9.143 68.709-14.401 106.667-14.401s74.687 5.258 109.5 15.084l-2.834-0.683c81.599-55.467 117.333-43.733 117.333-43.733 8.248 18.218 13.055 39.501 13.055 61.907 0 18.339-3.22 35.927-9.126 52.227l0.338-1.067c27.121 29.324 43.756 68.692 43.756 111.945 0 0.957-0.008 1.912-0.024 2.866l0.002-0.144c0 163.732-99.734 200-194.667 210.667 17.998 18.235 29.115 43.301 29.115 70.964 0 2.805-0.114 5.583-0.338 8.33l0.024-0.361c0 57.068-0.534 102.932-0.534 117.333 0 11.2 8 24.533 29.333 20.267 170.409-58.626 290.671-217.556 290.671-404.575 0-235.688-190.999-426.766-426.658-426.893l-0.013-0z"],"attrs":[],"grid":0,"tags":["github"]},"attrs":[],"properties":{"order":5055,"id":629,"name":"github","prevSize":32,"code":60224},"setIdx":0,"setId":0,"iconIdx":576},{"icon":{"paths":["M936.076 548.925l-45.437-139.938-0.011-0.037v-0.007l-90.201-277.703c-4.846-14.254-18.112-24.327-33.731-24.327-0.121 0-0.242 0.001-0.363 0.002l0.018-0c-0.058-0-0.127-0.001-0.196-0.001-15.608 0-28.833 10.198-33.378 24.294l-0.069 0.248-85.619 263.589h-270.156l-85.779-263.607c-4.617-14.336-17.838-24.527-33.439-24.527-0.070 0-0.14 0-0.21 0.001l0.011-0h-0.19c-15.741 0.004-29.106 10.173-33.889 24.3l-0.074 0.252-89.972 277.513-45.604 139.947c-1.602 4.734-2.527 10.186-2.527 15.855 0 16.914 8.234 31.905 20.912 41.183l0.144 0.1 394.143 286.332c0.532 0.376 1.152 0.763 1.793 1.115l0.103 0.052 0.268 0.164 0.162 0.091 0.128 0.052 0.093 0.037 0.227 0.096 2.042 0.854 0.043 0.018 0.164 0.068 0.208 0.076 0.083 0.021 0.273 0.065 0.104 0.023c0.474 0.143 0.964 0.247 1.453 0.357l0.568 0.138 0.083 0.021 0.187 0.043 0.31 0.065 0.25 0.021 0.043 0.003h0.013c0.844 0.136 1.822 0.218 2.819 0.228l0.010 0h0.034c1.007-0.009 1.988-0.091 2.946-0.241l-0.113 0.015h0.011l0.047-0.003 0.253-0.021 0.312-0.065 0.185-0.043 0.081-0.021 0.581-0.141 1.435-0.352 0.099-0.021 0.281-0.070 0.085-0.018 0.213-0.078 0.161-0.068 0.043-0.018 1.047-0.435 1.435-0.602 0.171-0.093 0.003-0.003 0.271-0.166c0.741-0.402 1.357-0.786 1.95-1.201l-0.064 0.043 0.154-0.091 0.039-0.026 0.185-0.114 393.831-286.107c12.816-9.378 21.045-24.365 21.045-41.274 0-5.67-0.925-11.124-2.634-16.22l0.105 0.36zM766.604 157.255l77.232 237.789h-154.47zM257.271 157.253l77.377 237.792h-154.467zM129.963 573.542c-2.726-2-4.476-5.191-4.476-8.792 0-1.211 0.198-2.377 0.564-3.465l-0.022 0.077 33.898-104.034 248.399 318.464zM193.707 435.255h154.018l109.799 338.234zM499.399 891.636l-0.229-0.195-0.495-0.427-0.838-0.771 0.070 0.057 0.093 0.079c0.555 0.533 1.148 1.041 1.768 1.513l0.050 0.036 0.020 0.016 0.085 0.076zM511.923 810.833l-121.928-375.578h244.026zM525.146 891.013l-0.45 0.388-0.052 0.047-0.227 0.193-0.521 0.384 0.085-0.073 0.016-0.013c0.667-0.505 1.258-1.011 1.815-1.55l-0.006 0.005 0.073-0.060 0.091-0.078zM676.305 435.255h154.008l-263.964 338.214zM893.917 573.534l-278.323 202.193 248.479-318.375 33.766 103.989c0.345 1.014 0.544 2.183 0.544 3.398 0 3.6-1.747 6.791-4.439 8.774l-0.030 0.021z"],"attrs":[],"grid":0,"tags":["gitlab"]},"attrs":[],"properties":{"order":5056,"id":628,"name":"gitlab","prevSize":32,"code":60225},"setIdx":0,"setId":0,"iconIdx":577},{"icon":{"paths":["M840.96 695.040l-597.333-597.333c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293v0l98.133 97.707h-67.84c-16.849 0.049-31.395 9.857-38.289 24.066l-0.111 0.254c-2.217 4.992-3.508 10.816-3.508 16.941 0 9.709 3.243 18.66 8.704 25.83l-0.076-0.104 289.28 363.947v166.4h-181.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h448c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-181.333v-166.4l69.973-85.333 155.733 155.733c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c8.322-7.806 13.506-18.871 13.506-31.147s-5.184-23.341-13.483-31.125l-0.023-0.021zM302.080 341.333h64.427l80.64 80.64h-80.64zM512 603.733l-77.227-96.427h97.707l31.573 31.573zM625.493 341.333h96.427l-26.88 33.707c-5.818 7.23-9.338 16.523-9.338 26.639 0 13.318 6.102 25.21 15.662 33.035l0.076 0.060c7.241 5.848 16.557 9.387 26.7 9.387 0.063 0 0.126-0 0.189-0l-0.010 0c0.043 0 0.094 0 0.145 0 13.34 0 25.25-6.122 33.074-15.71l0.061-0.077 82.347-103.253c5.385-7.066 8.628-16.017 8.628-25.725 0-6.125-1.291-11.949-3.615-17.214l0.108 0.273c-6.414-15.335-21.107-26.005-38.345-26.452l-0.055-0.001h-185.173c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["glass-martini-alt-slash"]},"attrs":[],"properties":{"order":5057,"id":627,"name":"glass-martini-alt-slash","prevSize":32,"code":60226},"setIdx":0,"setId":0,"iconIdx":578},{"icon":{"paths":["M128 384c23.564 0 42.667-19.103 42.667-42.667v0-128c0-23.564 19.103-42.667 42.667-42.667v0h128c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-128c-70.692 0-128 57.308-128 128v0 128c0 23.564 19.103 42.667 42.667 42.667v0zM341.333 853.333h-128c-23.564 0-42.667-19.103-42.667-42.667v0-128c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 128c0 70.692 57.308 128 128 128v0h128c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM725.333 554.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-48.64c-15.993-59.846-62.181-106.033-120.833-121.754l-1.193-0.272v-48.64c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 48.64c-59.846 15.993-106.033 62.181-121.754 120.833l-0.272 1.193h-48.64c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h48.64c15.993 59.846 62.181 106.033 120.833 121.754l1.193 0.272v48.64c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-48.64c59.846-15.993 106.033-62.181 121.754-120.833l0.272-1.193zM512 597.333c-47.128 0-85.333-38.205-85.333-85.333s38.205-85.333 85.333-85.333c47.128 0 85.333 38.205 85.333 85.333v0c0 47.128-38.205 85.333-85.333 85.333v0zM896 640c-23.564 0-42.667 19.103-42.667 42.667v0 128c0 23.564-19.103 42.667-42.667 42.667v0h-128c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h128c70.692 0 128-57.308 128-128v0-128c0-23.564-19.103-42.667-42.667-42.667v0zM810.667 85.333h-128c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h128c23.564 0 42.667 19.103 42.667 42.667v0 128c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-128c0-70.692-57.308-128-128-128v0z"],"attrs":[],"grid":0,"tags":["focus-target"]},"attrs":[],"properties":{"order":5058,"id":626,"name":"focus-target","prevSize":32,"code":60227},"setIdx":0,"setId":0,"iconIdx":579},{"icon":{"paths":["M929.28 154.453c5.757-7.208 9.238-16.454 9.238-26.513 0-6.645-1.519-12.935-4.229-18.542l0.111 0.255c-7.005-14.463-21.551-24.271-38.393-24.32l-0.007-0h-768c-16.849 0.049-31.395 9.857-38.289 24.066l-0.111 0.254c-2.599 5.352-4.118 11.642-4.118 18.287 0 10.059 3.481 19.305 9.304 26.599l-0.066-0.086 374.613 468.48v230.4h-245.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h576c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-245.333v-230.4zM216.747 170.667h590.507l-102.4 128h-384zM512 539.733l-124.587-155.733h249.173z"],"attrs":[],"grid":0,"tags":["glass-martini-alt"]},"attrs":[],"properties":{"order":5059,"id":625,"name":"glass-martini-alt","prevSize":32,"code":60228},"setIdx":0,"setId":0,"iconIdx":580},{"icon":{"paths":["M768 853.333h-213.333v-215.893c192.857-22.189 341.237-184.472 341.333-381.43l0-0.010c0.002-0.479 0.003-1.046 0.003-1.613 0-51.617-10.511-100.778-29.51-145.461l0.92 2.434c-2.325-5.317-5.491-9.849-9.378-13.645l-0.008-0.008-4.693-3.413c-2.589-2.146-5.539-4.001-8.714-5.446l-0.246-0.1c-3.475-1.652-7.508-2.854-11.748-3.393l-0.199-0.021h-640.427c-4.5 0.212-8.723 1.133-12.647 2.653l0.274-0.093c-3.459 2.030-6.384 4.003-9.181 6.135l0.221-0.161-5.12 3.84c-3.896 3.804-7.062 8.336-9.279 13.38l-0.107 0.274c-17.815 41.97-28.169 90.782-28.169 142.012 0 0.924 0.003 1.847 0.010 2.77l-0.001-0.142c0.097 196.968 148.476 359.251 339.555 381.273l1.779 0.167v215.893h-213.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h512c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM213.333 256c-0.001-0.242-0.001-0.528-0.001-0.814 0-30.14 4.523-59.223 12.926-86.608l-0.552 2.089h572.587c7.852 25.297 12.374 54.38 12.374 84.519 0 0.286-0 0.572-0.001 0.858l0-0.044c0 164.949-133.718 298.667-298.667 298.667s-298.667-133.718-298.667-298.667v0z"],"attrs":[],"grid":0,"tags":["glass-martini"]},"attrs":[],"properties":{"order":5060,"id":624,"name":"glass-martini","prevSize":32,"code":60229},"setIdx":0,"setId":0,"iconIdx":581},{"icon":{"paths":["M810.667 128c-23.483-26.174-57.39-42.588-95.133-42.667l-0.014-0h-407.040c-0.231-0.002-0.504-0.002-0.777-0.002-70.692 0-128 57.308-128 128 0 4.961 0.282 9.857 0.832 14.671l-0.055-0.589 66.56 597.333c7.331 64.374 61.491 113.922 127.224 113.922 0.273 0 0.546-0.001 0.818-0.003l-0.042 0h273.92c0.231 0.002 0.503 0.002 0.776 0.002 65.733 0 119.893-49.548 127.169-113.334l0.055-0.589 66.56-597.333c0.425-3.916 0.668-8.457 0.668-13.055 0-33.326-12.736-63.678-33.607-86.453l0.086 0.095zM691.2 815.36c-2.444 21.458-20.497 37.974-42.408 37.974-0.091 0-0.182-0-0.273-0.001l0.014 0h-273.493c-0.077 0.001-0.168 0.001-0.259 0.001-21.911 0-39.964-16.516-42.39-37.778l-0.018-0.196-43.093-388.693h445.44zM744.107 341.333h-464.213l-13.653-123.307c-0.17-1.428-0.266-3.083-0.266-4.76 0-10.983 4.15-20.996 10.967-28.558l-0.034 0.038c7.818-8.637 19.060-14.049 31.568-14.080l0.006-0h407.040c12.513 0.031 23.756 5.443 31.541 14.043l0.033 0.037c6.783 7.524 10.933 17.538 10.933 28.52 0 1.677-0.097 3.331-0.285 4.958l0.019-0.198zM597.333 768c23.564 0 42.667-19.103 42.667-42.667v0-170.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 170.667c0 23.564 19.103 42.667 42.667 42.667v0zM426.667 768c23.564 0 42.667-19.103 42.667-42.667v0-170.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 170.667c0 23.564 19.103 42.667 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["glass-tea"]},"attrs":[],"properties":{"order":5061,"id":623,"name":"glass-tea","prevSize":32,"code":60230},"setIdx":0,"setId":0,"iconIdx":582},{"icon":{"paths":["M842.667 99.413c-7.84-8.662-19.125-14.081-31.675-14.081-0.114 0-0.228 0-0.342 0.001l0.017-0h-597.333c-0.097-0.001-0.211-0.001-0.325-0.001-12.551 0-23.835 5.419-31.643 14.045l-0.033 0.036c-6.783 7.524-10.933 17.538-10.933 28.52 0 1.677 0.097 3.331 0.285 4.958l-0.019-0.198 76.8 692.053c7.331 64.374 61.491 113.922 127.224 113.922 0.273 0 0.546-0.001 0.818-0.003l-0.042 0h273.92c0.231 0.002 0.503 0.002 0.776 0.002 65.733 0 119.893-49.548 127.169-113.334l0.055-0.589 75.947-692.053c0.17-1.428 0.266-3.083 0.266-4.76 0-10.983-4.15-20.996-10.967-28.558l0.034 0.038zM691.2 815.36c-2.444 21.458-20.497 37.974-42.408 37.974-0.091 0-0.182-0-0.273-0.001l0.014 0h-273.493c-0.077 0.001-0.168 0.001-0.259 0.001-21.911 0-39.964-16.516-42.39-37.778l-0.018-0.196-43.093-388.693h445.44zM744.107 341.333h-464.213l-18.773-170.667h501.76z"],"attrs":[],"grid":0,"tags":["glass"]},"attrs":[],"properties":{"order":5062,"id":622,"name":"glass","prevSize":32,"code":60231},"setIdx":0,"setId":0,"iconIdx":583},{"icon":{"paths":["M913.493 368.64s0 0 0-2.133c-61.593-164.752-217.666-279.929-400.64-279.929s-339.047 115.177-399.673 276.985l-0.967 2.944s0 0 0 2.133c-15.949 42.646-25.18 91.925-25.18 143.36s9.231 100.714 26.126 146.272l-0.946-2.912s0 0 0 2.133c61.593 164.752 217.666 279.929 400.64 279.929s339.047-115.177 399.673-276.985l0.967-2.944s0 0 0-2.133c15.949-42.646 25.18-91.925 25.18-143.36s-9.231-100.714-26.126-146.272l0.946 2.912zM181.76 597.333c-7.047-25.599-11.097-54.993-11.097-85.333s4.050-59.734 11.638-87.671l-0.541 2.338h79.36c-3.259 25.618-5.119 55.259-5.119 85.333s1.86 59.715 5.471 88.812l-0.352-3.479zM216.747 682.667h59.733c11.156 41.825 25.733 78.272 44.026 112.432l-1.359-2.778c-41.879-28.787-76.217-65.441-101.534-108.078l-0.866-1.575zM276.48 341.333h-59.733c25.838-44.124 59.748-80.758 100.018-108.923l1.102-0.73c-16.513 31.375-30.676 67.857-40.593 106.051l-0.794 3.602zM469.333 840.533c-51.369-37.998-88.46-92.733-103.318-156.035l-0.362-1.832h103.68zM469.333 597.333h-122.027c-3.801-25.639-5.972-55.233-5.972-85.333s2.171-59.695 6.364-88.634l-0.392 3.3h122.027zM469.333 341.333h-103.68c15.22-65.134 52.311-119.869 102.946-157.348l0.734-0.519zM807.253 341.333h-59.733c-11.156-41.825-25.733-78.272-44.026-112.432l1.359 2.778c41.879 28.787 76.217 65.441 101.534 108.078l0.866 1.575zM554.667 183.467c51.369 37.998 88.46 92.733 103.318 156.035l0.362 1.832h-103.68zM554.667 840.533v-157.867h103.68c-15.22 65.134-52.311 119.869-102.946 157.348l-0.734 0.519zM676.693 597.333h-122.027v-170.667h122.027c3.801 25.639 5.972 55.233 5.972 85.333s-2.171 59.695-6.364 88.634l0.392-3.3zM706.133 792.32c16.934-31.382 31.511-67.829 41.832-106.025l0.835-3.629h59.733c-26.183 44.213-60.521 80.866-101.249 108.904l-1.151 0.749zM842.24 597.333h-79.36c3.261-25.185 5.122-54.317 5.122-83.883 0-0.51-0.001-1.020-0.002-1.53l0 0.080c0.001-0.34 0.001-0.742 0.001-1.144 0-29.674-1.861-58.913-5.472-87.607l0.351 3.417h79.36c7.047 25.599 11.097 54.993 11.097 85.333s-4.050 59.734-11.638 87.671l0.541-2.338z"],"attrs":[],"grid":0,"tags":["globe"]},"attrs":[],"properties":{"order":5063,"id":621,"name":"globe","prevSize":32,"code":60232},"setIdx":0,"setId":0,"iconIdx":584},{"icon":{"paths":["M341.333 469.333h341.333c13.235-0.090 25.027-6.193 32.792-15.71l0.061-0.077c6.5-7.448 10.464-17.256 10.464-27.99 0-2.623-0.237-5.191-0.69-7.684l0.039 0.261-42.667-213.333c-4.105-19.619-21.26-34.142-41.806-34.142-0.302 0-0.604 0.003-0.905 0.009l0.045-0.001h-256c-0.256-0.006-0.558-0.009-0.86-0.009-20.547 0-37.701 14.523-41.758 33.864l-0.049 0.278-42.667 213.333c-0.512 2.48-0.805 5.33-0.805 8.249 0 10.354 3.688 19.846 9.822 27.235l-0.057-0.070c7.885 9.667 19.796 15.79 33.138 15.79 0.2 0 0.4-0.001 0.599-0.004l-0.030 0zM418.987 256h186.027l25.6 128h-237.227zM938.667 588.8c-4.105-19.619-21.26-34.142-41.806-34.142-0.302 0-0.604 0.003-0.905 0.009l0.045-0.001h-256c-0.256-0.006-0.558-0.009-0.86-0.009-20.547 0-37.701 14.523-41.758 33.864l-0.049 0.278-42.667 213.333c-0.512 2.48-0.805 5.33-0.805 8.249 0 10.354 3.688 19.846 9.822 27.235l-0.057-0.070c7.885 9.667 19.796 15.79 33.138 15.79 0.2 0 0.4-0.001 0.599-0.004l-0.030 0h341.333c13.235-0.090 25.027-6.193 32.792-15.71l0.061-0.077c6.5-7.448 10.464-17.256 10.464-27.99 0-2.623-0.237-5.191-0.69-7.684l0.039 0.261zM649.387 768l25.6-128h186.027l25.6 128zM384 554.667h-256c-0.256-0.006-0.558-0.009-0.86-0.009-20.547 0-37.701 14.523-41.758 33.864l-0.049 0.278-42.667 213.333c-0.512 2.48-0.805 5.33-0.805 8.249 0 10.354 3.688 19.846 9.822 27.235l-0.057-0.070c7.885 9.667 19.796 15.79 33.138 15.79 0.2 0 0.4-0.001 0.599-0.004l-0.030 0h341.333c13.235-0.090 25.027-6.193 32.792-15.71l0.061-0.077c6.5-7.448 10.464-17.256 10.464-27.99 0-2.623-0.237-5.191-0.69-7.684l0.039 0.261-42.667-213.333c-4.105-19.619-21.26-34.142-41.806-34.142-0.302 0-0.604 0.003-0.905 0.009l0.045-0.001zM137.387 768l25.6-128h186.027l25.6 128z"],"attrs":[],"grid":0,"tags":["gold"]},"attrs":[],"properties":{"order":5064,"id":620,"name":"gold","prevSize":32,"code":60233},"setIdx":0,"setId":0,"iconIdx":585},{"icon":{"paths":["M597.333 384c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM597.333 256c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM512 85.333c-235.641 0-426.667 191.025-426.667 426.667s191.025 426.667 426.667 426.667c235.641 0 426.667-191.025 426.667-426.667v0c0-235.641-191.025-426.667-426.667-426.667v0zM512 853.333c-188.513 0-341.333-152.82-341.333-341.333s152.82-341.333 341.333-341.333c188.513 0 341.333 152.82 341.333 341.333v0c0 188.513-152.82 341.333-341.333 341.333v0zM725.333 341.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["golf-ball"]},"attrs":[],"properties":{"order":5065,"id":619,"name":"golf-ball","prevSize":32,"code":60234},"setIdx":0,"setId":0,"iconIdx":586},{"icon":{"paths":["M938.667 616.107c0.093-0.832 0.146-1.796 0.146-2.773s-0.053-1.941-0.156-2.891l0.010 0.117c-0.080-0.768-0.126-1.658-0.126-2.56s0.046-1.792 0.135-2.67l-0.009 0.11-2.133-5.12-256-439.040c-7.548-12.696-21.195-21.071-36.797-21.071-1.315 0-2.616 0.060-3.901 0.176l0.165-0.012h-256c-0.088-0.001-0.191-0.001-0.295-0.001-7.735 0-14.99 2.058-21.246 5.658l0.207-0.11-4.693 3.413c-1.417 1.070-2.671 2.189-3.829 3.401l-0.011 0.012c-1.624 1.489-3.034 3.171-4.207 5.019l-0.060 0.101s0 0-2.56 3.413v0l-256 440.747c-3.594 6.12-5.716 13.479-5.716 21.333s2.123 15.214 5.825 21.535l-0.109-0.201 128 216.747c1.402 2.424 2.955 4.52 4.715 6.424l-0.022-0.024v2.56c5.142 4.973 11.436 8.787 18.441 11.003l0.332 0.091c1.41 0.199 3.038 0.312 4.693 0.312s3.284-0.114 4.878-0.333l-0.185 0.021h515.84c15.533-0.003 29.126-8.305 36.586-20.714l0.107-0.193 128-219.307 2.133-5.12c-0.080-0.768-0.126-1.658-0.126-2.56s0.046-1.792 0.135-2.67l-0.009 0.11c0.109-0.833 0.171-1.796 0.171-2.773s-0.062-1.941-0.182-2.885l0.012 0.112c0.113-0.833 0.177-1.796 0.177-2.773s-0.064-1.94-0.189-2.884l0.012 0.111c1.427-1.154 2.686-2.413 3.803-3.793l0.037-0.047zM256 756.48l-76.373-132.267 204.373-356.693 37.12 64 42.667 70.827-165.12 276.48zM512 486.827l53.76 92.16h-108.373zM743.68 798.293h-415.147l78.507-133.973h414.72zM664.32 578.987l-206.080-353.28h157.44l206.080 353.28z"],"attrs":[],"grid":0,"tags":["google-drive-alt"]},"attrs":[],"properties":{"order":5066,"id":618,"name":"google-drive-alt","prevSize":32,"code":60235},"setIdx":0,"setId":0,"iconIdx":587},{"icon":{"paths":["M914.052 592.548l-259.82-450.13h-284.456l259.84 450.13zM345.138 185.103l-259.805 450.091 142.232 246.388 259.802-450.102zM419.068 635.194l-142.214 246.388h519.589l142.224-246.388z"],"attrs":[],"grid":0,"tags":["google-drive"]},"attrs":[],"properties":{"order":5067,"id":617,"name":"google-drive","prevSize":32,"code":60236},"setIdx":0,"setId":0,"iconIdx":588},{"icon":{"paths":["M383.646 328.128c-47.128 0-85.333 38.205-85.333 85.333s38.205 85.333 85.333 85.333v0l0.646-0.065v21.396c-0.024 11.772-9.561 21.309-21.331 21.333l-0.002 0c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0c58.888-0.056 106.61-47.779 106.667-106.661l0-0.005v-106.667c-0.29-2.424-0.745-4.599-1.367-6.703l0.072 0.284c-3.301-44.203-39.936-78.828-84.676-78.912l-0.008-0zM511.625 42.75c-230.627 0.005-417.585 186.966-417.585 417.593 0 215.6 163.388 393.039 373.098 415.251l1.82 0.156v63.002c-0 0.011-0 0.025-0 0.038 0 23.543 19.086 42.629 42.629 42.629 3.638 0 7.17-0.456 10.541-1.313l-0.295 0.064c218.536-55.411 381.461-240.070 403.74-466.043l0.176-2.212c2.232-16.174 3.506-34.864 3.506-53.852 0-229.376-185.946-415.321-415.321-415.321-0.812 0-1.624 0.002-2.435 0.007l0.125-0.001zM840.917 502.708c-16.722 173.174-129.377 316.404-283.569 376.984l-3.056 1.058v-45.5c0-0.007 0-0.016 0-0.025 0-23.55-19.091-42.642-42.642-42.642-0.009 0-0.017 0-0.026 0l0.001-0c-183.479-0.024-332.208-148.768-332.208-332.25 0-183.497 148.753-332.25 332.25-332.25s332.25 148.753 332.25 332.25v-0c-0.124 15.062-1.21 29.75-3.201 44.148l0.201-1.773zM639.646 328.128c-47.128 0-85.333 38.205-85.333 85.333s38.205 85.333 85.333 85.333v0l0.646-0.065v21.396c-0.024 11.772-9.561 21.309-21.331 21.333l-0.002 0c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0c58.888-0.056 106.61-47.779 106.667-106.661l0-0.005v-106.667c-0.29-2.424-0.745-4.599-1.367-6.703l0.072 0.284c-3.301-44.203-39.936-78.828-84.676-78.912l-0.008-0z"],"attrs":[],"grid":0,"tags":["google-hangouts-alt"]},"attrs":[],"properties":{"order":5068,"id":616,"name":"google-hangouts-alt","prevSize":32,"code":60237},"setIdx":0,"setId":0,"iconIdx":589},{"icon":{"paths":["M872.282 386.349c-13.138-72.277-46.057-135.307-92.886-185.105l0.175 0.188c-20.281-21.822-42.989-40.942-67.819-57.072l-1.391-0.847c-44.181-29.034-96.881-48.92-153.608-55.695l-1.72-0.167c-7.626-0.421-14.676-1.247-21.588-2.474l1.069 0.157h-48.404c-0.523 1.222-1.646 0.776-2.536 0.859-12.464 1.099-24.867 2.517-37.169 4.849-90.173 16.359-167.009 64.293-220.284 131.705l-0.578 0.758c-44.563 54.801-73.315 124.063-78.418 199.807l-0.059 1.089c-0.66 8.242-1.036 17.843-1.036 27.532 0 28.485 3.25 56.211 9.399 82.828l-0.48-2.469c6.547 28.99 15.709 54.477 27.544 78.405l-0.909-2.032c1.044 2.078 2.073 4.157 3.136 6.232 20.132 39.614 45.575 73.415 75.908 102.097l0.173 0.162c64.069 60.696 150.473 98.379 245.669 99.516l0.225 0.002c4.273 0.060 5.437 1.112 5.411 5.482-0.195 37.271-0.112 74.547-0.102 111.823 0.003 1.448 0.114 2.891 0.198 4.687 1.205-0.489 1.961-0.768 2.688-1.112 73.403-34.414 136.539-76.744 192.246-127.135l-0.66 0.588q17.090-15.559 32.807-32.532c4.492-4.836 8.948-9.757 13.451-14.588 6.955-7.438 12.974-15.747 19.531-23.578 7.573-9.034 14.37-18.635 21.077-28.3 13.698-19.298 26.745-41.312 37.964-64.379l1.227-2.795c5.63-11.898 10.989-23.89 15.734-36.164 0.172-0.202 0.328-0.427 0.461-0.667l0.011-0.021c11.907-30.215 20.909-65.38 25.411-101.939l0.213-2.125c1.539-12.427 2.537-24.932 3.167-37.43 0.282-5.237 0.443-11.367 0.443-17.534 0-22.134-2.070-43.784-6.028-64.767l0.339 2.159zM480.178 506.641c0 0.074 0 0.162 0 0.251 0 31.705-13.807 60.185-35.735 79.756l-0.105 0.092c-1.213 1.125-2.389 2.299-3.573 3.45-11.256 9.023-24.549 16.056-39.031 20.304l-0.81 0.204c-5.198 1.393-11.673 2.662-18.273 3.533l-0.824 0.089c-0.406 0.065-0.875 0.102-1.352 0.102-4.114 0-7.583-2.761-8.656-6.531l-0.015-0.063 0.049-41.307c0.242-4.053-1.391-8.396 1.857-11.971 1.512-1.741 3.527-3.010 5.817-3.582l0.078-0.017c7.923-1.476 14.99-3.971 21.499-7.386l-0.416 0.199c11.509-6.734 19.867-17.794 22.895-30.893l0.063-0.325c0.518-2.138 1.016-4.289 1.51-6.438q-43.555-0.080-87.099-0.143c-0.263 0.009-0.573 0.014-0.884 0.014-2.326 0-4.585-0.285-6.745-0.822l0.192 0.040c-7.406-2.019-12.807-8.563-13.077-16.411l-0.001-0.030q-0.082-65.851 0.065-131.712c-0.263-1.215-0.414-2.612-0.414-4.043 0-5.739 2.425-10.912 6.307-14.549l0.011-0.010c2.873-2.647 6.706-4.291 10.922-4.354l0.013-0q64.035-0.012 128.076-0.023c9.776 0.040 17.685 7.974 17.685 17.756 0 1.693-0.237 3.331-0.68 4.882l0.031-0.125c0.493 1.498 0.778 3.223 0.778 5.014 0 0.533-0.025 1.060-0.075 1.581l0.005-0.066c0.011 47.839 0.279 95.698-0.088 143.537zM706.444 506.854c-0.453 44.406-27.367 82.416-65.706 99.051l-0.706 0.273c-0.998 0.427-1.948 0.979-2.922 1.469l-1.628 0.456-0.922 0.524c-6.868 2.099-15.349 4.022-24.019 5.376l-1.103 0.142c-0.688 0.184-1.479 0.29-2.294 0.29-5.085 0-9.207-4.122-9.207-9.207 0-0.119 0.002-0.237 0.007-0.355l-0.001 0.017c-0.065-4.581-0.099-9.173-0.136-13.758l0.237-24.63c-0.037-1.815-0.102-3.614-0.096-5.419 0.008-6.307 2.432-8.969 10.273-10.758 10.451-1.833 19.632-6.318 27.11-12.732l-0.076 0.063c8.509-8.162 14.339-19.057 16.076-31.271l0.033-0.287-80.461-0.154c-2.917-0.005-5.836 0.037-8.758-0.013-0.178 0.006-0.386 0.010-0.596 0.010-9.873 0-17.877-8.004-17.877-17.877 0-0.316 0.008-0.63 0.024-0.942l-0.002 0.044q0.020-65.043 0.102-130.081l-0.073-1.253c-0.197-1.014-0.309-2.18-0.309-3.372 0-6.718 3.574-12.601 8.925-15.852l0.082-0.046c2.485-1.559 5.506-2.483 8.742-2.483 0.116 0 0.231 0.001 0.346 0.004l-0.017-0q63.613-0.035 127.226-0.037c9.774 0.046 17.68 7.979 17.68 17.76 0 1.693-0.237 3.33-0.679 4.881l0.031-0.125c0.49 1.502 0.773 3.23 0.773 5.025 0 0.528-0.024 1.050-0.072 1.565l0.005-0.066q-0 71.885-0.013 143.772z"],"attrs":[],"grid":0,"tags":["google-hangouts"]},"attrs":[],"properties":{"order":5069,"id":615,"name":"google-hangouts","prevSize":32,"code":60238},"setIdx":0,"setId":0,"iconIdx":590},{"icon":{"paths":["M892.538 454.528c-13.417-7.25-128.458-74-171.625-99.125l-0.125-0.085-522.875-301.873c-10.629-6.588-23.521-10.492-37.325-10.492-8.125 0-15.935 1.353-23.215 3.845l0.504-0.15c-1.117 0.401-2.167 0.805-3.252 1.302-2.941 0.963-5.381 1.963-7.736 3.111l0.358-0.158c-19.029 11.518-31.552 32.105-31.552 55.617 0 0.911 0.019 1.818 0.056 2.72l-0.004-0.129v810.042c-0.017 0.534-0.026 1.162-0.026 1.792 0 22.119 11.726 41.499 29.3 52.264l0.268 0.152c1.783 0.902 3.965 1.821 6.213 2.601l0.392 0.118c1.234 0.57 2.411 1.067 3.685 1.516 5.651 2.115 12.18 3.394 18.991 3.515l0.053 0.001c13.096-0.146 25.31-3.796 35.784-10.056l-0.326 0.18c16.583-9.625 530.708-306.458 530.708-306.458l171.542-99.042c21.103-10.741 35.419-32.101 35.916-56.851l0.001-0.066c-1.123-23.846-15.215-44.154-35.338-54.125l-0.371-0.166zM181.080 846.464v-671.451l338.778 335.32zM395.182 754.232l185.323-183.875 49.047 48.547c-53.958 31.158-145.123 83.799-234.37 135.33zM580.432 450.232l-187.642-185.728 236.956 136.802zM706.161 574.677l-65.083-64.417 65.184-64.675c30.732 17.847 78.627 45.625 111.612 64.61z"],"attrs":[],"grid":0,"tags":["google-play"]},"attrs":[],"properties":{"order":5070,"id":614,"name":"google-play","prevSize":32,"code":60239},"setIdx":0,"setId":0,"iconIdx":591},{"icon":{"paths":["M964.364 426.833c-3.725-20.076-21.099-35.078-41.978-35.084l-401.853-0c-0.003-0-0.007-0-0.011-0-23.558 0-42.656 19.098-42.656 42.656 0 0.004 0 0.008 0 0.012l-0-0.001v165.041c-0 0.003-0 0.007-0 0.011 0 23.558 19.098 42.656 42.656 42.656 0.004 0 0.008-0 0.012-0l169.062 0c-12.307 20.538-28.511 37.5-47.722 50.309l-0.569 0.357c-32.744 21.053-72.717 33.562-115.613 33.562-1.814 0-3.622-0.022-5.426-0.067l0.267 0.005c-92.5-1.092-170.567-61.659-197.819-145.19l-0.42-1.489-0.012-0.071c-7.104-20.145-11.209-43.374-11.209-67.563s4.105-47.418 11.655-69.030l-0.446 1.468 0.010-0.070c27.691-85.001 105.753-145.548 198.113-146.636l0.128-0.001c1.276-0.031 2.779-0.049 4.286-0.049 50.221 0 95.813 19.821 129.379 52.067l-0.062-0.060c7.65 7.32 18.045 11.825 29.492 11.825 11.783 0 22.45-4.774 30.175-12.492l122.375-122.375c7.727-7.717 12.507-18.383 12.507-30.165 0-12.311-5.219-23.404-13.565-31.186l-0.025-0.023c-80.852-75.947-189.988-122.606-310.023-122.606-1.595 0-3.189 0.008-4.781 0.025l0.243-0.002c-0.411-0.001-0.896-0.002-1.382-0.002-181.956 0-339.616 104.027-416.749 255.852l-1.225 2.658-0.063 0.076c-31.468 61.084-49.915 133.303-49.915 209.831 0 0.323 0 0.646 0.001 0.969l-0-0.050c0.113 76.842 18.543 149.352 51.156 213.434l-1.24-2.684 0.063 0.076c78.358 154.483 236.018 258.51 417.974 258.51 0.485 0 0.97-0.001 1.455-0.002l-0.075 0c3.385 0.092 7.369 0.144 11.366 0.144 115.45 0 220.724-43.564 300.282-115.151l-0.408 0.361 0.031-0.021 0.034-0.036 0.011-0.011c87.068-83.852 141.147-201.432 141.147-331.643 0-4.666-0.069-9.315-0.207-13.948l0.016 0.679c0-0.093 0-0.202 0-0.311 0-33.425-3.071-66.132-8.946-97.856l0.506 3.291zM520.533 128c1.071-0.011 2.338-0.018 3.605-0.018 82.22 0 158.184 26.786 219.641 72.109l-1.017-0.716-62.023 62.001c-43.825-30.677-98.245-49.020-156.949-49.020-1.145 0-2.289 0.007-3.43 0.021l0.174-0.002c-109.452 0.581-204.68 60.917-254.781 150.024l-0.763 1.475-70.58-54.716c68.451-109.442 188.315-181.161 324.929-181.161 0.42 0 0.84 0.001 1.26 0.002l-0.065-0zM156.989 635.875c-12.967-36.941-20.458-79.533-20.458-123.875s7.491-86.933 21.276-126.579l-0.818 2.704 76.042 58.959c-4.634 19.499-7.292 41.887-7.292 64.896s2.657 45.397 7.682 66.874l-0.39-1.978zM520.533 896c-0.353 0.001-0.77 0.002-1.188 0.002-136.619 0-256.487-71.722-324.005-179.568l-0.935-1.601 70.583-54.75c50.844 90.61 146.080 150.968 255.463 151.541l0.081 0c1.086 0.014 2.368 0.021 3.652 0.021 50.041 0 97.317-11.839 139.18-32.869l-1.787 0.813 72.177 56.035c-58.042 37.906-129.108 60.453-205.44 60.453-2.736 0-5.466-0.029-8.188-0.087l0.406 0.007zM798.971 778.208l-66.575-51.68c29.821-32.146 50.97-72.734 59.485-117.787l0.234-1.489c0.457-2.345 0.719-5.042 0.719-7.8 0-23.559-19.099-42.658-42.658-42.658-0.007 0-0.014 0-0.021 0l-186.955-0v-79.71h322.083c1.458 14.75 2.188 29.667 2.188 44.625 0.088 3.072 0.138 6.686 0.138 10.312 0 93.855-33.48 179.891-89.148 246.816l0.508-0.628z"],"attrs":[],"grid":0,"tags":["google"]},"attrs":[],"properties":{"order":5071,"id":613,"name":"google","prevSize":32,"code":60240},"setIdx":0,"setId":0,"iconIdx":592},{"icon":{"paths":["M916.907 434.773l-42.667-23.467-384-213.333h-4.693c-2.291-1.003-5-1.884-7.806-2.504l-0.3-0.056h-15.787c-3.277 0.679-6.132 1.562-8.866 2.681l0.333-0.121h-4.693l-384 213.333c-13.010 7.474-21.63 21.29-21.63 37.12s8.62 29.646 21.423 37.010l0.207 0.11 106.24 58.88v202.24c0 70.692 57.308 128 128 128v0h341.333c70.692 0 128-57.308 128-128v0-202.24l85.333-47.787v122.027c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-146.773c-0.028-15.854-8.699-29.676-21.55-37.010l-0.21-0.11zM682.667 746.667c0 23.564-19.103 42.667-42.667 42.667v0h-341.333c-23.564 0-42.667-19.103-42.667-42.667v0-154.88l192.427 106.667 6.4 2.56h3.84c1.602 0.213 3.453 0.335 5.333 0.335s3.732-0.122 5.548-0.357l-0.214 0.023c1.602 0.213 3.453 0.335 5.333 0.335s3.732-0.122 5.548-0.357l-0.214 0.023h3.84c2.419-0.52 4.561-1.406 6.484-2.609l-0.084 0.049 192.427-106.667zM469.333 612.693l-296.107-164.693 296.107-164.693 296.107 164.693z"],"attrs":[],"grid":0,"tags":["graduation-cap"]},"attrs":[],"properties":{"order":5072,"id":612,"name":"graduation-cap","prevSize":32,"code":60241},"setIdx":0,"setId":0,"iconIdx":593},{"icon":{"paths":["M256 554.667h-170.667c-23.564 0-42.667 19.103-42.667 42.667v0 341.333c0 23.564 19.103 42.667 42.667 42.667v0h170.667c23.564 0 42.667-19.103 42.667-42.667v0-341.333c0-23.564-19.103-42.667-42.667-42.667v0zM213.333 896h-85.333v-256h85.333zM938.667 384h-170.667c-23.564 0-42.667 19.103-42.667 42.667v0 512c0 23.564 19.103 42.667 42.667 42.667v0h170.667c23.564 0 42.667-19.103 42.667-42.667v0-512c0-23.564-19.103-42.667-42.667-42.667v0zM896 896h-85.333v-426.667h85.333zM597.333 42.667h-170.667c-23.564 0-42.667 19.103-42.667 42.667v0 853.333c0 23.564 19.103 42.667 42.667 42.667v0h170.667c23.564 0 42.667-19.103 42.667-42.667v0-853.333c0-23.564-19.103-42.667-42.667-42.667v0zM554.667 896h-85.333v-768h85.333z"],"attrs":[],"grid":0,"tags":["graph-bar"]},"attrs":[],"properties":{"order":5073,"id":611,"name":"graph-bar","prevSize":32,"code":60242},"setIdx":0,"setId":0,"iconIdx":594},{"icon":{"paths":["M896 85.333h-768c-23.564 0-42.667 19.103-42.667 42.667v0 768c0 23.564 19.103 42.667 42.667 42.667v0h768c23.564 0 42.667-19.103 42.667-42.667v0-768c0-23.564-19.103-42.667-42.667-42.667v0zM469.333 853.333h-298.667v-170.667h298.667zM469.333 597.333h-298.667v-170.667h298.667zM853.333 853.333h-298.667v-170.667h298.667zM853.333 597.333h-298.667v-170.667h298.667zM853.333 341.333h-682.667v-170.667h682.667z"],"attrs":[],"grid":0,"tags":["grid"]},"attrs":[],"properties":{"order":5074,"id":610,"name":"grid","prevSize":32,"code":60243},"setIdx":0,"setId":0,"iconIdx":595},{"icon":{"paths":["M896 85.333h-768c-23.564 0-42.667 19.103-42.667 42.667v0 768c0 23.564 19.103 42.667 42.667 42.667v0h768c23.564 0 42.667-19.103 42.667-42.667v0-768c0-23.564-19.103-42.667-42.667-42.667v0zM341.333 853.333h-170.667v-682.667h170.667zM597.333 853.333h-170.667v-682.667h170.667zM853.333 853.333h-170.667v-682.667h170.667z"],"attrs":[],"grid":0,"tags":["grids"]},"attrs":[],"properties":{"order":5075,"id":609,"name":"grids","prevSize":32,"code":60244},"setIdx":0,"setId":0,"iconIdx":596},{"icon":{"paths":["M392.96 449.707c7.712 7.668 18.343 12.407 30.080 12.407s22.368-4.74 30.082-12.409l-0.002 0.002c7.668-7.712 12.407-18.343 12.407-30.080s-4.74-22.368-12.409-30.082l0.002 0.002c-23.51-22.342-55.377-36.084-90.453-36.084s-66.943 13.743-90.51 36.137l0.056-0.053c-9.153 7.872-14.914 19.467-14.914 32.407 0 23.564 19.103 42.667 42.667 42.667 12.94 0 24.535-5.761 32.36-14.858l0.047-0.056c7.733-7.795 18.45-12.621 30.293-12.621s22.56 4.826 30.291 12.618l0.003 0.003zM512 85.333c-235.641 0-426.667 191.025-426.667 426.667s191.025 426.667 426.667 426.667c235.641 0 426.667-191.025 426.667-426.667v0c0-235.641-191.025-426.667-426.667-426.667v0zM512 853.333c-188.513 0-341.333-152.82-341.333-341.333s152.82-341.333 341.333-341.333c188.513 0 341.333 152.82 341.333 341.333v0c0 188.513-152.82 341.333-341.333 341.333v0zM640 384c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM640 554.667h-256c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0c0 70.692 57.308 128 128 128s128-57.308 128-128v0c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM512 682.667c-23.564 0-42.667-19.103-42.667-42.667v0h85.333c0 23.564-19.103 42.667-42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["grin-tongue-wink-alt"]},"attrs":[],"properties":{"order":5076,"id":608,"name":"grin-tongue-wink-alt","prevSize":32,"code":60245},"setIdx":0,"setId":0,"iconIdx":597},{"icon":{"paths":["M384 469.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667c-23.564 0-42.667 19.103-42.667 42.667v0c0 23.564 19.103 42.667 42.667 42.667v0zM512 85.333c-235.641 0-426.667 191.025-426.667 426.667s191.025 426.667 426.667 426.667c235.641 0 426.667-191.025 426.667-426.667v0c0-235.641-191.025-426.667-426.667-426.667v0zM512 853.333c-188.513 0-341.333-152.82-341.333-341.333s152.82-341.333 341.333-341.333c188.513 0 341.333 152.82 341.333 341.333v0c0 188.513-152.82 341.333-341.333 341.333v0zM640 554.667h-256c-23.564 0-42.667 19.103-42.667 42.667v0c0 94.257 76.41 170.667 170.667 170.667s170.667-76.41 170.667-170.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM512 682.667c-31.385-0.033-58.799-17.005-73.595-42.264l-0.218-0.403h147.627c-15.015 25.662-42.428 42.633-73.809 42.667l-0.005 0zM640 384c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["grin"]},"attrs":[],"properties":{"order":5077,"id":607,"name":"grin","prevSize":32,"code":60246},"setIdx":0,"setId":0,"iconIdx":598},{"icon":{"paths":["M512 85.333c-235.641 0-426.667 191.025-426.667 426.667s191.025 426.667 426.667 426.667c235.641 0 426.667-191.025 426.667-426.667v0c0-235.641-191.025-426.667-426.667-426.667v0zM512 853.333c-188.513 0-341.333-152.82-341.333-341.333s152.82-341.333 341.333-341.333c188.513 0 341.333 152.82 341.333 341.333v0c0 188.513-152.82 341.333-341.333 341.333v0zM751.787 389.547c-23.51-22.342-55.377-36.084-90.453-36.084s-66.943 13.743-90.51 36.137l0.056-0.053c-6.377 7.412-10.259 17.129-10.259 27.753 0 23.564 19.103 42.667 42.667 42.667 10.624 0 20.341-3.883 27.809-10.307l-0.056 0.047c7.733-7.795 18.45-12.621 30.293-12.621s22.56 4.826 30.291 12.618l0.003 0.003c7.712 7.668 18.343 12.407 30.080 12.407s22.368-4.74 30.082-12.409l-0.002 0.002c7.668-7.712 12.407-18.343 12.407-30.080s-4.74-22.368-12.409-30.082l0.002 0.002zM384 469.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667c-23.564 0-42.667 19.103-42.667 42.667v0c0 23.564 19.103 42.667 42.667 42.667v0zM640 554.667h-256c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0c0 70.692 57.308 128 128 128s128-57.308 128-128v0c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM512 682.667c-23.564 0-42.667-19.103-42.667-42.667v0h85.333c0 23.564-19.103 42.667-42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["grin-tongue-wink"]},"attrs":[],"properties":{"order":5078,"id":606,"name":"grin-tongue-wink","prevSize":32,"code":60247},"setIdx":0,"setId":0,"iconIdx":599},{"icon":{"paths":["M128 469.333h768c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-768c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM896 554.667h-768c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h768c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["grip-horizontal-line"]},"attrs":[],"properties":{"order":5079,"id":605,"name":"grip-horizontal-line","prevSize":32,"code":60248},"setIdx":0,"setId":0,"iconIdx":600},{"icon":{"paths":["M853.333 561.92v-7.253c0-0.093 0-0.202 0-0.312 0-95.876-39.529-182.52-103.179-244.523l-0.074-0.072c-37.071-36.101-82.595-63.712-133.31-79.574l-2.37-0.639h-2.133c-31.577-10.305-67.915-16.247-105.641-16.247-1.711 0-3.419 0.012-5.124 0.037l0.258-0.003c-184.613 10.444-330.446 162.381-331.093 348.523l-0 0.064c-50.24 18.049-85.524 65.277-85.524 120.747 0 70.692 57.308 128 128 128 0.067 0 0.134-0 0.201-0l-0.011 0h597.333c0.057 0 0.124 0 0.191 0 70.692 0 128-57.308 128-128 0-55.469-35.284-102.698-84.632-120.466l-0.892-0.281zM810.667 725.333h-597.333c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667v0h85.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-42.667c4.194-92.554 53.781-172.68 126.885-219.072l1.115-0.661v134.4c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-166.827c9.942-1.765 21.97-3.135 34.184-3.805l0.803-0.035h7.68c15.18 0.143 29.907 1.69 44.174 4.516l-1.508-0.249v166.4c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-135.68c19.053 11.134 35.544 23.413 50.533 37.29l-0.186-0.17c47.92 46.574 77.653 111.641 77.653 183.653 0 0.084-0 0.169-0 0.253l0-0.013h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h85.333c23.564 0 42.667 19.103 42.667 42.667s-19.103 42.667-42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["hard-hat"]},"attrs":[],"properties":{"order":5080,"id":604,"name":"hard-hat","prevSize":32,"code":60249},"setIdx":0,"setId":0,"iconIdx":601},{"icon":{"paths":["M938.667 634.027v-2.133c-0.57-8.888-2.091-17.184-4.47-25.108l0.203 0.788-69.973-415.147c-10.394-61.138-62.97-107.105-126.283-107.105-0.604 0-1.206 0.004-1.808 0.013l0.091-0.001h-450.987c-63.136 0.211-115.492 46.1-125.76 106.337l-0.107 0.756-69.12 414.293c-2.176 7.136-3.696 15.432-4.25 23.991l-0.017 0.329v2.133c-0.853 2.987-0.853 6.827-0.853 6.827v170.667c0 70.692 57.308 128 128 128v0h597.333c70.692 0 128-57.308 128-128v0-170.667c0 0 0-3.84 0-5.973zM243.627 206.080c3.585-20.242 21.043-35.418 42.046-35.418 0.218 0 0.436 0.002 0.653 0.005l-0.033-0h452.267c0.184-0.003 0.402-0.005 0.62-0.005 21.003 0 38.462 15.176 42.009 35.16l0.038 0.258 51.2 308.053c-6.542-1.356-14.060-2.132-21.759-2.133l-597.334-0c-7.433 0.061-14.649 0.834-21.629 2.256l0.722-0.123zM853.333 810.667c0 23.564-19.103 42.667-42.667 42.667v0h-597.333c-23.564 0-42.667-19.103-42.667-42.667v0-167.253l3.413-19.627c6.527-15.59 21.621-26.363 39.242-26.453l0.012-0h597.333c17.632 0.091 32.726 10.863 39.149 26.172l0.105 0.281 3.413 19.627zM725.333 682.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["hdd"]},"attrs":[],"properties":{"order":5081,"id":603,"name":"hdd","prevSize":32,"code":60250},"setIdx":0,"setId":0,"iconIdx":602},{"icon":{"paths":["M564.5 85.479c-3.6-0.148-7.825-0.232-12.070-0.232-85.975 0-163.888 34.52-220.634 90.456l0.037-0.036c-59.846 57.74-97.046 138.607-97.166 228.165l-0 0.023-78.667 127.896c-4.067 6.282-6.534 13.933-6.666 22.152l-0 0.035v1.729c0.122 5.355 1.213 10.421 3.102 15.077l-0.102-0.286 61.417 165.229c0.541 1.458 1.167 2.854 1.835 4.229 21.304 42.267 64.36 70.751 114.069 70.751 0.151 0 0.302-0 0.452-0.001l-0.023 0h32.583v85.333c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-85.333l85.333 0.021c4.911-0.010 9.623-0.848 14.007-2.383l-0.299 0.091 157.878-53.599c0.165 1.947 0.429 3.703 0.797 5.42l-0.050-0.28 42.667 147.895c5.316 17.954 21.651 30.833 40.998 30.854l0.002 0c4.221-0.016 8.292-0.631 12.14-1.765l-0.307 0.078c17.958-5.309 30.838-21.655 30.838-41.008 0-4.213-0.61-8.283-1.747-12.127l0.077 0.302-39.417-136.542 82.333-310.021c0.888-3.279 1.404-7.045 1.417-10.93l0-0.008v-9.708c0.012-1.052 0.019-2.295 0.019-3.539 0-174.973-136.82-317.989-309.309-327.9l-0.876-0.040zM490.667 725.333h-160.583c-0.045 0-0.099 0-0.152 0-15.9 0-29.757-8.742-37.028-21.683l-0.11-0.213-39.418-106.104h237.292zM726.315 657.435l-150.315 51.029v-123.040l185.378-61.795zM786.565 427.529c-0.094-0.001-0.206-0.001-0.317-0.001-3.7 0-7.288 0.484-10.702 1.392l0.29-0.066-249.44 83.146h-258.063l45.833-74.521c3.969-6.355 6.323-14.073 6.323-22.341 0-0.576-0.011-1.149-0.034-1.72l0.003 0.082c0-0.438-0.416-7.729-0.458-8.167-0.001-0.243-0.001-0.53-0.001-0.817 0-65.789 27.296-125.202 71.181-167.533l0.070-0.067c42.34-40.985 100.117-66.246 163.794-66.246 2.417 0 4.825 0.036 7.224 0.109l-0.352-0.008c127.3 8.185 227.451 113.439 227.451 242.085 0 1.442-0.013 2.882-0.038 4.318l0.003-0.216z"],"attrs":[],"grid":0,"tags":["head-side-mask"]},"attrs":[],"properties":{"order":5082,"id":602,"name":"head-side-mask","prevSize":32,"code":60251},"setIdx":0,"setId":0,"iconIdx":603},{"icon":{"paths":["M183.164 865.831c-7.722 7.721-12.497 18.388-12.497 30.171 0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667c0-11.782-4.776-22.449-12.497-30.171l-0-0c-7.721-7.722-18.387-12.498-30.169-12.498s-22.449 4.776-30.169 12.498l-0 0zM55.164 737.831c-7.722 7.721-12.497 18.388-12.497 30.171 0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667c0-11.782-4.776-22.449-12.497-30.171l-0-0c-7.721-7.722-18.387-12.498-30.169-12.498s-22.449 4.776-30.169 12.498l-0 0zM225.831 695.133c-7.722 7.721-12.497 18.388-12.497 30.171 0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667c0-11.782-4.776-22.449-12.497-30.171l-0-0c-7.721-7.722-18.387-12.498-30.169-12.498s-22.449 4.776-30.169 12.498l-0 0zM689.083 85.479c-2.758-0.091-6.001-0.142-9.255-0.142-166.52 0-301.514 134.98-301.536 301.495l-0 0.002v0.665l-75.542 160.355c-2.578 5.332-4.085 11.596-4.085 18.212 0 23.551 19.092 42.642 42.642 42.642 0.009 0 0.018-0 0.027-0l36.957 0v76.792c0.046 45.545 36.955 82.453 82.495 82.5l37.005 0v76.791c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-77.372c22.267-1.426 39.787-19.835 39.787-42.336 0-23.427-18.991-42.417-42.417-42.417-0.086 0-0.172 0-0.258 0.001l0.013-0-35.516 0.862c-1.136-0.313-2.582-0.614-4.055-0.835l-0.22-0.027c-2.091 0.277-3.933 0.661-5.725 1.167l0.283-0.068-71.391 1.734v-119.459c0-0.003 0-0.007 0-0.011 0-23.558-19.098-42.656-42.656-42.656-0.004 0-0.008 0-0.012 0l-12.333-0 51.417-109.187c2.575-5.302 4.081-11.533 4.081-18.116 0-0.641-0.014-1.278-0.042-1.912l0.003 0.090c0-0.458-0.416-6.937-0.458-7.416-0.001-0.219-0.001-0.479-0.001-0.738 0-60.601 25.141-115.33 65.562-154.325l0.064-0.061c39.033-37.758 92.285-61.028 150.971-61.028 2.208 0 4.408 0.033 6.6 0.098l-0.322-0.008c117.278 7.572 209.534 104.549 209.534 223.073 0 1.359-0.012 2.715-0.036 4.068l0.003-0.203-78.208 298.125c-0.895 3.276-1.409 7.038-1.409 10.919 0 4.214 0.606 8.287 1.735 12.135l-0.077-0.304 39.792 138.021c5.296 17.971 21.641 30.866 40.999 30.875l0.001 0c4.221-0.015 8.292-0.631 12.14-1.765l-0.307 0.078c17.956-5.302 30.837-21.642 30.837-40.991 0-4.211-0.61-8.28-1.747-12.123l0.077 0.302-36.541-126.688 76.625-288.604c0.888-3.279 1.404-7.045 1.416-10.93l0-0.008v-9.041c0.011-0.973 0.017-2.123 0.017-3.274 0-164.856-128.921-299.602-291.444-308.918l-0.824-0.038z"],"attrs":[],"grid":0,"tags":["head-side-cough"]},"attrs":[],"properties":{"order":5083,"id":601,"name":"head-side-cough","prevSize":32,"code":60252},"setIdx":0,"setId":0,"iconIdx":604},{"icon":{"paths":["M564.5 85.479c-3.57-0.145-7.761-0.228-11.97-0.228-86.006 0-163.95 34.517-220.735 90.454l0.039-0.038c-59.944 57.828-97.168 138.861-97.168 228.587 0 0.379 0.001 0.759 0.002 1.138l-0-0.059v1.292l-81.25 172.521c-2.578 5.332-4.084 11.596-4.084 18.211 0 23.551 19.092 42.643 42.643 42.643 0.009 0 0.018-0 0.026-0l42.665 0v85.333c0.056 47.106 38.227 85.278 85.328 85.333l42.672 0v85.333c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-85.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-128v-128c0-0.003 0-0.007 0-0.011 0-23.558-19.098-42.656-42.656-42.656-0.004 0-0.008 0-0.012 0l-18.083-0 57.166-121.354c2.572-5.299 4.076-11.527 4.076-18.106 0-0.6-0.013-1.197-0.037-1.791l0.003 0.085c0-0.438-0.416-7.729-0.458-8.167-0.001-0.242-0.001-0.529-0.001-0.816 0-65.789 27.297-125.203 71.182-167.534l0.070-0.067c42.369-40.985 100.171-66.244 163.872-66.244 2.389 0 4.77 0.036 7.142 0.106l-0.348-0.008c127.3 8.185 227.451 113.439 227.451 242.085 0 1.442-0.013 2.882-0.038 4.318l0.003-0.216-83.917 320.208c-0.895 3.279-1.409 7.044-1.409 10.929 0 4.218 0.606 8.294 1.735 12.147l-0.077-0.305 42.667 147.895c5.316 17.954 21.651 30.833 40.998 30.854l0.002 0c4.221-0.016 8.292-0.631 12.14-1.765l-0.307 0.078c17.958-5.309 30.838-21.655 30.838-41.008 0-4.213-0.61-8.283-1.747-12.127l0.077 0.302-39.417-136.542 82.333-310.021c0.888-3.279 1.404-7.045 1.417-10.93l0-0.008v-9.708c0.012-1.052 0.019-2.295 0.019-3.539 0-174.973-136.82-317.989-309.309-327.9l-0.876-0.040z"],"attrs":[],"grid":0,"tags":["head-side"]},"attrs":[],"properties":{"order":5084,"id":600,"name":"head-side","prevSize":32,"code":60253},"setIdx":0,"setId":0,"iconIdx":605},{"icon":{"paths":["M813.625 253.25c-76.923-77.635-183.572-125.702-301.449-125.702-35.181 0-69.361 4.282-102.049 12.352l2.914-0.609c-19.148 4.47-33.193 21.394-33.193 41.599 0 23.562 19.101 42.663 42.663 42.663 3.274 0 6.462-0.369 9.525-1.067l-0.286 0.055c23.856-5.939 51.244-9.347 79.427-9.347 188.727 0 341.766 152.799 342.156 341.434l0 0.037h-14.5c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h14.5v14.5c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-99.833c0.002-0.481 0.003-1.050 0.003-1.62 0-117.236-47.817-223.304-125.012-299.764l-0.033-0.033zM158.165 97.835c-7.692-7.558-18.247-12.223-29.892-12.223-23.562 0-42.662 19.1-42.662 42.662 0 11.645 4.666 22.2 12.229 29.898l-0.006-0.006 103.907 103.91c-72.081 76.002-116.409 178.945-116.409 292.241 0 0.123 0 0.246 0 0.369l-0-0.019v298.667c0 23.564 19.103 42.667 42.667 42.667v0h128c70.66-0.080 127.92-57.339 128-127.992l0-0.008v-85.333c-0.080-70.66-57.339-127.92-127.992-128l-85.341-0c-0-0.061-0-0.133-0-0.205 0-89.77 34.813-171.408 91.676-232.151l-0.176 0.189 377.833 377.833v67.667c0.080 70.66 57.339 127.92 127.992 128l67.675 0 30.165 30.165c7.701 7.608 18.29 12.307 29.977 12.307 23.562 0 42.662-19.1 42.662-42.662 0-11.686-4.699-22.275-12.31-29.98l0.004 0.004zM256 640c23.551 0.032 42.635 19.115 42.667 42.664l0 0.003v85.333c-0.032 23.551-19.115 42.635-42.664 42.667l-0.003 0h-85.333v-170.667z"],"attrs":[],"grid":0,"tags":["headphone-slash"]},"attrs":[],"properties":{"order":5085,"id":599,"name":"headphone-slash","prevSize":32,"code":60254},"setIdx":0,"setId":0,"iconIdx":606},{"icon":{"paths":["M853.333 562.347v-93.013c0-188.513-152.82-341.333-341.333-341.333s-341.333 152.82-341.333 341.333v0 93.013c-50.028 18.062-85.173 65.066-85.333 120.3l-0 0.020v85.333c0 70.692 57.308 128 128 128v0h128c23.564 0 42.667-19.103 42.667-42.667v0-256c0-23.564-19.103-42.667-42.667-42.667v0h-85.333v-85.333c0-141.385 114.615-256 256-256s256 114.615 256 256v0 85.333h-85.333c-23.564 0-42.667 19.103-42.667 42.667v0 256c0 23.564 19.103 42.667 42.667 42.667v0h128c70.692 0 128-57.308 128-128v0-85.333c-0.16-55.254-35.305-102.258-84.442-120.038l-0.891-0.282zM298.667 640v170.667h-85.333c-23.564 0-42.667-19.103-42.667-42.667v0-85.333c0-23.564 19.103-42.667 42.667-42.667v0zM853.333 768c0 23.564-19.103 42.667-42.667 42.667v0h-85.333v-170.667h85.333c23.564 0 42.667 19.103 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["headphones-alt"]},"attrs":[],"properties":{"order":5086,"id":598,"name":"headphones-alt","prevSize":32,"code":60255},"setIdx":0,"setId":0,"iconIdx":607},{"icon":{"paths":["M860.16 196.693c-48.414-48.427-115.305-78.381-189.192-78.381-59.85 0-115.11 19.654-159.677 52.86l0.709-0.505c-43.99-33.013-99.506-52.866-159.658-52.866-147.747 0-267.52 119.773-267.52 267.52 0 74.203 30.211 141.35 79.003 189.812l0.015 0.015 317.867 317.867c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 317.867-317.867c48.448-48.418 78.416-115.323 78.416-189.227s-29.968-140.809-78.415-189.225l-0.001-0.001zM800 514.987l-288 287.573-288-287.573c-32.887-33.020-53.218-78.565-53.218-128.859 0-100.364 80.965-181.818 181.143-182.608l0.075-0c50.023 0.127 95.265 20.488 127.995 53.328l0.005 0.005c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c31.772-27.648 73.573-44.502 119.31-44.502 100.619 0 182.187 81.568 182.187 182.187 0 46.269-17.248 88.51-45.665 120.643l0.168-0.194z"],"attrs":[],"grid":0,"tags":["heart-alt"]},"attrs":[],"properties":{"order":5087,"id":597,"name":"heart-alt","prevSize":32,"code":60256},"setIdx":0,"setId":0,"iconIdx":608},{"icon":{"paths":["M512 128c-235.641 0-426.667 191.025-426.667 426.667v0 298.667c0 23.564 19.103 42.667 42.667 42.667v0h128c70.692 0 128-57.308 128-128v0-85.333c0-70.692-57.308-128-128-128v0h-85.333c0-188.513 152.82-341.333 341.333-341.333s341.333 152.82 341.333 341.333v0h-85.333c-70.692 0-128 57.308-128 128v0 85.333c0 70.692 57.308 128 128 128v0h128c23.564 0 42.667-19.103 42.667-42.667v0-298.667c0-235.641-191.025-426.667-426.667-426.667v0zM256 640c23.564 0 42.667 19.103 42.667 42.667v0 85.333c0 23.564-19.103 42.667-42.667 42.667v0h-85.333v-170.667zM853.333 810.667h-85.333c-23.564 0-42.667-19.103-42.667-42.667v0-85.333c0-23.564 19.103-42.667 42.667-42.667v0h85.333z"],"attrs":[],"grid":0,"tags":["headphones"]},"attrs":[],"properties":{"order":5088,"id":596,"name":"headphones","prevSize":32,"code":60257},"setIdx":0,"setId":0,"iconIdx":609},{"icon":{"paths":["M860.16 196.693c-48.414-48.427-115.305-78.381-189.192-78.381-59.85 0-115.11 19.654-159.677 52.86l0.709-0.505c-43.99-33.013-99.506-52.866-159.658-52.866-147.747 0-267.52 119.773-267.52 267.52 0 74.203 30.211 141.35 79.003 189.812l0.015 0.015 317.867 318.293c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 317.867-318.293c48.448-48.418 78.416-115.323 78.416-189.227s-29.968-140.809-78.415-189.225l-0.001-0.001zM800 514.56l-288 288-288-288c-33.803-33.036-54.764-79.087-54.764-130.034 0-100.383 81.377-181.76 181.76-181.76 41.265 0 79.318 13.751 109.827 36.921l-0.45-0.327-72.96 170.667c-2.43 5.198-3.848 11.287-3.848 17.707s1.418 12.508 3.957 17.97l-0.11-0.263c5.522 11.136 15.446 19.385 27.436 22.547l0.297 0.067 118.187 29.867-59.733 123.307c-2.756 5.489-4.369 11.96-4.369 18.809 0 16.77 9.675 31.28 23.747 38.253l0.249 0.112c5.434 2.692 11.832 4.267 18.599 4.267 0.061 0 0.123-0 0.184-0l-0.009 0c0.025 0 0.055 0 0.085 0 16.73 0 31.21-9.628 38.203-23.646l0.112-0.247 85.333-170.667c2.616-5.368 4.146-11.679 4.146-18.347s-1.53-12.979-4.257-18.6l0.111 0.254c-5.745-11.475-15.945-20.001-28.272-23.393l-0.315-0.074-120.747-30.293 61.867-144.64c32.659-31.572 77.204-51.028 126.293-51.028 100.406 0 181.801 81.395 181.801 181.801 0 51.317-21.262 97.668-55.457 130.724l-0.051 0.049z"],"attrs":[],"grid":0,"tags":["heart-break"]},"attrs":[],"properties":{"order":5089,"id":595,"name":"heart-break","prevSize":32,"code":60258},"setIdx":0,"setId":0,"iconIdx":610},{"icon":{"paths":["M597.333 469.333h-42.667v-42.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 42.667h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h42.667v42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM860.16 213.333c-48.466-47.98-115.162-77.623-188.782-77.623-59.999 0-115.399 19.689-160.092 52.958l0.714-0.508c-43.99-33.013-99.506-52.866-159.658-52.866-147.747 0-267.52 119.773-267.52 267.52 0 74.203 30.211 141.35 79.003 189.812l0.015 0.015 256 258.133c23.158 23.13 55.135 37.434 90.453 37.434s67.296-14.304 90.455-37.435l-0.001 0.001 256-258.133c49.73-48.619 80.566-116.384 80.566-191.351 0-73.274-29.459-139.667-77.179-187.983l0.027 0.027zM800 531.627l-256 256c-7.733 7.795-18.45 12.621-30.293 12.621s-22.56-4.826-30.291-12.618l-0.003-0.003-256-256c-32.279-32.975-52.198-78.162-52.198-128s19.919-95.025 52.23-128.032l-0.032 0.032c32.885-32.479 78.1-52.541 128-52.541s95.115 20.062 128.018 52.559l-0.018-0.018c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c32.885-32.479 78.1-52.541 128-52.541s95.115 20.062 128.018 52.559l-0.018-0.018c32.53 33.021 52.617 78.378 52.617 128.427s-20.087 95.406-52.639 128.449l0.022-0.022z"],"attrs":[],"grid":0,"tags":["heart-medical"]},"attrs":[],"properties":{"order":5090,"id":594,"name":"heart-medical","prevSize":32,"code":60259},"setIdx":0,"setId":0,"iconIdx":611},{"icon":{"paths":["M896 469.333h-168.107c-1.346-0.193-2.9-0.303-4.48-0.303s-3.134 0.11-4.655 0.323l0.175-0.020h-7.253c-2.451 1.408-4.542 2.818-6.525 4.36l0.125-0.094c-2.582 1.714-4.808 3.398-6.927 5.203l0.1-0.083c-1.338 1.628-2.607 3.44-3.731 5.347l-0.109 0.199c-1.815 2.466-3.519 5.262-4.973 8.204l-0.147 0.329-68.267 188.16-177.92-482.133c-6.127-16.537-21.765-28.11-40.107-28.11s-33.979 11.573-40.011 27.815l-0.096 0.295-98.56 270.507h-136.533c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h183.467c2.602-1.265 4.842-2.686 6.902-4.324l-0.075 0.058c2.582-1.714 4.808-3.398 6.927-5.203l-0.1 0.083 3.84-5.547c1.926-2.473 3.636-5.278 5.011-8.268l0.109-0.265 69.12-193.28 177.493 487.253c6.111 16.558 21.754 28.152 40.106 28.16l0.001 0c18.353-0.008 33.995-11.602 40.011-27.865l0.096-0.295 98.133-270.507h136.96c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["heart-rate"]},"attrs":[],"properties":{"order":5091,"id":593,"name":"heart-rate","prevSize":32,"code":60260},"setIdx":0,"setId":0,"iconIdx":612},{"icon":{"paths":["M860.16 213.333c-48.466-47.98-115.162-77.623-188.782-77.623-59.999 0-115.399 19.689-160.092 52.958l0.714-0.508c-43.99-33.013-99.506-52.866-159.658-52.866-147.747 0-267.52 119.773-267.52 267.52 0 74.203 30.211 141.35 79.003 189.812l0.015 0.015 256 258.133c23.158 23.13 55.135 37.434 90.453 37.434s67.296-14.304 90.455-37.435l-0.001 0.001 256-258.133c49.73-48.619 80.566-116.384 80.566-191.351 0-73.274-29.459-139.667-77.179-187.983l0.027 0.027zM800 531.627l-256 256c-7.733 7.795-18.45 12.621-30.293 12.621s-22.56-4.826-30.291-12.618l-0.003-0.003-256-256c-32.279-32.975-52.198-78.162-52.198-128s19.919-95.025 52.23-128.032l-0.032 0.032c32.885-32.479 78.1-52.541 128-52.541s95.115 20.062 128.018 52.559l-0.018-0.018c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c30.82-24.692 70.386-39.627 113.44-39.627 100.619 0 182.187 81.568 182.187 182.187 0 43.054-14.935 82.621-39.906 113.801l0.279-0.361z"],"attrs":[],"grid":0,"tags":["heart-sign"]},"attrs":[],"properties":{"order":5092,"id":592,"name":"heart-sign","prevSize":32,"code":60261},"setIdx":0,"setId":0,"iconIdx":613},{"icon":{"paths":["M860.16 213.333c-48.591-48.713-115.783-78.852-190.015-78.852-59.461 0-114.405 19.337-158.887 52.067l0.743-0.521c-43.99-33.013-99.506-52.866-159.658-52.866-147.747 0-267.52 119.773-267.52 267.52 0 74.203 30.211 141.35 79.003 189.812l0.015 0.015 264.96 265.387c21.396 21.066 50.779 34.074 83.2 34.074s61.804-13.008 83.215-34.089l-0.015 0.015 264.96-265.387c48.067-48.353 77.778-115 77.778-188.587s-29.711-140.234-77.791-188.6l0.013 0.013zM800 531.627l-264.96 264.96c-5.879 5.935-14.030 9.609-23.040 9.609s-17.161-3.674-23.037-9.606l-0.003-0.003-264.96-266.24c-32.279-32.975-52.198-78.162-52.198-128s19.919-95.025 52.23-128.032l-0.032 0.032c32.885-32.479 78.1-52.541 128-52.541s95.115 20.062 128.018 52.559l-0.018-0.018c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c32.885-32.479 78.1-52.541 128-52.541s95.115 20.062 128.018 52.559l-0.018-0.018c33.312 33.155 53.927 79.042 53.927 129.744 0 48.986-19.243 93.478-50.582 126.328l0.068-0.072z"],"attrs":[],"grid":0,"tags":["heart"]},"attrs":[],"properties":{"order":5093,"id":591,"name":"heart","prevSize":32,"code":60262},"setIdx":0,"setId":0,"iconIdx":614},{"icon":{"paths":["M896 444.16h-106.667c-11.868 0.051-22.584 4.939-30.287 12.793l-0.007 0.007-52.907 55.040-119.467-136.107c-7.806-8.322-18.871-13.506-31.147-13.506s-23.341 5.184-31.125 13.483l-0.021 0.023-72.533 72.533h-67.84c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h85.333c0.073 0 0.16 0.001 0.247 0.001 11.721 0 22.338-4.726 30.049-12.377l-0.003 0.003 55.040-57.173 119.467 136.107c7.568 8.595 18.463 14.106 30.651 14.505l0.069 0.002c0.073 0 0.16 0.001 0.247 0.001 11.721 0 22.338-4.726 30.049-12.377l-0.003 0.003 72.533-72.96h88.32c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM580.693 670.293l-81.067 81.067c-7.733 7.795-18.45 12.621-30.293 12.621s-22.56-4.826-30.291-12.618l-0.003-0.003-222.293-222.293c-28.511-28.494-46.146-67.868-46.146-111.36s17.635-82.866 46.146-111.359l0.001-0.001c28.473-28.384 67.76-45.933 111.147-45.933s82.674 17.55 111.151 45.937l-0.004-0.004c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c28.87-27.497 68.033-44.414 111.147-44.414s82.277 16.918 111.213 44.476l-0.066-0.062c9.267 9.385 17.45 19.876 24.325 31.248l0.422 0.752c7.848 10.702 20.375 17.572 34.506 17.572 23.564 0 42.667-19.103 42.667-42.667 0-6.368-1.395-12.409-3.896-17.837l0.109 0.265c-11.094-18.255-23.506-34.060-37.563-48.23l0.016 0.017c-43.953-44.455-104.943-71.985-172.363-71.985-52.829 0-101.709 16.903-141.528 45.597l0.717-0.492c-39.27-28.572-88.461-45.71-141.654-45.71-133.844 0-242.347 108.502-242.347 242.347 0 0.17 0 0.34 0.001 0.509l-0-0.026c-0 0.029-0 0.063-0 0.097 0 66.722 27.251 127.078 71.23 170.547l0.023 0.023 222.293 222.293c23.158 23.13 55.135 37.434 90.453 37.434s67.296-14.304 90.455-37.435l-0.001 0.001 80.213-80.213c7.668-7.712 12.407-18.343 12.407-30.080s-4.74-22.368-12.409-30.082l0.002 0.002c-7.666-7.418-18.126-11.989-29.653-11.989s-21.987 4.571-29.665 12l0.012-0.011z"],"attrs":[],"grid":0,"tags":["heartbeat"]},"attrs":[],"properties":{"order":5094,"id":590,"name":"heartbeat","prevSize":32,"code":60263},"setIdx":0,"setId":0,"iconIdx":615},{"icon":{"paths":["M470.272 85.333h-85.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0 85.333h-50.53c4.836-12.664 7.706-27.307 7.863-42.6l0.001-0.067c0-0.002 0-0.004 0-0.007 0-70.692-57.308-128-128-128-47.131 0-88.313 25.473-110.528 63.403l-0.327 0.604c-3.6 6.124-5.726 13.49-5.726 21.352 0 23.568 19.106 42.673 42.673 42.673 15.721 0 29.456-8.501 36.86-21.157l0.109-0.202c7.523-12.83 21.238-21.313 36.936-21.333l0.003-0c23.564 0 42.667 19.103 42.667 42.667s-19.103 42.667-42.667 42.667v0c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0c23.564 0 42.667 19.103 42.667 42.667s-19.103 42.667-42.667 42.667v0c-15.7-0.021-29.414-8.504-36.828-21.132l-0.109-0.201c-7.513-12.858-21.248-21.359-36.969-21.359-23.568 0-42.673 19.106-42.673 42.673 0 7.862 2.126 15.228 5.835 21.553l-0.109-0.201c22.543 38.533 63.724 64.005 110.854 64.005 70.692 0 128-57.308 128-128 0-0.002-0-0.003-0-0.005l0 0c-0.156-15.36-3.026-30.002-8.151-43.537l0.289 0.87h50.528v128c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-298.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM598.272 298.667h42.667c23.551 0.032 42.635 19.115 42.667 42.664l0 0.003v42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667c-0.080-70.66-57.339-127.92-127.992-128l-42.674-0c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM427.605 682.667h-42.667c-23.551-0.032-42.635-19.115-42.667-42.664l-0-0.003v-42.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 42.667c0.080 70.66 57.339 127.92 127.992 128l42.674 0c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM896.939 640c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-128v-21.333c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 21.333h-128c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h221.196c-10.374 41.33-28.45 77.441-52.76 108.428l0.471-0.623c-9.501-12.202-18.405-25.926-26.098-40.392l-0.746-1.537c-7.227-13.881-21.505-23.197-37.958-23.197-23.558 0-42.655 19.097-42.655 42.655 0 7.104 1.737 13.803 4.809 19.694l-0.112-0.236c12.446 23.83 26.032 44.35 41.457 63.314l-0.535-0.679c-29.338 21.519-64.009 37.762-101.557 46.514l-1.908 0.375c-19.291 4.365-33.479 21.36-33.479 41.668 0 23.566 19.104 42.67 42.67 42.67 3.194 0 6.306-0.351 9.3-1.016l-0.284 0.053c56.353-12.724 105.746-36.786 147.784-69.793l-0.797 0.603c41.561 32.41 91.292 56.469 145.504 68.697l2.488 0.472c2.761 0.636 5.932 1.001 9.187 1.001 23.565 0 42.667-19.103 42.667-42.667 0-20.309-14.189-37.304-33.194-41.612l-0.286-0.054c-39.75-9.016-74.726-25.136-105.218-47.093l0.851 0.583c38.008-46.492 65.223-103.267 76.965-165.508l0.364-2.317z"],"attrs":[],"grid":0,"tags":["hindi-to-chinese"]},"attrs":[],"properties":{"order":5095,"id":589,"name":"hindi-to-chinese","prevSize":32,"code":60264},"setIdx":0,"setId":0,"iconIdx":616},{"icon":{"paths":["M746.667 593.067c0-8.533-8.533-17.067-17.067-17.067-4.267 0-8.533 0-12.8 4.267-55.467 46.933-128 72.533-204.8 72.533v0c-72.533 0-145.067-25.6-204.8-72.533-4.267-4.267-8.533-4.267-12.8-4.267-8.533 0-17.067 8.533-17.067 17.067 0 0 0 0 0 0 0 8.533 4.267 12.8 8.533 21.333 55.467 68.267 140.8 106.667 226.133 102.4v0c85.333 4.267 166.4-34.133 221.867-102.4 8.533-8.533 8.533-12.8 12.8-21.333zM861.867 887.467c-34.133-17.067-59.733-51.2-72.533-85.333-4.267-8.533 0-12.8 4.267-17.067 89.6-64 140.8-166.4 140.8-273.067 0-204.8-192-366.933-426.667-366.933s-426.667 166.4-426.667 366.933c0 204.8 192 366.933 426.667 366.933 29.867 0 59.733-4.267 89.6-8.533 4.267 0 12.8 0 17.067 4.267 68.267 38.4 145.067 64 221.867 64 17.067 4.267 29.867-8.533 34.133-25.6 0 0 0-4.267 0-4.267 4.267-8.533-0-17.067-8.533-21.333zM746.667 853.333v0c0 0 0 4.267 0 4.267 0 4.267-4.267 4.267-4.267 4.267-46.933-12.8-85.333-34.133-123.733-64-4.267-4.267-12.8-4.267-21.333-4.267-29.867 8.533-59.733 8.533-89.6 8.533-196.267 0-354.133-132.267-354.133-294.4s157.867-294.4 354.133-294.4c196.267 0 354.133 132.267 354.133 294.4-4.267 98.133-59.733 187.733-145.067 234.667-8.533 4.267-12.8 12.8-12.8 17.067 12.8 38.4 25.6 68.267 42.667 93.867z"],"attrs":[],"grid":0,"tags":["hipchat"]},"attrs":[],"properties":{"order":5096,"id":588,"name":"hipchat","prevSize":32,"code":60265},"setIdx":0,"setId":0,"iconIdx":617},{"icon":{"paths":["M488.107 85.333c-113.97 0.335-217.373 45.304-293.704 118.336l0.158-0.15v-75.52c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 192c0 23.564 19.103 42.667 42.667 42.667v0h192c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-102.4c62.347-65.752 150.33-106.664 247.869-106.664 188.513 0 341.333 152.82 341.333 341.333s-152.82 341.333-341.333 341.333c-0.442 0-0.883-0.001-1.324-0.003l0.069 0c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0c235.641 0 426.667-191.025 426.667-426.667s-191.025-426.667-426.667-426.667v0zM488.107 341.333c-23.564 0-42.667 19.103-42.667 42.667v0 128c0 23.564 19.103 42.667 42.667 42.667v0h85.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-42.667v-85.333c0-23.564-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["history-alt"]},"attrs":[],"properties":{"order":5097,"id":587,"name":"history-alt","prevSize":32,"code":60266},"setIdx":0,"setId":0,"iconIdx":618},{"icon":{"paths":["M512 85.333c-113.97 0.335-217.373 45.304-293.704 118.336l0.158-0.15v-75.52c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 192c0 23.564 19.103 42.667 42.667 42.667v0h192c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-102.4c62.247-64.967 149.714-105.343 246.611-105.343 188.513 0 341.333 152.82 341.333 341.333s-152.82 341.333-341.333 341.333c-188.513 0-341.333-152.82-341.333-341.333 0-0.466 0.001-0.931 0.003-1.396l-0 0.072c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0c0 235.641 191.025 426.667 426.667 426.667s426.667-191.025 426.667-426.667c0-235.641-191.025-426.667-426.667-426.667v0zM512 341.333c-23.564 0-42.667 19.103-42.667 42.667v0 128c0 23.564 19.103 42.667 42.667 42.667v0h85.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-42.667v-85.333c0-23.564-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["history"]},"attrs":[],"properties":{"order":5098,"id":586,"name":"history","prevSize":32,"code":60267},"setIdx":0,"setId":0,"iconIdx":619},{"icon":{"paths":["M853.333 341.333v0l-256-224.427c-22.54-20.227-52.493-32.594-85.333-32.594s-62.793 12.368-85.453 32.7l0.119-0.105-256 224.427c-26.239 23.54-42.671 57.556-42.671 95.409 0 0.358 0.001 0.715 0.004 1.072l-0-0.055v372.907c0 70.692 57.308 128 128 128v0h512c70.692 0 128-57.308 128-128v0-373.333c0.001-0.176 0.001-0.385 0.001-0.593 0-37.852-16.43-71.867-42.548-95.301l-0.12-0.105zM597.333 853.333h-170.667v-213.333c0-23.564 19.103-42.667 42.667-42.667v0h85.333c23.564 0 42.667 19.103 42.667 42.667v0zM810.667 810.667c0 23.564-19.103 42.667-42.667 42.667v0h-85.333v-213.333c0-70.692-57.308-128-128-128v0h-85.333c-70.692 0-128 57.308-128 128v0 213.333h-85.333c-23.564 0-42.667-19.103-42.667-42.667v0-373.333c0.017-12.731 5.606-24.153 14.46-31.96l0.047-0.040 256-224c7.473-6.59 17.347-10.613 28.16-10.613s20.687 4.023 28.207 10.653l-0.047-0.040 256 224c8.9 7.847 14.49 19.269 14.507 31.997l0 0.003z"],"attrs":[],"grid":0,"tags":["home-alt"]},"attrs":[],"properties":{"order":5099,"id":585,"name":"home-alt","prevSize":32,"code":60268},"setIdx":0,"setId":0,"iconIdx":620},{"icon":{"paths":["M924.16 437.333l-384-341.333c-7.473-6.59-17.347-10.613-28.16-10.613s-20.687 4.023-28.207 10.653l0.047-0.040-384 341.333c-8.849 7.854-14.397 19.258-14.397 31.957 0 5.541 1.056 10.834 2.978 15.691l-0.101-0.289c6.326 16.072 21.691 27.252 39.673 27.307l0.007 0h42.667v384c0 23.564 19.103 42.667 42.667 42.667v0h597.333c23.564 0 42.667-19.103 42.667-42.667v0-384h42.667c17.989-0.055 33.354-11.234 39.579-27.017l0.101-0.289c1.821-4.568 2.877-9.862 2.877-15.403 0-12.7-5.548-24.103-14.353-31.919l-0.044-0.038zM554.667 853.333h-85.333v-128c0-23.564 19.103-42.667 42.667-42.667s42.667 19.103 42.667 42.667v0zM768 853.333h-128v-128c0-70.692-57.308-128-128-128s-128 57.308-128 128v0 128h-128v-341.333h512zM240.213 426.667l271.787-241.493 271.787 241.493z"],"attrs":[],"grid":0,"tags":["home"]},"attrs":[],"properties":{"order":5100,"id":584,"name":"home","prevSize":32,"code":60269},"setIdx":0,"setId":0,"iconIdx":621},{"icon":{"paths":["M896 426.667h-85.333v-128c0-23.564-19.103-42.667-42.667-42.667v0h-213.333v-128c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 128h-213.333c-23.564 0-42.667 19.103-42.667 42.667v0 128h-85.333c-23.564 0-42.667 19.103-42.667 42.667v0 256c0 23.564 19.103 42.667 42.667 42.667v0h341.333v128c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-128h341.333c23.564 0 42.667-19.103 42.667-42.667v0-256c0-23.564-19.103-42.667-42.667-42.667v0zM298.667 341.333h426.667v85.333h-426.667zM853.333 682.667h-682.667v-170.667h682.667z"],"attrs":[],"grid":0,"tags":["horizontal-align-center"]},"attrs":[],"properties":{"order":5101,"id":583,"name":"horizontal-align-center","prevSize":32,"code":60270},"setIdx":0,"setId":0,"iconIdx":622},{"icon":{"paths":["M896 426.667h-213.333v-128c0-23.564-19.103-42.667-42.667-42.667v0h-469.333v-128c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 768c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-128h725.333c23.564 0 42.667-19.103 42.667-42.667v0-256c0-23.564-19.103-42.667-42.667-42.667v0zM170.667 341.333h426.667v85.333h-426.667zM853.333 682.667h-682.667v-170.667h682.667z"],"attrs":[],"grid":0,"tags":["horizontal-align-left"]},"attrs":[],"properties":{"order":5102,"id":582,"name":"horizontal-align-left","prevSize":32,"code":60271},"setIdx":0,"setId":0,"iconIdx":623},{"icon":{"paths":["M896 85.333c-23.564 0-42.667 19.103-42.667 42.667v0 128h-469.333c-23.564 0-42.667 19.103-42.667 42.667v0 128h-213.333c-23.564 0-42.667 19.103-42.667 42.667v0 256c0 23.564 19.103 42.667 42.667 42.667v0h725.333v128c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-768c0-23.564-19.103-42.667-42.667-42.667v0zM853.333 682.667h-682.667v-170.667h682.667zM853.333 426.667h-426.667v-85.333h426.667z"],"attrs":[],"grid":0,"tags":["horizontal-align-right"]},"attrs":[],"properties":{"order":5103,"id":581,"name":"horizontal-align-right","prevSize":32,"code":60272},"setIdx":0,"setId":0,"iconIdx":624},{"icon":{"paths":["M810.667 213.333h-42.667v-85.333c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 85.333h-42.667c-23.564 0-42.667 19.103-42.667 42.667v0 512c0 23.564 19.103 42.667 42.667 42.667v0h42.667v85.333c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-85.333h42.667c23.564 0 42.667-19.103 42.667-42.667v0-512c0-23.564-19.103-42.667-42.667-42.667v0zM768 725.333h-85.333v-426.667h85.333zM469.333 170.667h-85.333v-42.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 42.667h-85.333c-23.564 0-42.667 19.103-42.667 42.667v0 597.333c0 23.564 19.103 42.667 42.667 42.667v0h85.333v42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667h85.333c23.564 0 42.667-19.103 42.667-42.667v0-597.333c0-23.564-19.103-42.667-42.667-42.667v0zM426.667 768h-170.667v-512h170.667z"],"attrs":[],"grid":0,"tags":["horizontal-distribution-center"]},"attrs":[],"properties":{"order":5104,"id":580,"name":"horizontal-distribution-center","prevSize":32,"code":60273},"setIdx":0,"setId":0,"iconIdx":625},{"icon":{"paths":["M810.667 85.333c-23.564 0-42.667 19.103-42.667 42.667v0 42.667h-213.333c-23.564 0-42.667 19.103-42.667 42.667v0 597.333c0 23.564 19.103 42.667 42.667 42.667v0h213.333v42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-768c0-23.564-19.103-42.667-42.667-42.667v0zM768 768h-170.667v-512h170.667zM384 85.333c-23.564 0-42.667 19.103-42.667 42.667v0 85.333h-128c-23.564 0-42.667 19.103-42.667 42.667v0 512c0 23.564 19.103 42.667 42.667 42.667v0h128v85.333c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-768c0-23.564-19.103-42.667-42.667-42.667v0zM341.333 725.333h-85.333v-426.667h85.333z"],"attrs":[],"grid":0,"tags":["horizontal-distribution-right"]},"attrs":[],"properties":{"order":5105,"id":579,"name":"horizontal-distribution-right","prevSize":32,"code":60274},"setIdx":0,"setId":0,"iconIdx":626},{"icon":{"paths":["M640 256c-0.003-0-0.007-0-0.011-0-23.558 0-42.656 19.098-42.656 42.656 0 0.004 0 0.008 0 0.012l-0-0.001v170.667h-170.667v-170.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 426.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-170.667h170.667v170.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-426.667c0-0.003 0-0.007 0-0.011 0-23.558-19.098-42.656-42.656-42.656-0.004 0-0.008 0-0.012 0l0.001-0zM810.667 85.333h-597.333c-70.66 0.080-127.92 57.339-128 127.992l-0 0.008v597.333c0.080 70.66 57.339 127.92 127.992 128l597.341 0c70.66-0.080 127.92-57.339 128-127.992l0-0.008v-597.333c-0.080-70.66-57.339-127.92-127.992-128l-0.008-0zM853.333 810.667c-0.024 23.554-19.112 42.642-42.664 42.667l-597.336 0c-23.554-0.024-42.642-19.112-42.667-42.664l-0-0.002v-597.333c0.024-23.554 19.112-42.642 42.664-42.667l597.336-0c23.554 0.024 42.642 19.112 42.667 42.664l0 0.002z"],"attrs":[],"grid":0,"tags":["hospital-square-sign"]},"attrs":[],"properties":{"order":5106,"id":578,"name":"hospital-square-sign","prevSize":32,"code":60275},"setIdx":0,"setId":0,"iconIdx":627},{"icon":{"paths":["M640 298.667c-0.003-0-0.007-0-0.011-0-23.558 0-42.656 19.098-42.656 42.656 0 0.004 0 0.008 0 0.012l-0-0.001v128h-170.667v-128c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 341.333c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-128h170.667v128c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-341.333c0-0.003 0-0.007 0-0.011 0-23.558-19.098-42.656-42.656-42.656-0.004 0-0.008 0-0.012 0l0.001-0zM512 85.333c-235.641 0-426.667 191.025-426.667 426.667s191.025 426.667 426.667 426.667c235.641 0 426.667-191.025 426.667-426.667v0c-0.278-235.529-191.137-426.388-426.64-426.667l-0.027-0zM512 853.333c-188.513 0-341.333-152.82-341.333-341.333s152.82-341.333 341.333-341.333c188.513 0 341.333 152.82 341.333 341.333v0c-0.223 188.424-152.91 341.111-341.312 341.333l-0.021 0z"],"attrs":[],"grid":0,"tags":["hospital-symbol"]},"attrs":[],"properties":{"order":5107,"id":577,"name":"hospital-symbol","prevSize":32,"code":60276},"setIdx":0,"setId":0,"iconIdx":628},{"icon":{"paths":["M469.333 170.667h-213.333v-42.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 768c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667h213.333c23.564 0 42.667-19.103 42.667-42.667v0-597.333c0-23.564-19.103-42.667-42.667-42.667v0zM426.667 768h-170.667v-512h170.667zM810.667 213.333h-128v-85.333c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 768c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-85.333h128c23.564 0 42.667-19.103 42.667-42.667v0-512c0-23.564-19.103-42.667-42.667-42.667v0zM768 725.333h-85.333v-426.667h85.333z"],"attrs":[],"grid":0,"tags":["horizontal-distribution-left"]},"attrs":[],"properties":{"order":5108,"id":576,"name":"horizontal-distribution-left","prevSize":32,"code":60277},"setIdx":0,"setId":0,"iconIdx":629},{"icon":{"paths":["M533.333 704h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM533.333 533.333h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM320 704h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM320 533.333h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM917.333 277.333h-128v-170.667c0-0.003 0-0.007 0-0.011 0-23.558-19.098-42.656-42.656-42.656-0.004 0-0.008 0-0.012 0l-469.333-0c-0.003-0-0.007-0-0.011-0-23.558 0-42.656 19.098-42.656 42.656 0 0.004 0 0.008 0 0.012l-0-0.001v170.667h-128c-0.003-0-0.007-0-0.011-0-23.558 0-42.656 19.098-42.656 42.656 0 0.004 0 0.008 0 0.012l-0-0.001v597.333c-0 0.003-0 0.007-0 0.011 0 23.558 19.098 42.656 42.656 42.656 0.004 0 0.008-0 0.012-0l810.666 0c0.003 0 0.007 0 0.011 0 23.558 0 42.656-19.098 42.656-42.656 0-0.004-0-0.008-0-0.012l0 0.001v-597.333c0-0.003 0-0.007 0-0.011 0-23.558-19.098-42.656-42.656-42.656-0.004 0-0.008 0-0.012 0l0.001-0zM874.667 874.667h-725.333v-512h128c0.003 0 0.007 0 0.011 0 23.558 0 42.656-19.098 42.656-42.656 0-0.004-0-0.008-0-0.012l0 0.001v-170.667h384v170.667c-0 0.003-0 0.007-0 0.011 0 23.558 19.098 42.656 42.656 42.656 0.004 0 0.008-0 0.012-0l127.999 0zM704 533.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM576 298.667h-21.333v-21.333c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 21.333h-21.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h21.333v21.333c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-21.333h21.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM746.667 704h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["hospital"]},"attrs":[],"properties":{"order":5109,"id":575,"name":"hospital","prevSize":32,"code":60278},"setIdx":0,"setId":0,"iconIdx":630},{"icon":{"paths":["M924.333 437.437l-384-341.333c-7.494-6.692-17.436-10.781-28.333-10.781s-20.839 4.090-28.375 10.818l0.042-0.037-384 341.333c-8.809 7.851-14.33 19.229-14.33 31.896 0 23.562 19.101 42.663 42.663 42.663 10.895 0 20.836-4.084 28.376-10.804l-0.042 0.037 14.333-12.739v407.509c-0 0.003-0 0.007-0 0.011 0 23.558 19.098 42.656 42.656 42.656 0.004 0 0.008-0 0.012-0l597.333 0c0.003 0 0.007 0 0.011 0 23.558 0 42.656-19.098 42.656-42.656 0-0.004-0-0.008-0-0.012l0 0.001v-407.509l14.333 12.74c7.497 6.683 17.438 10.767 28.333 10.767 23.562 0 42.663-19.101 42.663-42.663 0-12.667-5.521-24.045-14.287-31.859l-0.042-0.037zM391.862 853.333c17.85-50.109 64.88-85.334 120.138-85.334s102.288 35.225 119.861 84.445l0.277 0.889zM448 618.667c0-35.346 28.654-64 64-64s64 28.654 64 64c0 35.346-28.654 64-64 64v0c-35.33-0.040-63.96-28.67-64-63.996l-0-0.004zM768 853.333h-46.979c-12.498-58.493-47.585-107.109-95.483-137.217l-0.887-0.52c22.652-25.752 36.527-59.706 36.682-96.897l0-0.032c0-82.475-66.859-149.333-149.333-149.333s-149.333 66.859-149.333 149.333v0c0.155 37.224 14.030 71.177 36.824 97.095l-0.142-0.165c-48.784 30.628-83.872 79.243-96.118 136.336l-0.252 1.401h-46.979v-440.695l256-227.555 256 227.555z"],"attrs":[],"grid":0,"tags":["house-user"]},"attrs":[],"properties":{"order":5110,"id":574,"name":"house-user","prevSize":32,"code":60279},"setIdx":0,"setId":0,"iconIdx":631},{"icon":{"paths":["M810.313 896.085h-42.667v-71.125c-0.144-25.721-4.818-50.306-13.261-73.059l0.48 1.476c-0.466-1.253-0.956-2.414-1.531-3.607-7.492-20.148-17.060-37.581-28.758-53.338l0.404 0.57-59.729-79.667c-15.939-21.157-25.547-47.867-25.604-76.82l-0-0.013v-43.085c0.105-35.323 14.402-67.287 37.485-90.506l-0.006 0.006 28.041-28.042c31.561-31.727 53.101-73.452 59.454-120.010l0.122-1.095c0.023-0.593 0.341-1.088 0.341-1.687l-0.12-0.586c1.383-8.007 2.346-17.472 2.673-27.098l0.010-0.357v-99.956h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-597.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h42.667v99.956c0.337 9.984 1.3 19.449 2.857 28.712l-0.175-1.256-0.12 0.588c0 0.597 0.317 1.094 0.341 1.687 6.475 47.652 28.014 89.377 59.585 121.113l-0.009-0.009 28.042 28.042c23.077 23.212 37.373 55.175 37.479 90.478l0 0.020v43.085c-0.060 28.963-9.659 55.671-25.822 77.164l0.238-0.331-59.771 79.665c-11.29 15.192-20.855 32.631-27.864 51.32l-0.482 1.466c-0.567 1.182-1.055 2.331-1.516 3.57-7.964 21.283-12.639 45.875-12.784 71.54l-0 0.063v71.125h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h597.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM340.979 213.419v-85.333h341.333v85.333zM378.458 318.544c-5.868-5.894-11.163-12.368-15.789-19.326l-0.292-0.466h298.536c-4.918 7.423-10.213 13.897-16.085 19.796l0.005-0.005-28.042 28.042c-32.246 32.062-54.215 74.431-60.548 121.749l-0.119 1.084h-88.96c-6.45-48.403-28.418-90.774-60.655-122.827l-0.010-0.010zM426.333 668.501c23.743-31.532 39.106-70.591 42.127-113.063l0.039-0.687h86.292c3.058 43.161 18.43 82.222 42.583 114.297l-0.395-0.548 42.672 56.917h-256.021zM682.313 896.085h-341.333v-71.125c0.132-5.146 0.55-10.058 1.241-14.882l-0.079 0.674h339.011c0.612 4.15 1.030 9.062 1.158 14.045l0.003 0.163z"],"attrs":[],"grid":0,"tags":["hourglass"]},"attrs":[],"properties":{"order":5111,"id":573,"name":"hourglass","prevSize":32,"code":60280},"setIdx":0,"setId":0,"iconIdx":632},{"icon":{"paths":["M339.292 341.352h298.083l-7.56 85.333h-203.523c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h195.961l-11.253 127-99.375 22.542-99.333-22.584-4.084-45.417c-2.010-21.877-20.27-38.877-42.5-38.877-23.565 0-42.669 19.103-42.669 42.669 0 1.335 0.061 2.656 0.181 3.959l-0.012-0.167 6.833 76.373c1.719 18.602 15.135 33.64 32.753 37.776l0.289 0.057 139.083 31.584c2.842 0.662 6.106 1.041 9.458 1.041s6.616-0.379 9.75-1.098l-0.292 0.056 139.125-31.584c17.919-4.197 31.34-19.256 33.030-37.708l0.012-0.167 18.414-207.698 0.085-0.427-0.034-0.167 14.784-166.75c0.103-1.111 0.161-2.402 0.161-3.707 0-23.571-19.094-42.682-42.658-42.709l-344.71-0c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667h-0zM881.25 99.227c-7.837-8.535-19.045-13.867-31.499-13.875l-676.251-0c-0.006-0-0.013-0-0.020-0-23.555 0-42.651 19.095-42.651 42.651 0 1.341 0.062 2.667 0.183 3.976l-0.013-0.168 61.583 690.958c1.638 17.891 14.115 32.475 30.741 37.217l0.301 0.073 276.167 77.041c3.434 1.005 7.379 1.583 11.458 1.583s8.025-0.578 11.757-1.657l-0.298 0.074 276.916-77.333c16.927-4.816 29.403-19.4 31.029-37.124l0.012-0.167 61.583-690.667c0.106-1.132 0.167-2.447 0.167-3.777 0-11.114-4.243-21.238-11.196-28.839l0.029 0.033zM748.292 785.52l-237.042 66.208-236.291-65.918-54.833-615.125h583z"],"attrs":[],"grid":0,"tags":["html3-alt"]},"attrs":[],"properties":{"order":5112,"id":572,"name":"html3-alt","prevSize":32,"code":60281},"setIdx":0,"setId":0,"iconIdx":633},{"icon":{"paths":["M915.958 99.209c-7.827-8.538-19.029-13.872-31.478-13.875l-744.961-0c-23.566 0.009-42.667 19.116-42.667 42.683 0 1.329 0.061 2.644 0.18 3.942l-0.012-0.167 64.853 725.333c1.641 17.908 14.136 32.503 30.782 37.239l0.301 0.073 307.209 85.333c3.422 0.992 7.354 1.562 11.418 1.562l0 0c4.056-0.004 7.98-0.566 11.7-1.615l-0.304 0.073 308.042-85.333c16.955-4.817 29.455-19.418 31.092-37.166l0.012-0.168 64.853-725.333c0.107-1.133 0.168-2.45 0.168-3.782 0-11.116-4.251-21.24-11.216-28.833l0.028 0.031zM779.75 820.105l-268.146 74.291-267.354-74.271-58.083-649.458h651.667zM333.646 554.667h294.187l-13.958 139.563-109.563 39.125-134.978-48.209c-4.286-1.586-9.237-2.504-14.403-2.504-23.568 0-42.674 19.106-42.674 42.674 0 18.439 11.695 34.147 28.072 40.11l0.297 0.094 149.333 53.333c4.273 1.571 9.208 2.479 14.354 2.479s10.081-0.909 14.652-2.574l-0.298 0.095 149.333-53.333c15.316-5.589 26.386-19.282 28.089-35.755l0.015-0.183 21.333-213.333c0.133-1.266 0.209-2.736 0.209-4.223 0-23.57-19.1-42.679-42.666-42.694l-302.73-0-12.792-128h336.853c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-384c-23.568 0.015-42.667 19.124-42.667 42.694 0 1.487 0.076 2.956 0.224 4.404l-0.015-0.182 21.333 213.333c2.235 21.664 20.391 38.417 42.459 38.417l0 0z"],"attrs":[],"grid":0,"tags":["html5-alt"]},"attrs":[],"properties":{"order":5113,"id":571,"name":"html5-alt","prevSize":32,"code":60282},"setIdx":0,"setId":0,"iconIdx":634},{"icon":{"paths":["M136.306 85.333l68.381 767.758 306.864 85.575 307.708-85.894 68.436-767.439zM745.643 261.237l-22.772 255.773 0.082 1.38-0.109 3.164v-0.029l-16.18 178.831-1.783 15.887-193.038 53.505-192.541-53.67-13.045-147.848h94.421l6.695 75.19 104.625 28.396 105.020-28.77 11.105-122.425h-219.554l-1.884-20.696-4.306-48.486-2.229-26.036h236.321l8.603-95.219h-359.963l-1.891-20.671-4.278-48.512-2.258-26.035h471.213zM745.643 261.237z"],"attrs":[],"grid":0,"tags":["html3"]},"attrs":[],"properties":{"order":5114,"id":570,"name":"html3","prevSize":32,"code":60283},"setIdx":0,"setId":0,"iconIdx":635},{"icon":{"paths":["M135.787 85.338l68.474 768.029 307.281 85.305 308.125-85.422 68.547-767.912zM739.203 336.529h-360.458l8.609 96.458h343.276l-25.849 289.195-193.213 53.563-192.953-53.562-13.198-147.901h94.557l6.703 75.125 104.995 28.297 105.057-28.357 10.938-122.164h-326.458l-25.406-284.849h471.834z"],"attrs":[],"grid":0,"tags":["html5"]},"attrs":[],"properties":{"order":5115,"id":569,"name":"html5","prevSize":32,"code":60284},"setIdx":0,"setId":0,"iconIdx":636},{"icon":{"paths":["M512 384c-70.692 0-128 57.308-128 128s57.308 128 128 128c70.692 0 128-57.308 128-128v0c0-70.692-57.308-128-128-128v0zM512 554.667c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667c23.564 0 42.667 19.103 42.667 42.667v0c0 23.564-19.103 42.667-42.667 42.667v0zM896 469.333h-45.653c-20.152-154.513-141.167-275.528-293.958-295.496l-1.722-0.184v-45.653c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 45.653c-154.513 20.152-275.528 141.167-295.496 293.958l-0.184 1.722h-45.653c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h45.653c20.152 154.513 141.167 275.528 293.958 295.496l1.722 0.184v45.653c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-45.653c154.513-20.152 275.528-141.167 295.496-293.958l0.184-1.722h45.653c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM512 768c-141.385 0-256-114.615-256-256s114.615-256 256-256c141.385 0 256 114.615 256 256v0c0 141.385-114.615 256-256 256v0z"],"attrs":[],"grid":0,"tags":["hunting"]},"attrs":[],"properties":{"order":5116,"id":568,"name":"hunting","prevSize":32,"code":60285},"setIdx":0,"setId":0,"iconIdx":637},{"icon":{"paths":["M580.267 465.067c4.267 4.267 8.533 4.267 17.067 4.267h298.667c25.6 0 42.667-17.067 42.667-42.667 0-8.533 0-12.8-4.267-17.067l-149.333-298.667c-12.8-21.333-38.4-29.867-59.733-17.067-4.267 4.267-12.8 8.533-17.067 17.067l-149.333 298.667c-8.533 17.067-0 42.667 21.333 55.467zM746.667 221.867l81.067 162.133h-162.133l81.067-162.133zM277.333 85.333c-106.667 0-192 85.333-192 192s85.333 192 192 192 192-85.333 192-192c0-106.667-85.333-192-192-192zM277.333 384c-59.733 0-106.667-46.933-106.667-106.667s46.933-106.667 106.667-106.667 106.667 46.933 106.667 106.667c0 59.733-46.933 106.667-106.667 106.667zM456.533 567.467c0 0 0 0 0 0-17.067-17.067-42.667-17.067-59.733 0 0 0 0 0 0 0l-119.467 119.467-119.467-119.467c-17.067-17.067-42.667-17.067-59.733 0s-17.067 42.667 0 59.733l119.467 119.467-119.467 119.467c-17.067 17.067-17.067 42.667 0 59.733s42.667 17.067 59.733 0c0 0 0 0 0 0l119.467-119.467 119.467 119.467c17.067 17.067 42.667 17.067 59.733 0s17.067-42.667 0-59.733l-119.467-119.467 119.467-119.467c17.067-17.067 17.067-42.667-0-59.733zM896 554.667h-298.667c-25.6 0-42.667 17.067-42.667 42.667v298.667c0 25.6 17.067 42.667 42.667 42.667h298.667c25.6 0 42.667-17.067 42.667-42.667v-298.667c0-25.6-17.067-42.667-42.667-42.667zM853.333 853.333h-213.333v-213.333h213.333v213.333z"],"attrs":[],"grid":0,"tags":["icons"]},"attrs":[],"properties":{"order":5117,"id":567,"name":"icons","prevSize":32,"code":60286},"setIdx":0,"setId":0,"iconIdx":638},{"icon":{"paths":["M934.4 409.6c-8.533-21.333-34.133-29.867-55.467-21.333v0l-123.733 59.733-179.2-179.2 59.733-123.733c8.533-21.333 0-46.933-21.333-55.467s-46.933 0-55.467 21.333l-64 132.267-273.067 42.667c-17.067 4.267-29.867 17.067-34.133 34.133l-102.4 494.933c-4.267 12.8 0 29.867 12.8 38.4l72.533 72.533c8.533 8.533 21.333 12.8 29.867 12.8 4.267 0 4.267 0 8.533 0l494.933-102.4c17.067-4.267 29.867-17.067 34.133-34.133l42.667-273.067 132.267-64c21.333-8.533 29.867-34.133 21.333-55.467zM657.067 759.467l-418.133 85.333 157.867-157.867c64 29.867 140.8 4.267 170.667-59.733s4.267-140.8-59.733-170.667c-46.933-21.333-106.667-12.8-145.067 25.6v0c-38.4 38.4-46.933 98.133-25.6 145.067l-157.867 157.867 85.333-418.133 247.467-42.667 187.733 187.733-42.667 247.467zM409.6 571.733c0-12.8 4.267-21.333 12.8-29.867v0c17.067-17.067 42.667-17.067 59.733 0s17.067 42.667 0 59.733c-17.067 17.067-42.667 17.067-59.733 0-8.533-8.533-12.8-21.333-12.8-29.867z"],"attrs":[],"grid":0,"tags":["illustration"]},"attrs":[],"properties":{"order":5118,"id":566,"name":"illustration","prevSize":32,"code":60287},"setIdx":0,"setId":0,"iconIdx":639},{"icon":{"paths":["M926.293 865.707l-39.68-39.68-3.84-4.267-2.56-2.987-21.333-21.333-5.547-2.987-221.013-221.867-3.84-3.413-136.533-136.96-4.267-5.547-329.387-328.96c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l42.667 42.667c-7.809 16.068-12.373 34.953-12.373 54.904 0 0.048 0 0.095 0 0.143l-0-0.007v512c0 70.692 57.308 128 128 128v0h512c19.802-0.246 38.414-5.107 54.884-13.551l-0.697 0.325s0 0 2.133 0l40.533 42.667c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.8-7.734 12.629-18.454 12.629-30.302 0-11.419-4.486-21.791-11.792-29.448l0.016 0.017zM213.333 273.493l138.24 138.24c-10.942 5.707-20.349 12.527-28.622 20.514l0.035-0.034-109.653 110.080zM256 810.667c-23.564 0-42.667-19.103-42.667-42.667v0-104.96l170.667-170.667c6.143-5.695 14.397-9.189 23.467-9.189s17.324 3.494 23.489 9.209l-0.022-0.020 319.573 318.293zM412.16 213.333h355.84c23.564 0 42.667 19.103 42.667 42.667v0 253.44c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l74.24 74.24c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.651-7.709 12.379-18.328 12.379-30.051 0-0.235-0.002-0.47-0.006-0.704l0 0.035v-357.547c0-70.692-57.308-128-128-128v0h-357.12c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["image-alt-slash"]},"attrs":[],"properties":{"order":5119,"id":565,"name":"image-alt-slash","prevSize":32,"code":60288},"setIdx":0,"setId":0,"iconIdx":640},{"icon":{"paths":["M876.373 104.96c-38.625-38.719-92.035-62.674-151.040-62.674-117.821 0-213.333 95.513-213.333 213.333s95.513 213.333 213.333 213.333c117.687 0 213.116-95.296 213.333-212.932l0-0.021c0-0.113 0-0.247 0-0.381 0-58.816-23.801-112.072-62.298-150.663l0.004 0.004zM597.333 256c0-70.692 57.308-128 128-128v0c20.045 0.123 38.962 4.834 55.79 13.134l-0.75-0.334-170.667 170.667c-7.81-16.069-12.375-34.955-12.375-54.907 0-0.197 0-0.394 0.001-0.59l-0 0.030zM815.787 346.453c-23.521 22.391-55.421 36.166-90.54 36.166-19.769 0-38.519-4.365-55.337-12.184l0.81 0.338 170.667-170.667c7.551 15.836 11.96 34.416 11.96 54.026 0 0.657-0.005 1.312-0.015 1.966l0.001-0.099c-0.032 35.333-14.375 67.31-37.545 90.452l-0.001 0.001zM810.667 554.667c-23.564 0-42.667 19.103-42.667 42.667v0 16.64l-63.147-63.573c-21.853-20.566-51.371-33.203-83.84-33.203s-61.987 12.637-83.903 33.261l0.063-0.059-29.867 30.293-105.813-106.24c-21.853-20.566-51.371-33.203-83.84-33.203s-61.987 12.637-83.903 33.261l0.063-0.059-63.147 63.573v-239.36c0-23.564 19.103-42.667 42.667-42.667v0h170.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-170.667c-70.692 0-128 57.308-128 128v0 512c0 70.692 57.308 128 128 128v0h512c14.591-0.233 28.491-2.872 41.425-7.534l-0.892 0.281h3.84c44.135-16.075 76.474-54.526 83.539-101.266l0.088-0.707c0.115-1.405 0.181-3.042 0.181-4.693s-0.066-3.288-0.194-4.907l0.014 0.214v-222.72c0-23.564-19.103-42.667-42.667-42.667v0zM213.333 853.333c-23.564 0-42.667-19.103-42.667-42.667v0-152.32l123.733-123.307c6.036-5.76 14.231-9.305 23.253-9.305s17.217 3.545 23.267 9.318l-0.013-0.013 136.107 135.68 182.613 182.613zM768 810.667c-0.296 8.659-3.127 16.602-7.77 23.174l0.090-0.134-192.853-193.707 30.293-29.867c6.036-5.76 14.231-9.305 23.253-9.305s17.217 3.545 23.267 9.318l-0.013-0.013 123.733 124.16z"],"attrs":[],"grid":0,"tags":["image-block"]},"attrs":[],"properties":{"order":5120,"id":564,"name":"image-block","prevSize":32,"code":60289},"setIdx":0,"setId":0,"iconIdx":641},{"icon":{"paths":["M926.293 620.373l-106.667-108.373c-7.733-7.795-18.45-12.621-30.293-12.621s-22.56 4.826-30.291 12.618l-0.003 0.003-119.040 121.173-119.040-121.173c-7.733-7.795-18.45-12.621-30.293-12.621s-22.56 4.826-30.291 12.618l-0.003 0.003-97.707 99.84-97.707-99.84c-7.733-7.795-18.45-12.621-30.293-12.621s-22.56 4.826-30.291 12.618l-0.003 0.003-106.667 106.667c-3.773 3.937-6.808 8.616-8.859 13.791l-0.101 0.289c-2.092 4.778-3.34 10.34-3.413 16.186l-0 0.027v161.707c0 70.692 57.308 128 128 128v0h597.333c70.692 0 128-57.308 128-128v0-160c-0.073-5.873-1.322-11.435-3.52-16.489l0.107 0.275c-2.152-5.464-5.187-10.143-8.974-14.095l0.014 0.015zM853.333 810.667c0 23.564-19.103 42.667-42.667 42.667v0h-597.333c-23.564 0-42.667-19.103-42.667-42.667v0-142.507l64-64 97.707 98.133c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 97.707-98.133 119.040 121.173c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 119.040-119.467 64 64zM810.667 85.333h-597.333c-70.692 0-128 57.308-128 128v0 224.427c-0.212 1.729-0.333 3.73-0.333 5.76s0.121 4.031 0.357 5.997l-0.023-0.237s0 2.987 0 4.267c6.468 15.845 21.759 26.808 39.61 26.808 12.312 0 23.406-5.215 31.194-13.556l0.023-0.025 78.507-75.947 97.707 98.133c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 97.707-98.133 119.040 121.173c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 119.040-119.467 75.52 75.947c7.811 8.366 18.905 13.581 31.217 13.581 17.851 0 33.142-10.963 39.507-26.523l0.103-0.285c0.099-0.577 0.155-1.242 0.155-1.92s-0.056-1.343-0.165-1.99l0.010 0.070c1.426-3.52 2.347-7.596 2.557-11.859l0.003-0.088v-226.133c0-0 0-0 0-0.001 0-70.542-57.065-127.757-127.55-127.999l-0.023-0zM853.333 334.507l-33.707-35.84c-7.733-7.795-18.45-12.621-30.293-12.621s-22.56 4.826-30.291 12.618l-0.003 0.003-119.040 121.173-119.040-121.173c-7.733-7.795-18.45-12.621-30.293-12.621s-22.56 4.826-30.291 12.618l-0.003 0.003-97.707 99.84-97.707-99.84c-7.733-7.795-18.45-12.621-30.293-12.621s-22.56 4.826-30.291 12.618l-0.003 0.003-33.707 35.84v-121.173c0-23.564 19.103-42.667 42.667-42.667v0h597.333c23.564 0 42.667 19.103 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["image-broken"]},"attrs":[],"properties":{"order":5121,"id":563,"name":"image-broken","prevSize":32,"code":60290},"setIdx":0,"setId":0,"iconIdx":642},{"icon":{"paths":["M926.293 98.133c-7.712-7.668-18.343-12.407-30.080-12.407s-22.368 4.74-30.082 12.409l0.002-0.002-144.213 140.8-52.053-51.2c-7.693-7.536-18.237-12.186-29.867-12.186-23.579 0-42.693 19.114-42.693 42.693 0 11.948 4.908 22.75 12.819 30.5l0.007 0.007 81.92 80.213c7.69 7.542 18.235 12.197 29.867 12.197s22.177-4.655 29.874-12.203l-0.007 0.007 174.080-170.667c7.796-7.733 12.622-18.45 12.622-30.295 0-11.631-4.654-22.176-12.202-29.872l0.007 0.007zM810.667 384c-23.564 0-42.667 19.103-42.667 42.667v0 187.307l-63.147-63.147c-21.414-21.549-51.069-34.886-83.84-34.886s-62.426 13.337-83.834 34.88l-0.006 0.006-29.867 29.867-105.813-106.24c-21.508-21.343-51.134-34.533-83.84-34.533s-62.332 13.19-83.848 34.541l0.008-0.007-63.147 63.147v-238.933c0-23.564 19.103-42.667 42.667-42.667v0h256c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-256c-70.692 0-128 57.308-128 128v0 512c0 70.692 57.308 128 128 128v0h512c70.692 0 128-57.308 128-128v0-384c0-23.564-19.103-42.667-42.667-42.667v0zM213.333 853.333c-23.564 0-42.667-19.103-42.667-42.667v0-152.32l123.733-123.733c6.036-5.76 14.231-9.305 23.253-9.305s17.217 3.545 23.267 9.318l-0.013-0.013 135.253 135.253 183.040 183.467zM768 810.667c-0.066 8.541-2.942 16.399-7.748 22.706l0.068-0.093-192.427-193.28 29.867-29.867c6.016-5.983 14.309-9.682 23.467-9.682s17.451 3.699 23.468 9.683l-0.001-0.001 123.307 124.587z"],"attrs":[],"grid":0,"tags":["image-check"]},"attrs":[],"properties":{"order":5122,"id":562,"name":"image-check","prevSize":32,"code":60291},"setIdx":0,"setId":0,"iconIdx":643},{"icon":{"paths":["M968.96 268.373c-7.733-7.795-18.45-12.621-30.293-12.621s-22.56 4.826-30.291 12.618l-0.003 0.003-55.040 55.467v-238.507c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 238.507l-55.040-55.467c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l128 128c3.937 3.773 8.616 6.808 13.791 8.859l0.289 0.101c4.771 2.163 10.345 3.423 16.213 3.423s11.443-1.26 16.466-3.525l-0.253 0.102c5.464-2.152 10.143-5.187 14.095-8.974l-0.015 0.014 128-128c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003zM810.667 554.667c-23.564 0-42.667 19.103-42.667 42.667v0 16.213l-63.147-63.147c-21.508-21.343-51.134-34.533-83.84-34.533s-62.332 13.19-83.848 34.541l0.008-0.007-29.867 29.867-105.813-105.813c-21.771-20.754-51.314-33.524-83.84-33.524s-62.069 12.77-83.889 33.57l0.049-0.046-63.147 63.147v-238.933c0-23.564 19.103-42.667 42.667-42.667v0h341.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-341.333c-70.692 0-128 57.308-128 128v0 512c0 70.692 57.308 128 128 128v0h512c70.692 0 128-57.308 128-128v0-213.333c0-23.564-19.103-42.667-42.667-42.667v0zM213.333 853.333c-23.564 0-42.667-19.103-42.667-42.667v0-152.32l123.733-123.733c6.036-5.76 14.231-9.305 23.253-9.305s17.217 3.545 23.267 9.318l-0.013-0.013 318.72 318.72zM768 810.667c-0.066 8.541-2.942 16.399-7.748 22.706l0.068-0.093-192.427-193.28 29.867-29.867c5.968-6.087 14.277-9.861 23.467-9.861s17.499 3.773 23.461 9.855l0.005 0.005 123.307 124.16z"],"attrs":[],"grid":0,"tags":["image-download"]},"attrs":[],"properties":{"order":5123,"id":561,"name":"image-download","prevSize":32,"code":60292},"setIdx":0,"setId":0,"iconIdx":644},{"icon":{"paths":["M927.438 160.043l-103.25-103.251c-7.719-7.723-18.385-12.5-30.167-12.5s-22.447 4.777-30.166 12.5l-195.417 195.417c-7.721 7.72-12.498 18.384-12.501 30.165l-0 0.001v103.252c0.001 23.564 19.103 42.665 42.667 42.667l103.273 0c11.781-0.003 22.446-4.78 30.165-12.501l195.397-195.417c7.722-7.719 12.499-18.384 12.499-30.165s-4.776-22.446-12.498-30.165l-0-0zM684.208 342.959h-42.937v-42.917l152.75-152.75 42.917 42.916zM810.667 469.333c-23.564 0-42.667 19.103-42.667 42.667v0 102.042l-63.167-63.167c-21.46-21.419-51.084-34.664-83.802-34.664s-62.342 13.245-83.804 34.666l0.002-0.002-29.781 29.781-106.073-106.075c-21.435-21.404-51.031-34.641-83.719-34.641s-62.283 13.237-83.72 34.642l0.001-0.001-63.271 63.275v-239.189c0.032-23.551 19.115-42.635 42.664-42.667l0.003-0h256c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-256c-70.66 0.080-127.92 57.339-128 127.992l-0 0.008v512c0.080 70.66 57.339 127.92 127.992 128l512.008 0c70.66-0.080 127.92-57.339 128-127.992l0-0.008v-298.667c0-23.564-19.103-42.667-42.667-42.667v0zM213.333 853.333c-23.551-0.032-42.635-19.115-42.667-42.664l-0-0.003v-152.146l123.605-123.605c6.090-5.748 14.325-9.281 23.385-9.281s17.295 3.533 23.402 9.297l-0.017-0.016 135.168 135.13c0.362 0.391 0.495 0.93 0.873 1.307l181.995 181.981zM768 810.667c-0.228 8.616-3.052 16.53-7.713 23.039l0.085-0.125-192.591-192.591 29.781-29.781c6.015-5.987 14.31-9.688 23.469-9.688s17.454 3.701 23.47 9.689l-0.001-0.001 123.5 123.5z"],"attrs":[],"grid":0,"tags":["image-edit"]},"attrs":[],"properties":{"order":5124,"id":560,"name":"image-edit","prevSize":32,"code":60293},"setIdx":0,"setId":0,"iconIdx":645},{"icon":{"paths":["M853.333 221.013v-50.347c0-70.692-57.308-128-128-128s-128 57.308-128 128v0 50.347c-50.028 18.062-85.173 65.066-85.333 120.3l-0 0.020v85.333c0 70.692 57.308 128 128 128v0h170.667c70.692 0 128-57.308 128-128v0-85.333c-0.16-55.254-35.305-102.258-84.442-120.038l-0.891-0.282zM682.667 170.667c0-23.564 19.103-42.667 42.667-42.667s42.667 19.103 42.667 42.667v0 42.667h-85.333zM853.333 426.667c0 23.564-19.103 42.667-42.667 42.667v0h-170.667c-23.564 0-42.667-19.103-42.667-42.667v0-85.333c0-23.564 19.103-42.667 42.667-42.667v0h170.667c23.564 0 42.667 19.103 42.667 42.667v0zM810.667 640c-23.564 0-42.667 19.103-42.667 42.667v0 128c-0.066 8.541-2.942 16.399-7.748 22.706l0.068-0.093-358.827-358.827c-21.813-20.659-51.343-33.362-83.84-33.362s-62.027 12.703-83.896 33.415l0.056-0.052-63.147 63.147v-238.933c0-23.564 19.103-42.667 42.667-42.667v0h213.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-213.333c-70.692 0-128 57.308-128 128v0 512c0 70.692 57.308 128 128 128v0h512c70.692 0 128-57.308 128-128v0-128c0-23.564-19.103-42.667-42.667-42.667v0zM213.333 853.333c-23.564 0-42.667-19.103-42.667-42.667v0-152.32l123.733-123.733c6.036-5.76 14.231-9.305 23.253-9.305s17.217 3.545 23.267 9.318l-0.013-0.013 318.72 318.72z"],"attrs":[],"grid":0,"tags":["image-lock"]},"attrs":[],"properties":{"order":5125,"id":559,"name":"image-lock","prevSize":32,"code":60294},"setIdx":0,"setId":0,"iconIdx":646},{"icon":{"paths":["M896 171h-170.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h170.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM810.667 341.333c-23.564 0-42.667 19.103-42.667 42.667v0 230.042l-63.167-63.167c-21.46-21.419-51.084-34.664-83.802-34.664s-62.342 13.245-83.804 34.666l0.002-0.002-29.781 29.781-106.073-106.075c-21.435-21.404-51.031-34.641-83.719-34.641s-62.283 13.237-83.72 34.642l0.001-0.001-63.271 63.275v-239.189c0.032-23.551 19.115-42.635 42.664-42.667l0.003-0h341.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-341.333c-70.66 0.080-127.92 57.339-128 127.992l-0 0.008v512c0.080 70.66 57.339 127.92 127.992 128l512.008 0c70.66-0.080 127.92-57.339 128-127.992l0-0.008v-426.667c0-23.564-19.103-42.667-42.667-42.667v0zM213.333 853.333c-23.551-0.032-42.635-19.115-42.667-42.664l-0-0.003v-152.146l123.605-123.605c6.090-5.748 14.325-9.281 23.385-9.281s17.295 3.533 23.402 9.297l-0.017-0.016 135.168 135.13c0.362 0.391 0.495 0.93 0.873 1.307l181.995 181.981zM768 810.667c-0.228 8.616-3.052 16.53-7.713 23.039l0.085-0.125-192.591-192.591 29.781-29.781c6.015-5.987 14.31-9.688 23.469-9.688s17.454 3.701 23.47 9.689l-0.001-0.001 123.5 123.5z"],"attrs":[],"grid":0,"tags":["image-minus"]},"attrs":[],"properties":{"order":5126,"id":558,"name":"image-minus","prevSize":32,"code":60295},"setIdx":0,"setId":0,"iconIdx":647},{"icon":{"paths":["M810.667 426.667c-23.564 0-42.667 19.103-42.667 42.667v0 144.213l-63.147-63.147c-21.508-21.343-51.134-34.533-83.84-34.533s-62.332 13.19-83.848 34.541l0.008-0.007-29.867 30.293-105.813-106.24c-21.508-21.343-51.134-34.533-83.84-34.533s-62.332 13.19-83.848 34.541l0.008-0.007-63.147 63.573v-239.36c0-23.564 19.103-42.667 42.667-42.667v0h341.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-341.333c-70.692 0-128 57.308-128 128v0 521.387c0.242 65.411 53.202 118.372 118.59 118.613l0.023 0h530.773c12.205-0.1 23.936-1.964 35.004-5.349l-0.87 0.229c49.631-14.251 85.334-59.237 85.334-112.563 0-0.177-0-0.354-0.001-0.531l0 0.027v-351.147c0-0.003 0-0.006 0-0.009 0-23.564-19.103-42.667-42.667-42.667-0.3 0-0.599 0.003-0.898 0.009l0.045-0.001zM213.333 853.333c-23.564 0-42.667-19.103-42.667-42.667v0-152.32l123.307-123.307c6.016-5.983 14.309-9.682 23.467-9.682s17.451 3.699 23.468 9.683l-0.001-0.001 318.72 318.293zM768 810.667c-0.296 8.659-3.127 16.602-7.77 23.174l0.090-0.134-192.853-193.707 30.293-29.867c5.968-6.087 14.277-9.861 23.467-9.861s17.499 3.773 23.461 9.855l0.005 0.005 123.307 124.16zM896 170.667h-42.667v-42.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 42.667h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h42.667v42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["image-plus"]},"attrs":[],"properties":{"order":5127,"id":557,"name":"image-plus","prevSize":32,"code":60296},"setIdx":0,"setId":0,"iconIdx":648},{"icon":{"paths":["M810.667 554.667c-23.564 0-42.667 19.103-42.667 42.667v0 16.64l-63.147-63.147c-21.414-21.549-51.069-34.886-83.84-34.886s-62.426 13.337-83.834 34.88l-0.006 0.006-29.867 29.867-105.813-106.24c-21.813-20.659-51.343-33.362-83.84-33.362s-62.027 12.703-83.896 33.415l0.056-0.052-63.147 63.147v-238.933c0-23.564 19.103-42.667 42.667-42.667v0h341.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-341.333c-70.692 0-128 57.308-128 128v0 512c0 70.692 57.308 128 128 128v0h512c70.692 0 128-57.308 128-128v0-213.333c0-23.564-19.103-42.667-42.667-42.667v0zM213.333 853.333c-23.564 0-42.667-19.103-42.667-42.667v0-152.32l123.733-123.733c6.036-5.76 14.231-9.305 23.253-9.305s17.217 3.545 23.267 9.318l-0.013-0.013 135.253 135.253 183.040 183.467zM768 810.667c-0.383 8.509-3.202 16.29-7.77 22.747l0.090-0.133-192.427-193.28 29.867-29.867c6.016-5.983 14.309-9.682 23.467-9.682s17.451 3.699 23.468 9.683l-0.001-0.001 123.307 124.587zM810.667 85.333c-0.024-0-0.053-0-0.082-0-47.128 0-88.308 25.47-110.524 63.396l-0.327 0.604c-3.613 6.133-5.748 13.511-5.748 21.388 0 15.791 8.578 29.578 21.329 36.956l0.205 0.11c6.055 3.499 13.32 5.563 21.067 5.563 15.716 0 29.448-8.497 36.851-21.148l0.109-0.202c7.474-13.011 21.291-21.632 37.121-21.632 23.564 0 42.667 19.103 42.667 42.667 0 0.105-0 0.21-0.001 0.314l0-0.016c0 23.564-19.103 42.667-42.667 42.667v0c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0c70.692 0 128-57.308 128-128s-57.308-128-128-128v0zM826.88 387.413c-5.263-2.499-11.435-3.959-17.948-3.959-2.401 0-4.755 0.198-7.048 0.579l0.249-0.034-7.68 2.56-7.68 3.84-6.4 5.547c-7.651 7.709-12.379 18.328-12.379 30.051 0 0.235 0.002 0.47 0.006 0.704l-0-0.035c-0 0.073-0.001 0.16-0.001 0.247 0 11.721 4.726 22.338 12.377 30.049l-0.003-0.003c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.648-7.709 12.374-18.326 12.374-30.047 0-0.087-0-0.173-0.001-0.26l0 0.013c-0.091-17.632-10.863-32.726-26.172-39.149l-0.281-0.105z"],"attrs":[],"grid":0,"tags":["image-question"]},"attrs":[],"properties":{"order":5128,"id":556,"name":"image-question","prevSize":32,"code":60297},"setIdx":0,"setId":0,"iconIdx":649},{"icon":{"paths":["M917.333 64c-23.564 0-42.667 19.103-42.667 42.667v0 0c-35.241-26.713-79.826-42.791-128.166-42.791-117.821 0-213.333 95.513-213.333 213.333s95.513 213.333 213.333 213.333c54.144 0 103.577-20.171 141.194-53.407l-0.229 0.198c8.985-7.884 14.626-19.39 14.626-32.213 0-23.63-19.156-42.786-42.786-42.786-10.807 0-20.678 4.006-28.209 10.615l0.049-0.042c-22.451 19.89-52.16 32.037-84.706 32.037-70.692 0-128-57.308-128-128s57.308-128 128-128c37.834 0 71.835 16.415 95.268 42.511l0.105 0.119h-52.48c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h128c23.564 0 42.667-19.103 42.667-42.667v0-128c-0.241-23.38-19.25-42.24-42.665-42.24-0.001 0-0.002 0-0.002 0l0-0zM789.333 576c-23.564 0-42.667 19.103-42.667 42.667v0 16.64l-64-63.147c-21.414-21.549-51.069-34.886-83.84-34.886s-62.426 13.337-83.834 34.88l-0.006 0.006-29.867 29.867-104.96-106.24c-21.508-21.343-51.134-34.533-83.84-34.533s-62.332 13.19-83.848 34.541l0.008-0.007-63.147 63.147v-238.933c0-23.564 19.103-42.667 42.667-42.667v0h213.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-213.333c-70.692 0-128 57.308-128 128v0 512c0 70.692 57.308 128 128 128v0h512c70.692 0 128-57.308 128-128v0-213.333c0-23.564-19.103-42.667-42.667-42.667v0zM192 874.667c-23.564 0-42.667-19.103-42.667-42.667v0-152.32l123.733-125.013c6.036-5.76 14.231-9.305 23.253-9.305s17.217 3.545 23.267 9.318l-0.013-0.013 135.253 135.253 185.173 184.747zM746.667 832c-0.383 8.509-3.202 16.29-7.77 22.747l0.090-0.133-192.427-192.427 29.867-29.867c6.016-5.983 14.309-9.682 23.467-9.682s17.451 3.699 23.468 9.683l-0.001-0.001 123.307 123.733z"],"attrs":[],"grid":0,"tags":["image-redo"]},"attrs":[],"properties":{"order":5129,"id":555,"name":"image-redo","prevSize":32,"code":60298},"setIdx":0,"setId":0,"iconIdx":650},{"icon":{"paths":["M554.667 469.333h-469.333c-23.564 0-42.667 19.103-42.667 42.667v0 384c0 23.564 19.103 42.667 42.667 42.667v0h463.36c2.133 0 3.84 0 5.973 0 23.564 0 42.667-19.103 42.667-42.667v0-384c0-23.564-19.103-42.667-42.667-42.667v0zM317.44 853.333l82.347-82.347c2.326-3.471 6.233-5.725 10.667-5.725s8.34 2.254 10.638 5.678l0.029 0.046 81.92 82.347zM512 741.547l-30.72-30.293c-18.427-17.632-43.466-28.485-71.040-28.485s-52.613 10.853-71.078 28.521l0.038-0.036-142.507 142.080h-68.693v-298.667h384zM85.333 175.36c15.533-0.003 29.126-8.305 36.586-20.714l0.107-0.193c5.075-7.164 8.113-16.083 8.113-25.712 0-0.261-0.002-0.521-0.007-0.781l0.001 0.039c0-0.016 0-0.035 0-0.053 0-23.564-19.103-42.667-42.667-42.667-0.75 0-1.496 0.019-2.237 0.058l0.104-0.004c-23.564 0-42.667 19.103-42.667 42.667v0 4.267c-0.001 0.127-0.002 0.277-0.002 0.427 0 23.564 19.103 42.667 42.667 42.667 0.001 0 0.001-0 0.002-0l-0 0zM422.827 170.667h8.107c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-8.107c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM85.333 374.613c23.564 0 42.667-19.103 42.667-42.667v0-9.387c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 9.387c0 23.564 19.103 42.667 42.667 42.667v0zM601.173 85.333h-8.107c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h8.107c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM252.16 170.667h8.107c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-8.107c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM938.667 273.067c-23.564 0-42.667 19.103-42.667 42.667v0 8.96c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-8.96c0-23.564-19.103-42.667-42.667-42.667v0zM730.453 853.333h-10.24c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h10.24c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM934.4 85.333c-21.656 2.24-38.401 20.391-38.401 42.453 0 0.075 0 0.15 0.001 0.225l-0-0.012c0.109 6.539 1.672 12.687 4.378 18.17l-0.111-0.25c6.958 14.673 21.651 24.639 38.671 24.639 21.873 0 39.901-16.458 42.377-37.666l0.019-0.199v-4.693c-2.044-23.98-22.014-42.67-46.348-42.67-0.206 0-0.411 0.001-0.616 0.004l0.031-0zM938.667 465.067c-23.564 0-42.667 19.103-42.667 42.667v0 9.387c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-9.387c0-23.564-19.103-42.667-42.667-42.667v0zM771.84 85.333h-8.107c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h8.107c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM938.667 853.333c-0.016-0-0.035-0-0.053-0-6.854 0-13.303 1.738-18.929 4.797l0.209-0.104c-14.165 7.054-23.756 21.377-23.893 37.955l-0 0.018c0 23.564 19.103 42.667 42.667 42.667v0c23.98-2.044 42.67-22.014 42.67-46.348 0-0.206-0.001-0.411-0.004-0.616l0 0.031c-2.24-21.656-20.391-38.401-42.453-38.401-0.075 0-0.15 0-0.225 0.001l0.012-0zM938.667 658.773c-23.564 0-42.667 19.103-42.667 42.667v0 9.387c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-11.093c0-23.564-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["image-resize-landscape"]},"attrs":[],"properties":{"order":5130,"id":554,"name":"image-resize-landscape","prevSize":32,"code":60299},"setIdx":0,"setId":0,"iconIdx":651},{"icon":{"paths":["M128 345.6c23.564 0 42.667-19.103 42.667-42.667v0-8.107c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 8.107c0 23.564 19.103 42.667 42.667 42.667v0zM128 174.933c6.539-0.109 12.687-1.672 18.17-4.378l-0.25 0.111c20.748-3.411 36.383-21.213 36.383-42.667 0-23.864-19.345-43.209-43.209-43.209-2.41 0-4.775 0.197-7.077 0.577l0.251-0.034h-4.267c-23.98 2.044-42.67 22.014-42.67 46.348 0 0.206 0.001 0.411 0.004 0.616l-0-0.031c1.168 22.628 19.8 40.533 42.613 40.533 0.019 0 0.037-0 0.056-0l-0.003 0zM869.973 166.827c7.18 5.68 16.366 9.112 26.354 9.112 23.564 0 42.667-19.103 42.667-42.667 0-1.858-0.119-3.689-0.349-5.484l0.022 0.213c0-23.564-19.103-42.667-42.667-42.667v0h-4.267c-23.559 0.007-42.654 19.107-42.654 42.667 0 15.53 8.298 29.123 20.702 36.586l0.193 0.107zM507.307 170.667h9.387c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-9.387c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM315.307 170.667h8.96c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-8.96c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM896 853.333c-6.539 0.109-12.687 1.672-18.17 4.378l0.25-0.111c-14.629 6.975-24.558 21.644-24.558 38.633 0 21.995 16.643 40.103 38.023 42.417l0.189 0.017h4.267c23.98-2.044 42.67-22.014 42.67-46.348 0-0.206-0.001-0.411-0.004-0.616l0 0.031c-2.24-21.656-20.391-38.401-42.453-38.401-0.075 0-0.15 0-0.225 0.001l0.012-0zM597.333 469.333c0-23.564-19.103-42.667-42.667-42.667v0h-415.147c-1.73-0.23-3.729-0.361-5.76-0.361s-4.030 0.131-5.991 0.386l0.231-0.025c-23.564 0-42.667 19.103-42.667 42.667v0 426.667c0 23.564 19.103 42.667 42.667 42.667v0h430.933c23.426-0.182 42.346-19.214 42.346-42.665 0-6.503-1.455-12.666-4.057-18.181l0.11 0.26zM512 853.333h-276.48l166.827-166.4c2.555-2.59 6.103-4.195 10.027-4.195s7.472 1.605 10.025 4.193l0.002 0.002 89.6 89.173zM512 655.787l-29.013-29.44c-18.116-17.975-43.067-29.083-70.613-29.083s-52.498 11.108-70.62 29.089l0.006-0.006-170.667 170.667v-285.013h341.333zM896 655.787c-23.564 0-42.667 19.103-42.667 42.667v0 8.96c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-7.68c0-23.564-19.103-42.667-42.667-42.667v0zM896 271.787c-23.564 0-42.667 19.103-42.667 42.667v0 9.813c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-8.96c0-23.564-19.103-42.667-42.667-42.667v0zM896 463.787c-23.564 0-42.667 19.103-42.667 42.667v0 9.387c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-9.387c-0.479-23.194-19.394-41.813-42.658-41.813-0.003 0-0.006 0-0.009 0l0-0zM729.6 853.333h-8.533c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h8.533c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM708.693 170.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-8.96c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["image-resize-square"]},"attrs":[],"properties":{"order":5131,"id":553,"name":"image-resize-square","prevSize":32,"code":60300},"setIdx":0,"setId":0,"iconIdx":652},{"icon":{"paths":["M810.667 554.667c-23.564 0-42.667 19.103-42.667 42.667v0 16.64l-63.147-63.147c-21.508-21.343-51.134-34.533-83.84-34.533s-62.332 13.19-83.848 34.541l0.008-0.007-29.867 29.867-105.813-106.24c-21.853-20.566-51.371-33.203-83.84-33.203s-61.987 12.637-83.903 33.261l0.063-0.059-63.147 63.573v-239.36c0-23.564 19.103-42.667 42.667-42.667v0h170.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-170.667c-70.692 0-128 57.308-128 128v0 512c0 70.692 57.308 128 128 128v0h512c70.692 0 128-57.308 128-128v0-213.333c0-23.564-19.103-42.667-42.667-42.667v0zM213.333 853.333c-23.564 0-42.667-19.103-42.667-42.667v0-152.32l123.733-123.307c6.036-5.76 14.231-9.305 23.253-9.305s17.217 3.545 23.267 9.318l-0.013-0.013 318.293 318.293zM768 810.667c-0.296 8.659-3.127 16.602-7.77 23.174l0.090-0.134-192.427-193.707 29.867-29.44c5.968-6.087 14.277-9.861 23.467-9.861s17.499 3.773 23.461 9.855l0.005 0.005 123.307 124.16zM926.293 439.040l-72.96-73.387c17.095-27.396 27.231-60.664 27.231-96.3 0-101.561-82.332-183.893-183.893-183.893s-183.893 82.332-183.893 183.893c0 50.768 20.573 96.731 53.836 130.007l-0-0c32.727 32.926 77.938 53.412 127.934 53.76l0.066 0c0.685 0.009 1.494 0.014 2.304 0.014 35.239 0 68.178-9.843 96.219-26.93l-0.817 0.462 73.387 73.813c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c8.055-7.772 13.057-18.662 13.057-30.72s-5.002-22.948-13.044-30.708l-0.013-0.012zM768 341.333c-17.936 18.053-42.777 29.227-70.228 29.227-54.669 0-98.987-44.318-98.987-98.987s44.318-98.987 98.987-98.987c27.451 0 52.292 11.174 70.222 29.221l0.005 0.005c17.774 17.889 28.759 42.542 28.759 69.76s-10.985 51.871-28.764 69.765l0.005-0.005z"],"attrs":[],"grid":0,"tags":["image-search"]},"attrs":[],"properties":{"order":5132,"id":552,"name":"image-search","prevSize":32,"code":60301},"setIdx":0,"setId":0,"iconIdx":653},{"icon":{"paths":["M853.333 298.667c-18.957 0.064-36.446 6.3-50.575 16.802l0.228-0.162-74.667-34.133 82.347-37.547c12.169 7.502 26.854 12.065 42.582 12.372l0.085 0.001c47.128 0 85.333-38.205 85.333-85.333s-38.205-85.333-85.333-85.333c-47.128 0-85.333 38.205-85.333 85.333v0l-80.64 37.12c-13.734-9.857-30.884-15.762-49.413-15.762-47.128 0-85.333 38.205-85.333 85.333s38.205 85.333 85.333 85.333c0.722 0 1.441-0.009 2.159-0.027l-0.106 0.002c0.011 0 0.024 0 0.037 0 14.407 0 27.926-3.798 39.612-10.447l-0.396 0.207 89.6 42.667c5.679 42.113 41.392 74.24 84.609 74.24 47.128 0 85.333-38.205 85.333-85.333s-38.205-85.333-85.333-85.333c-0.045 0-0.091 0-0.136 0l0.007-0zM810.667 554.667c-23.564 0-42.667 19.103-42.667 42.667v0 16.64l-63.147-63.147c-21.414-21.549-51.069-34.886-83.84-34.886s-62.426 13.337-83.834 34.88l-0.006 0.006-29.867 29.867-105.813-106.24c-21.508-21.343-51.134-34.533-83.84-34.533s-62.332 13.19-83.848 34.541l0.008-0.007-63.147 63.147v-238.933c0-23.564 19.103-42.667 42.667-42.667v0h213.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-213.333c-70.692 0-128 57.308-128 128v0 512c0 70.692 57.308 128 128 128v0h512c70.692 0 128-57.308 128-128v0-213.333c0-23.564-19.103-42.667-42.667-42.667v0zM213.333 853.333c-23.564 0-42.667-19.103-42.667-42.667v0-152.32l123.733-123.733c6.036-5.76 14.231-9.305 23.253-9.305s17.217 3.545 23.267 9.318l-0.013-0.013 135.253 135.253 183.040 183.467zM768 810.667c-0.066 8.541-2.942 16.399-7.748 22.706l0.068-0.093-192.427-193.28 29.867-29.867c6.016-5.983 14.309-9.682 23.467-9.682s17.451 3.699 23.468 9.683l-0.001-0.001 123.307 124.587z"],"attrs":[],"grid":0,"tags":["image-share"]},"attrs":[],"properties":{"order":5133,"id":551,"name":"image-share","prevSize":32,"code":60302},"setIdx":0,"setId":0,"iconIdx":654},{"icon":{"paths":["M944.213 100.693c-7.264-5.913-16.631-9.495-26.834-9.495-3.19 0-6.299 0.35-9.29 1.014l0.284-0.053c-7.529 1.753-16.174 2.757-25.054 2.757-25.929 0-49.858-8.567-69.11-23.024l0.297 0.213c-6.96-5.134-15.707-8.217-25.173-8.217s-18.213 3.083-25.291 8.3l0.117-0.083c-18.955 14.244-42.884 22.811-68.813 22.811-8.88 0-17.525-1.005-25.828-2.907l0.774 0.149c-2.707-0.611-5.816-0.961-9.006-0.961-10.203 0-19.57 3.582-26.912 9.556l0.078-0.062c-9.665 7.885-15.787 19.795-15.787 33.135 0 0.051 0 0.102 0 0.153l-0-0.008v141.227c-0 0.064-0 0.139-0 0.215 0 64.181 30.607 121.214 78.022 157.298l0.485 0.354 66.987 49.493c6.96 5.134 15.707 8.217 25.173 8.217s18.213-3.083 25.291-8.3l-0.117 0.083 66.987-49.493c47.899-36.438 78.507-93.471 78.507-157.652 0-0.075-0-0.151-0-0.226l0 0.012v-141.227c0-0.043 0-0.094 0-0.145 0-13.34-6.122-25.25-15.71-33.074l-0.077-0.061zM874.667 275.2c0.005 0.39 0.008 0.85 0.008 1.311 0 35.542-16.587 67.209-42.441 87.684l-0.233 0.178-42.667 30.72-42.667-30.72c-26.088-20.653-42.674-52.321-42.674-87.862 0-0.461 0.003-0.921 0.008-1.381l-0.001 0.070v-95.147c31.422-1.51 60.577-9.858 86.446-23.578l-1.113 0.538c24.757 13.182 53.911 21.53 84.864 23.022l0.469 0.018zM789.333 576c-23.564 0-42.667 19.103-42.667 42.667v0 16.64l-64-63.147c-21.414-21.549-51.069-34.886-83.84-34.886s-62.426 13.337-83.834 34.88l-0.006 0.006-29.867 29.867-104.96-106.24c-21.771-20.754-51.314-33.524-83.84-33.524s-62.069 12.77-83.889 33.57l0.049-0.046-63.147 63.147v-238.933c0-23.564 19.103-42.667 42.667-42.667v0h298.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-298.667c-70.692 0-128 57.308-128 128v0 512c0 70.692 57.308 128 128 128v0h512c70.692 0 128-57.308 128-128v0-213.333c0-23.564-19.103-42.667-42.667-42.667v0zM192 874.667c-23.564 0-42.667-19.103-42.667-42.667v0-152.32l123.733-125.013c6.036-5.76 14.231-9.305 23.253-9.305s17.217 3.545 23.267 9.318l-0.013-0.013 135.253 135.253 185.173 184.747zM746.667 832c-0.383 8.509-3.202 16.29-7.77 22.747l0.090-0.133-192.427-192.427 29.867-29.867c6.016-5.983 14.309-9.682 23.467-9.682s17.451 3.699 23.468 9.683l-0.001-0.001 123.307 123.733z"],"attrs":[],"grid":0,"tags":["image-shield"]},"attrs":[],"properties":{"order":5134,"id":550,"name":"image-shield","prevSize":32,"code":60303},"setIdx":0,"setId":0,"iconIdx":655},{"icon":{"paths":["M832 170.667h-405.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h405.333c23.564 0 42.667 19.103 42.667 42.667v0 288.427l-80.213-80.213c-13.344-13.276-29.608-23.632-47.743-30.018l-0.897-0.275c-4.073-1.418-8.767-2.238-13.653-2.238-23.622 0-42.771 19.149-42.771 42.771 0 18.736 12.047 34.658 28.817 40.443l0.301 0.090c6.102 1.958 11.283 5.348 15.336 9.786l0.024 0.027 141.227 140.373c-0.116 0.96-0.182 2.072-0.182 3.2s0.066 2.24 0.195 3.333l-0.013-0.133c-0.092 0.959-0.145 2.073-0.145 3.2s0.053 2.241 0.156 3.341l-0.011-0.141c1.72 2.902 3.552 5.414 5.595 7.736l-0.048-0.056c1.082 1.799 2.356 3.344 3.823 4.678l0.017 0.015c2.472 2.293 5.277 4.281 8.322 5.873l0.212 0.101c1.352 0.946 2.896 1.803 4.526 2.497l0.167 0.063c4.639 2.138 10.064 3.393 15.779 3.413l0.007 0c23.564 0 42.667-19.103 42.667-42.667v0-403.627c0-0.017 0-0.037 0-0.058 0-69.342-55.139-125.806-123.964-127.938l-0.196-0.005zM136.96 97.707c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l59.307 59.307c-18.043 21.879-28.992 50.192-29.013 81.062l-0 0.004v426.667c0 70.692 57.308 128 128 128v0h537.173l72.533 72.96c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003zM192 298.667c0.113-7.208 1.996-13.952 5.231-19.848l-0.111 0.222 116.053 115.627c-16.558 6.407-30.743 15.52-42.719 26.929l0.052-0.049-78.507 80.213zM234.667 768c-23.564 0-42.667-19.103-42.667-42.667v0-103.253l140.8-140.373c7.69-7.542 18.235-12.197 29.867-12.197s22.177 4.655 29.874 12.203l-0.007-0.007 286.293 286.293z"],"attrs":[],"grid":0,"tags":["image-slash"]},"attrs":[],"properties":{"order":5135,"id":549,"name":"image-slash","prevSize":32,"code":60304},"setIdx":0,"setId":0,"iconIdx":656},{"icon":{"paths":["M810.667 426.667c-23.564 0-42.667 19.103-42.667 42.667v0 144.64l-63.147-63.147c-21.414-21.549-51.069-34.886-83.84-34.886s-62.426 13.337-83.834 34.88l-0.006 0.006-29.867 29.867-105.813-106.24c-21.508-21.343-51.134-34.533-83.84-34.533s-62.332 13.19-83.848 34.541l0.008-0.007-63.147 63.147v-238.933c0-23.564 19.103-42.667 42.667-42.667v0h341.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-341.333c-70.692 0-128 57.308-128 128v0 512c0 70.692 57.308 128 128 128v0h512c70.692 0 128-57.308 128-128v0-341.333c0-23.564-19.103-42.667-42.667-42.667v0zM213.333 853.333c-23.564 0-42.667-19.103-42.667-42.667v0-152.32l123.733-123.733c6.036-5.76 14.231-9.305 23.253-9.305s17.217 3.545 23.267 9.318l-0.013-0.013 135.253 135.253 183.040 183.467zM768 810.667c-0.066 8.541-2.942 16.399-7.748 22.706l0.068-0.093-192.427-193.28 29.867-29.867c6.016-5.983 14.309-9.682 23.467-9.682s17.451 3.699 23.468 9.683l-0.001-0.001 123.307 124.587zM870.827 213.333l55.467-55.040c7.668-7.712 12.407-18.343 12.407-30.080s-4.74-22.368-12.409-30.082l0.002 0.002c-7.733-7.795-18.45-12.621-30.293-12.621s-22.56 4.826-30.291 12.618l-0.003 0.003-55.040 55.040-55.040-55.040c-7.733-7.795-18.45-12.621-30.293-12.621s-22.56 4.826-30.291 12.618l-0.003 0.003c-7.668 7.712-12.407 18.343-12.407 30.080s4.74 22.368 12.409 30.082l-0.002-0.002 55.467 55.040-55.467 55.467c-7.668 7.712-12.407 18.343-12.407 30.080s4.74 22.368 12.409 30.082l-0.002-0.002c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 55.040-55.040 55.040 55.040c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.668-7.712 12.407-18.343 12.407-30.080s-4.74-22.368-12.409-30.082l0.002 0.002z"],"attrs":[],"grid":0,"tags":["image-times"]},"attrs":[],"properties":{"order":5136,"id":548,"name":"image-times","prevSize":32,"code":60305},"setIdx":0,"setId":0,"iconIdx":657},{"icon":{"paths":["M810.667 554.667c-23.564 0-42.667 19.103-42.667 42.667v0 16.213l-63.147-63.147c-21.508-21.343-51.134-34.533-83.84-34.533s-62.332 13.19-83.848 34.541l0.008-0.007-29.867 29.867-105.813-105.813c-21.771-20.754-51.314-33.524-83.84-33.524s-62.069 12.77-83.889 33.57l0.049-0.046-63.147 63.147v-238.933c0-23.564 19.103-42.667 42.667-42.667v0h298.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-298.667c-70.692 0-128 57.308-128 128v0 512c0 70.692 57.308 128 128 128v0h512c70.692 0 128-57.308 128-128v0-213.333c0-23.564-19.103-42.667-42.667-42.667v0zM213.333 853.333c-23.564 0-42.667-19.103-42.667-42.667v0-152.32l123.733-123.733c6.036-5.76 14.231-9.305 23.253-9.305s17.217 3.545 23.267 9.318l-0.013-0.013 318.72 318.72zM768 810.667c-0.066 8.541-2.942 16.399-7.748 22.706l0.068-0.093-192.427-193.28 29.867-29.867c5.968-6.087 14.277-9.861 23.467-9.861s17.499 3.773 23.461 9.855l0.005 0.005 123.307 124.16zM968.96 183.040l-128-128c-3.937-3.773-8.616-6.808-13.791-8.859l-0.289-0.101c-4.793-2.024-10.366-3.201-16.213-3.201s-11.42 1.176-16.495 3.305l0.281-0.105c-5.464 2.152-10.143 5.187-14.095 8.974l0.015-0.014-128 128c-7.753 7.753-12.548 18.463-12.548 30.293 0 23.661 19.181 42.841 42.841 42.841 11.83 0 22.541-4.795 30.293-12.548l-0 0 55.040-55.467v238.507c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-238.507l55.040 55.467c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003z"],"attrs":[],"grid":0,"tags":["image-upload"]},"attrs":[],"properties":{"order":5137,"id":547,"name":"image-upload","prevSize":32,"code":60306},"setIdx":0,"setId":0,"iconIdx":658},{"icon":{"paths":["M810.667 85.333h-597.333c-70.692 0-128 57.308-128 128v0 597.333c0 70.692 57.308 128 128 128v0h597.333c7.462-0.107 14.674-0.879 21.667-2.258l-0.761 0.125 12.8-2.987h5.12l15.787-5.973 5.547-2.987c4.267-2.56 8.96-4.693 13.227-7.68 5.997-4.436 11.284-8.911 16.266-13.703l-0.052 0.050 2.987-3.84c4.082-4.135 7.862-8.592 11.29-13.32l0.23-0.333 3.84-5.547c2.713-4.245 5.287-9.154 7.438-14.284l0.242-0.65c1.055-1.801 2.060-3.911 2.889-6.106l0.097-0.294c2.133-5.12 3.413-10.667 5.12-16.213v-6.4c2.282-7.555 3.809-16.305 4.256-25.34l0.010-0.26v-597.333c0-70.692-57.308-128-128-128v0zM213.333 853.333c-23.564 0-42.667-19.103-42.667-42.667v0-183.893l140.373-140.8c7.733-7.795 18.45-12.621 30.293-12.621s22.56 4.826 30.291 12.618l0.003 0.003 366.933 367.36zM853.333 810.667c-0.044 5.54-1.136 10.813-3.089 15.646l0.102-0.286c-1.089 2.306-2.227 4.264-3.506 6.116l0.093-0.142c-1.227 1.927-2.491 3.599-3.877 5.162l0.037-0.042-228.267-228.267 37.547-37.547c7.733-7.795 18.45-12.621 30.293-12.621s22.56 4.826 30.291 12.618l0.003 0.003 140.373 140.8zM853.333 591.36l-80.213-79.36c-23.51-22.342-55.377-36.084-90.453-36.084s-66.943 13.743-90.51 36.137l0.056-0.053-37.547 37.547-122.88-122.88c-23.51-22.342-55.377-36.084-90.453-36.084s-66.943 13.743-90.51 36.137l0.056-0.053-80.213 79.36v-292.693c0-23.564 19.103-42.667 42.667-42.667v0h597.333c23.564 0 42.667 19.103 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["image-v"]},"attrs":[],"properties":{"order":5138,"id":546,"name":"image-v","prevSize":32,"code":60307},"setIdx":0,"setId":0,"iconIdx":659},{"icon":{"paths":["M810.667 170.667h-597.333c-70.692 0-128 57.308-128 128v0 426.667c0 70.692 57.308 128 128 128v0h597.333c70.692 0 128-57.308 128-128v0-426.667c0-70.692-57.308-128-128-128v0zM213.333 768c-23.564 0-42.667-19.103-42.667-42.667v0-103.253l140.8-140.373c7.69-7.542 18.235-12.197 29.867-12.197s22.177 4.655 29.874 12.203l-0.007-0.007 286.293 286.293zM853.333 725.333c0 23.564-19.103 42.667-42.667 42.667v0h-32.853l-162.56-163.413 37.547-37.547c7.69-7.542 18.235-12.197 29.867-12.197s22.177 4.655 29.874 12.203l-0.007-0.007 140.8 140.373zM853.333 587.093l-80.213-79.787c-23.426-22.533-55.319-36.411-90.453-36.411s-67.027 13.878-90.496 36.451l0.042-0.041-37.547 37.547-122.88-122.88c-23.426-22.533-55.319-36.411-90.453-36.411s-67.027 13.878-90.496 36.451l0.042-0.041-80.213 79.787v-203.093c0-23.564 19.103-42.667 42.667-42.667v0h597.333c23.564 0 42.667 19.103 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["image"]},"attrs":[],"properties":{"order":5139,"id":545,"name":"image","prevSize":32,"code":60308},"setIdx":0,"setId":0,"iconIdx":660},{"icon":{"paths":["M768 640v-426.667c0-70.692-57.308-128-128-128v0h-426.667c-70.692 0-128 57.308-128 128v0 426.667c0 70.692 57.308 128 128 128v0h426.667c70.692 0 128-57.308 128-128v0zM170.667 213.333c0-23.564 19.103-42.667 42.667-42.667v0h426.667c23.564 0 42.667 19.103 42.667 42.667v0 186.027l-46.080-46.507c-19.763-19.767-47.067-31.995-77.226-32l-0.001-0c-30.143 0.105-57.416 12.308-77.232 32.005l0.005-0.005-38.827 38.827-34.56-34.56c-22.549-22.198-53.514-35.904-87.68-35.904s-65.131 13.706-87.696 35.92l0.016-0.016-62.72 63.147zM175.787 659.2c-3.155-5.528-5.045-12.136-5.12-19.178l-0-0.022v-99.413l122.88-122.88c7.033-7.065 16.766-11.438 27.52-11.438s20.487 4.372 27.519 11.436l0.001 0.001 35.413 34.56zM542.72 413.44c4.073-4.464 9.916-7.255 16.41-7.255 0.081 0 0.162 0 0.243 0.001l-0.012-0c0.068-0.001 0.149-0.001 0.23-0.001 6.494 0 12.337 2.79 16.394 7.237l0.016 0.017 106.667 106.24v120.32c0 23.564-19.103 42.667-42.667 42.667v0h-366.933zM896 256c-23.564 0-42.667 19.103-42.667 42.667v0 426.667c0 70.692-57.308 128-128 128v0h-426.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h426.667c117.821 0 213.333-95.513 213.333-213.333v0-426.667c0-23.564-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["images"]},"attrs":[],"properties":{"order":5140,"id":544,"name":"images","prevSize":32,"code":60309},"setIdx":0,"setId":0,"iconIdx":661},{"icon":{"paths":["M896 597.333c-23.564 0-42.667 19.103-42.667 42.667v0 170.667c0 23.564-19.103 42.667-42.667 42.667v0h-597.333c-23.564 0-42.667-19.103-42.667-42.667v0-170.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 170.667c0 70.692 57.308 128 128 128v0h597.333c70.692 0 128-57.308 128-128v0-170.667c0-23.564-19.103-42.667-42.667-42.667v0zM481.707 670.293c3.937 3.773 8.616 6.808 13.791 8.859l0.289 0.101c4.771 2.163 10.345 3.423 16.213 3.423s11.443-1.26 16.466-3.525l-0.253 0.102c5.464-2.152 10.143-5.187 14.095-8.974l-0.015 0.014 170.667-170.667c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l0-0-97.707 98.133v-409.173c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 409.173l-97.707-98.133c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l0 0z"],"attrs":[],"grid":0,"tags":["import"]},"attrs":[],"properties":{"order":5141,"id":543,"name":"import","prevSize":32,"code":60310},"setIdx":0,"setId":0,"iconIdx":662},{"icon":{"paths":["M813.041 85.333h-597.333c-70.66 0.080-127.92 57.339-128 127.992l-0 0.008v597.333c0.080 70.66 57.339 127.92 127.992 128l597.341 0c70.66-0.080 127.92-57.339 128-127.992l0-0.008v-597.333c-0.080-70.66-57.339-127.92-127.992-128l-0.008-0zM215.708 170.667h597.333c23.554 0.024 42.642 19.112 42.667 42.664l0 0.002v341.333h-105.167c-0.021-0-0.045-0-0.069-0-29.466 0-55.438 14.958-70.738 37.695l-0.193 0.305-60 90h-210.333l-60-90c-15.493-23.042-41.465-38-70.931-38-0.024 0-0.049 0-0.073 0l-105.163-0v-341.333c0.024-23.554 19.112-42.642 42.664-42.667l0.002-0zM813.041 853.333h-597.333c-23.554-0.024-42.642-19.112-42.667-42.664l-0-0.002v-170.667h105.167l60 90c15.493 23.042 41.465 38 70.931 38 0.024 0 0.049-0 0.073-0l210.33 0c0.021 0 0.045 0 0.069 0 29.466 0 55.438-14.958 70.738-37.695l0.193-0.305 60-90h105.167v170.667c-0.024 23.554-19.112 42.642-42.664 42.667l-0.002 0z"],"attrs":[],"grid":0,"tags":["inbox"]},"attrs":[],"properties":{"order":5142,"id":542,"name":"inbox","prevSize":32,"code":60311},"setIdx":0,"setId":0,"iconIdx":663},{"icon":{"paths":["M663.467 384c4.822 1.892 10.406 2.988 16.246 2.988 0.139 0 0.277-0.001 0.415-0.002l-0.021 0h170.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-67.84l140.373-140.373c9.153-7.872 14.914-19.467 14.914-32.407 0-23.564-19.103-42.667-42.667-42.667-12.94 0-24.535 5.761-32.36 14.858l-0.047 0.056-140.373 139.947v-67.84c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 170.667c-0.001 0.117-0.002 0.256-0.002 0.394 0 5.84 1.097 11.424 3.095 16.557l-0.107-0.311c4.333 10.633 12.51 18.948 22.763 23.36l0.277 0.106zM829.44 554.667c-9.387 0-19.2-2.987-28.587-5.12-21.902-4.865-40.587-10.588-58.643-17.576l2.75 0.936c-8.677-3.257-18.705-5.142-29.174-5.142-33.468 0-62.435 19.267-76.416 47.314l-0.223 0.495-9.387 19.2c-43.295-24.339-80.587-52.66-113.523-85.363l0.030 0.030c-32.673-32.906-60.995-70.199-83.986-110.901l-1.347-2.593 17.92-11.947c28.542-14.205 47.808-43.172 47.808-76.64 0-10.468-1.885-20.497-5.334-29.763l0.192 0.59c-5.868-15.079-11.586-33.757-16.055-52.915l-0.585-2.978c-2.133-9.387-3.84-19.2-5.12-29.013-10.754-60.726-63.13-106.254-126.139-106.254-0.654 0-1.307 0.005-1.959 0.015l0.099-0.001h-128c-0.357-0.004-0.779-0.006-1.202-0.006-70.692 0-128 57.308-128 128 0 6.172 0.437 12.242 1.281 18.18l-0.079-0.681c48.095 367.748 336.77 655.549 700.837 701.876l4.017 0.417h16.213c0.056 0 0.122 0 0.188 0 32.752 0 62.631-12.301 85.269-32.536l-0.124 0.109c26.238-23.54 42.668-57.555 42.668-95.407 0-0.209-0-0.417-0.001-0.625l0 0.032v-128c-1.124-61.764-45.825-112.764-104.599-123.613l-0.788-0.121zM850.773 810.667c-0.017 12.731-5.606 24.153-14.46 31.96l-0.047 0.040c-7.878 6.831-18.231 10.994-29.556 10.994-1.914 0-3.8-0.119-5.652-0.35l0.221 0.022c-328.712-43.345-585.857-301.508-627.254-627.021l-0.373-3.593c-0.173-1.507-0.272-3.254-0.272-5.023 0-11.447 4.136-21.929 10.995-30.031l-0.056 0.068c7.847-8.9 19.269-14.49 31.997-14.507l0.003-0h128c0.283-0.007 0.615-0.011 0.949-0.011 20.394 0 37.446 14.308 41.665 33.434l0.052 0.283q2.56 17.493 6.4 34.56c5.721 25.899 12.474 48.010 20.728 69.374l-1.101-3.241-59.733 27.733c-14.801 6.91-24.874 21.669-24.874 38.78 0 6.52 1.463 12.699 4.078 18.226l-0.11-0.259c62.648 132.060 166.607 236.019 294.925 297.065l3.741 1.602c4.793 2.024 10.366 3.201 16.213 3.201s11.42-1.176 16.495-3.305l-0.281 0.105c10.842-3.955 19.439-11.858 24.21-21.927l0.11-0.259 26.453-59.733c17.866 6.724 40.404 13.471 63.467 18.851l3.947 0.776q17.067 3.84 34.56 6.4c19.409 4.271 33.717 21.324 33.717 41.718 0 0.334-0.004 0.667-0.011 0.999l0.001-0.049z"],"attrs":[],"grid":0,"tags":["incoming-call"]},"attrs":[],"properties":{"order":5143,"id":541,"name":"incoming-call","prevSize":32,"code":60312},"setIdx":0,"setId":0,"iconIdx":664},{"icon":{"paths":["M512 85.333c-235.641 0-426.667 191.025-426.667 426.667s191.025 426.667 426.667 426.667c235.641 0 426.667-191.025 426.667-426.667v0c-0.27-235.533-191.134-426.396-426.641-426.667l-0.026-0zM512 853.333c-188.513 0-341.333-152.82-341.333-341.333s152.82-341.333 341.333-341.333c188.513 0 341.333 152.82 341.333 341.333v0c-0.223 188.424-152.91 341.111-341.312 341.333l-0.021 0zM512 490.667c-23.564 0-42.667 19.103-42.667 42.667v0 128c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-128c0-23.564-19.103-42.667-42.667-42.667v0zM512 320c-29.455 0-53.333 23.878-53.333 53.333s23.878 53.333 53.333 53.333c29.455 0 53.333-23.878 53.333-53.333v0c0-29.455-23.878-53.333-53.333-53.333v0z"],"attrs":[],"grid":0,"tags":["info-circle"]},"attrs":[],"properties":{"order":5144,"id":540,"name":"info-circle","prevSize":32,"code":60313},"setIdx":0,"setId":0,"iconIdx":665},{"icon":{"paths":["M512 406.187c-58.439 0-105.813 47.374-105.813 105.813s47.374 105.813 105.813 105.813c58.439 0 105.813-47.374 105.813-105.813v0c0-58.439-47.374-105.813-105.813-105.813v0zM935.68 301.653c-0.244-34.709-6.797-67.816-18.566-98.331l0.646 1.904c-17.708-45.762-53.224-81.278-97.823-98.589l-1.164-0.398c-28.61-11.123-61.718-17.676-96.324-17.919l-0.102-0.001c-55.040-2.987-71.253-2.987-210.347-2.987s-155.307 0-210.347 2.987c-34.709 0.244-67.816 6.797-98.331 18.566l1.904-0.646c-45.762 17.708-81.278 53.224-98.589 97.823l-0.398 1.164c-11.123 28.61-17.676 61.718-17.919 96.324l-0.001 0.102c-2.987 55.040-2.987 71.253-2.987 210.347s0 155.307 2.987 210.347c0.5 34.894 7.028 68.113 18.585 98.871l-0.665-2.018c9.008 23.342 22.202 43.253 38.815 59.721l0.012 0.012c16.559 16.725 36.63 29.938 59.020 38.446l1.14 0.38c28.61 11.123 61.718 17.676 96.324 17.919l0.102 0.001c55.040 2.987 71.253 2.987 210.347 2.987s155.307 0 210.347-2.987c34.709-0.244 67.816-6.797 98.331-18.566l-1.904 0.646c23.53-8.888 43.601-22.102 60.146-38.813l0.014-0.014c16.625-16.48 29.819-36.392 38.435-58.587l0.392-1.146c11.112-28.743 17.663-61.995 17.919-96.745l0.001-0.109c2.987-55.040 2.987-71.253 2.987-210.347s0-155.307-2.987-210.347zM827.307 642.987c-1.496 27.998-7.471 54.184-17.224 78.444l0.584-1.644c-17.098 41.483-49.397 73.782-89.787 90.48l-1.093 0.4c-22.861 8.683-49.286 14.086-76.859 14.924l-0.368 0.009c-33.707 0-42.667 0-130.56 0s-96.853 0-130.56 0c-27.941-0.847-54.365-6.251-78.911-15.489l1.685 0.556c-21.947-8.294-40.623-20.797-55.845-36.643l-0.048-0.050c-15.063-14.918-26.968-32.995-34.643-53.158l-0.344-1.028c-8.737-22.9-14.014-49.373-14.504-77.015l-0.003-0.211c0-33.707 0-42.667 0-130.56s0-96.853 0-130.56c0.492-27.853 5.77-54.327 15.042-78.838l-0.535 1.611c8.294-21.947 20.797-40.623 36.643-55.845l0.050-0.048c14.973-14.975 33.032-26.864 53.14-34.631l1.046-0.355c22.861-8.683 49.286-14.086 76.859-14.924l0.368-0.009c33.707 0 42.667 0 130.56 0s96.853 0 130.56 0c27.941 0.847 54.365 6.251 78.911 15.489l-1.685-0.556c21.947 8.294 40.623 20.797 55.845 36.643l0.048 0.050c15.063 14.918 26.968 32.995 34.643 53.158l0.344 1.028c8.683 22.861 14.086 49.286 14.924 76.859l0.009 0.368c0 33.707 0 42.667 0 130.56s2.987 96.853 1.707 130.56zM759.040 325.547c-10.513-27.968-32.192-49.647-59.461-59.929l-0.699-0.231c-16.657-5.965-35.873-9.413-55.895-9.413-1.049 0-2.097 0.009-3.142 0.028l0.157-0.002c-33.28 0-42.667 0-128 0s-94.72 0-128 0c-21.215 0.214-41.421 4.265-60.044 11.491l1.164-0.397c-27.589 10.056-49.155 30.926-59.915 57.348l-0.245 0.679c-5.691 16.866-8.976 36.289-8.976 56.48 0 0.844 0.006 1.686 0.017 2.528l-0.001-0.127c0 33.28 0 42.667 0 128s0 94.72 0 128c0.461 21.252 4.489 41.425 11.507 60.137l-0.413-1.257c10.513 27.968 32.192 49.647 59.461 59.929l0.699 0.231c16.787 6.373 36.192 10.381 56.436 11.085l0.311 0.009c33.28 0 42.667 0 128 0s94.72 0 128 0c21.215-0.214 41.421-4.265 60.044-11.491l-1.164 0.397c27.968-10.513 49.647-32.192 59.929-59.461l0.231-0.699c6.828-17.459 10.88-37.665 11.093-58.791l0.001-0.089c0-33.28 0-42.667 0-128s0-94.72 0-128c0-0.029 0-0.064 0-0.099 0-21.154-4.073-41.358-11.477-59.868l0.384 1.087zM512 674.987c-0 0-0 0-0.001 0-89.779 0-162.56-72.781-162.56-162.56 0-0.15 0-0.3 0.001-0.45l-0 0.023c0-90.015 72.972-162.986 162.987-162.986s162.987 72.972 162.987 162.987c0 90.015-72.972 162.987-162.987 162.987-0.15 0-0.3-0-0.45-0.001l0.023 0zM682.667 381.013c-19.397-2.113-34.358-18.403-34.358-38.187s14.961-36.073 34.187-38.172l0.171-0.015c19.397 2.113 34.358 18.403 34.358 38.187s-14.961 36.073-34.187 38.172l-0.171 0.015z"],"attrs":[],"grid":0,"tags":["instagram-alt"]},"attrs":[],"properties":{"order":5145,"id":539,"name":"instagram-alt","prevSize":32,"code":60314},"setIdx":0,"setId":0,"iconIdx":666},{"icon":{"paths":["M512 426.667c-23.564 0-42.667 19.103-42.667 42.667v0 256c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-256c0-23.564-19.103-42.667-42.667-42.667v0zM512 256c-29.455 0-53.333 23.878-53.333 53.333s23.878 53.333 53.333 53.333c29.455 0 53.333-23.878 53.333-53.333v0c0-29.455-23.878-53.333-53.333-53.333v0z"],"attrs":[],"grid":0,"tags":["info"]},"attrs":[],"properties":{"order":5146,"id":538,"name":"info","prevSize":32,"code":60315},"setIdx":0,"setId":0,"iconIdx":667},{"icon":{"paths":["M739.84 232.96v0c-28.277 0-51.2 22.923-51.2 51.2s22.923 51.2 51.2 51.2c28.277 0 51.2-22.923 51.2-51.2h0c-0-28.277-22.923-51.2-51.2-51.2h0zM936.107 336.213c-0.904-37.445-8.023-72.954-20.36-105.915l0.733 2.235c-11.453-29.551-28.275-54.735-49.457-75.485l-0.036-0.035c-20.63-21.334-45.873-38.070-74.135-48.614l-1.385-0.453c-30.704-11.967-66.225-19.254-103.344-20.048l-0.336-0.006c-45.227-2.56-59.733-2.56-175.787-2.56s-130.56 0-175.787 2.56c-37.455 0.799-72.976 8.086-105.807 20.777l2.127-0.723c-29.606 11.111-54.828 27.828-75.477 49.023l-0.043 0.044c-21.334 20.63-38.070 45.873-48.614 74.135l-0.453 1.385c-11.967 30.704-19.254 66.225-20.048 103.344l-0.006 0.336c-2.56 45.227-2.56 59.733-2.56 175.787s0 130.56 2.56 175.787c0.799 37.455 8.086 72.976 20.777 105.807l-0.723-2.127c10.997 29.647 27.733 54.89 49.011 75.466l0.056 0.054c20.692 21.238 45.914 37.955 74.116 48.602l1.404 0.465c30.704 11.967 66.225 19.254 103.344 20.048l0.336 0.006c45.227 2.56 59.733 2.56 175.787 2.56s130.56 0 175.787-2.56c37.455-0.799 72.976-8.086 105.807-20.777l-2.127 0.723c29.647-10.997 54.89-27.733 75.466-49.011l0.054-0.056c21.32-20.72 38.161-45.925 49.014-74.105l0.479-1.415c11.604-30.726 18.723-66.235 19.619-103.287l0.008-0.393c0-45.227 2.56-59.733 2.56-175.787s0-130.56-2.56-175.787zM859.307 682.667c-0.338 28.567-5.628 55.797-15.048 81.013l0.541-1.653c-7.189 19.266-18.101 35.665-31.96 49.029l-0.040 0.038c-13.499 13.748-29.866 24.63-48.137 31.684l-0.93 0.316c-23.562 8.879-50.792 14.169-79.213 14.505l-0.147 0.001c-42.667 2.133-58.453 2.56-170.667 2.56s-128 0-170.667-2.56c-1.362 0.027-2.967 0.043-4.577 0.043-27.985 0-54.872-4.702-79.914-13.359l1.718 0.516c-18.336-7.727-33.946-18.55-46.894-31.959l-0.039-0.041c-13.81-13.379-24.597-29.795-31.29-48.177l-0.283-0.89c-9.935-23.914-16.117-51.64-17.057-80.69l-0.010-0.377c0-42.667-2.56-58.453-2.56-170.667s0-128 2.56-170.667c0.208-29.17 5.667-57.004 15.477-82.688l-0.544 1.621c7.869-18.572 19.309-34.253 33.566-46.812l0.141-0.122c12.772-14.406 28.42-25.954 46.080-33.795l0.854-0.339c24.092-8.973 51.925-14.271 80.963-14.506l0.103-0.001c42.667 0 58.453-2.56 170.667-2.56s128 0 170.667 2.56c28.567 0.338 55.797 5.628 81.013 15.048l-1.653-0.541c20.059 7.573 37.064 19.228 50.689 34.040l0.085 0.093c13.672 12.839 24.536 28.496 31.686 46.060l0.314 0.873c9.073 24.095 14.381 51.942 14.506 81.013l0 0.054c2.133 42.667 2.56 58.453 2.56 170.667s-0.427 128-2.56 170.667zM512 293.12c-120.701 0.243-218.453 98.146-218.453 218.88 0 120.884 97.996 218.88 218.88 218.88s218.88-97.996 218.88-218.88l-0 0c0-0.127 0-0.278 0-0.428 0-120.648-97.805-218.453-218.453-218.453-0.3 0-0.6 0.001-0.9 0.002l0.047-0zM512 654.080c-78.469 0-142.080-63.611-142.080-142.080s63.611-142.080 142.080-142.080c78.469 0 142.080 63.611 142.080 142.080v0c0 78.469-63.611 142.080-142.080 142.080v0z"],"attrs":[],"grid":0,"tags":["instagram"]},"attrs":[],"properties":{"order":5147,"id":537,"name":"instagram","prevSize":32,"code":60316},"setIdx":0,"setId":0,"iconIdx":668},{"icon":{"paths":["M426.292 640.019c0.007 0 0.016 0 0.025 0 23.55 0 42.642-19.091 42.642-42.642 0-0.009-0-0.017-0-0.026l0 0.001v-341.333c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 341.333c-0 0.007-0 0.016-0 0.024 0 23.551 19.092 42.642 42.642 42.642 0.009 0 0.017-0 0.026-0l-0.001 0zM596.958 640.019c0.007 0 0.016 0 0.025 0 23.55 0 42.642-19.091 42.642-42.642 0-0.009-0-0.017-0-0.026l0 0.001v-341.333c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 341.333c-0 0.007-0 0.016-0 0.024 0 23.551 19.092 42.642 42.642 42.642 0.009 0 0.017-0 0.026-0l-0.001 0zM255.625 554.685c0.007 0 0.016 0 0.025 0 23.55 0 42.642-19.091 42.642-42.642 0-0.009-0-0.017-0-0.026l0 0.001v-170.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 170.667c-0 0.007-0 0.016-0 0.024 0 23.551 19.092 42.642 42.642 42.642 0.009 0 0.017-0 0.026-0l-0.001 0zM852.958 42.685h-682.667c-70.66 0.080-127.92 57.339-128 127.992l-0 0.008v682.667c0.080 70.66 57.339 127.92 127.992 128l682.674 0c70.66-0.080 127.92-57.339 128-127.992l0-0.008v-682.667c-0.080-70.66-57.339-127.92-127.992-128l-0.008-0zM895.625 853.352c-0.016 23.558-19.109 42.65-42.665 42.667l-682.668 0c-23.558-0.016-42.65-19.109-42.667-42.665l-0-0.002v-682.667c0.016-23.558 19.109-42.65 42.665-42.667l682.668-0c23.558 0.016 42.65 19.109 42.667 42.665l0 0.002zM740.167 657.435c-60.174 42.619-135.089 68.127-215.961 68.127-4.424 0-8.83-0.076-13.218-0.228l0.637 0.017c-3.114 0.091-6.779 0.143-10.455 0.143-81.563 0-157.179-25.466-219.329-68.881l1.242 0.822c-7.367-6.224-16.971-10.007-27.458-10.007-23.568 0-42.674 19.106-42.674 42.674 0 13.081 5.885 24.787 15.152 32.615l0.063 0.052c74.988 55.046 169.116 88.086 270.961 88.086 4.395 0 8.775-0.062 13.14-0.184l-0.643 0.014c3.722 0.108 8.102 0.169 12.497 0.169 101.845 0 195.973-33.041 272.25-88.987l-1.288 0.901c9.33-7.88 15.216-19.586 15.216-32.667 0-23.568-19.106-42.674-42.674-42.674-10.488 0-20.092 3.783-27.522 10.059l0.063-0.052zM767.625 298.685c-0.007-0-0.016-0-0.025-0-23.55 0-42.642 19.091-42.642 42.642 0 0.009 0 0.017 0 0.026l-0-0.001v170.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-170.667c0-0.007 0-0.016 0-0.025 0-23.55-19.091-42.642-42.642-42.642-0.009 0-0.017 0-0.026 0l0.001-0z"],"attrs":[],"grid":0,"tags":["intercom-alt"]},"attrs":[],"properties":{"order":5148,"id":536,"name":"intercom-alt","prevSize":32,"code":60317},"setIdx":0,"setId":0,"iconIdx":669},{"icon":{"paths":["M832 85.333h-640c-58.91 0-106.667 47.756-106.667 106.667v0 640c0 58.91 47.756 106.667 106.667 106.667v0h640c58.91 0 106.667-47.756 106.667-106.667v0-640c0-58.91-47.756-106.667-106.667-106.667v0zM625.92 241.92c-0.002-0.128-0.003-0.279-0.003-0.43 0-15.552 12.608-28.16 28.16-28.16 0.151 0 0.302 0.001 0.453 0.004l-0.023-0c15.364 0.46 27.7 12.796 28.159 28.117l0.001 0.043v379.733c-1.797 14.217-13.814 25.101-28.373 25.101s-26.576-10.884-28.359-24.96l-0.015-0.141zM483.413 227.413c0-15.788 12.799-28.587 28.587-28.587v0 0c15.788 0 28.587 12.799 28.587 28.587v0 412.587c0 15.788-12.799 28.587-28.587 28.587s-28.587-12.799-28.587-28.587v0zM341.333 241.92c1.797-14.217 13.814-25.101 28.373-25.101s26.576 10.884 28.359 24.96l0.015 0.141v379.733c0 0.001 0 0.002 0 0.003 0 15.552-12.608 28.16-28.16 28.16-0.15 0-0.3-0.001-0.449-0.004l0.023 0c-15.364-0.46-27.7-12.796-28.159-28.117l-0.001-0.043zM199.253 298.667c1.797-14.217 13.814-25.101 28.373-25.101s26.576 10.884 28.359 24.96l0.015 0.141v256c-0.24 15.603-12.946 28.16-28.583 28.16-0.001 0-0.002-0-0.003-0l0 0c-15.456-0.236-27.924-12.704-28.16-28.138l-0-0.022zM814.933 732.587c-78.56 57.819-177.232 92.531-284.012 92.531-6.654 0-13.277-0.135-19.866-0.402l0.944 0.030c-5.644 0.237-12.267 0.371-18.921 0.371-106.78 0-205.453-34.713-285.348-93.469l1.336 0.938c-4.264-4.964-6.86-11.468-6.86-18.579 0-15.788 12.799-28.587 28.587-28.587 5.715 0 11.039 1.677 15.506 4.567l-0.112-0.068c69.471 49.049 155.899 78.398 249.181 78.398 5.849 0 11.672-0.115 17.465-0.344l-0.833 0.026c4.978 0.205 10.821 0.322 16.691 0.322 93.325 0 179.755-29.52 250.462-79.731l-1.339 0.903c4.355-2.821 9.678-4.499 15.394-4.499 15.788 0 28.587 12.799 28.587 28.587 0 7.111-2.596 13.615-6.892 18.617l0.032-0.038zM824.747 554.667c-1.797 14.217-13.814 25.101-28.373 25.101s-26.576-10.884-28.359-24.96l-0.015-0.141v-256c0.24-15.603 12.946-28.16 28.583-28.16 0.001 0 0.002 0 0.003 0l-0-0c15.552 0 28.16 12.608 28.16 28.16v0z"],"attrs":[],"grid":0,"tags":["intercom"]},"attrs":[],"properties":{"order":5149,"id":535,"name":"intercom","prevSize":32,"code":60318},"setIdx":0,"setId":0,"iconIdx":670},{"icon":{"paths":["M554.667 682.667h-256c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h256c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM384 426.667h85.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-85.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM896 512h-128v-384c0-0.050 0-0.11 0-0.169 0-15.71-8.49-29.436-21.132-36.842l-0.201-0.109c-6.12-3.594-13.479-5.716-21.333-5.716s-15.214 2.123-21.535 5.825l0.201-0.109-128 73.387-128-73.387c-6.12-3.594-13.479-5.716-21.333-5.716s-15.214 2.123-21.535 5.825l0.201-0.109-128 73.387-128-73.387c-6.12-3.594-13.479-5.716-21.333-5.716s-15.214 2.123-21.535 5.825l0.201-0.109c-12.844 7.514-21.334 21.241-21.334 36.951 0 0.060 0 0.119 0 0.179l-0-0.009v682.667c0 70.692 57.308 128 128 128v0h597.333c70.692 0 128-57.308 128-128v0-256c0-23.564-19.103-42.667-42.667-42.667v0zM213.333 853.333c-23.564 0-42.667-19.103-42.667-42.667v0-608.853l85.333 48.64c6.189 3.299 13.535 5.236 21.333 5.236s15.144-1.937 21.583-5.357l-0.249 0.121 128-73.387 128 73.387c6.189 3.299 13.535 5.236 21.333 5.236s15.144-1.937 21.583-5.357l-0.249 0.121 85.333-48.64v608.853c0.125 15.341 2.93 29.989 7.968 43.552l-0.288-0.885zM853.333 810.667c0 23.564-19.103 42.667-42.667 42.667s-42.667-19.103-42.667-42.667v0-213.333h85.333zM554.667 512h-256c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h256c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["invoice"]},"attrs":[],"properties":{"order":5150,"id":534,"name":"invoice","prevSize":32,"code":60319},"setIdx":0,"setId":0,"iconIdx":671},{"icon":{"paths":["M725.333 256h-256c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h64.853l-136.533 341.333h-98.987c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h256c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-64.853l136.533-341.333h98.987c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["italic"]},"attrs":[],"properties":{"order":5151,"id":533,"name":"italic","prevSize":32,"code":60320},"setIdx":0,"setId":0,"iconIdx":672},{"icon":{"paths":["M804.267 669.44c-7.712-7.668-18.343-12.407-30.080-12.407s-22.368 4.74-30.082 12.409l0.002-0.002-87.893 87.893c-7.651 7.709-12.38 18.329-12.38 30.052 0 19.621 13.244 36.148 31.28 41.13l0.3 0.071 11.093 2.987-34.133 34.133c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 85.333-85.333c7.936-7.755 12.857-18.566 12.857-30.526 0-4.328-0.645-8.506-1.843-12.443l0.079 0.302c-4.028-14.825-15.468-26.266-29.994-30.224l-0.299-0.069-11.093-2.56 35.413-35.84c7.926-7.753 12.84-18.557 12.84-30.509 0-11.526-4.57-21.985-11.998-29.663l0.011 0.012zM337.493 831.573l11.093-2.987c18.336-5.053 31.58-21.58 31.58-41.201 0-11.724-4.728-22.343-12.382-30.055l0.003 0.003-87.893-87.893c-7.412-6.377-17.129-10.259-27.753-10.259-23.564 0-42.667 19.103-42.667 42.667 0 10.624 3.883 20.341 10.307 27.809l-0.047-0.056 35.413 35.84-11.093 2.56c-14.825 4.028-26.266 15.468-30.224 29.994l-0.069 0.299c-1.119 3.634-1.764 7.812-1.764 12.141 0 11.96 4.921 22.771 12.849 30.518l0.008 0.008 85.333 85.333c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003zM896 170.667c-23.564 0-42.667 19.103-42.667 42.667v0h-128c0-70.692-57.308-128-128-128v0h-170.667c-70.692 0-128 57.308-128 128v0h-128c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 85.333c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0h128v85.333c-0 0.020-0 0.044-0 0.067 0 55.398 35.193 102.577 84.442 120.398l0.891 0.282v49.92c0 47.128 38.205 85.333 85.333 85.333v0 256c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-256c47.128 0 85.333-38.205 85.333-85.333v0-49.92c50.14-18.103 85.333-65.281 85.333-120.68 0-0.024-0-0.047-0-0.071l0 0.004v-85.333h128c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-85.333c0-23.564-19.103-42.667-42.667-42.667v0zM640 384c0 23.564-19.103 42.667-42.667 42.667v0c-23.564 0-42.667 19.103-42.667 42.667v0 85.333h-85.333v-85.333c0-23.564-19.103-42.667-42.667-42.667v0c-23.564 0-42.667-19.103-42.667-42.667v0-170.667c0-23.564 19.103-42.667 42.667-42.667v0h170.667c23.564 0 42.667 19.103 42.667 42.667v0zM512 256c-23.564 0-42.667 19.103-42.667 42.667v0 42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667c0-23.564-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["jackhammer"]},"attrs":[],"properties":{"order":5152,"id":532,"name":"jackhammer","prevSize":32,"code":60321},"setIdx":0,"setId":0,"iconIdx":673},{"icon":{"paths":["M617.728 635.004c-5.039 0.52-10.889 0.817-16.808 0.817-27.864 0-54.191-6.577-77.515-18.263l1 0.454c-12.865-10.355-21.425-25.607-22.832-42.882l-0.014-0.219c-0.057-5.184-4.273-9.364-9.465-9.364-0.072 0-0.144 0.001-0.215 0.002l0.011-0c-13.508-0.164-27.013-0.128-40.518-0.018-0.274-0.030-0.593-0.047-0.915-0.047-4.619 0-8.427 3.474-8.953 7.952l-0.004 0.042c-0.087 1.562-0.137 3.39-0.137 5.23 0 29.035 12.402 55.174 32.197 73.407l0.070 0.064c26.096 20.516 58.871 33.639 94.609 35.741l0.464 0.022c11.895 1.458 25.665 2.291 39.63 2.291 24.228 0 47.87-2.505 70.683-7.27l-2.235 0.39c28.357-5.417 52.87-19.158 71.566-38.548l0.039-0.040c13.875-17.001 22.282-38.941 22.282-62.844 0-11.578-1.972-22.696-5.599-33.035l0.214 0.699c-9.461-22.752-28.495-39.885-51.935-46.563l-0.562-0.137c-54.646-19.174-113.677-17.724-169.387-32.294-9.672-3.044-21.489-6.349-25.799-16.588-1.269-3.551-2.002-7.648-2.002-11.916 0-11.686 5.497-22.087 14.046-28.76l0.081-0.061c15.552-9.043 34.226-14.381 54.146-14.381 1.196 0 2.387 0.019 3.574 0.057l-0.173-0.004c4.879-0.487 10.546-0.765 16.278-0.765 23.088 0 45.124 4.505 65.276 12.684l-1.163-0.417c15.239 9.077 26.075 24.193 29.247 41.963l0.055 0.371c0.157 5.371 4.374 9.707 9.68 10.053l0.031 0.002c13.411 0.273 26.828 0.073 40.239 0.091 0.347 0.044 0.748 0.069 1.155 0.069 4.482 0 8.255-3.032 9.382-7.157l0.016-0.068c0.001-0.203 0.002-0.444 0.002-0.685 0-37.708-20.099-70.721-50.169-88.91l-0.464-0.261c-30.831-14.576-66.978-23.085-105.112-23.085-11.352 0-22.527 0.754-33.48 2.215l1.282-0.14v-0.003c-35.809 1.512-68.11 15.391-93.006 37.443l0.157-0.137c-15.348 16.506-24.766 38.706-24.766 63.106 0 12.025 2.288 23.516 6.452 34.062l-0.219-0.629c9.983 21.863 28.614 38.311 51.401 45.152l0.583 0.15c54.464 19.672 114.156 13.359 169.149 30.755 10.716 3.636 23.195 9.196 26.479 21.123 0.782 3.041 1.231 6.532 1.231 10.128 0 11.848-4.875 22.558-12.728 30.233l-0.008 0.008c-18.999 11.977-42.111 19.083-66.883 19.083-3.392 0-6.752-0.133-10.077-0.395l0.439 0.028zM866.001 274.668q-159.504-90.197-319.081-180.232c-10.059-5.727-22.1-9.103-34.93-9.103s-24.871 3.376-35.284 9.288l0.354-0.185q-158.956 89.762-317.929 179.516c-20.456 11.311-34.122 32.683-34.312 57.262l-0 0.027v361.568c0.367 25.034 14.563 46.668 35.275 57.64l0.36 0.174c30.443 16.57 60.021 34.828 91.016 50.297 17.836 9.722 39.064 15.439 61.628 15.439 20.038 0 39.023-4.509 55.996-12.567l-0.792 0.339c25.744-16.316 42.586-44.654 42.586-76.927 0-1.774-0.051-3.535-0.151-5.284l0.011 0.242c0.237-119.325 0.036-238.656 0.091-357.984 0.074-0.443 0.117-0.954 0.117-1.475 0-5.032-3.964-9.139-8.94-9.368l-0.021-0.001c-13.542-0.219-27.104-0.128-40.646-0.036-0.239-0.023-0.517-0.036-0.798-0.036-4.933 0-8.932 3.999-8.932 8.932 0 0.078 0.001 0.155 0.003 0.232l-0-0.011c-0.182 118.56 0.037 237.154-0.109 355.732 0 0.045 0 0.099 0 0.152 0 17.080-10.671 31.668-25.71 37.461l-0.274 0.093c-5.549 1.702-11.927 2.682-18.534 2.682-12.724 0-24.599-3.635-34.644-9.922l0.274 0.16q-42.305-23.893-84.608-47.782c-3.448-1.662-5.784-5.13-5.784-9.143 0-0.315 0.014-0.628 0.043-0.936l-0.003 0.040q0-178.937 0-357.856c-0.025-0.279-0.039-0.603-0.039-0.93 0-4.545 2.744-8.448 6.666-10.144l0.072-0.028q158.435-89.232 316.809-178.652c1.738-1.2 3.889-1.918 6.208-1.918 2.33 0 4.492 0.724 6.271 1.96l-0.036-0.024q158.429 89.26 316.844 178.583c3.977 1.771 6.699 5.689 6.699 10.242 0 0.321-0.014 0.639-0.040 0.953l0.003-0.041q-0.027 178.905-0.036 357.839c0.027 0.278 0.042 0.601 0.042 0.928 0 4.022-2.299 7.506-5.655 9.211l-0.059 0.027q-156.008 88.215-312.182 176.175c-4.974 2.771-10.862 7.229-16.68 3.872-27.268-15.435-54.203-31.469-81.38-47.050-1.462-1.127-3.32-1.807-5.336-1.807-1.646 0-3.186 0.453-4.503 1.24l0.040-0.022c-10.695 6.401-23.109 12.321-36.089 17.068l-1.546 0.495c-5.891 2.385-13.138 3.065-17.193 8.529 5.078 5.512 11.194 9.98 18.050 13.109l0.351 0.143q47.676 27.605 95.403 55.162c10.488 6.681 23.27 10.648 36.979 10.648 12.35 0 23.949-3.22 34.001-8.866l-0.35 0.181q158.98-89.643 317.946-179.367c21.054-11.164 35.243-32.779 35.653-57.747l0.001-0.056v-361.567c-0.192-24.126-13.361-45.133-32.862-56.404l-0.317-0.169z"],"attrs":[],"grid":0,"tags":["java-script"]},"attrs":[],"properties":{"order":5153,"id":531,"name":"java-script","prevSize":32,"code":60322},"setIdx":0,"setId":0,"iconIdx":674},{"icon":{"paths":["M901.12 720.213c-23.127-22.947-54.98-37.128-90.146-37.128-19.958 0-38.849 4.568-55.684 12.714l0.763-0.333-49.067-48.64c97.426-104.896 173.451-231.141 220.197-370.802l2.097-7.224c5.067-13.681 7.999-29.484 7.999-45.972 0-75.17-60.937-136.107-136.107-136.107-16.488 0-32.291 2.932-46.917 8.302l0.944-0.303c-146.888 48.843-273.132 124.868-378.67 222.884l0.643-0.591-48.64-49.067c7.858-16.112 12.453-35.055 12.453-55.071 0-70.692-57.308-128-128-128s-128 57.308-128 128c0 35.546 14.49 67.709 37.885 90.902l0.009 0.009c23.143 23.171 55.12 37.515 90.447 37.547l0.006 0c19.902-0.191 38.661-4.895 55.363-13.134l-0.75 0.334 49.067 48.64c-97.426 104.896-173.451 231.141-220.197 370.802l-2.097 7.224c-4.411 12.926-6.957 27.817-6.957 43.303 0 38.048 15.371 72.506 40.243 97.503l-0.006-0.006c23.86 25.393 57.3 41.545 94.519 42.662l0.201 0.005c16.503-0.161 32.331-2.801 47.21-7.566l-1.13 0.312c146.888-48.843 273.132-124.868 378.67-222.884l-0.643 0.591 48.64 49.067c-7.858 16.112-12.453 35.055-12.453 55.071 0 70.692 57.308 128 128 128s128-57.308 128-128c0-35.546-14.49-67.709-37.885-90.902l-0.009-0.009zM243.627 243.2v0c-7.736 7.789-18.452 12.611-30.293 12.611-23.577 0-42.691-19.113-42.691-42.691 0-11.736 4.735-22.365 12.4-30.082l-0.002 0.002c7.736-7.789 18.452-12.611 30.293-12.611 23.577 0 42.691 19.113 42.691 42.691 0 11.736-4.735 22.365-12.4 30.082l0.002-0.002zM781.227 176.213c5.964-2.033 12.84-3.272 19.985-3.412l0.068-0.001c0.12-0.001 0.262-0.002 0.404-0.002 13.673 0 26.051 5.545 35.009 14.508l0 0c9.083 9.422 14.678 22.259 14.678 36.403 0 6.86-1.316 13.412-3.71 19.418l0.125-0.354c-24.931 75.682-55.708 141.159-93.215 202.048l2.335-4.074-173.653-173.653c56.814-35.172 122.291-65.949 191.32-88.958l6.653-1.922zM242.773 847.787c-5.633 2.32-12.172 3.667-19.027 3.667-28.277 0-51.2-22.923-51.2-51.2 0-6.854 1.347-13.393 3.79-19.368l-0.124 0.342c24.931-75.682 55.708-141.159 93.215-202.048l-2.335 4.074 173.653 173.653c-56.814 35.172-122.291 65.949-191.32 88.958l-6.653 1.922zM512 707.84l-195.84-195.84c20.449-27.626 40.446-51.818 61.621-74.912l-0.608 0.672 209.493 209.493c-22.466 20.363-46.798 40.227-72.128 58.81l-2.539 1.777zM646.4 586.667l-209.067-209.493c22.514-20.548 46.846-40.548 72.185-59.263l2.482-1.75 196.267 196.267c-20.554 27.579-40.687 51.772-62.002 74.857l0.562-0.617zM840.533 842.667c-7.736 7.789-18.452 12.611-30.293 12.611-23.577 0-42.691-19.113-42.691-42.691 0-11.736 4.735-22.365 12.4-30.082l-0.002 0.002c7.712-7.668 18.343-12.407 30.080-12.407s22.368 4.74 30.082 12.409l-0.002-0.002c7.433 7.669 12.015 18.14 12.015 29.68 0 11.103-4.241 21.215-11.191 28.805l0.029-0.032z"],"attrs":[],"grid":0,"tags":["kayak"]},"attrs":[],"properties":{"order":5154,"id":530,"name":"kayak","prevSize":32,"code":60323},"setIdx":0,"setId":0,"iconIdx":675},{"icon":{"paths":["M926.293 278.613l-60.587-60.16 60.587-60.16c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l-449.707 449.707c-33.069-22.097-73.739-35.264-117.483-35.264-117.821 0-213.333 95.513-213.333 213.333s95.513 213.333 213.333 213.333c117.821 0 213.333-95.513 213.333-213.333 0-43.744-13.166-84.414-35.752-118.261l0.489 0.778 208.213-208.64 60.16 60.587c7.709 7.648 18.326 12.374 30.047 12.374 0.087 0 0.173-0 0.26-0.001l-0.013 0c0.073 0 0.16 0.001 0.247 0.001 11.721 0 22.338-4.726 30.049-12.377l-0.003 0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003-60.587-58.027 60.587-60.587 60.16 60.587c7.709 7.648 18.326 12.374 30.047 12.374 0.087 0 0.173-0 0.26-0.001l-0.013 0c0.073 0 0.16 0.001 0.247 0.001 11.721 0 22.338-4.726 30.049-12.377l-0.003 0.003c8.458-7.82 13.736-18.974 13.736-31.36s-5.278-23.54-13.707-31.334l-0.028-0.026zM298.667 853.333c-70.692 0-128-57.308-128-128s57.308-128 128-128c70.692 0 128 57.308 128 128v0c0 70.692-57.308 128-128 128v0z"],"attrs":[],"grid":0,"tags":["key-skeleton-alt"]},"attrs":[],"properties":{"order":5155,"id":529,"name":"key-skeleton-alt","prevSize":32,"code":60324},"setIdx":0,"setId":0,"iconIdx":676},{"icon":{"paths":["M896 188.16l30.293-29.867c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l-0 0-59.733 60.16-120.747 120.747-269.227 268.8c-33.069-22.097-73.739-35.264-117.483-35.264-117.821 0-213.333 95.513-213.333 213.333s95.513 213.333 213.333 213.333c117.821 0 213.333-95.513 213.333-213.333 0-43.744-13.166-84.414-35.752-118.261l0.489 0.778 238.507-238.933 90.453 90.88c7.715 7.662 18.344 12.397 30.080 12.397 23.577 0 42.691-19.113 42.691-42.691 0-11.842-4.821-22.557-12.608-30.291l-0.002-0.002-90.453-90.453 60.587-60.16 29.867 29.867c7.736 7.789 18.452 12.611 30.293 12.611 23.577 0 42.691-19.113 42.691-42.691 0-11.736-4.735-22.365-12.4-30.082l0.002 0.002zM298.667 853.333c-70.692 0-128-57.308-128-128s57.308-128 128-128c70.692 0 128 57.308 128 128v0c0 70.692-57.308 128-128 128v0z"],"attrs":[],"grid":0,"tags":["key-skeleton"]},"attrs":[],"properties":{"order":5156,"id":528,"name":"key-skeleton","prevSize":32,"code":60325},"setIdx":0,"setId":0,"iconIdx":677},{"icon":{"paths":["M286.293 396.373c-7.733-7.795-18.45-12.621-30.293-12.621s-22.56 4.826-30.291 12.618l-0.003 0.003c-3.773 3.937-6.808 8.616-8.859 13.791l-0.101 0.289c-2.109 4.883-3.336 10.568-3.336 16.539 0 11.682 4.695 22.267 12.3 29.972l-0.004-0.005c4.001 3.646 8.658 6.662 13.76 8.838l0.32 0.122c4.477 2.162 9.736 3.425 15.29 3.425 0.325 0 0.648-0.004 0.971-0.013l-0.048 0.001c23.473-0.121 42.454-19.177 42.454-42.666 0-5.848-1.176-11.421-3.305-16.495l0.105 0.281c-2.152-5.464-5.187-10.143-8.974-14.095l0.014 0.015zM426.667 469.333c23.473-0.121 42.454-19.177 42.454-42.666 0-5.848-1.176-11.421-3.305-16.495l0.105 0.281c-2.152-5.464-5.187-10.143-8.974-14.095l0.014 0.015c-7.773-8.062-18.667-13.068-30.731-13.068-2.711 0-5.363 0.253-7.934 0.736l0.265-0.041c-3.025 0.433-5.757 1.331-8.249 2.627l0.142-0.067-7.68 3.84-6.4 5.12c-7.66 8.024-12.374 18.918-12.374 30.913 0 0.082 0 0.165 0.001 0.247l-0-0.013c0 23.564 19.103 42.667 42.667 42.667v0zM272.213 558.080c-4.793-2.024-10.366-3.201-16.213-3.201s-11.42 1.176-16.495 3.305l0.281-0.105c-15.59 6.527-26.363 21.621-26.453 39.242l-0 0.012c0.121 23.473 19.177 42.454 42.666 42.454 5.848 0 11.421-1.176 16.495-3.305l-0.281 0.105c5.422-2.298 10.079-5.314 14.119-8.995l-0.039 0.035c7.648-7.709 12.374-18.326 12.374-30.047 0-0.087-0-0.173-0.001-0.26l0 0.013c0-0.073 0.001-0.16 0.001-0.247 0-11.721-4.726-22.338-12.377-30.049l0.003 0.003c-3.895-3.844-8.588-6.891-13.807-8.869l-0.273-0.091zM597.333 554.667h-170.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h170.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM627.627 396.373c-7.733-7.795-18.45-12.621-30.293-12.621s-22.56 4.826-30.291 12.618l-0.003 0.003c-3.773 3.937-6.808 8.616-8.859 13.791l-0.101 0.289c-2.156 4.931-3.41 10.676-3.41 16.715 0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667c0-0.176-0.001-0.352-0.003-0.528l0 0.027c0.008-0.275 0.012-0.599 0.012-0.923 0-5.554-1.263-10.813-3.518-15.505l0.093 0.215c-2.152-5.464-5.187-10.143-8.974-14.095l0.014 0.015zM791.893 561.92c-2.211-1.521-4.75-2.82-7.453-3.77l-0.227-0.070c-4.793-2.024-10.366-3.201-16.213-3.201s-11.42 1.176-16.495 3.305l0.281-0.105c-5.422 2.298-10.079 5.314-14.119 8.995l0.039-0.035c-7.522 7.877-12.204 18.523-12.373 30.26l-0 0.033c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0c-0.169-11.771-4.851-22.416-12.39-30.311l0.016 0.017zM853.333 213.333h-682.667c-70.692 0-128 57.308-128 128v0 341.333c0 70.692 57.308 128 128 128v0h682.667c70.692 0 128-57.308 128-128v0-341.333c0-70.692-57.308-128-128-128v0zM896 682.667c0 23.564-19.103 42.667-42.667 42.667v0h-682.667c-23.564 0-42.667-19.103-42.667-42.667v0-341.333c0-23.564 19.103-42.667 42.667-42.667v0h682.667c23.564 0 42.667 19.103 42.667 42.667v0zM798.293 396.373c-7.733-7.796-18.45-12.621-30.294-12.621-23.564 0-42.667 19.103-42.667 42.667 0 0.087 0 0.174 0.001 0.262l-0-0.013c-0.002 0.149-0.003 0.325-0.003 0.502 0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667c0-6.039-1.254-11.784-3.517-16.991l0.107 0.276c-2.152-5.464-5.187-10.143-8.974-14.095l0.014 0.015z"],"attrs":[],"grid":0,"tags":["keyboard-alt"]},"attrs":[],"properties":{"order":5157,"id":527,"name":"keyboard-alt","prevSize":32,"code":60326},"setIdx":0,"setId":0,"iconIdx":678},{"icon":{"paths":["M286.293 439.040c-4.001-3.646-8.658-6.662-13.76-8.838l-0.32-0.122c-4.883-2.109-10.568-3.336-16.539-3.336-11.682 0-22.267 4.695-29.972 12.3l0.005-0.004c-3.773 3.937-6.808 8.616-8.859 13.791l-0.101 0.289c-2.109 4.883-3.336 10.568-3.336 16.539 0 11.682 4.695 22.267 12.3 29.972l-0.004-0.005c4.001 3.646 8.658 6.662 13.76 8.838l0.32 0.122c4.694 1.933 10.144 3.055 15.855 3.055 23.564 0 42.667-19.103 42.667-42.667 0-5.712-1.122-11.161-3.158-16.14l0.103 0.285c-2.152-5.464-5.187-10.143-8.974-14.095l0.014 0.015zM396.373 328.96c7.709 7.648 18.326 12.374 30.047 12.374 0.087 0 0.173-0 0.26-0.001l-0.013 0c0.275 0.008 0.599 0.012 0.923 0.012 5.554 0 10.813-1.263 15.505-3.518l-0.215 0.093c5.422-2.298 10.079-5.314 14.119-8.995l-0.039 0.035c3.646-4.001 6.662-8.658 8.838-13.76l0.122-0.32c2.163-4.771 3.423-10.345 3.423-16.213s-1.26-11.443-3.525-16.466l0.102 0.253c-2.298-5.422-5.314-10.079-8.995-14.119l0.035 0.039c-7.733-7.795-18.45-12.621-30.293-12.621s-22.56 4.826-30.291 12.618l-0.003 0.003c-3.646 4.001-6.662 8.658-8.838 13.76l-0.122 0.32c-2.163 4.771-3.423 10.345-3.423 16.213s1.26 11.443 3.525 16.466l-0.102-0.253c2.298 5.422 5.314 10.079 8.995 14.119l-0.035-0.039zM286.293 268.373c-7.733-7.796-18.45-12.621-30.294-12.621-23.564 0-42.667 19.103-42.667 42.667 0 0.087 0 0.174 0.001 0.262l-0-0.013c0.073 5.873 1.322 11.435 3.52 16.489l-0.107-0.275c2.298 5.422 5.314 10.079 8.995 14.119l-0.035-0.039c7.709 7.648 18.326 12.374 30.047 12.374 0.087 0 0.173-0 0.26-0.001l-0.013 0c0.275 0.008 0.599 0.012 0.923 0.012 5.554 0 10.813-1.263 15.505-3.518l-0.215 0.093c5.422-2.298 10.079-5.314 14.119-8.995l-0.039 0.035c3.646-4.001 6.662-8.658 8.838-13.76l0.122-0.32c2.163-4.771 3.423-10.345 3.423-16.213s-1.26-11.443-3.525-16.466l0.102 0.253c-2.298-5.422-5.314-10.079-8.995-14.119l0.035 0.039zM567.040 780.373l-55.040 55.467-55.040-55.467c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l85.333 85.333c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 85.333-85.333c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l0-0zM798.293 268.373c-7.733-7.796-18.45-12.621-30.294-12.621-23.564 0-42.667 19.103-42.667 42.667 0 0.087 0 0.174 0.001 0.262l-0-0.013c-0.008 0.275-0.012 0.599-0.012 0.923 0 5.554 1.263 10.813 3.518 15.505l-0.093-0.215c2.298 5.422 5.314 10.079 8.995 14.119l-0.035-0.039c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c3.646-4.001 6.662-8.658 8.838-13.76l0.122-0.32c2.162-4.477 3.425-9.736 3.425-15.29 0-0.325-0.004-0.648-0.013-0.971l0.001 0.048c-0.073-5.873-1.322-11.435-3.52-16.489l0.107 0.275c-2.298-5.422-5.314-10.079-8.995-14.119l0.035 0.039zM597.333 426.667h-170.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h170.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM853.333 85.333h-682.667c-70.692 0-128 57.308-128 128v0 341.333c0 70.692 57.308 128 128 128v0h682.667c70.692 0 128-57.308 128-128v0-341.333c0-70.692-57.308-128-128-128v0zM896 554.667c0 23.564-19.103 42.667-42.667 42.667v0h-682.667c-23.564 0-42.667-19.103-42.667-42.667v0-341.333c0-23.564 19.103-42.667 42.667-42.667v0h682.667c23.564 0 42.667 19.103 42.667 42.667v0zM798.293 439.040c-3.937-3.773-8.616-6.808-13.791-8.859l-0.289-0.101c-4.762-2.214-10.337-3.505-16.213-3.505s-11.451 1.291-16.456 3.606l0.243-0.101c-5.422 2.298-10.079 5.314-14.119 8.995l0.039-0.035c-7.522 7.877-12.204 18.523-12.373 30.26l-0 0.033c-0.002 0.149-0.003 0.325-0.003 0.502 0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667c0-6.039-1.254-11.784-3.517-16.991l0.107 0.276c-2.152-5.464-5.187-10.143-8.974-14.095l0.014 0.015zM581.12 259.413c-5.422 2.298-10.079 5.314-14.119 8.995l0.039-0.035c-7.522 7.877-12.204 18.523-12.373 30.26l-0 0.033c0.073 5.873 1.322 11.435 3.52 16.489l-0.107-0.275c2.298 5.422 5.314 10.079 8.995 14.119l-0.035-0.039c7.709 7.648 18.326 12.374 30.047 12.374 0.087 0 0.173-0 0.26-0.001l-0.013 0c0.275 0.008 0.599 0.012 0.923 0.012 5.554 0 10.813-1.263 15.505-3.518l-0.215 0.093c5.422-2.298 10.079-5.314 14.119-8.995l-0.039 0.035c3.646-4.001 6.662-8.658 8.838-13.76l0.122-0.32c2.162-4.477 3.425-9.736 3.425-15.29 0-0.325-0.004-0.648-0.013-0.971l0.001 0.048c-0.169-11.771-4.851-22.416-12.39-30.311l0.016 0.017c-7.7-7.601-18.286-12.296-29.968-12.296-5.971 0-11.656 1.227-16.817 3.442l0.278-0.106z"],"attrs":[],"grid":0,"tags":["keyboard-hide"]},"attrs":[],"properties":{"order":5158,"id":526,"name":"keyboard-hide","prevSize":32,"code":60327},"setIdx":0,"setId":0,"iconIdx":679},{"icon":{"paths":["M286.293 439.040c-7.733-7.796-18.45-12.621-30.294-12.621-23.564 0-42.667 19.103-42.667 42.667 0 0.087 0 0.174 0.001 0.262l-0-0.013c-0.002 0.149-0.003 0.325-0.003 0.502 0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667c0-6.039-1.254-11.784-3.517-16.991l0.107 0.276c-2.152-5.464-5.187-10.143-8.974-14.095l0.014 0.015zM396.373 328.96c7.709 7.648 18.326 12.374 30.047 12.374 0.087 0 0.173-0 0.26-0.001l-0.013 0c0.073 0 0.16 0.001 0.247 0.001 11.721 0 22.338-4.726 30.049-12.377l-0.003 0.003c3.646-4.001 6.662-8.658 8.838-13.76l0.122-0.32c2.092-4.778 3.34-10.34 3.413-16.186l0-0.027c-0.169-11.771-4.851-22.416-12.39-30.311l0.016 0.017-6.4-5.12-7.68-3.84c-2.326-1.517-5.034-2.694-7.933-3.379l-0.174-0.035c-2.518-0.528-5.413-0.83-8.377-0.83-11.709 0-22.317 4.717-30.026 12.354l0.003-0.003c-3.773 3.937-6.808 8.616-8.859 13.791l-0.101 0.289c-2.163 4.771-3.423 10.345-3.423 16.213s1.26 11.443 3.525 16.466l-0.102-0.253c2.211 5.75 5.241 10.701 9.008 14.989l-0.048-0.055zM279.893 263.253c-2.211-1.521-4.75-2.82-7.453-3.77l-0.227-0.070-7.68-3.413c-2.625-0.574-5.639-0.903-8.731-0.903-11.745 0-22.382 4.746-30.097 12.425l0.002-0.002c-3.773 3.937-6.808 8.616-8.859 13.791l-0.101 0.289c-2.163 4.771-3.423 10.345-3.423 16.213s1.26 11.443 3.525 16.466l-0.102-0.253c2.298 5.422 5.314 10.079 8.995 14.119l-0.035-0.039c4.001 3.646 8.658 6.662 13.76 8.838l0.32 0.122c4.69 2.572 10.255 4.136 16.174 4.266l0.040 0.001c0.073 0 0.16 0.001 0.247 0.001 11.721 0 22.338-4.726 30.049-12.377l-0.003 0.003c3.646-4.001 6.662-8.658 8.838-13.76l0.122-0.32c2.092-4.778 3.34-10.34 3.413-16.186l0-0.027c-0.169-11.771-4.851-22.416-12.39-30.311l0.016 0.017zM542.293 780.373c-7.733-7.795-18.45-12.621-30.293-12.621s-22.56 4.826-30.291 12.618l-0.003 0.003-85.333 85.333c-7.753 7.753-12.548 18.463-12.548 30.293 0 23.661 19.181 42.841 42.841 42.841 11.83 0 22.541-4.795 30.293-12.548l-0 0 55.040-55.467 55.040 55.467c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003zM798.293 439.040c-7.733-7.795-18.45-12.621-30.293-12.621s-22.56 4.826-30.291 12.618l-0.003 0.003c-3.773 3.937-6.808 8.616-8.859 13.791l-0.101 0.289c-1.933 4.694-3.055 10.144-3.055 15.855 0 23.564 19.103 42.667 42.667 42.667 5.712 0 11.161-1.122 16.14-3.158l-0.285 0.103c5.422-2.298 10.079-5.314 14.119-8.995l-0.039 0.035c7.648-7.709 12.374-18.326 12.374-30.047 0-0.087-0-0.173-0.001-0.26l0 0.013c0.008-0.275 0.012-0.599 0.012-0.923 0-5.554-1.263-10.813-3.518-15.505l0.093 0.215c-2.152-5.464-5.187-10.143-8.974-14.095l0.014 0.015zM597.333 426.667h-170.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h170.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM853.333 85.333h-682.667c-70.692 0-128 57.308-128 128v0 341.333c0 70.692 57.308 128 128 128v0h682.667c70.692 0 128-57.308 128-128v0-341.333c0-70.692-57.308-128-128-128v0zM896 554.667c0 23.564-19.103 42.667-42.667 42.667v0h-682.667c-23.564 0-42.667-19.103-42.667-42.667v0-341.333c0-23.564 19.103-42.667 42.667-42.667v0h682.667c23.564 0 42.667 19.103 42.667 42.667v0zM751.787 259.413c-5.492 2.069-10.185 5.116-14.084 8.964l0.004-0.004c-7.522 7.877-12.204 18.523-12.373 30.26l-0 0.033c0.073 5.873 1.322 11.435 3.52 16.489l-0.107-0.275c2.298 5.422 5.314 10.079 8.995 14.119l-0.035-0.039c7.709 7.648 18.326 12.374 30.047 12.374 0.087 0 0.173-0 0.26-0.001l-0.013 0c0.073 0 0.16 0.001 0.247 0.001 11.721 0 22.338-4.726 30.049-12.377l-0.003 0.003c3.646-4.001 6.662-8.658 8.838-13.76l0.122-0.32c2.092-4.778 3.34-10.34 3.413-16.186l0-0.027c-0.169-11.771-4.851-22.416-12.39-30.311l0.016 0.017c-7.7-7.601-18.286-12.296-29.968-12.296-5.971 0-11.656 1.227-16.817 3.442l0.278-0.106zM621.227 263.253l-7.68-3.84-7.68-3.413c-2.457-0.503-5.282-0.79-8.174-0.79-5.984 0-11.681 1.232-16.85 3.456l0.277-0.106c-5.492 2.069-10.185 5.116-14.084 8.964l0.004-0.004c-3.773 3.937-6.808 8.616-8.859 13.791l-0.101 0.289c-2.163 4.771-3.423 10.345-3.423 16.213s1.26 11.443 3.525 16.466l-0.102-0.253c2.298 5.422 5.314 10.079 8.995 14.119l-0.035-0.039c7.652 8.018 18.368 13.056 30.262 13.226l0.031 0c0.073 0 0.16 0.001 0.247 0.001 11.721 0 22.338-4.726 30.049-12.377l-0.003 0.003c3.646-4.001 6.662-8.658 8.838-13.76l0.122-0.32c2.092-4.778 3.34-10.34 3.413-16.186l0-0.027c-0.169-11.771-4.851-22.416-12.39-30.311l0.016 0.017z"],"attrs":[],"grid":0,"tags":["keyboard-show"]},"attrs":[],"properties":{"order":5159,"id":525,"name":"keyboard-show","prevSize":32,"code":60328},"setIdx":0,"setId":0,"iconIdx":680},{"icon":{"paths":["M264.96 567.040c-3.895-3.844-8.588-6.891-13.807-8.869l-0.273-0.091c-4.793-2.024-10.366-3.201-16.213-3.201s-11.42 1.176-16.495 3.305l0.281-0.105c-10.747 3.967-19.073 12.293-22.954 22.774l-0.086 0.266c-2.158 4.933-3.413 10.681-3.413 16.722 0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667c0-6.041-1.256-11.789-3.52-16.997l0.107 0.276c-2.152-5.464-5.187-10.143-8.974-14.095l0.014 0.015zM576 469.333h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM405.333 469.333h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM277.333 384h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM853.333 213.333h-682.667c-70.692 0-128 57.308-128 128v0 341.333c0 70.692 57.308 128 128 128v0h682.667c70.692 0 128-57.308 128-128v0-341.333c0-70.692-57.308-128-128-128v0zM896 682.667c0 23.564-19.103 42.667-42.667 42.667v0h-682.667c-23.564 0-42.667-19.103-42.667-42.667v0-341.333c0-23.564 19.103-42.667 42.667-42.667v0h682.667c23.564 0 42.667 19.103 42.667 42.667v0zM640 554.667h-256c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h256c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM789.333 384h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM819.627 567.040c-3.937-3.773-8.616-6.808-13.791-8.859l-0.289-0.101c-4.793-2.024-10.366-3.201-16.213-3.201s-11.42 1.176-16.495 3.305l0.281-0.105c-5.492 2.069-10.185 5.116-14.084 8.964l0.004-0.004c-3.773 3.937-6.808 8.616-8.859 13.791l-0.101 0.289c-2.156 4.931-3.41 10.676-3.41 16.715 0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667c0-0.176-0.001-0.352-0.003-0.528l0 0.027c0.008-0.275 0.012-0.599 0.012-0.923 0-5.554-1.263-10.813-3.518-15.505l0.093 0.215c-2.152-5.464-5.187-10.143-8.974-14.095l0.014 0.015z"],"attrs":[],"grid":0,"tags":["keyboard"]},"attrs":[],"properties":{"order":5160,"id":524,"name":"keyboard","prevSize":32,"code":60329},"setIdx":0,"setId":0,"iconIdx":681},{"icon":{"paths":["M512 341.333c-47.128 0-85.333 38.205-85.333 85.333v0c0.194 31.22 17.125 58.443 42.264 73.169l0.403 0.218v139.947c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-139.947c25.542-14.943 42.472-42.166 42.667-73.359l0-0.028c0-47.128-38.205-85.333-85.333-85.333v0zM512 85.333c-235.641 0-426.667 191.025-426.667 426.667s191.025 426.667 426.667 426.667c235.641 0 426.667-191.025 426.667-426.667v0c0-235.641-191.025-426.667-426.667-426.667v0zM512 853.333c-188.513 0-341.333-152.82-341.333-341.333s152.82-341.333 341.333-341.333c188.513 0 341.333 152.82 341.333 341.333v0c0 188.513-152.82 341.333-341.333 341.333v0z"],"attrs":[],"grid":0,"tags":["keyhole-circle"]},"attrs":[],"properties":{"order":5161,"id":523,"name":"keyhole-circle","prevSize":32,"code":60330},"setIdx":0,"setId":0,"iconIdx":682},{"icon":{"paths":["M469.333 500.053v139.947c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-139.947c25.542-14.943 42.472-42.166 42.667-73.359l0-0.028c0-47.128-38.205-85.333-85.333-85.333s-85.333 38.205-85.333 85.333v0c0.194 31.22 17.125 58.443 42.264 73.169l0.403 0.218zM896 85.333h-768c-23.564 0-42.667 19.103-42.667 42.667v0 768c0 23.564 19.103 42.667 42.667 42.667v0h768c23.564 0 42.667-19.103 42.667-42.667v0-768c0-23.564-19.103-42.667-42.667-42.667v0zM853.333 853.333h-682.667v-682.667h682.667z"],"attrs":[],"grid":0,"tags":["keyhole-square-full"]},"attrs":[],"properties":{"order":5162,"id":522,"name":"keyhole-square-full","prevSize":32,"code":60331},"setIdx":0,"setId":0,"iconIdx":683},{"icon":{"paths":["M810.667 85.333h-597.333c-70.692 0-128 57.308-128 128v0 597.333c0 70.692 57.308 128 128 128v0h597.333c70.692 0 128-57.308 128-128v0-597.333c0-70.692-57.308-128-128-128v0zM853.333 810.667c0 23.564-19.103 42.667-42.667 42.667v0h-597.333c-23.564 0-42.667-19.103-42.667-42.667v0-597.333c0-23.564 19.103-42.667 42.667-42.667v0h597.333c23.564 0 42.667 19.103 42.667 42.667v0zM512 341.333c-47.128 0-85.333 38.205-85.333 85.333v0c0.194 31.22 17.125 58.443 42.264 73.169l0.403 0.218v139.947c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-139.947c25.542-14.943 42.472-42.166 42.667-73.359l0-0.028c0-47.128-38.205-85.333-85.333-85.333v0z"],"attrs":[],"grid":0,"tags":["keyhole-square"]},"attrs":[],"properties":{"order":5163,"id":521,"name":"keyhole-square","prevSize":32,"code":60332},"setIdx":0,"setId":0,"iconIdx":684},{"icon":{"paths":["M426.667 426.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667c0 23.564 19.103 42.667 42.667 42.667v0c23.564 0 42.667-19.103 42.667-42.667v0zM618.667 599.893c-6.176-3.68-13.62-5.855-21.572-5.855-15.661 0-29.352 8.438-36.773 21.016l-0.109 0.199c-9.727 16.87-27.665 28.044-48.213 28.044s-38.486-11.173-48.071-27.776l-0.143-0.268c-7.53-12.777-21.22-21.215-36.882-21.215-7.952 0-15.395 2.175-21.768 5.963l0.197-0.108c-12.853 7.512-21.35 21.244-21.35 36.96 0 7.747 2.064 15.011 5.673 21.273l-0.11-0.207c24.839 42.655 70.351 70.869 122.453 70.869s97.614-28.214 122.092-70.198l0.362-0.672c3.499-6.055 5.563-13.32 5.563-21.067 0-15.716-8.497-29.448-21.148-36.851l-0.202-0.109zM640 384c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM512 85.333c-235.641 0-426.667 191.025-426.667 426.667s191.025 426.667 426.667 426.667c235.641 0 426.667-191.025 426.667-426.667v0c0-235.641-191.025-426.667-426.667-426.667v0zM512 853.333c-0.438 0.002-0.955 0.003-1.473 0.003-188.513 0-341.333-152.82-341.333-341.333 0-142.94 87.862-265.358 212.526-316.194l2.281-0.823c-0.21 2.745-0.329 5.945-0.329 9.173s0.119 6.428 0.354 9.596l-0.025-0.423c0 70.692 57.308 128 128 128v0c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667v0c188.513 0 341.333 152.82 341.333 341.333s-152.82 341.333-341.333 341.333v0z"],"attrs":[],"grid":0,"tags":["kid"]},"attrs":[],"properties":{"order":5164,"id":520,"name":"kid","prevSize":32,"code":60333},"setIdx":0,"setId":0,"iconIdx":685},{"icon":{"paths":["M640 512c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667c0-23.564-19.103-42.667-42.667-42.667v0c-23.564 0-42.667 19.103-42.667 42.667v0zM926.293 481.707l-213.333-213.333c-7.709-7.648-18.326-12.374-30.047-12.374-0.087 0-0.173 0-0.26 0.001l0.013-0h-469.333c-70.692 0-128 57.308-128 128v0 256c0 70.692 57.308 128 128 128v0h469.333c0.073 0 0.16 0.001 0.247 0.001 11.721 0 22.338-4.726 30.049-12.377l-0.003 0.003 213.333-213.333c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003zM665.173 682.667h-451.84c-23.564 0-42.667-19.103-42.667-42.667v0-256c0-23.564 19.103-42.667 42.667-42.667v0h451.84l170.667 170.667z"],"attrs":[],"grid":0,"tags":["label-alt"]},"attrs":[],"properties":{"order":5165,"id":519,"name":"label-alt","prevSize":32,"code":60334},"setIdx":0,"setId":0,"iconIdx":686},{"icon":{"paths":["M926.293 481.707l-213.333-213.333c-7.709-7.648-18.326-12.374-30.047-12.374-0.087 0-0.173 0-0.26 0.001l0.013-0h-469.333c-70.692 0-128 57.308-128 128v0 256c0 70.692 57.308 128 128 128v0h469.333c0.073 0 0.16 0.001 0.247 0.001 11.721 0 22.338-4.726 30.049-12.377l-0.003 0.003 213.333-213.333c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003zM665.173 682.667h-451.84c-23.564 0-42.667-19.103-42.667-42.667v0-256c0-23.564 19.103-42.667 42.667-42.667v0h451.84l170.667 170.667z"],"attrs":[],"grid":0,"tags":["label"]},"attrs":[],"properties":{"order":5166,"id":518,"name":"label","prevSize":32,"code":60335},"setIdx":0,"setId":0,"iconIdx":687},{"icon":{"paths":["M768 118.613c-4.434-19.198-21.383-33.293-41.624-33.293-0.367 0-0.732 0.005-1.096 0.014l0.054-0.001h-426.667c-0.31-0.008-0.676-0.013-1.042-0.013-20.241 0-37.19 14.095-41.568 33.005l-0.056 0.288-85.333 384c-0.658 2.807-1.035 6.030-1.035 9.342 0 10.245 3.611 19.646 9.629 27.001l-0.060-0.076c7.885 9.671 19.799 15.798 33.144 15.798 0.348 0 0.695-0.004 1.041-0.012l-0.051 0.001h168.107c1.63 12.73 2.56 27.457 2.56 42.402 0 0.093-0 0.186-0 0.279l0-0.014c0.002 0.449 0.003 0.98 0.003 1.512 0 104.191-41.868 198.603-109.697 267.329l0.041-0.041c-7.542 7.69-12.197 18.235-12.197 29.867 0 23.502 19.002 42.566 42.481 42.666l0.010 0h414.72c23.488-0.1 42.49-19.164 42.49-42.666 0-11.632-4.655-22.177-12.204-29.874l0.007 0.007c-67.789-68.686-109.656-163.098-109.656-267.288 0-0.532 0.001-1.063 0.003-1.594l-0 0.082c-0-0.079-0-0.172-0-0.265 0-14.945 0.93-29.672 2.736-44.127l-0.176 1.725h40.107v85.333c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-85.333h42.667c0.043 0 0.094 0 0.145 0 13.34 0 25.25-6.122 33.074-15.71l0.061-0.077c5.958-7.279 9.569-16.68 9.569-26.925 0-3.311-0.377-6.534-1.091-9.629l0.056 0.287zM393.387 853.333c47.602-71.785 75.948-159.934 75.948-254.704 0-0.456-0.001-0.911-0.002-1.367l0 0.071c0-14.080 0-28.587-2.133-42.667h89.6c0 14.080-2.133 28.587-2.133 42.667-0.001 0.385-0.002 0.84-0.002 1.296 0 94.77 28.347 182.919 77.024 256.431l-1.075-1.728zM265.387 469.333l67.413-298.667h358.4l66.133 298.667z"],"attrs":[],"grid":0,"tags":["lamp"]},"attrs":[],"properties":{"order":5167,"id":517,"name":"lamp","prevSize":32,"code":60336},"setIdx":0,"setId":0,"iconIdx":688},{"icon":{"paths":["M898.375 512h-85.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0 85.333h-50.528c4.836-12.664 7.705-27.307 7.861-42.6l0.001-0.067c0-0.006 0-0.013 0-0.020 0-70.682-57.299-127.981-127.981-127.981-47.134 0-88.317 25.48-110.526 63.417l-0.327 0.605c-3.646 6.154-5.8 13.564-5.8 21.477 0 23.562 19.101 42.663 42.663 42.663 15.783 0 29.565-8.571 36.944-21.312l0.11-0.205c7.519-12.82 21.227-21.295 36.914-21.312l0.002-0c23.564 0 42.667 19.103 42.667 42.667s-19.103 42.667-42.667 42.667v0c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0c23.564 0 42.667 19.103 42.667 42.667s-19.103 42.667-42.667 42.667v0c-15.69-0.017-29.397-8.493-36.808-21.112l-0.109-0.201c-7.489-12.946-21.27-21.517-37.054-21.517-23.562 0-42.663 19.101-42.663 42.663 0 7.913 2.154 15.323 5.909 21.676l-0.109-0.198c22.536 38.541 63.719 64.021 110.852 64.021 70.682 0 127.981-57.299 127.981-127.981 0-0.006-0-0.013-0-0.019l0 0.001c-0.156-15.36-3.026-30.002-8.151-43.537l0.289 0.87h50.528v128c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-298.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM387.667 479.688c4.795 18.698 21.497 32.297 41.375 32.297 23.555 0 42.651-19.095 42.651-42.651 0-3.677-0.465-7.246-1.34-10.65l0.064 0.296-74.959-299.937c-10.927-42.671-49.037-73.709-94.396-73.709s-83.469 31.038-94.249 73.034l-0.147 0.675-75 299.937c-0.811 3.108-1.276 6.677-1.276 10.354 0 23.555 19.095 42.651 42.651 42.651 19.878 0 36.58-13.599 41.31-32.001l0.064-0.296 23.927-95.688h125.409zM259.682 298.667l29.734-118.917c1.844-4.727 6.361-8.015 11.646-8.015s9.802 3.288 11.617 7.931l0.029 0.085 29.719 118.917zM599.708 298.667h42.667c23.554 0.024 42.642 19.112 42.667 42.664l0 0.002v42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667c-0.080-70.66-57.339-127.92-127.992-128l-42.674-0c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM429.041 682.667h-42.667c-23.554-0.024-42.642-19.112-42.667-42.664l-0-0.002v-42.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 42.667c0.080 70.66 57.339 127.92 127.992 128l42.674 0c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["language"]},"attrs":[],"properties":{"order":5168,"id":516,"name":"language","prevSize":32,"code":60337},"setIdx":0,"setId":0,"iconIdx":689},{"icon":{"paths":["M192 426.667h234.667c70.564-0.17 127.701-57.412 127.701-128 0-54.167-33.646-100.475-81.179-119.166l-0.869-0.301c-28.85-55.747-86.086-93.191-152.068-93.191-81.931 0-150.378 57.733-166.878 134.737l-0.201 1.12c-38.503 16.666-64.954 54.33-64.954 98.172 0 57.895 46.125 105.018 103.632 106.624l0.148 0.003zM192 298.667c23.564 0 42.667-19.103 42.667-42.667v0c0.339-46.871 38.413-84.736 85.331-84.736 37.134 0 68.727 23.719 80.458 56.832l0.184 0.597c5.163 14.65 17.694 25.478 33.026 28.124l0.254 0.036c20.162 3.573 35.296 20.908 35.413 41.801l0 0.013c0 23.564-19.103 42.667-42.667 42.667v0h-234.667c-11.782 0-21.333-9.551-21.333-21.333s9.551-21.333 21.333-21.333v0zM896 682.667h-42.667v-298.667c0-70.692-57.308-128-128-128v0h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h42.667c23.564 0 42.667 19.103 42.667 42.667v0 298.667h-512v-128c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 128h-42.667c-23.564 0-42.667 19.103-42.667 42.667v0 85.333c0 70.692 57.308 128 128 128v0h597.333c70.692 0 128-57.308 128-128v0-85.333c0-23.564-19.103-42.667-42.667-42.667v0zM853.333 810.667c0 23.564-19.103 42.667-42.667 42.667v0h-597.333c-23.564 0-42.667-19.103-42.667-42.667v0-42.667h682.667z"],"attrs":[],"grid":0,"tags":["laptop-cloud"]},"attrs":[],"properties":{"order":5169,"id":515,"name":"laptop-cloud","prevSize":32,"code":60338},"setIdx":0,"setId":0,"iconIdx":690},{"icon":{"paths":["M896 768h-263.68c-13.196-36.33-41.323-64.457-76.764-77.37l-0.89-0.283v-135.68h298.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-42.667v-256c0-70.692-57.308-128-128-128v0h-341.333c-70.692 0-128 57.308-128 128v0 256h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h298.667v135.68c-36.33 13.196-64.457 41.323-77.37 76.764l-0.283 0.89h-263.68c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h263.68c18.382 49.611 65.296 84.33 120.32 84.33s101.938-34.719 120.032-83.444l0.288-0.886h263.68c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM298.667 469.333v-256c0-23.564 19.103-42.667 42.667-42.667v0h341.333c23.564 0 42.667 19.103 42.667 42.667v0 256zM512 853.333c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667c23.564 0 42.667 19.103 42.667 42.667v0c0 23.564-19.103 42.667-42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["laptop-connection"]},"attrs":[],"properties":{"order":5170,"id":514,"name":"laptop-connection","prevSize":32,"code":60339},"setIdx":0,"setId":0,"iconIdx":691},{"icon":{"paths":["M896 597.333h-42.667v-298.667c0-70.692-57.308-128-128-128v0h-426.667c-70.692 0-128 57.308-128 128v0 298.667h-42.667c-23.564 0-42.667 19.103-42.667 42.667v0 85.333c0 70.692 57.308 128 128 128v0h597.333c70.692 0 128-57.308 128-128v0-85.333c0-23.564-19.103-42.667-42.667-42.667v0zM256 298.667c0-23.564 19.103-42.667 42.667-42.667v0h426.667c23.564 0 42.667 19.103 42.667 42.667v0 298.667h-512zM853.333 725.333c0 23.564-19.103 42.667-42.667 42.667v0h-597.333c-23.564 0-42.667-19.103-42.667-42.667v0-42.667h682.667z"],"attrs":[],"grid":0,"tags":["laptop"]},"attrs":[],"properties":{"order":5171,"id":513,"name":"laptop","prevSize":32,"code":60340},"setIdx":0,"setId":0,"iconIdx":692},{"icon":{"paths":["M604.16 520.96c7.709 7.648 18.326 12.374 30.047 12.374 0.087 0 0.173-0 0.26-0.001l-0.013 0c0.073 0 0.16 0.001 0.247 0.001 11.721 0 22.338-4.726 30.049-12.377l-0.003 0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003-33.707-33.707 33.707-33.707c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l-64 64c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003zM387.413 520.96l64-64c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003-64-64c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l-0-0 34.133 33.707-34.133 33.707c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003c7.709 7.648 18.326 12.374 30.047 12.374 0.087 0 0.173-0 0.26-0.001l-0.013 0c0.073 0 0.16 0.001 0.247 0.001 11.721 0 22.338-4.726 30.049-12.377l-0.003 0.003zM612.693 606.293c-27.277 22.134-62.42 35.536-100.693 35.536s-73.416-13.403-100.992-35.771l0.298 0.234c-7.346-6.139-16.891-9.867-27.307-9.867-23.594 0-42.72 19.126-42.72 42.72 0 13.178 5.967 24.962 15.346 32.798l0.068 0.055c41.735 35.027 96.036 56.304 155.307 56.304s113.571-21.277 155.681-56.61l-0.374 0.306c9.447-7.891 15.413-19.676 15.413-32.853 0-23.594-19.126-42.72-42.72-42.72-10.416 0-19.961 3.728-27.374 9.922l0.068-0.055zM512 85.333c-235.641 0-426.667 191.025-426.667 426.667s191.025 426.667 426.667 426.667c235.641 0 426.667-191.025 426.667-426.667v0c0-235.641-191.025-426.667-426.667-426.667v0zM512 853.333c-188.513 0-341.333-152.82-341.333-341.333s152.82-341.333 341.333-341.333c188.513 0 341.333 152.82 341.333 341.333v0c0 188.513-152.82 341.333-341.333 341.333v0z"],"attrs":[],"grid":0,"tags":["laughing"]},"attrs":[],"properties":{"order":5172,"id":512,"name":"laughing","prevSize":32,"code":60341},"setIdx":0,"setId":0,"iconIdx":693},{"icon":{"paths":["M437.76 213.333l74.24-42.667 298.667 170.667-134.4 78.080c-12.853 7.512-21.35 21.244-21.35 36.96 0 7.747 2.064 15.011 5.673 21.273l-0.11-0.207c7.488 12.956 21.275 21.534 37.066 21.534 7.877 0 15.255-2.134 21.588-5.856l-0.2 0.109 198.4-114.773c13.010-7.474 21.63-21.29 21.63-37.12s-8.62-29.646-21.423-37.010l-0.207-0.11-384-221.867c-6.12-3.594-13.479-5.716-21.333-5.716s-15.214 2.123-21.535 5.825l0.201-0.109-95.573 55.467c-12.956 7.488-21.534 21.275-21.534 37.066 0 7.877 2.134 15.255 5.856 21.588l-0.109-0.2c7.344 13.499 21.422 22.508 37.604 22.508 7.659 0 14.847-2.018 21.060-5.551l-0.211 0.11zM158.293 97.707c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l-0-0 96 97.707-85.333 49.92c-13.010 7.474-21.63 21.29-21.63 37.12s8.62 29.646 21.423 37.010l0.207 0.11 384 221.867c6.12 3.594 13.479 5.716 21.333 5.716s15.214-2.123 21.535-5.825l-0.201 0.109 4.267-2.56 45.653 45.653-71.253 42.667-364.373-212.907c-6.123-3.58-13.481-5.694-21.333-5.694-23.645 0-42.814 19.168-42.814 42.814 0 15.793 8.552 29.589 21.277 37.010l0.203 0.11 384 221.867c6.049 3.489 13.303 5.548 21.039 5.548 0.104 0 0.207-0 0.311-0.001l-0.016 0c0.088 0.001 0.191 0.001 0.295 0.001 7.735 0 14.99-2.058 21.246-5.658l-0.207 0.11 112.213-64.853 45.653 45.653-179.2 101.547-362.667-207.787c-6.123-3.58-13.481-5.694-21.333-5.694-23.645 0-42.814 19.168-42.814 42.814 0 15.793 8.552 29.589 21.277 37.010l0.203 0.11 384 221.867c6.12 3.594 13.479 5.716 21.333 5.716s15.214-2.123 21.535-5.825l-0.201 0.109 220.587-128 111.787 112.213c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003zM213.333 341.333l42.667-24.747 117.333 117.333zM874.667 474.88l-90.453 52.053c-12.929 7.531-21.48 21.327-21.48 37.12 0 23.645 19.168 42.814 42.814 42.814 7.852 0 15.21-2.114 21.537-5.803l-0.203 0.11 90.453-52.053c12.929-7.531 21.48-21.327 21.48-37.12 0-23.645-19.168-42.814-42.814-42.814-7.852 0-15.21 2.114-21.537 5.803l0.203-0.11z"],"attrs":[],"grid":0,"tags":["layer-group-slash"]},"attrs":[],"properties":{"order":5173,"id":511,"name":"layer-group-slash","prevSize":32,"code":60342},"setIdx":0,"setId":0,"iconIdx":694},{"icon":{"paths":["M106.667 378.027l384 221.867c6.12 3.594 13.479 5.716 21.333 5.716s15.214-2.123 21.535-5.825l-0.201 0.109 384-221.867c12.771-7.472 21.236-21.083 21.333-36.679l0-0.014c0-0.050 0-0.11 0-0.169 0-15.71-8.49-29.436-21.132-36.842l-0.201-0.109-384-221.44c-6.12-3.594-13.479-5.716-21.333-5.716s-15.214 2.123-21.535 5.825l0.201-0.109-384 221.44c-12.844 7.514-21.334 21.241-21.334 36.951 0 0.060 0 0.119 0 0.179l-0-0.009c0.097 15.61 8.562 29.222 21.132 36.584l0.201 0.109zM512 170.667l298.667 170.667-298.667 170.667-298.667-170.667zM874.667 476.587l-362.667 206.080-362.667-207.787c-6.133-3.613-13.511-5.748-21.388-5.748-15.791 0-29.578 8.578-36.956 21.329l-0.11 0.205c-3.499 6.055-5.563 13.32-5.563 21.067 0 15.716 8.497 29.448 21.148 36.851l0.202 0.109 384 221.867c6.12 3.594 13.479 5.716 21.333 5.716s15.214-2.123 21.535-5.825l-0.201 0.109 384-221.867c12.853-7.512 21.35-21.244 21.35-36.96 0-7.747-2.064-15.011-5.673-21.273l0.11 0.207c-7.488-12.956-21.275-21.534-37.066-21.534-7.877 0-15.255 2.134-21.588 5.856l0.2-0.109zM874.667 647.253l-362.667 206.080-362.667-207.787c-6.133-3.613-13.511-5.748-21.388-5.748-15.791 0-29.578 8.578-36.956 21.329l-0.11 0.205c-3.499 6.055-5.563 13.32-5.563 21.067 0 15.716 8.497 29.448 21.148 36.851l0.202 0.109 384 221.867c6.12 3.594 13.479 5.716 21.333 5.716s15.214-2.123 21.535-5.825l-0.201 0.109 384-221.867c12.853-7.512 21.35-21.244 21.35-36.96 0-7.747-2.064-15.011-5.673-21.273l0.11 0.207c-7.488-12.956-21.275-21.534-37.066-21.534-7.877 0-15.255 2.134-21.588 5.856l0.2-0.109z"],"attrs":[],"grid":0,"tags":["layer-group"]},"attrs":[],"properties":{"order":5174,"id":510,"name":"layer-group","prevSize":32,"code":60343},"setIdx":0,"setId":0,"iconIdx":695},{"icon":{"paths":["M896 85.333h-512c-23.564 0-42.667 19.103-42.667 42.667v0 170.667h-85.333c-23.564 0-42.667 19.103-42.667 42.667v0 170.667h-85.333c-23.564 0-42.667 19.103-42.667 42.667v0 341.333c0 23.564 19.103 42.667 42.667 42.667v0h341.333c23.564 0 42.667-19.103 42.667-42.667v0-85.333h170.667c23.564 0 42.667-19.103 42.667-42.667v0-85.333h170.667c23.564 0 42.667-19.103 42.667-42.667v0-512c0-23.564-19.103-42.667-42.667-42.667v0zM426.667 853.333h-256v-256h256zM640 725.333h-128v-170.667c0-23.564-19.103-42.667-42.667-42.667v0h-170.667v-128h341.333zM853.333 597.333h-128v-256c0-23.564-19.103-42.667-42.667-42.667v0h-256v-128h426.667z"],"attrs":[],"grid":0,"tags":["layers-alt"]},"attrs":[],"properties":{"order":5175,"id":509,"name":"layers-alt","prevSize":32,"code":60344},"setIdx":0,"setId":0,"iconIdx":696},{"icon":{"paths":["M874.24 594.773l-14.507 8.533c-12.599 7.57-20.898 21.164-20.898 36.696 0 8.028 2.217 15.537 6.072 21.951l-0.107-0.193c7.568 12.601 21.161 20.904 36.693 20.907l0 0c8.029-0.002 15.54-2.222 21.953-6.081l-0.193 0.107 14.507-8.533c10.702-7.848 17.572-20.375 17.572-34.506 0-23.564-19.103-42.667-42.667-42.667-6.368 0-12.409 1.395-17.837 3.896l0.265-0.109zM497.067 271.36l14.933-8.96 298.667 170.667-75.093 42.667c-13.011 7.474-21.632 21.291-21.632 37.121 0 23.564 19.103 42.667 42.667 42.667 0.105 0 0.21-0 0.314-0.001l-0.016 0c0.088 0.001 0.191 0.001 0.295 0.001 7.735 0 14.99-2.058 21.246-5.658l-0.207 0.11 139.093-80.64c13.010-7.474 21.63-21.29 21.63-37.12s-8.62-29.646-21.423-37.010l-0.207-0.11-384-221.44c-6.12-3.594-13.479-5.716-21.333-5.716s-15.214 2.123-21.535 5.825l0.201-0.109-36.267 20.907c-12.929 7.531-21.48 21.327-21.48 37.12 0 23.645 19.168 42.814 42.814 42.814 7.852 0 15.21-2.114 21.537-5.803l-0.203 0.11zM158.293 97.707c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l-0-0 155.307 154.88-146.347 85.333c-13.010 7.474-21.63 21.29-21.63 37.12s8.62 29.646 21.423 37.010l0.207 0.11 384 221.867c6.171 3.385 13.501 5.425 21.296 5.546l0.037 0c7.833-0.192 15.15-2.222 21.592-5.673l-0.258 0.126 64-37.547 61.867 62.293-146.773 85.333-363.093-210.347c-6.123-3.58-13.481-5.694-21.333-5.694-23.645 0-42.814 19.168-42.814 42.814 0 15.793 8.552 29.589 21.277 37.010l0.203 0.11 384 221.867c6.12 3.594 13.479 5.716 21.333 5.716s15.214-2.123 21.535-5.825l-0.201 0.109 188.16-108.8 144.213 144.64c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003zM512 609.707l-298.667-174.933 102.4-58.88 218.453 218.88z"],"attrs":[],"grid":0,"tags":["layers-slash"]},"attrs":[],"properties":{"order":5176,"id":508,"name":"layers-slash","prevSize":32,"code":60345},"setIdx":0,"setId":0,"iconIdx":697},{"icon":{"paths":["M106.667 450.56l384 221.867c6.12 3.594 13.479 5.716 21.333 5.716s15.214-2.123 21.535-5.825l-0.201 0.109 384-221.867c12.801-7.524 21.258-21.228 21.258-36.907s-8.457-29.382-21.058-36.798l-0.2-0.109-384-221.867c-6.12-3.594-13.479-5.716-21.333-5.716s-15.214 2.123-21.535 5.825l0.201-0.109-384 221.867c-12.801 7.524-21.258 21.228-21.258 36.907s8.457 29.382 21.058 36.798l0.2 0.109zM512 241.067l298.667 170.667-298.667 172.8-298.667-171.093zM874.667 573.44l-362.667 209.493-362.667-209.493c-6.176-3.68-13.62-5.855-21.572-5.855-15.661 0-29.352 8.438-36.773 21.016l-0.109 0.199c-3.613 6.133-5.748 13.511-5.748 21.388 0 15.791 8.578 29.578 21.329 36.956l0.205 0.11 384 221.867c6.12 3.594 13.479 5.716 21.333 5.716s15.214-2.123 21.535-5.825l-0.201 0.109 384-221.867c12.956-7.488 21.534-21.275 21.534-37.066 0-7.877-2.134-15.255-5.856-21.588l0.109 0.2c-7.53-12.777-21.22-21.215-36.882-21.215-7.952 0-15.395 2.175-21.768 5.963l0.197-0.108z"],"attrs":[],"grid":0,"tags":["layers"]},"attrs":[],"properties":{"order":5177,"id":507,"name":"layers","prevSize":32,"code":60346},"setIdx":0,"setId":0,"iconIdx":698},{"icon":{"paths":["M725.333 469.333h-494.507l98.133-97.707c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l-170.667 170.667c-3.773 3.937-6.808 8.616-8.859 13.791l-0.101 0.289c-2.024 4.793-3.201 10.366-3.201 16.213s1.176 11.42 3.305 16.495l-0.105-0.281c2.152 5.464 5.187 10.143 8.974 14.095l-0.014-0.015 170.667 170.667c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003-98.133-97.707h494.507c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM896 170.667c-23.564 0-42.667 19.103-42.667 42.667v0 597.333c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-597.333c0-23.564-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["left-arrow-from-left"]},"attrs":[],"properties":{"order":5178,"id":506,"name":"left-arrow-from-left","prevSize":32,"code":60347},"setIdx":0,"setId":0,"iconIdx":699},{"icon":{"paths":["M896 469.333h-494.507l98.133-97.707c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l-170.667 170.667c-3.773 3.937-6.808 8.616-8.859 13.791l-0.101 0.289c-2.024 4.793-3.201 10.366-3.201 16.213s1.176 11.42 3.305 16.495l-0.105-0.281c2.152 5.464 5.187 10.143 8.974 14.095l-0.014-0.015 170.667 170.667c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003-98.133-97.707h494.507c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM128 128c-23.564 0-42.667 19.103-42.667 42.667v0 682.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-682.667c0-23.564-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["left-arrow-to-left"]},"attrs":[],"properties":{"order":5179,"id":505,"name":"left-arrow-to-left","prevSize":32,"code":60348},"setIdx":0,"setId":0,"iconIdx":700},{"icon":{"paths":["M384 213.333c-23.564 0-42.667 19.103-42.667 42.667v0 512c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-512c0-23.564-19.103-42.667-42.667-42.667v0zM554.667 298.667h341.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-341.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM246.187 413.44c-7.882-9.459-19.666-15.435-32.846-15.435-10.422 0-19.971 3.736-27.38 9.943l0.067-0.054-85.333 71.253c-9.464 7.882-15.443 19.669-15.443 32.853s5.98 24.971 15.375 32.798l0.069 0.056 85.333 71.253c7.343 6.152 16.892 9.888 27.314 9.888 13.18 0 24.964-5.976 32.791-15.366l0.056-0.069c6.152-7.343 9.888-16.892 9.888-27.314 0-13.18-5.976-24.964-15.366-32.791l-0.069-0.056-46.080-38.4 46.080-38.4c9.459-7.882 15.435-19.666 15.435-32.846 0-10.422-3.736-19.971-9.943-27.38l0.054 0.067zM896 384h-341.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h341.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM896 554.667h-341.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h341.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM896 725.333h-341.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h341.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["left-indent-alt"]},"attrs":[],"properties":{"order":5180,"id":504,"name":"left-indent-alt","prevSize":32,"code":60349},"setIdx":0,"setId":0,"iconIdx":701},{"icon":{"paths":["M128 298.667h768c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-768c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM128 469.333h426.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-426.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM928.853 413.44c-7.878-9.312-19.572-15.184-32.637-15.184-10.518 0-20.147 3.806-27.585 10.115l0.062-0.051-85.333 70.827c-9.464 7.882-15.443 19.669-15.443 32.853s5.98 24.971 15.375 32.798l0.069 0.056 85.333 70.827c7.304 6.276 16.845 10.132 27.284 10.24l0.023 0c0.021 0 0.045 0 0.069 0 13.146 0 24.903-5.945 32.73-15.293l0.054-0.067c6.152-7.343 9.888-16.892 9.888-27.314 0-13.18-5.976-24.964-15.366-32.791l-0.069-0.056-46.080-38.4 46.080-38.4c9.459-7.882 15.435-19.666 15.435-32.846 0-10.422-3.736-19.971-9.943-27.38l0.054 0.067zM896 725.333h-768c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h768c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM128 640h426.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-426.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["left-indent"]},"attrs":[],"properties":{"order":5181,"id":503,"name":"left-indent","prevSize":32,"code":60350},"setIdx":0,"setId":0,"iconIdx":702},{"icon":{"paths":["M913.92 751.787c-2.152-5.464-5.187-10.143-8.974-14.095l0.014 0.015-128-128c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l-0-0 55.467 55.040h-622.507c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h622.507l-55.467 55.040c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 128-128c3.773-3.937 6.808-8.616 8.859-13.791l0.101-0.289c2.024-4.793 3.201-10.366 3.201-16.213s-1.176-11.42-3.305-16.495l0.105 0.281zM362.667 426.667v170.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-426.667h85.333v426.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-426.667h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-298.667c-94.257 0-170.667 76.41-170.667 170.667s76.41 170.667 170.667 170.667v0zM362.667 170.667v170.667c-47.128 0-85.333-38.205-85.333-85.333s38.205-85.333 85.333-85.333v0z"],"attrs":[],"grid":0,"tags":["left-to-right-text-direction"]},"attrs":[],"properties":{"order":5182,"id":502,"name":"left-to-right-text-direction","prevSize":32,"code":60351},"setIdx":0,"setId":0,"iconIdx":703},{"icon":{"paths":["M853.333 213.333h-298.667v-42.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 42.667h-298.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h506.971c-20.478 133.161-80.821 249.553-168.272 339.438l0.136-0.141c-60.693-62.231-108.385-137.451-138.487-221.068l-1.349-4.292c-6.005-16.773-21.763-28.557-40.272-28.557-23.569 0-42.675 19.106-42.675 42.675 0 5.018 0.866 9.834 2.457 14.306l-0.093-0.298c35.454 99.067 88.987 183.886 157.205 254.413l-0.187-0.194c-68.934 54.774-151.682 95.377-242.056 115.917l-4.088 0.781c-19.314 4.348-33.526 21.355-33.526 41.681 0 23.545 19.069 42.637 42.606 42.673l0.003 0c3.248-0.001 6.412-0.358 9.456-1.035l-0.289 0.054c112.26-25.289 210.388-74.645 292.635-142.55l-1.179 0.945c81.251 66.893 179.517 116.236 287.234 140.709l4.685 0.895c2.641 0.581 5.674 0.914 8.785 0.914 23.564 0 42.667-19.103 42.667-42.667 0-20.239-14.091-37.186-32.998-41.566l-0.288-0.056c-94.759-21.292-177.799-61.869-248.311-117.599l1.291 0.984c100.96-104.738 169.798-241.066 190.277-392.739l0.4-3.623h89.927c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["letter-chinese-a"]},"attrs":[],"properties":{"order":5183,"id":501,"name":"letter-chinese-a","prevSize":32,"code":60352},"setIdx":0,"setId":0,"iconIdx":704},{"icon":{"paths":["M809.396 842.979l-154.5-618.021c-14.309-56.12-64.405-96.958-124.039-96.958-0.052 0-0.104 0-0.156 0l-37.411-0c-0.044-0-0.095-0-0.147-0-59.634 0-109.73 40.838-123.847 96.073l-0.192 0.885-154.5 618.021c-0.81 3.109-1.275 6.677-1.275 10.354 0 23.567 19.104 42.671 42.671 42.671 19.889 0 36.6-13.608 41.331-32.021l0.064-0.296 55.919-223.688h317.37l55.919 223.688c4.795 18.709 21.506 32.317 41.396 32.317 23.567 0 42.671-19.104 42.671-42.671 0-3.677-0.465-7.246-1.34-10.65l0.064 0.296zM374.648 554.667l77.248-309c4.759-18.713 21.458-32.333 41.338-32.333 0.020 0 0.040 0 0.061 0l-0.003-0h37.419c0.017-0 0.037-0 0.058-0 19.88 0 36.579 13.62 41.274 32.039l0.064 0.295 77.246 309z"],"attrs":[],"grid":0,"tags":["letter-english-a"]},"attrs":[],"properties":{"order":5184,"id":500,"name":"letter-english-a","prevSize":32,"code":60353},"setIdx":0,"setId":0,"iconIdx":705},{"icon":{"paths":["M854.272 128h-213.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h64v256h-211.197c27.151-35.046 43.583-79.587 43.758-127.96l0-0.040c-0.002-117.819-95.514-213.33-213.333-213.33-78.546 0-147.177 42.448-184.205 105.656l-0.545 1.007c-3.663 6.165-5.828 13.591-5.828 21.523 0 23.558 19.098 42.656 42.656 42.656 15.78 0 29.558-8.569 36.937-21.307l0.11-0.205c22.543-38.54 63.73-64.018 110.867-64.018 70.697 0 128.009 57.312 128.009 128.009 0 70.694-57.306 128.004-127.999 128.009l-0.001 0c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0c70.682 0.014 127.975 57.316 127.975 128 0 70.692-57.308 128-128 128-47.128 0-88.308-25.47-110.524-63.396l-0.327-0.604c-7.528-12.775-21.215-21.212-36.874-21.212-23.558 0-42.656 19.098-42.656 42.656 0 7.81 2.099 15.13 5.764 21.426l-0.109-0.203c37.573 64.215 106.205 106.665 184.751 106.665 117.82 0 213.332-95.511 213.333-213.331l0-0c-0.175-48.413-16.608-92.954-44.119-128.484l0.361 0.484h211.197v298.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-640h64c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["letter-hindi-a"]},"attrs":[],"properties":{"order":5185,"id":499,"name":"letter-hindi-a","prevSize":32,"code":60354},"setIdx":0,"setId":0,"iconIdx":706},{"icon":{"paths":["M873.458 511.875c-37.067-56.131-99.464-92.931-170.523-94.027l-0.164-0.002c-0.554-15.791-2.551-30.8-5.871-45.305l0.309 1.603c-4.613-18.951-21.439-32.8-41.5-32.8-23.557 0-42.654 19.097-42.654 42.654 0 3.496 0.421 6.894 1.214 10.146l-0.060-0.292c1.777 7.492 3.037 16.282 3.513 25.28l0.016 0.376c-51.704 6.529-98.632 18.837-142.879 36.441l3.913-1.373c0.961-51.364 3.276-102.711 8.393-153.911l1.633-16.308c58.757-8.059 109.107-17.971 158.433-30.452l-9.857 2.114 5.125-1.271c18.871-4.677 32.638-21.466 32.638-41.471 0-23.564-19.103-42.667-42.667-42.667-3.72 0-7.328 0.476-10.768 1.37l0.297-0.065-5.208 1.292c-39.323 9.833-79.174 17.258-119.208 23.492l6.458-64.451c0.135-1.274 0.212-2.753 0.212-4.25 0-23.566-19.104-42.671-42.671-42.671-22.070 0-40.226 16.755-42.443 38.238l-0.015 0.183-8.371 83.596c-39.846 3.573-79.802 5.99-119.835 5.99-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0c37.143 0 74.219-1.979 111.224-4.873-5.553 55.794-8.72 120.592-8.72 186.13 0 5.036 0.019 10.067 0.056 15.094l-0.005-0.774c-5.726 3.125-11.505 6.063-17.179 9.359-31.782 18.329-58.95 36.81-84.664 57.053l1.497-1.136-0.958 0.771c-43.044 33.409-80.267 71.339-111.9 113.689l-1.1 1.54c-15.154 20.789-24.245 46.842-24.245 75.018 0 70.791 57.388 128.179 128.179 128.179 7.693 0 15.228-0.678 22.549-1.977l-0.774 0.114c45.555-8.817 86.119-23.816 123.215-44.321l-2.137 1.083c7.66 11.905 20.844 19.678 35.842 19.678 23.461 0 42.481-19.019 42.481-42.481 0-2.533-0.222-5.014-0.647-7.424l0.037 0.256c-1.034-6.195-1.508-12.456-2.479-18.659 20.56-15.968 38.845-32.108 56.072-49.307l-0.008 0.008c34.045-33.911 63.751-72.138 88.239-113.801l1.433-2.637c0.977-1.685 1.797-3.375 2.75-5.062 5.035-8.984 9.789-18.005 14.156-27.091 2.297-4.739 4.365-9.461 6.466-14.2 2.557-5.812 5-11.615 7.273-17.443 2.409-6.127 4.685-12.229 6.761-18.333 1.38-4.089 2.583-8.159 3.818-12.242 2.19-7.203 4.341-14.383 6.059-21.516l0.213-0.758c0.553-0.009 1.205-0.013 1.858-0.013 42.201 0 79.655 20.324 103.109 51.717l0.241 0.338c43.459 75.396-41.083 212.352-188.459 305.271-12.1 7.667-20.017 20.985-20.017 36.153 0 23.558 19.098 42.656 42.656 42.656 8.483 0 16.387-2.476 23.030-6.745l-0.169 0.102c191.956-121 285.165-301.584 216.79-420.209zM289.958 792.854c-2.059 0.35-4.43 0.551-6.848 0.551-23.675 0-42.867-19.192-42.867-42.867 0-9.311 2.969-17.929 8.011-24.958l-0.088 0.129c28.338-37.733 60.531-70.356 96.58-98.234l1.17-0.87 1.125-0.917c15.099-11.815 31.659-22.997 48.811-33.835 2.607 51.002 7.375 101.839 13.906 152.529-34.314 22.344-74.477 39.178-117.54 48.082l-2.26 0.391zM602.695 511.98c-4.745 13.72-9.303 24.736-14.392 35.45l0.903-2.112c-2.372 5.073-5.035 10.144-7.688 15.229q-6.152 11.883-13.252 23.651c-3.612 5.953-7.334 11.898-11.313 17.81-18.481 27.455-38.237 51.437-60.056 73.364l0.020-0.020c-2.979 2.979-6.12 5.687-9.156 8.576q-6.961-68.16-9.013-136.651c36.131-17.076 78.161-30.856 122.102-39.25l3.338-0.531c-0.497 1.496-0.969 2.983-1.492 4.483z"],"attrs":[],"grid":0,"tags":["letter-japanese-a"]},"attrs":[],"properties":{"order":5186,"id":498,"name":"letter-japanese-a","prevSize":32,"code":60355},"setIdx":0,"setId":0,"iconIdx":707},{"icon":{"paths":["M938.667 471.467c0-4.693 0-9.387 0-14.080l-3.84-25.6-3.84-16.64c0-7.253-3.413-14.507-5.547-21.76s-3.413-11.52-5.547-17.067c-1.008-2.689-2.034-6.112-2.861-9.612l-0.125-0.628s0 0 0-2.133c-44.686-116.596-135.137-207.047-248.784-250.737l-2.949-0.997s0 0-2.133 0l-9.813-2.987-17.92-5.547c-6.4 0-13.227-3.413-19.627-5.12l-19.627-4.267-19.627-2.987c-6.827 0-13.227 0-20.48-2.56s-14.933 0-22.187 0l-21.76-3.413h-16.64c-7.253 0-14.933 0-22.187 0s-13.653 0-20.48 2.56l-19.627 2.987-19.627 4.267c-6.4 0-13.227 2.987-19.627 5.12l-17.92 5.547-9.813 2.987s0 0-2.133 0c-116.596 44.686-207.047 135.137-250.737 248.784l-0.997 2.949s0 0 0 2.133c-0.953 4.128-1.979 7.551-3.191 10.884l0.205-0.644c0 5.547-3.84 11.093-5.547 17.067s-3.84 14.507-5.547 21.76l-3.84 16.64-3.84 25.6c0 4.693 0 9.387 0 14.080 0 13.227 0 26.88 0 40.533s0 27.307 0 40.533c0 4.693 0 9.387 0 14.080l3.84 25.6 3.84 16.64c0 7.253 3.413 14.507 5.547 21.76s3.413 11.52 5.547 17.067c1.008 2.689 2.034 6.112 2.861 9.612l0.125 0.628c0.039 0.447 0.061 0.968 0.061 1.493s-0.022 1.046-0.065 1.56l0.005-0.067c44.304 116.477 134.732 206.766 248.374 249.903l2.932 0.977s0 0 2.133 0l10.24 2.987 17.067 5.547 21.76 5.547 16.64 3.84 25.6 3.84h14.080c13.227 0 26.88 2.133 40.533 2.133s27.307 0 40.533-2.133h14.080l25.6-3.84 16.64-3.84 21.76-5.547 17.067-5.547 10.24-2.987s0 0 2.133 0c116.575-44.114 207.003-134.403 250.326-247.953l0.981-2.927c-0.039-0.447-0.061-0.968-0.061-1.493s0.022-1.046 0.065-1.56l-0.005 0.067c0-3.413 2.133-6.827 2.987-10.24s3.84-11.093 5.547-17.067 3.84-14.507 5.547-21.76l3.84-16.64 3.84-25.6c0-4.693 0-9.387 0-14.080 0-13.227 2.133-26.88 2.133-40.533s3.84-23.893 3.84-37.12zM669.867 208.64c63.717 33.208 114.419 83.911 146.731 145.744l0.896 1.883-122.027 42.667c-17.989-28.528-41.446-51.984-69.071-69.441l-0.902-0.532zM441.173 178.773c8.96-2.133 17.493-3.413 26.027-4.693h10.24c11.007-1.223 23.769-1.92 36.693-1.92s25.687 0.697 38.25 2.057l-1.557-0.137h10.24c8.533 0 17.067 2.56 26.027 4.693h2.56l-42.667 122.027c-8.748-1.415-18.831-2.224-29.104-2.224-2.069 0-4.129 0.033-6.182 0.098l0.3-0.008c-0.074-0-0.161-0-0.248-0-10.913 0-21.609 0.931-32.012 2.719l1.114-0.158-42.667-122.027zM358.4 208.64l42.667 122.027c-28.697 17.948-52.298 41.412-69.87 69.081l-0.53 0.893-122.027-42.667c32.948-64.399 83.7-115.701 145.764-148.438l1.862-0.896zM178.773 584.96c-1.856-7.253-3.362-15.972-4.211-24.883l-0.055-0.717c0-3.84 0-7.253 0-10.667-1.358-11.014-2.134-23.763-2.134-36.693s0.775-25.679 2.282-38.204l-0.148 1.51c0-3.413 0-6.827 0-10.667 0.904-9.628 2.411-18.347 4.525-26.825l-0.259 1.225s0 0 0-2.56l122.027 42.667c-1.629 9.364-2.56 20.146-2.56 31.147s0.931 21.783 2.719 32.274l-0.159-1.127-122.027 42.667s-0 1.707-0 0.853zM356.267 815.36c-63.717-33.208-114.419-83.911-146.731-145.744l-0.896-1.883 122.027-42.667c17.989 28.528 41.446 51.984 69.071 69.441l0.902 0.532zM584.96 845.227c-8.96 2.133-17.493 3.413-26.027 4.693h-10.24c-11.007 1.223-23.769 1.92-36.693 1.92s-25.687-0.697-38.25-2.057l1.557 0.137h-10.24c-8.533 0-17.067-2.56-26.027-4.693h-2.56l42.667-122.027c9.364 1.629 20.146 2.56 31.147 2.56s21.783-0.931 32.274-2.719l-1.127 0.159 42.667 122.027zM556.373 631.893v0c-7.253 2.56-14.507 4.267-21.333 5.973-6.414 1.253-13.79 1.97-21.333 1.97s-14.919-0.717-22.063-2.087l0.73 0.116c-6.827 0-14.080-3.413-21.333-5.973v0c-36.598-12.898-65.030-40.911-78.218-76.342l-0.289-0.885c-2.312-6.076-4.378-13.375-5.834-20.893l-0.14-0.867c-1.302-6.414-2.047-13.787-2.047-21.333s0.745-14.919 2.165-22.049l-0.119 0.715c1.492-8.074 3.412-15.094 5.848-21.868l-0.302 0.961c13.314-35.903 41.229-63.678 76.338-76.516l0.889-0.284c7.253-2.56 14.507-4.267 21.333-5.973 6.414-1.253 13.79-1.97 21.333-1.97s14.919 0.717 22.063 2.087l-0.73-0.116c6.827 0 14.080 3.413 21.333 5.973v0c35.824 13.225 63.575 40.976 76.513 75.914l0.287 0.886c2.312 6.076 4.378 13.375 5.834 20.893l0.14 0.867c1.302 6.414 2.047 13.787 2.047 21.333s-0.745 14.919-2.165 22.049l0.119-0.715c-1.595 8.385-3.661 15.684-6.285 22.712l0.311-0.952c-13.428 35.477-41.132 62.901-75.912 75.662l-0.888 0.285zM667.733 815.787l-42.667-122.027c28.528-17.989 51.984-41.446 69.441-69.071l0.532-0.902 122.027 42.667c-33.437 64.439-84.777 115.641-147.426 148.011l-1.907 0.896zM853.333 548.693c0 3.413 0 6.827 0 10.667-0.904 9.628-2.411 18.347-4.525 26.825l0.259-1.225s0 0 0 2.56l-122.027-42.667c1.629-9.364 2.56-20.146 2.56-31.147s-0.931-21.783-2.719-32.274l0.159 1.127 122.027-42.667s0 0 0 2.56c1.856 7.253 3.362 15.972 4.211 24.883l0.055 0.717c0 3.84 0 7.253 0 10.667 1.358 11.014 2.134 23.763 2.134 36.693s-0.775 25.679-2.282 38.204l0.148-1.51z"],"attrs":[],"grid":0,"tags":["life-ring"]},"attrs":[],"properties":{"order":5187,"id":497,"name":"life-ring","prevSize":32,"code":60356},"setIdx":0,"setId":0,"iconIdx":708},{"icon":{"paths":["M729.173 120.32c-58.469-48.367-134.217-77.708-216.819-77.708-24.14 0-47.694 2.506-70.417 7.272l2.222-0.39c-135.619 28.104-240.489 133.69-267.158 267.477l-0.362 2.176c-3.798 19.196-5.971 41.266-5.971 63.844 0 83.859 29.979 160.717 79.804 220.44l-0.447-0.551c28.948 32.551 47.127 75.243 48.632 122.147l0.008 0.307v128c0 70.692 57.308 128 128 128v0h170.667c70.692 0 128-57.308 128-128v0-119.893c1.541-52.167 20.963-99.52 52.315-136.422l-0.261 0.315c47.261-58.094 75.886-132.996 75.886-214.584 0-105.722-48.065-200.219-123.536-262.828l-0.564-0.455zM640 853.333c0 23.564-19.103 42.667-42.667 42.667v0h-170.667c-23.564 0-42.667-19.103-42.667-42.667v0-42.667h256zM711.253 544.427c-41.346 48.792-67.68 111.467-71.223 180.168l-0.030 0.739h-85.333v-128c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 128h-85.333c-1.212-68.21-26.864-130.203-68.542-177.814l0.275 0.321c-36.99-44.083-59.46-101.436-59.46-164.036 0-123.010 86.759-225.756 202.423-250.385l1.676-0.299c15.52-3.344 33.35-5.26 51.627-5.26 141.385 0 256 114.615 256 256 0 0.049-0 0.098-0 0.148l0-0.008c0.002 0.403 0.004 0.88 0.004 1.358 0 60.559-21.42 116.115-57.098 159.504l0.347-0.435z"],"attrs":[],"grid":0,"tags":["lightbulb-alt"]},"attrs":[],"properties":{"order":5188,"id":496,"name":"lightbulb-alt","prevSize":32,"code":60357},"setIdx":0,"setId":0,"iconIdx":709},{"icon":{"paths":["M744.533 531.627c41.615-50.923 66.831-116.663 66.831-188.292 0-92.922-42.435-175.932-108.983-230.71l-0.515-0.411c-51.316-41.398-117.322-66.453-189.18-66.453-22.46 0-44.348 2.448-65.413 7.091l2.006-0.371c-134.941 30.612-234.166 149.528-234.166 291.619 0 69.751 23.911 133.917 63.982 184.75l-0.483-0.635c27.315 33.038 44.438 75.386 46.070 121.676l0.010 0.35v12.373c-15.684 15.167-25.562 36.253-26.025 59.647l-0.001 0.086v85.333c0 47.128 38.205 85.333 85.333 85.333v0 42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667h85.333v42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667c47.128 0 85.333-38.205 85.333-85.333v0-85.333c0-0.022 0-0.048 0-0.075 0-23.227-9.28-44.287-24.335-59.674l0.015 0.015v-18.347c1.341-43.234 17.579-82.435 43.723-112.882l-0.203 0.242zM384 807.68v-85.333h256v85.333zM677.973 478.293c-36.4 42.724-59.482 97.782-62.272 158.139l-0.021 0.581h-207.787c-4.329-61.805-27.771-117.424-64.387-161.762l0.387 0.482c-28.968-36.108-46.49-82.481-46.49-132.946 0-101.638 71.077-186.676 166.238-208.118l1.426-0.27c14.105-3.323 30.301-5.228 46.941-5.228 117.821 0 213.333 95.513 213.333 213.333 0 0.638-0.003 1.276-0.008 1.913l0.001-0.098c0.002 0.342 0.003 0.746 0.003 1.151 0 50.563-17.877 96.95-47.654 133.187l0.291-0.365z"],"attrs":[],"grid":0,"tags":["lightbulb"]},"attrs":[],"properties":{"order":5189,"id":495,"name":"lightbulb","prevSize":32,"code":60358},"setIdx":0,"setId":0,"iconIdx":710},{"icon":{"paths":["M926.293 140.373c-7.733-7.795-18.45-12.621-30.293-12.621s-22.56 4.826-30.291 12.618l-0.003 0.003-768 768c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 768-768c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003z"],"attrs":[],"grid":0,"tags":["line-alt"]},"attrs":[],"properties":{"order":5190,"id":494,"name":"line-alt","prevSize":32,"code":60359},"setIdx":0,"setId":0,"iconIdx":711},{"icon":{"paths":["M268.373 414.293c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003-85.333-85.333c-3.937-3.773-8.616-6.808-13.791-8.859l-0.289-0.101c-4.793-2.024-10.366-3.201-16.213-3.201s-11.42 1.176-16.495 3.305l0.281-0.105c-5.464 2.152-10.143 5.187-14.095 8.974l0.015-0.014-85.333 85.333c-7.753 7.753-12.548 18.463-12.548 30.293 0 23.661 19.181 42.841 42.841 42.841 11.83 0 22.541-4.795 30.293-12.548l-0 0 12.373-12.8v221.013l-12.373-12.8c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l85.333 85.333c3.937 3.773 8.616 6.808 13.791 8.859l0.289 0.101c4.771 2.163 10.345 3.423 16.213 3.423s11.443-1.26 16.466-3.525l-0.253 0.102c5.464-2.152 10.143-5.187 14.095-8.974l-0.015 0.014 85.333-85.333c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l0-0-12.373 12.8v-221.013zM469.333 341.333h426.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-426.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM896 469.333h-426.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h426.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM896 682.667h-426.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h426.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["line-spacing"]},"attrs":[],"properties":{"order":5191,"id":493,"name":"line-spacing","prevSize":32,"code":60360},"setIdx":0,"setId":0,"iconIdx":712},{"icon":{"paths":["M516.693 656.64l-165.547 165.547c-19.086 19.159-45.492 31.014-74.667 31.014s-55.581-11.855-74.663-31.011l-0.003-0.003c-19.263-19.038-31.194-45.459-31.194-74.667s11.93-55.629 31.183-74.657l0.010-0.010 165.547-165.547c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l-0 0-165.547 165.973c-31.236 33.915-50.386 79.381-50.386 129.32 0 105.567 85.579 191.147 191.147 191.147 49.938 0 95.404-19.15 129.454-50.508l-0.134 0.122 165.973-165.547c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l0-0zM376.747 647.253c7.709 7.648 18.326 12.374 30.047 12.374 0.087 0 0.173-0 0.26-0.001l-0.013 0c0.073 0 0.16 0.001 0.247 0.001 11.721 0 22.338-4.726 30.049-12.377l-0.003 0.003 209.92-209.92c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l-209.92 209.92c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003zM896 768h-42.667v-42.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 42.667h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h42.667v42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM717.227 577.28l165.547-165.973c31.236-33.915 50.386-79.381 50.386-129.32 0-105.567-85.579-191.147-191.147-191.147-49.938 0-95.404 19.15-129.454 50.508l0.134-0.122-165.973 165.547c-7.753 7.753-12.548 18.463-12.548 30.293 0 23.661 19.181 42.841 42.841 42.841 11.83 0 22.541-4.795 30.293-12.548v0l165.547-165.547c19.086-19.159 45.492-31.014 74.667-31.014s55.581 11.855 74.663 31.011l0.003 0.003c19.263 19.038 31.194 45.459 31.194 74.667s-11.93 55.629-31.183 74.657l-0.010 0.010-165.547 165.547c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003z"],"attrs":[],"grid":0,"tags":["link-add"]},"attrs":[],"properties":{"order":5192,"id":492,"name":"link-add","prevSize":32,"code":60361},"setIdx":0,"setId":0,"iconIdx":713},{"icon":{"paths":["M516.693 656.64l-165.547 165.547c-19.312 18.658-45.647 30.154-74.667 30.154s-55.354-11.497-74.697-30.184l0.031 0.030c-19.159-19.086-31.014-45.492-31.014-74.667s11.855-55.581 31.011-74.663l0.003-0.003 165.547-165.547c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l-0 0-165.547 165.973c-31.236 33.915-50.386 79.381-50.386 129.32 0 105.567 85.579 191.147 191.147 191.147 49.938 0 95.404-19.15 129.454-50.508l-0.134 0.122 165.973-165.547c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l0-0zM882.773 141.227c-34.625-34.416-82.348-55.689-135.040-55.689s-100.415 21.273-135.050 55.699l0.010-0.010-165.973 165.547c-7.753 7.753-12.548 18.463-12.548 30.293 0 23.661 19.181 42.841 42.841 42.841 11.83 0 22.541-4.795 30.293-12.548v0l165.547-165.547c19.312-18.658 45.647-30.154 74.667-30.154s55.354 11.497 74.697 30.184l-0.031-0.030c19.159 19.086 31.014 45.492 31.014 74.667s-11.855 55.581-31.011 74.663l-0.003 0.003-165.547 165.547c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 165.547-165.973c34.416-34.625 55.689-82.348 55.689-135.040s-21.273-100.415-55.699-135.050l0.010 0.010zM376.747 647.253c7.709 7.648 18.326 12.374 30.047 12.374 0.087 0 0.173-0 0.26-0.001l-0.013 0c0.073 0 0.16 0.001 0.247 0.001 11.721 0 22.338-4.726 30.049-12.377l-0.003 0.003 209.92-209.92c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l-209.92 209.92c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003z"],"attrs":[],"grid":0,"tags":["link-alt"]},"attrs":[],"properties":{"order":5193,"id":491,"name":"link-alt","prevSize":32,"code":60362},"setIdx":0,"setId":0,"iconIdx":714},{"icon":{"paths":["M203.093 451.84c1.666 0.229 3.591 0.359 5.547 0.359 23.762 0 43.026-19.263 43.026-43.026 0-21.807-16.223-39.825-37.258-42.643l-0.221-0.024-75.093-18.773c-3.741-1.189-8.043-1.874-12.506-1.874-23.564 0-42.667 19.103-42.667 42.667 0 20.13 13.941 37.005 32.695 41.495l0.291 0.059 75.093 20.053c3.143 1.085 6.766 1.711 10.535 1.711 0.196 0 0.392-0.002 0.588-0.005l-0.029 0zM367.787 213.333c5.046 18.345 21.578 31.598 41.206 31.598 0.514 0 1.025-0.009 1.534-0.027l-0.074 0.002c1.667 0.282 3.588 0.442 5.547 0.442s3.879-0.161 5.75-0.47l-0.203 0.028c18.189-5.151 31.291-21.607 31.291-41.122 0-3.887-0.52-7.652-1.493-11.23l0.069 0.299-20.053-75.093c-4.549-19.045-21.423-32.986-41.554-32.986-23.564 0-42.667 19.103-42.667 42.667 0 4.462 0.685 8.765 1.956 12.808l-0.082-0.302zM573.867 640c-7.789-8.188-18.767-13.28-30.933-13.28s-23.144 5.092-30.917 13.262l-0.017 0.018-149.333 151.893c-16.914 16.246-39.928 26.251-65.28 26.251s-48.366-10.005-65.312-26.281l0.032 0.030c-16.849-16.641-27.285-39.742-27.285-65.28s10.436-48.639 27.276-65.271l0.009-0.009 151.893-149.333c9.153-7.872 14.914-19.467 14.914-32.407 0-23.564-19.103-42.667-42.667-42.667-12.94 0-24.535 5.761-32.36 14.858l-0.047 0.056-153.173 148.907c-32.321 32.321-52.312 76.973-52.312 126.293 0 98.641 79.965 178.606 178.606 178.606 49.321 0 93.972-19.991 126.293-52.312l150.613-150.613c8.458-7.82 13.736-18.974 13.736-31.36s-5.278-23.54-13.707-31.334l-0.028-0.026zM221.013 281.173c7.667 7.606 18.211 12.323 29.857 12.373l0.010 0c0.073 0 0.16 0.001 0.247 0.001 11.721 0 22.338-4.726 30.049-12.377l-0.003 0.003c7.668-7.712 12.407-18.343 12.407-30.080s-4.74-22.368-12.409-30.082l0.002 0.002-55.040-55.040c-7.412-6.377-17.129-10.259-27.753-10.259-23.564 0-42.667 19.103-42.667 42.667 0 10.624 3.883 20.341 10.307 27.809l-0.047-0.056zM907.093 593.92l-75.093-20.053c-4.154-1.484-8.946-2.341-13.938-2.341-23.564 0-42.667 19.103-42.667 42.667 0 20.951 15.101 38.375 35.012 41.982l0.26 0.039 75.093 20.053h11.093c1.666 0.229 3.591 0.359 5.547 0.359 23.762 0 43.026-19.263 43.026-43.026 0-21.807-16.223-39.825-37.258-42.643l-0.221-0.024zM656.213 810.667c-5.115-18.243-21.597-31.398-41.152-31.398-4.031 0-7.932 0.559-11.629 1.604l0.301-0.073c-18.189 5.151-31.291 21.607-31.291 41.122 0 3.887 0.52 7.652 1.493 11.23l-0.069-0.299 20.053 75.093c5.046 18.345 21.578 31.598 41.206 31.598 0.514 0 1.025-0.009 1.534-0.027l-0.074 0.002c1.665 0.2 3.592 0.315 5.547 0.315s3.882-0.114 5.777-0.336l-0.23 0.022c18.445-4.978 31.795-21.559 31.795-41.258 0-3.992-0.548-7.857-1.574-11.522l0.072 0.3zM802.987 743.68c-7.412-6.377-17.129-10.259-27.753-10.259-23.564 0-42.667 19.103-42.667 42.667 0 10.624 3.883 20.341 10.307 27.809l-0.047-0.056 55.040 55.040c7.712 7.668 18.343 12.407 30.080 12.407s22.368-4.74 30.082-12.409l-0.002 0.002c7.668-7.712 12.407-18.343 12.407-30.080s-4.74-22.368-12.409-30.082l0.002 0.002zM904.533 298.667c0.020-0.987 0.031-2.15 0.031-3.316 0-98.027-79.466-177.493-177.493-177.493-49.421 0-94.125 20.199-126.306 52.791l-0.018 0.018-150.613 151.893c-7.826 7.879-12.662 18.734-12.662 30.72 0 24.077 19.518 43.596 43.596 43.596 12.092 0 23.034-4.923 30.931-12.873l0.002-0.002 149.333-151.893c16.914-16.246 39.928-26.251 65.28-26.251s48.366 10.005 65.312 26.281l-0.032-0.030c16.849 16.641 27.285 39.742 27.285 65.28s-10.436 48.639-27.276 65.271l-0.009 0.009-151.893 149.333c-7.668 7.712-12.407 18.343-12.407 30.080s4.74 22.368 12.409 30.082l-0.002-0.002c7.712 7.668 18.343 12.407 30.080 12.407s22.368-4.74 30.082-12.409l-0.002 0.002 153.173-148.907c31.509-32.079 51.017-76.037 51.2-124.551l0-0.036z"],"attrs":[],"grid":0,"tags":["link-broken"]},"attrs":[],"properties":{"order":5194,"id":490,"name":"link-broken","prevSize":32,"code":60363},"setIdx":0,"setId":0,"iconIdx":715},{"icon":{"paths":["M341.333 512c0 23.564 19.103 42.667 42.667 42.667v0h256c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-256c-23.564 0-42.667 19.103-42.667 42.667v0zM426.667 640h-128c-70.692 0-128-57.308-128-128s57.308-128 128-128v0h128c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-128c-117.821 0-213.333 95.513-213.333 213.333s95.513 213.333 213.333 213.333v0h128c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM725.333 298.667h-128c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h128c70.692 0 128 57.308 128 128s-57.308 128-128 128v0h-128c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h128c117.821 0 213.333-95.513 213.333-213.333s-95.513-213.333-213.333-213.333v0z"],"attrs":[],"grid":0,"tags":["link-h"]},"attrs":[],"properties":{"order":5195,"id":489,"name":"link-h","prevSize":32,"code":60364},"setIdx":0,"setId":0,"iconIdx":716},{"icon":{"paths":["M426.667 748.8l-75.52 73.387c-19.109 19.109-45.508 30.928-74.667 30.928-58.318 0-105.595-47.276-105.595-105.595 0-29.159 11.819-55.558 30.928-74.667v0l193.707-194.133c19.006-19.066 45.294-30.863 74.338-30.863 27.085 0 51.773 10.259 70.392 27.103l-0.090-0.080 5.12 4.267c7.693 7.536 18.237 12.186 29.867 12.186 23.579 0 42.693-19.114 42.693-42.693 0-11.948-4.908-22.75-12.819-30.5l-0.007-0.007c-2.564-3.302-5.078-6.221-7.728-9.011l0.048 0.051c-33.228-29.027-76.998-46.729-124.903-46.729-52.737 0-100.463 21.453-134.928 56.107l-0.008 0.009-196.267 194.133c-31.236 33.915-50.386 79.381-50.386 129.32 0 105.567 85.579 191.147 191.147 191.147 49.938 0 95.404-19.15 129.454-50.508l-0.134 0.122 73.813-72.107c6.953-7.566 11.214-17.7 11.214-28.831 0-23.564-19.103-42.667-42.667-42.667-10.279 0-19.709 3.635-27.075 9.69l0.074-0.059zM882.773 141.227c-34.625-34.416-82.348-55.689-135.040-55.689s-100.415 21.273-135.050 55.699l0.010-0.010-73.813 72.107c-6.953 7.566-11.214 17.7-11.214 28.831 0 23.564 19.103 42.667 42.667 42.667 10.279 0 19.709-3.635 27.075-9.69l-0.074 0.059 73.813-73.387c19.109-19.109 45.508-30.928 74.667-30.928 58.318 0 105.595 47.276 105.595 105.595 0 29.159-11.819 55.558-30.928 74.667v0l-193.707 194.133c-19.006 19.066-45.294 30.863-74.338 30.863-27.085 0-51.773-10.259-70.392-27.103l0.090 0.080-5.12-4.267c-7.693-7.536-18.237-12.186-29.867-12.186-23.579 0-42.693 19.114-42.693 42.693 0 11.948 4.908 22.75 12.819 30.5l0.007 0.007c3.050 3.118 6.25 6.047 9.605 8.795l0.208 0.165c33.258 28.935 77.010 46.572 124.882 46.572 52.715 0 100.434-21.387 134.956-55.957l0.002-0.002 194.133-194.133c34.929-34.711 56.548-82.78 56.548-135.899 0-52.267-20.932-99.646-54.87-134.21l0.028 0.029z"],"attrs":[],"grid":0,"tags":["link"]},"attrs":[],"properties":{"order":5196,"id":488,"name":"link","prevSize":32,"code":60365},"setIdx":0,"setId":0,"iconIdx":717},{"icon":{"paths":["M840.533 750.933c-4.267-8.533-8.533-17.067-8.533-25.6 0-17.067-8.533-29.867-21.333-42.667-4.267-4.267-12.8-8.533-17.067-8.533 25.6-76.8-12.8-153.6-55.467-209.067 0 0 0 0 0 0-34.133-51.2-85.333-89.6-81.067-157.867 0-81.067 8.533-230.4-140.8-217.6-153.6 8.533-110.933 166.4-115.2 221.867 0 46.933-21.333 93.867-55.467 132.267-8.533 8.533-17.067 21.333-21.333 29.867-42.667 51.2-64 119.467-64 183.467-8.533 8.533-17.067 17.067-21.333 25.6-4.267 4.267-8.533 8.533-8.533 12.8-4.267 4.267-12.8 8.533-21.333 12.8-17.067 4.267-29.867 12.8-38.4 29.867-4.267 12.8-8.533 29.867-4.267 46.933 4.267 8.533 4.267 17.067 0 29.867-8.533 17.067-8.533 38.4 0 59.733 12.8 17.067 34.133 21.333 64 25.6 21.333 0 46.933 8.533 68.267 17.067v0c21.333 12.8 46.933 21.333 72.533 21.333 12.8 0 29.867-4.267 42.667-8.533 12.8-8.533 21.333-17.067 25.6-29.867 17.067 0 42.667-8.533 72.533-8.533 25.6 0 51.2 8.533 85.333 4.267 0 4.267 0 8.533 4.267 12.8 8.533 21.333 29.867 38.4 55.467 42.667 4.267 0 4.267 0 8.533 0 34.133-4.267 68.267-21.333 89.6-46.933v0c17.067-17.067 38.4-29.867 59.733-38.4 25.6-12.8 42.667-21.333 46.933-42.667 4.267-29.867-4.267-46.933-21.333-72.533zM546.133 204.8c25.6 4.267 46.933 25.6 42.667 51.2 0 12.8-4.267 25.6-12.8 38.4 0 0 0 0-4.267 0-8.533-4.267-12.8-4.267-17.067-8.533 4.267-4.267 4.267-12.8 8.533-21.333 0-17.067-8.533-29.867-17.067-29.867-12.8 0-21.333 12.8-21.333 29.867 0 0 0 4.267 0 4.267-4.267-4.267-12.8-4.267-17.067-8.533 0 0 0-4.267 0-4.267-4.267-21.333 12.8-46.933 38.4-51.2zM533.333 290.133c4.267 4.267 12.8 8.533 17.067 8.533s12.8 4.267 17.067 8.533c8.533 4.267 17.067 8.533 17.067 21.333s-12.8 25.6-38.4 34.133c-8.533 4.267-12.8 4.267-17.067 8.533-12.8 8.533-25.6 12.8-42.667 12.8-12.8 0-25.6-8.533-34.133-17.067-4.267-4.267-8.533-8.533-17.067-12.8-4.267-4.267-12.8-12.8-17.067-25.6 0-4.267 4.267-8.533 8.533-12.8 12.8-8.533 17.067-12.8 21.333-17.067l4.267-4.267c8.533-12.8 25.6-21.333 42.667-21.333 12.8 4.267 25.6 8.533 38.4 17.067zM443.733 213.333c17.067 0 29.867 17.067 34.133 46.933 0 4.267 0 4.267 0 8.533-4.267 0-12.8 4.267-17.067 8.533 0 0 0-4.267 0-8.533 0-12.8-8.533-25.6-17.067-21.333-8.533 0-12.8 12.8-12.8 25.6 0 8.533 4.267 12.8 8.533 17.067v0c0 0-4.267 4.267-8.533 4.267-8.533-8.533-17.067-21.333-17.067-34.133 0-25.6 12.8-46.933 29.867-46.933zM401.067 900.267c-29.867 12.8-68.267 8.533-93.867-8.533-25.6-12.8-46.933-17.067-76.8-17.067-21.333-4.267-42.667-4.267-46.933-12.8s-4.267-21.333 4.267-42.667c4.267-12.8 4.267-25.6 0-38.4s-4.267-21.333 0-34.133c4.267-12.8 12.8-17.067 25.6-21.333s21.333-8.533 29.867-17.067c4.267-4.267 8.533-8.533 12.8-17.067 12.8-17.067 21.333-25.6 34.133-25.6 25.6 4.267 46.933 42.667 64 81.067 8.533 12.8 17.067 29.867 29.867 42.667 17.067 21.333 38.4 51.2 38.4 68.267 0 21.333-8.533 34.133-21.333 42.667zM610.133 806.4c0 4.267 0 4.267-4.267 8.533-51.2 38.4-119.467 42.667-174.933 12.8-8.533-12.8-17.067-25.6-25.6-38.4 38.4-4.267 29.867-55.467-51.2-106.667-85.333-55.467-25.6-157.867 4.267-204.8 4.267-4.267 4.267 0-12.8 34.133-12.8 25.6-38.4 89.6-4.267 136.533 0-34.133 8.533-68.267 21.333-102.4 29.867-55.467 51.2-119.467 64-183.467 4.267 4.267 4.267 4.267 8.533 4.267 4.267 4.267 8.533 8.533 12.8 8.533 8.533 12.8 25.6 17.067 38.4 17.067 0 0 4.267 0 4.267 0 17.067 0 34.133-4.267 46.933-17.067 4.267-4.267 8.533-8.533 17.067-8.533 12.8-4.267 25.6-12.8 38.4-25.6 17.067 55.467 34.133 106.667 59.733 153.6 17.067 34.133 29.867 68.267 38.4 106.667 12.8 0 29.867 4.267 42.667 12.8 34.133 17.067 46.933 29.867 42.667 51.2-4.267 0-4.267 0-8.533 0 0-12.8-8.533-25.6-38.4-38.4s-55.467-12.8-64 17.067c-4.267 0-8.533 4.267-12.8 4.267-34.133 17.067-34.133 64-38.4 110.933 4.267 17.067-0 29.867-4.267 46.933zM806.4 832c-25.6 8.533-46.933 25.6-64 46.933-17.067 25.6-46.933 42.667-81.067 38.4-17.067 0-34.133-12.8-38.4-29.867-4.267-25.6-4.267-51.2 8.533-76.8 4.267-17.067 8.533-29.867 12.8-46.933 4.267-51.2 4.267-81.067 25.6-93.867v0c0 21.333 12.8 34.133 29.867 42.667 21.333 0 42.667-4.267 59.733-21.333 4.267 0 4.267 0 8.533 0 12.8 0 21.333 0 29.867 8.533s12.8 21.333 12.8 29.867c0 12.8 8.533 25.6 12.8 38.4 21.333 21.333 21.333 34.133 21.333 38.4-4.267 8.533-21.333 17.067-38.4 25.6zM422.4 320c-4.267 0-4.267 0-4.267 4.267 0 0 0 4.267 4.267 4.267 0 0 0 0 0 0 4.267 0 4.267 4.267 4.267 4.267 12.8 17.067 34.133 25.6 59.733 29.867 21.333-4.267 42.667-8.533 64-25.6 8.533-4.267 17.067-8.533 25.6-12.8 4.267 0 4.267-4.267 4.267-4.267 0-4.267 0-4.267-4.267-4.267v0c-8.533 4.267-21.333 8.533-29.867 12.8-17.067 12.8-38.4 21.333-59.733 21.333s-38.4-12.8-51.2-25.6c-4.267 0-8.533-4.267-12.8-4.267z"],"attrs":[],"grid":0,"tags":["linux"]},"attrs":[],"properties":{"order":5197,"id":487,"name":"linux","prevSize":32,"code":60366},"setIdx":0,"setId":0,"iconIdx":718},{"icon":{"paths":["M587.947 403.627v0c-8.954 0-16.213 7.259-16.213 16.213v0 71.253l-59.733-79.36c-2.978-4.775-8.142-7.945-14.057-8.106l-0.023-0c-8.954 0-16.213 7.259-16.213 16.213v0 121.173c0 8.954 7.259 16.213 16.213 16.213v0 0c8.954 0 16.213-7.259 16.213-16.213v0-71.68l59.307 81.493c1.504 2.241 3.719 3.903 6.319 4.673l0.081 0.021c0.897 0.21 1.928 0.331 2.987 0.331s2.089-0.12 3.079-0.349l-0.092 0.018c1.431 0.537 3.085 0.848 4.811 0.848 2.459 0 4.77-0.63 6.781-1.738l-0.073 0.037 4.267-2.987c2.889-2.977 4.676-7.038 4.693-11.517l0-0.003v-120.32c0-0.042 0.001-0.091 0.001-0.141 0-8.954-7.259-16.213-16.213-16.213-0.752 0-1.493 0.051-2.218 0.15l0.084-0.009zM392.533 523.52h-45.227v-103.68c0-8.954-7.259-16.213-16.213-16.213v0c-8.954-0-16.213 7.259-16.213 16.213v121.173c0 8.954 7.259 16.213 16.213 16.213v0h61.44c0.002 0 0.004 0 0.005 0 9.040 0 16.396-7.209 16.634-16.191l0-0.022c0.014-0.255 0.022-0.553 0.022-0.853 0-9.19-7.45-16.64-16.64-16.64-0.008 0-0.015 0-0.023 0l0.001-0zM439.893 403.627v0c-0.002-0-0.004-0-0.005-0-9.040 0-16.396 7.209-16.634 16.191l-0 0.022v121.173c0.238 9.005 7.595 16.213 16.635 16.213 0.002 0 0.004-0 0.006-0l-0 0c8.954 0 16.213-7.259 16.213-16.213h-0v-121.173c0-8.954-7.259-16.213-16.213-16.213h0zM764.16 85.333h-504.32c-96.28 0.242-174.265 78.227-174.507 174.483l-0 0.023v504.32c0.242 96.28 78.227 174.265 174.483 174.507l0.023 0h504.32c96.28-0.242 174.265-78.227 174.507-174.483l0-0.023v-504.32c-0.242-96.28-78.227-174.265-174.483-174.507l-0.023-0zM777.387 609.28c-1.812 2.726-3.636 5.092-5.608 7.324l0.061-0.071c-10.314 12.632-21.502 23.819-33.713 33.801l-0.42 0.333c-85.333 79.787-228.693 175.36-247.893 160.427s27.307-75.093-22.613-85.333c-1.602 0.213-3.453 0.335-5.333 0.335s-3.732-0.122-5.548-0.357l0.214 0.023c-146.773-20.48-256-123.307-256-246.613 0-138.667 140.373-250.88 313.173-250.88s313.173 112.213 313.173 250.88c-1.594 49.817-20.028 95.042-49.762 130.462l0.269-0.329zM704.427 404.053h-64.427c-8.954-0-16.213 7.259-16.213 16.213l0 0v121.173c-0 8.954 7.259 16.213 16.213 16.213h0 63.147c8.954 0 16.213-7.259 16.213-16.213v0c0-8.954-7.259-16.213-16.213-16.213v0h-43.947v-25.6h45.227c9.005-0.238 16.213-7.595 16.213-16.635 0-0.002-0-0.004-0-0.006l0 0c-0-8.954-7.259-16.213-16.213-16.213l0 0h-45.227v-26.027h45.227c8.954 0 16.213-7.259 16.213-16.213l0-0c0.365-1.282 0.574-2.755 0.574-4.277 0-8.954-7.259-16.213-16.213-16.213-0.202 0-0.403 0.004-0.603 0.011l0.029-0.001z"],"attrs":[],"grid":0,"tags":["line"]},"attrs":[],"properties":{"order":5198,"id":486,"name":"line","prevSize":32,"code":60367},"setIdx":0,"setId":0,"iconIdx":719},{"icon":{"paths":["M746.667 383.957c-0.029-0-0.064-0-0.099-0-40.051 0-77.724 10.184-110.57 28.104l1.21-0.604c-6.28-16.213-21.75-27.5-39.856-27.5-0.007 0-0.013 0-0.020 0l-170.666-0c-0.007-0-0.016-0-0.024-0-23.551 0-42.642 19.092-42.642 42.642 0 0.009 0 0.017 0 0.026l-0-0.001v512c-0 0.007-0 0.016-0 0.025 0 23.55 19.091 42.642 42.642 42.642 0.009 0 0.017-0 0.026-0l170.665 0c0.007 0 0.016 0 0.025 0 23.55 0 42.642-19.091 42.642-42.642 0-0.009-0-0.017-0-0.026l0 0.001v-234.667c0-23.564 19.103-42.667 42.667-42.667s42.667 19.103 42.667 42.667v0 234.667c-0 0.007-0 0.016-0 0.025 0 23.55 19.091 42.642 42.642 42.642 0.009 0 0.017-0 0.026-0l170.665 0c0.007 0 0.016 0 0.025 0 23.55 0 42.642-19.091 42.642-42.642 0-0.009-0-0.017-0-0.026l0 0.001v-320c-0.166-129.536-105.131-234.5-234.65-234.667l-0.016-0zM896 895.957h-85.333v-192c0-70.692-57.308-128-128-128s-128 57.308-128 128v0 192h-85.333v-426.667h85.333v30c0.014 23.565 19.12 42.662 42.687 42.662 13.437 0 25.424-6.209 33.249-15.914l0.064-0.082c27.453-34.644 69.527-56.668 116.745-56.668 82.064 0 148.59 66.526 148.59 148.59 0 0.262-0.001 0.524-0.002 0.785l0-0.040zM298.667 383.957h-170.667c-0.007-0-0.016-0-0.024-0-23.551 0-42.642 19.092-42.642 42.642 0 0.009 0 0.017 0 0.026l-0-0.001v512c-0 0.007-0 0.016-0 0.025 0 23.55 19.091 42.642 42.642 42.642 0.009 0 0.017-0 0.026-0l170.665 0c0.007 0 0.016 0 0.025 0 23.55 0 42.642-19.091 42.642-42.642 0-0.009-0-0.017-0-0.026l0 0.001v-512c0-0.007 0-0.016 0-0.024 0-23.551-19.092-42.642-42.642-42.642-0.009 0-0.017 0-0.026 0l0.001-0zM256 895.957h-85.333v-426.667h85.333zM213.958 65.792c-2.464-0.157-5.342-0.246-8.242-0.246-76.179 0-137.934 61.755-137.934 137.934s61.755 137.934 137.934 137.934c2.049 0 4.087-0.045 6.113-0.133l-0.289 0.010h1.208c2.445 0.155 5.302 0.243 8.18 0.243 76.193 0 137.959-61.766 137.959-137.959s-61.766-137.959-137.959-137.959c-2.452 0-4.89 0.064-7.31 0.19l0.339-0.014zM212.75 255.957h-1.209c-1.887 0.242-4.070 0.38-6.285 0.38-28.794 0-52.136-23.342-52.136-52.136 0-0.232 0.002-0.464 0.005-0.695l-0 0.035c0-31.834 23.875-52.417 60.833-52.417 2.089-0.294 4.502-0.461 6.954-0.461 29.066 0 52.629 23.563 52.629 52.629 0 0.088-0 0.175-0.001 0.263l0-0.013c0 31.833-23.875 52.416-60.791 52.416z"],"attrs":[],"grid":0,"tags":["linkedin-alt"]},"attrs":[],"properties":{"order":5199,"id":485,"name":"linkedin-alt","prevSize":32,"code":60368},"setIdx":0,"setId":0,"iconIdx":720},{"icon":{"paths":["M873.387 85.333h-722.773c-0.255-0.004-0.557-0.006-0.859-0.006-33.87 0-61.383 27.218-61.86 60.974l-0.001 0.045v731.307c0.478 33.802 27.991 61.019 61.861 61.019 0.302 0 0.604-0.002 0.905-0.006l-0.046 0.001h722.773c0.255 0.004 0.557 0.006 0.859 0.006 33.87 0 61.383-27.218 61.86-60.974l0.001-0.045v-731.307c-0.478-33.802-27.991-61.019-61.861-61.019-0.302 0-0.604 0.002-0.905 0.006l0.046-0.001zM345.173 799.573h-128v-384h128zM281.173 361.813v0c-36.76 0-66.56-29.8-66.56-66.56s29.8-66.56 66.56-66.56v0c2.265-0.272 4.889-0.427 7.549-0.427 36.996 0 66.987 29.991 66.987 66.987s-29.991 66.987-66.987 66.987c-2.66 0-5.283-0.155-7.862-0.456l0.313 0.030zM806.827 799.573h-128v-206.080c0-51.627-18.347-85.333-64.853-85.333-30.103 0.227-55.691 19.314-65.549 46.019l-0.158 0.488c-2.77 8.044-4.37 17.314-4.37 26.956 0 1.474 0.037 2.939 0.111 4.394l-0.008-0.204v213.333h-128s0-349.013 0-384h128v54.187c22.532-38.579 63.738-64.087 110.902-64.087 1.662 0 3.316 0.032 4.962 0.094l-0.237-0.007c85.333 0 147.2 55.040 147.2 173.227z"],"attrs":[],"grid":0,"tags":["linkedin"]},"attrs":[],"properties":{"order":5200,"id":484,"name":"linkedin","prevSize":32,"code":60369},"setIdx":0,"setId":0,"iconIdx":721},{"icon":{"paths":["M298.667 853.333h-128v-4.267c0-21.333 17.067-38.4 38.4-38.4 59.733 0 110.933-38.4 128-93.867 17.067-68.267-21.333-140.8-89.6-157.867-55.467-17.067-115.2 8.533-145.067 59.733-12.8 21.333-4.267 46.933 17.067 59.733s46.933 4.267 59.733-17.067c0 0 0 0 0 0 12.8-21.333 38.4-25.6 59.733-12.8 4.267 4.267 8.533 4.267 8.533 8.533 8.533 12.8 8.533 25.6 8.533 38.4-8.533 17.067-25.6 29.867-42.667 29.867-72.533 0-128 55.467-128 123.733v46.933c0 25.6 17.067 42.667 42.667 42.667h170.667c25.6 0 42.667-17.067 42.667-42.667s-17.067-42.667-42.667-42.667zM469.333 298.667h426.667c25.6 0 42.667-17.067 42.667-42.667s-17.067-42.667-42.667-42.667h-426.667c-25.6 0-42.667 17.067-42.667 42.667s17.067 42.667 42.667 42.667zM298.667 384h-42.667v-256c0-25.6-17.067-42.667-42.667-42.667s-42.667 17.067-42.667 42.667v42.667h-42.667c-25.6 0-42.667 17.067-42.667 42.667s17.067 42.667 42.667 42.667h42.667v128h-42.667c-25.6 0-42.667 17.067-42.667 42.667s17.067 42.667 42.667 42.667h170.667c25.6 0 42.667-17.067 42.667-42.667s-17.067-42.667-42.667-42.667zM896 682.667h-426.667c-25.6 0-42.667 17.067-42.667 42.667s17.067 42.667 42.667 42.667h426.667c25.6 0 42.667-17.067 42.667-42.667s-17.067-42.667-42.667-42.667z"],"attrs":[],"grid":0,"tags":["list-ol"]},"attrs":[],"properties":{"order":5201,"id":483,"name":"list-ol","prevSize":32,"code":60370},"setIdx":0,"setId":0,"iconIdx":722},{"icon":{"paths":["M149.333 256c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM320 341.333h597.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-597.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM320 469.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM490.667 682.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM917.333 469.333h-426.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h426.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM917.333 682.667h-256c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h256c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["list-ui-alt"]},"attrs":[],"properties":{"order":5202,"id":482,"name":"list-ui-alt","prevSize":32,"code":60371},"setIdx":0,"setId":0,"iconIdx":723},{"icon":{"paths":["M298.667 853.333h-128v-4.267c0-21.333 17.067-38.4 38.4-38.4 59.733 0 110.933-38.4 128-93.867 17.067-68.267-21.333-140.8-89.6-157.867-55.467-17.067-115.2 8.533-145.067 59.733-12.8 21.333-4.267 46.933 17.067 59.733s46.933 4.267 59.733-17.067c0 0 0 0 0 0 12.8-21.333 38.4-25.6 59.733-12.8 4.267 4.267 8.533 4.267 8.533 8.533 8.533 12.8 8.533 25.6 8.533 38.4-8.533 17.067-25.6 29.867-42.667 29.867-72.533 0-128 55.467-128 123.733v46.933c0 25.6 17.067 42.667 42.667 42.667h170.667c25.6 0 42.667-17.067 42.667-42.667s-17.067-42.667-42.667-42.667zM298.667 384h-42.667v-256c0-25.6-17.067-42.667-42.667-42.667s-42.667 17.067-42.667 42.667v42.667h-42.667c-25.6 0-42.667 17.067-42.667 42.667s17.067 42.667 42.667 42.667h42.667v128h-42.667c-25.6 0-42.667 17.067-42.667 42.667s17.067 42.667 42.667 42.667h170.667c25.6 0 42.667-17.067 42.667-42.667s-17.067-42.667-42.667-42.667zM469.333 256h426.667c25.6 0 42.667-17.067 42.667-42.667s-17.067-42.667-42.667-42.667h-426.667c-25.6 0-42.667 17.067-42.667 42.667s17.067 42.667 42.667 42.667zM896 853.333h-426.667c-25.6 0-42.667 17.067-42.667 42.667s17.067 42.667 42.667 42.667h426.667c25.6 0 42.667-17.067 42.667-42.667s-17.067-42.667-42.667-42.667zM896 384h-426.667c-25.6 0-42.667 17.067-42.667 42.667s17.067 42.667 42.667 42.667h426.667c25.6 0 42.667-17.067 42.667-42.667s-17.067-42.667-42.667-42.667zM896 640h-426.667c-25.6 0-42.667 17.067-42.667 42.667s17.067 42.667 42.667 42.667h426.667c25.6 0 42.667-17.067 42.667-42.667s-17.067-42.667-42.667-42.667z"],"attrs":[],"grid":0,"tags":["list-ol-alt"]},"attrs":[],"properties":{"order":5203,"id":481,"name":"list-ol-alt","prevSize":32,"code":60372},"setIdx":0,"setId":0,"iconIdx":724},{"icon":{"paths":["M925.013 753.067l-298.667-597.333c-21.534-42.133-64.63-70.477-114.347-70.477s-92.813 28.344-114.011 69.755l-0.336 0.722-298.667 597.333c-8.455 16.623-13.409 36.25-13.409 57.034 0 70.692 57.308 128 128 128 18.754 0 36.566-4.033 52.615-11.279l-0.807 0.326 229.12-102.4c5.165-2.226 11.178-3.52 17.493-3.52s12.328 1.294 17.788 3.632l-0.295-0.112 229.12 102.4c15.243 6.92 33.055 10.954 51.809 10.954 70.692 0 128-57.308 128-128 0-20.784-4.953-40.41-13.744-57.764l0.336 0.73zM839.68 838.4c-7.777 8.089-18.689 13.113-30.774 13.113-6.317 0-12.312-1.373-17.706-3.836l0.267 0.109-229.12-101.973c-15.309-6.988-33.205-11.062-52.053-11.062s-36.744 4.074-52.857 11.389l0.803-0.326-227.413 103.253c-5.009 2.234-10.855 3.535-17.004 3.535-23.564 0-42.667-19.103-42.667-42.667 0-6.715 1.551-13.068 4.315-18.72l-0.111 0.252 298.667-597.333c7.227-13.89 21.512-23.212 37.973-23.212s30.746 9.323 37.861 22.976l0.112 0.236 298.667 597.333c2.783 5.512 4.413 12.014 4.413 18.897 0 11.363-4.442 21.689-11.685 29.336l0.018-0.020z"],"attrs":[],"grid":0,"tags":["location-arrow-alt"]},"attrs":[],"properties":{"order":5204,"id":480,"name":"location-arrow-alt","prevSize":32,"code":60373},"setIdx":0,"setId":0,"iconIdx":725},{"icon":{"paths":["M768 512c-23.564 0-42.667 19.103-42.667 42.667v0c-0.191 164.872-133.795 298.476-298.648 298.667l-0.018 0v-378.224l222.583-49.464c19.209-4.423 33.316-21.376 33.316-41.625 0-23.561-19.1-42.661-42.661-42.661-3.244 0-6.404 0.362-9.441 1.048l0.285-0.054-204.083 45.351v-83.263l222.583-49.464c19.303-4.351 33.505-21.35 33.505-41.667 0-23.561-19.1-42.661-42.661-42.661-3.312 0-6.537 0.378-9.632 1.092l0.287-0.056-204.083 45.351v-89.039c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 108.003l-94.583 21.018c-19.303 4.351-33.505 21.35-33.505 41.667 0 23.561 19.1 42.661 42.661 42.661 3.312 0 6.537-0.378 9.632-1.092l-0.287 0.056 76.083-16.906v83.263l-94.583 21.018c-19.303 4.351-33.505 21.35-33.505 41.667 0 23.561 19.1 42.661 42.661 42.661 3.312 0 6.537-0.378 9.632-1.092l-0.287 0.056 76.083-16.906v401.927c0 23.564 19.103 42.667 42.667 42.667v0h42.667c211.975-0.254 383.746-172.025 384-383.975l0-0.025c0-23.564-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["lira-sign"]},"attrs":[],"properties":{"order":5205,"id":479,"name":"lira-sign","prevSize":32,"code":60374},"setIdx":0,"setId":0,"iconIdx":726},{"icon":{"paths":["M768 191.147c-65.516-65.516-156.026-106.039-256-106.039-199.948 0-362.039 162.090-362.039 362.039 0 99.974 40.523 190.484 106.039 256l-0-0 224.853 225.28c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 226.56-227.413c65.242-65.243 105.596-155.376 105.596-254.933s-40.353-189.69-105.596-254.933l0 0zM706.987 640l-194.987 195.84-194.987-195.84c-49.825-49.87-80.64-118.74-80.64-194.808 0-152.224 123.402-275.627 275.627-275.627s275.627 123.402 275.627 275.627c0 76.068-30.815 144.939-80.642 194.81l0.002-0.002zM384 316.16c-33.236 33.335-53.786 79.334-53.786 130.133s20.55 96.798 53.79 130.138l-0.005-0.005c33.289 33.345 79.307 53.972 130.143 53.972 100.886 0 182.797-81.24 183.882-181.87l0.001-0.103c0.004-0.427 0.006-0.933 0.006-1.438 0-50.342-20.563-95.882-53.748-128.678l-0.017-0.017c-33.34-34.083-79.799-55.216-131.193-55.216-50.337 0-95.939 20.272-129.088 53.097l0.015-0.015zM584.107 515.84c-18.042 18.309-43.109 29.652-70.826 29.652-54.904 0-99.413-44.509-99.413-99.413s44.509-99.413 99.413-99.413c54.904 0 99.413 44.509 99.413 99.413 0 0.075-0 0.151-0 0.226l0-0.012c-0.666 27.392-12.31 51.94-30.683 69.511l-0.037 0.035z"],"attrs":[],"grid":0,"tags":["location-point"]},"attrs":[],"properties":{"order":5206,"id":478,"name":"location-point","prevSize":32,"code":60375},"setIdx":0,"setId":0,"iconIdx":727},{"icon":{"paths":["M512 460.8c47.128 0 85.333-38.205 85.333-85.333s-38.205-85.333-85.333-85.333c-47.128 0-85.333 38.205-85.333 85.333v0c0 47.128 38.205 85.333 85.333 85.333v0zM481.707 755.627c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 174.507-174.933c52.459-52.432 84.907-124.88 84.907-204.907 0-160.001-129.706-289.707-289.707-289.707s-289.707 129.706-289.707 289.707c0 80.027 32.448 152.475 84.906 204.906l0.001 0.001zM308.48 355.84c6.251-63.426 40.542-117.742 90.14-151l0.74-0.467c31.73-21.104 70.717-33.674 112.64-33.674s80.91 12.57 113.397 34.147l-0.757-0.473c55.632 37.393 91.749 100.093 91.749 171.228 0 56.548-22.823 107.765-59.76 144.943l0.011-0.011-144.64 144.64-144.64-144.64c-37.011-36.86-59.913-87.862-59.913-144.213 0-7.213 0.375-14.338 1.107-21.357l-0.074 0.877zM810.667 853.333h-597.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h597.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["location-pin-alt"]},"attrs":[],"properties":{"order":5207,"id":477,"name":"location-pin-alt","prevSize":32,"code":60376},"setIdx":0,"setId":0,"iconIdx":728},{"icon":{"paths":["M902.4 122.027c-22.394-22.814-53.556-36.954-88.021-36.954-14.315 0-28.060 2.439-40.843 6.925l0.864-0.264-603.733 201.813c-49.91 16.698-85.242 63.020-85.242 117.594 0 52.666 32.904 97.646 79.276 115.506l0.846 0.286 223.573 85.333c10.334 4.027 18.398 11.953 22.517 21.923l0.096 0.264 85.333 224c17.711 47.218 62.471 80.215 114.938 80.215 0.242 0 0.484-0.001 0.726-0.002l-0.037 0h2.987c53.548-1.005 98.636-36.112 114.526-84.465l0.247-0.869 201.813-604.587c4.084-11.734 6.443-25.26 6.443-39.336 0-34.146-13.88-65.051-36.305-87.38l-0.004-0.004zM853.333 221.867l-203.947 605.013c-4.883 15.44-19.075 26.439-35.838 26.453l-0.002 0c-0.191 0.003-0.417 0.005-0.644 0.005-16.457 0-30.548-10.127-36.382-24.489l-0.094-0.263-85.333-224c-12.795-33.024-38.328-58.696-70.413-71.387l-0.841-0.293-224-85.333c-14.825-5.545-25.188-19.59-25.188-36.056 0-0.374 0.005-0.747 0.016-1.119l-0.001 0.055c0.014-16.765 11.013-30.957 26.187-35.767l0.266-0.073 605.013-201.813c4.334-1.816 9.371-2.872 14.654-2.872 21.443 0 38.827 17.383 38.827 38.827 0 4.702-0.836 9.21-2.367 13.381l0.087-0.269z"],"attrs":[],"grid":0,"tags":["location-arrow"]},"attrs":[],"properties":{"order":5208,"id":476,"name":"location-arrow","prevSize":32,"code":60377},"setIdx":0,"setId":0,"iconIdx":729},{"icon":{"paths":["M810.667 85.333h-597.333c-70.66 0.080-127.92 57.339-128 127.992l-0 0.008v597.333c0.080 70.66 57.339 127.92 127.992 128l597.341 0c70.66-0.080 127.92-57.339 128-127.992l0-0.008v-597.333c-0.080-70.66-57.339-127.92-127.992-128l-0.008-0zM725.333 341.333c-70.792 0-121.875 92.896-175.957 191.229-63.668 115.75-129.501 235.438-250.709 235.438-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667v0c70.792 0 121.875-92.896 175.957-191.229 63.668-115.75 129.501-235.438 250.709-235.438 23.564 0 42.667 19.103 42.667 42.667s-19.103 42.667-42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["lottiefiles-alt"]},"attrs":[],"properties":{"order":5209,"id":475,"name":"lottiefiles-alt","prevSize":32,"code":60378},"setIdx":0,"setId":0,"iconIdx":730},{"icon":{"paths":["M341.333 512h85.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-85.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM725.333 256h-213.333v-85.333h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-85.333c-23.564 0-42.667 19.103-42.667 42.667v0 128h-128c-94.257 0-170.667 76.41-170.667 170.667v0 256c0 23.564 19.103 42.667 42.667 42.667v0h256v170.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-170.667h341.333c23.564 0 42.667-19.103 42.667-42.667v0-256c0-94.257-76.41-170.667-170.667-170.667v0zM554.667 426.667v213.333h-341.333v-213.333c0-47.128 38.205-85.333 85.333-85.333v0h279.893c-14.889 24.351-23.757 53.792-23.893 85.295l-0 0.038zM810.667 640h-170.667v-213.333c0-47.128 38.205-85.333 85.333-85.333s85.333 38.205 85.333 85.333v0z"],"attrs":[],"grid":0,"tags":["mailbox"]},"attrs":[],"properties":{"order":5210,"id":474,"name":"mailbox","prevSize":32,"code":60379},"setIdx":0,"setId":0,"iconIdx":731},{"icon":{"paths":["M725.333 384v-85.333c0-117.821-95.513-213.333-213.333-213.333s-213.333 95.513-213.333 213.333v0 85.333c-70.692 0-128 57.308-128 128v0 298.667c0 70.692 57.308 128 128 128v0h426.667c70.692 0 128-57.308 128-128v0-298.667c0-70.692-57.308-128-128-128v0zM384 298.667c0-70.692 57.308-128 128-128s128 57.308 128 128v0 85.333h-256zM768 810.667c0 23.564-19.103 42.667-42.667 42.667v0h-426.667c-23.564 0-42.667-19.103-42.667-42.667v0-298.667c0-23.564 19.103-42.667 42.667-42.667v0h426.667c23.564 0 42.667 19.103 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["lock"]},"attrs":[],"properties":{"order":5211,"id":473,"name":"lock","prevSize":32,"code":60380},"setIdx":0,"setId":0,"iconIdx":732},{"icon":{"paths":["M597.333 403.2h-170.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h170.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM872.96 410.88c-18.172-184.913-172.865-328.206-361.026-328.206-200.295 0-362.667 162.371-362.667 362.667 0 100.401 40.798 191.273 106.721 256.941l0.011 0.011 226.133 226.56c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 225.28-226.56c65.894-65.415 106.682-156.041 106.682-256.193 0-12.403-0.626-24.66-1.847-36.741l0.124 1.521zM708.267 642.133l-196.267 196.267-196.267-196.267c-50.107-50.11-81.099-119.334-81.099-195.797 0-9.481 0.476-18.85 1.407-28.086l-0.095 1.163c8.584-86.193 55.064-160.027 122.314-205.448l0.993-0.632c42.948-28.889 95.836-46.11 152.747-46.11s109.799 17.221 153.738 46.737l-0.991-0.627c68.043 45.881 114.465 119.364 123.206 204.027l0.1 1.199c0.884 8.306 1.389 17.944 1.389 27.699 0 76.501-31.023 145.757-81.174 195.872l-0.002 0.002z"],"attrs":[],"grid":0,"tags":["map-marker-minus"]},"attrs":[],"properties":{"order":5212,"id":472,"name":"map-marker-minus","prevSize":32,"code":60381},"setIdx":0,"setId":0,"iconIdx":733},{"icon":{"paths":["M512 426.667c-23.564 0-42.667 19.103-42.667 42.667v0 85.333c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-85.333c0-23.564-19.103-42.667-42.667-42.667v0zM872.96 413.013c-17.305-185.733-172.402-329.986-361.191-329.986-74.61 0-143.959 22.53-201.612 61.159l1.31-0.826c-88.593 59.846-149.002 155.634-160.298 265.967l-0.129 1.553c-1.097 10.56-1.722 22.817-1.722 35.22 0 100.153 40.789 190.779 106.661 256.172l0.021 0.021 226.133 226.56c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 225.28-226.56c65.894-65.415 106.682-156.041 106.682-256.193 0-12.403-0.626-24.66-1.847-36.741l0.124 1.521zM708.267 642.133l-196.267 196.267-196.267-196.267c-50.107-50.11-81.099-119.334-81.099-195.797 0-9.481 0.476-18.85 1.407-28.086l-0.095 1.163c8.584-86.193 55.064-160.027 122.314-205.448l0.993-0.632c42.948-28.889 95.836-46.11 152.747-46.11s109.799 17.221 153.738 46.737l-0.991-0.627c68.043 45.881 114.465 119.364 123.206 204.027l0.1 1.199c0.884 8.306 1.389 17.944 1.389 27.699 0 76.501-31.023 145.757-81.174 195.872l-0.002 0.002zM551.253 322.987c-0.917-2.777-2.223-5.185-3.88-7.306l0.040 0.053-5.12-6.4c-7.634-7.26-17.985-11.726-29.379-11.726-3.35 0-6.609 0.386-9.736 1.116l0.288-0.057h-7.68l-7.68 3.84-6.4 5.547-5.12 6.4c-1.617 2.068-2.923 4.477-3.791 7.085l-0.049 0.169c-1.229 2.35-2.127 5.082-2.544 7.969l-0.016 0.137c-0.565 2.89-0.888 6.214-0.888 9.613 0 0.671 0.013 1.338 0.038 2.003l-0.003-0.096c-0.008 0.289-0.013 0.629-0.013 0.971 0 5.683 1.263 11.071 3.523 15.899l-0.097-0.23c2.305 5.266 5.318 9.782 8.983 13.678l-0.023-0.024c3.95 3.88 8.619 7.045 13.787 9.274l0.293 0.113c4.813 1.884 10.386 2.976 16.213 2.976s11.4-1.092 16.525-3.082l-0.311 0.106c5.423-2.458 10.075-5.608 14.105-9.41l-0.025 0.023c3.642-3.871 6.655-8.387 8.841-13.35l0.119-0.303c2.147-4.908 3.401-10.626 3.413-16.635l0-0.005c0.1-1.214 0.157-2.627 0.157-4.053s-0.057-2.84-0.169-4.238l0.012 0.184c-0.431-3.829-1.644-7.299-3.478-10.356l0.065 0.116z"],"attrs":[],"grid":0,"tags":["map-marker-info"]},"attrs":[],"properties":{"order":5213,"id":471,"name":"map-marker-info","prevSize":32,"code":60382},"setIdx":0,"setId":0,"iconIdx":734},{"icon":{"paths":["M872.96 410.88c-18.172-184.913-172.865-328.206-361.026-328.206-200.295 0-362.667 162.371-362.667 362.667 0 100.401 40.798 191.273 106.721 256.941l0.011 0.011 226.133 226.56c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 225.28-226.56c65.894-65.415 106.682-156.041 106.682-256.193 0-12.403-0.626-24.66-1.847-36.741l0.124 1.521zM708.267 642.133l-196.267 196.267-196.267-196.267c-50.107-50.11-81.099-119.334-81.099-195.797 0-9.481 0.476-18.85 1.407-28.086l-0.095 1.163c8.584-86.193 55.064-160.027 122.314-205.448l0.993-0.632c42.948-28.889 95.836-46.11 152.747-46.11s109.799 17.221 153.738 46.737l-0.991-0.627c68.043 45.881 114.465 119.364 123.206 204.027l0.1 1.199c0.884 8.306 1.389 17.944 1.389 27.699 0 76.501-31.023 145.757-81.174 195.872l-0.002 0.002zM588.373 266.667c-7.733-7.795-18.45-12.621-30.293-12.621s-22.56 4.826-30.291 12.618l-0.003 0.003-152.747 152.747c-7.606 7.667-12.323 18.211-12.373 29.857l-0 0.010v105.387c0 23.564 19.103 42.667 42.667 42.667v0h103.253c0.073 0 0.16 0.001 0.247 0.001 11.721 0 22.338-4.726 30.049-12.377l-0.003 0.003 152.747-152.747c7.668-7.712 12.407-18.343 12.407-30.080s-4.74-22.368-12.409-30.082l0.002 0.002zM491.093 512h-42.667v-42.667l110.080-110.080 42.667 42.667z"],"attrs":[],"grid":0,"tags":["map-marker-edit"]},"attrs":[],"properties":{"order":5214,"id":470,"name":"map-marker-edit","prevSize":32,"code":60383},"setIdx":0,"setId":0,"iconIdx":735},{"icon":{"paths":["M872.96 410.88c-18.283-184.806-172.924-327.976-361.004-327.976-74.689 0-144.105 22.578-201.795 61.281l1.306-0.825c-88.593 59.846-149.002 155.634-160.298 265.967l-0.129 1.553c-1.097 10.56-1.722 22.817-1.722 35.22 0 100.153 40.789 190.779 106.661 256.172l0.021 0.021 226.133 226.56c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 225.28-226.56c65.894-65.415 106.682-156.041 106.682-256.193 0-12.403-0.626-24.66-1.847-36.741l0.124 1.521zM708.267 642.133l-196.267 196.267-196.267-196.267c-50.107-50.11-81.099-119.334-81.099-195.797 0-9.481 0.476-18.85 1.407-28.086l-0.095 1.163c8.584-86.193 55.064-160.027 122.314-205.448l0.993-0.632c42.948-28.889 95.836-46.11 152.747-46.11s109.799 17.221 153.738 46.737l-0.991-0.627c68.043 45.881 114.465 119.364 123.206 204.027l0.1 1.199c0.884 8.306 1.389 17.944 1.389 27.699 0 76.501-31.023 145.757-81.174 195.872l-0.002 0.002zM512 256c-106.039 0-192 85.961-192 192s85.961 192 192 192c106.039 0 192-85.961 192-192v0c-0.242-105.941-86.059-191.758-191.977-192l-0.023-0zM512 554.667c-58.91 0-106.667-47.756-106.667-106.667s47.756-106.667 106.667-106.667c58.91 0 106.667 47.756 106.667 106.667v0c0 58.91-47.756 106.667-106.667 106.667v0z"],"attrs":[],"grid":0,"tags":["map-marker-alt"]},"attrs":[],"properties":{"order":5215,"id":469,"name":"map-marker-alt","prevSize":32,"code":60384},"setIdx":0,"setId":0,"iconIdx":736},{"icon":{"paths":["M614.827 278.613c-6.194 1.43-13.307 2.249-20.611 2.249-21.491 0-41.325-7.093-57.289-19.067l0.247 0.178c-6.96-5.134-15.707-8.217-25.173-8.217s-18.213 3.083-25.291 8.3l0.117-0.083c-15.717 11.796-35.551 18.889-57.042 18.889-7.304 0-14.417-0.819-21.252-2.371l0.64 0.122c-2.707-0.611-5.816-0.961-9.006-0.961-10.203 0-19.57 3.582-26.912 9.556l0.078-0.062c-9.665 7.885-15.787 19.795-15.787 33.135 0 0.051 0 0.102 0 0.153l-0-0.008v123.733c-0.007 0.572-0.010 1.248-0.010 1.925 0 56.917 26.92 107.547 68.722 139.852l0.408 0.303 58.453 42.667c6.96 5.134 15.707 8.217 25.173 8.217s18.213-3.083 25.291-8.3l-0.117 0.083 58.453-42.667c43.195-32.563 70.828-83.775 70.828-141.441 0-0.225-0-0.45-0.001-0.674l0 0.035v-123.733c0-0.043 0-0.094 0-0.145 0-13.34-6.122-25.25-15.71-33.074l-0.077-0.061c-7.205-5.748-16.444-9.223-26.494-9.223-2.7 0-5.342 0.251-7.903 0.731l0.264-0.041zM581.12 444.16c0.002 0.222 0.003 0.484 0.003 0.746 0 29.722-14.135 56.142-36.049 72.905l-0.221 0.162-32.853 24.32-32.853-24.32c-22.135-16.925-36.27-43.346-36.27-73.067 0-0.262 0.001-0.525 0.003-0.787l-0 0.040v-78.507c25.516-1.847 49.037-8.737 70.122-19.673l-1.002 0.473c20.083 10.463 43.604 17.353 68.534 19.166l0.586 0.034zM872.96 410.88c-18.283-184.806-172.924-327.976-361.004-327.976-74.689 0-144.105 22.578-201.795 61.281l1.306-0.825c-88.593 59.846-149.002 155.634-160.298 265.967l-0.129 1.553c-1.097 10.56-1.722 22.817-1.722 35.22 0 100.153 40.789 190.779 106.661 256.172l0.021 0.021 226.133 226.56c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 225.28-226.56c65.894-65.415 106.682-156.041 106.682-256.193 0-12.403-0.626-24.66-1.847-36.741l0.124 1.521zM708.267 642.133l-196.267 196.267-196.267-196.267c-50.107-50.11-81.099-119.334-81.099-195.797 0-9.481 0.476-18.85 1.407-28.086l-0.095 1.163c8.584-86.193 55.064-160.027 122.314-205.448l0.993-0.632c42.948-28.889 95.836-46.11 152.747-46.11s109.799 17.221 153.738 46.737l-0.991-0.627c68.043 45.881 114.465 119.364 123.206 204.027l0.1 1.199c0.884 8.306 1.389 17.944 1.389 27.699 0 76.501-31.023 145.757-81.174 195.872l-0.002 0.002z"],"attrs":[],"grid":0,"tags":["map-marker-shield"]},"attrs":[],"properties":{"order":5216,"id":468,"name":"map-marker-shield","prevSize":32,"code":60385},"setIdx":0,"setId":0,"iconIdx":737},{"icon":{"paths":["M453.547 234.24c17.503-4.27 37.598-6.719 58.265-6.719 141.385 0 256 114.615 256 256 0 20.542-2.419 40.518-6.989 59.66l0.351-1.742c-0.773 3.039-1.217 6.527-1.217 10.119 0 20.060 13.844 36.887 32.498 41.448l0.292 0.060c1.474 0.2 3.177 0.315 4.907 0.315s3.433-0.114 5.102-0.336l-0.196 0.021c0.37 0.012 0.806 0.018 1.243 0.018 19.935 0 36.677-13.671 41.361-32.15l0.063-0.295c5.753-23.459 9.053-50.39 9.053-78.092 0-188.513-152.82-341.333-341.333-341.333-27.577 0-54.391 3.27-80.074 9.445l2.327-0.472c-19.602 4.623-33.967 21.967-33.967 42.667 0 24.179 19.601 43.781 43.781 43.781 3.48 0 6.865-0.406 10.11-1.173l-0.297 0.059zM926.293 856.32l-768-768c-7.733-7.795-18.45-12.621-30.293-12.621s-22.56 4.826-30.291 12.618l-0.003 0.003c-7.668 7.712-12.407 18.343-12.407 30.080s4.74 22.368 12.409 30.082l-0.002-0.002 136.96 136.96c-39.929 55.168-63.868 124.189-63.868 198.8 0 94.124 38.098 179.35 99.714 241.099l-0.006-0.006 211.2 211.2c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 170.667-170.667 151.893 151.893c7.736 7.789 18.452 12.611 30.293 12.611 23.577 0 42.691-19.113 42.691-42.691 0-11.736-4.735-22.365-12.4-30.082l0.002 0.002zM517.12 567.893c-1.628 0.111-3.529 0.174-5.444 0.174-23.315 0-44.446-9.35-59.847-24.505l0.011 0.011c-15.625-15.472-25.299-36.928-25.299-60.644 0-1.631 0.046-3.251 0.136-4.859l-0.010 0.223zM512 845.227l-180.907-180.907c-46.101-46.289-74.603-110.136-74.603-180.641 0-50.744 14.764-98.039 40.23-137.825l-0.614 1.025 62.72 62.72c-10.677 21.657-16.923 47.147-16.923 74.095 0 46.811 18.846 89.219 49.364 120.053l-0.014-0.014c30.853 31.032 73.546 50.263 120.731 50.347l0.016 0c26.916-0.126 52.296-6.574 74.772-17.933l-0.959 0.439 67.413 67.413z"],"attrs":[],"grid":0,"tags":["map-marker-slash"]},"attrs":[],"properties":{"order":5217,"id":467,"name":"map-marker-slash","prevSize":32,"code":60386},"setIdx":0,"setId":0,"iconIdx":738},{"icon":{"paths":["M512 85.333c-188.513 0-341.333 152.82-341.333 341.333v0c0 230.4 300.8 490.667 313.6 501.76 7.409 6.367 17.119 10.243 27.733 10.243s20.324-3.876 27.79-10.29l-0.057 0.048c14.933-11.093 313.6-271.36 313.6-501.76 0-188.513-152.82-341.333-341.333-341.333v0zM512 838.4c-90.88-85.333-256-269.227-256-411.733 0-141.385 114.615-256 256-256s256 114.615 256 256v0c0 142.507-165.12 326.827-256 411.733zM512 256c-94.257 0-170.667 76.41-170.667 170.667s76.41 170.667 170.667 170.667c94.257 0 170.667-76.41 170.667-170.667v0c0-94.257-76.41-170.667-170.667-170.667v0zM512 512c-47.128 0-85.333-38.205-85.333-85.333s38.205-85.333 85.333-85.333c47.128 0 85.333 38.205 85.333 85.333v0c0 47.128-38.205 85.333-85.333 85.333v0z"],"attrs":[],"grid":0,"tags":["map-marker"]},"attrs":[],"properties":{"order":5218,"id":466,"name":"map-marker","prevSize":32,"code":60387},"setIdx":0,"setId":0,"iconIdx":739},{"icon":{"paths":["M530.773 559.36l-7.253-4.693c-4.8-2.030-10.38-3.21-16.237-3.21-11.832 0-22.539 4.816-30.267 12.595l-0.002 0.002c-4.030 3.714-7.221 8.274-9.298 13.404l-0.089 0.249c-2.147 4.908-3.401 10.626-3.413 16.635l-0 0.005c0.073 5.873 1.322 11.435 3.52 16.489l-0.107-0.275c4.679 10.291 12.749 18.361 22.754 22.923l0.286 0.117c4.778 2.092 10.34 3.34 16.186 3.413l0.027 0c6.024-0.116 11.726-1.359 16.948-3.527l-0.308 0.113c5.317-2.325 9.849-5.491 13.645-9.378l0.008-0.008c7.668-7.712 12.407-18.343 12.407-30.080s-4.74-22.368-12.409-30.082l0.002 0.002zM506.88 256c-0.392-0.005-0.856-0.007-1.32-0.007-42.245 0-79.275 22.325-99.936 55.821l-0.29 0.506c-4.177 6.48-6.66 14.395-6.66 22.89 0 23.564 19.103 42.667 42.667 42.667 16.334 0 30.524-9.178 37.694-22.659l0.112-0.23c6.037-8.321 15.729-13.671 26.671-13.671 0.373 0 0.745 0.006 1.116 0.019l-0.054-0.001c17.673 0 32 14.327 32 32s-14.327 32-32 32v0c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0c64.801 0 117.333-52.532 117.333-117.333s-52.532-117.333-117.333-117.333v0zM872.96 413.013c-17.305-185.733-172.402-329.986-361.191-329.986-74.61 0-143.959 22.53-201.612 61.159l1.31-0.826c-88.593 59.846-149.002 155.634-160.298 265.967l-0.129 1.553c-1.097 10.56-1.722 22.817-1.722 35.22 0 100.153 40.789 190.779 106.661 256.172l0.021 0.021 226.133 226.56c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 225.28-226.56c65.894-65.415 106.682-156.041 106.682-256.193 0-12.403-0.626-24.66-1.847-36.741l0.124 1.521zM708.267 642.133l-196.267 196.267-196.267-196.267c-50.107-50.11-81.099-119.334-81.099-195.797 0-9.481 0.476-18.85 1.407-28.086l-0.095 1.163c8.584-86.193 55.064-160.027 122.314-205.448l0.993-0.632c42.948-28.889 95.836-46.11 152.747-46.11s109.799 17.221 153.738 46.737l-0.991-0.627c68.043 45.881 114.465 119.364 123.206 204.027l0.1 1.199c0.884 8.306 1.389 17.944 1.389 27.699 0 76.501-31.023 145.757-81.174 195.872l-0.002 0.002z"],"attrs":[],"grid":0,"tags":["map-marker-question"]},"attrs":[],"properties":{"order":5219,"id":465,"name":"map-marker-question","prevSize":32,"code":60388},"setIdx":0,"setId":0,"iconIdx":740},{"icon":{"paths":["M469.333 507.733v217.6c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-217.6c98.072-20.544 170.667-106.306 170.667-209.023 0-117.821-95.513-213.333-213.333-213.333s-213.333 95.513-213.333 213.333c0 102.718 72.595 188.48 169.278 208.779l1.389 0.244zM512 170.667c70.692 0 128 57.308 128 128s-57.308 128-128 128c-70.692 0-128-57.308-128-128v0c0-70.692 57.308-128 128-128v0zM691.627 615.253c-2.693-0.592-5.787-0.931-8.96-0.931-24.078 0-43.597 19.519-43.597 43.597 0 20.905 14.714 38.374 34.35 42.615l0.287 0.052c96.853 19.2 136.96 53.76 136.96 67.413 0 24.747-104.533 85.333-298.667 85.333s-298.667-60.587-298.667-85.333c0-13.653 40.107-48.213 136.96-69.12 19.923-4.293 34.637-21.761 34.637-42.667 0-24.078-19.519-43.597-43.597-43.597-3.173 0-6.267 0.339-9.247 0.983l0.287-0.052c-129.707 29.867-204.373 85.76-204.373 154.453 0 112.213 193.28 170.667 384 170.667s384-58.453 384-170.667c0-68.693-74.667-124.587-204.373-152.747z"],"attrs":[],"grid":0,"tags":["map-pin-alt"]},"attrs":[],"properties":{"order":5220,"id":464,"name":"map-pin-alt","prevSize":32,"code":60389},"setIdx":0,"setId":0,"iconIdx":741},{"icon":{"paths":["M909.653 215.467l-256-85.333h-2.987c-0.896-0.095-1.935-0.15-2.987-0.15s-2.091 0.054-3.115 0.16l0.128-0.011h-18.347l-242.347 83.2-242.347-83.2c-3.988-1.361-8.583-2.146-13.361-2.146-9.408 0-18.105 3.045-25.159 8.203l0.121-0.084c-10.85 7.794-17.852 20.352-17.92 34.549l-0 0.011v597.333c-0 0.033-0 0.071-0 0.11 0 18.678 12.002 34.552 28.714 40.333l0.3 0.090 256 85.333c3.95 1.333 8.498 2.102 13.227 2.102s9.277-0.769 13.528-2.189l-0.301 0.087 243.2-81.067 242.347 83.2c2.051 0.293 4.419 0.461 6.827 0.461s4.776-0.168 7.094-0.492l-0.268 0.031c0.168 0.003 0.366 0.004 0.564 0.004 9.126 0 17.541-3.048 24.281-8.182l-0.098 0.072c10.85-7.794 17.852-20.352 17.92-34.549l0-0.011v-597.333c0-0.033 0-0.071 0-0.11 0-18.678-12.002-34.552-28.714-40.333l-0.3-0.090zM341.333 794.027l-170.667-56.747v-507.307l170.667 56.747zM597.333 737.28l-170.667 56.747v-507.307l170.667-56.747zM853.333 794.027l-170.667-56.747v-507.307l170.667 56.747z"],"attrs":[],"grid":0,"tags":["map"]},"attrs":[],"properties":{"order":5221,"id":463,"name":"map","prevSize":32,"code":60390},"setIdx":0,"setId":0,"iconIdx":742},{"icon":{"paths":["M698.453 545.707c-4.675-1.914-10.101-3.025-15.787-3.025-23.585 0-42.705 19.12-42.705 42.705 0 17.9 11.013 33.228 26.633 39.577l0.286 0.103c62.293 24.747 101.12 63.147 101.12 100.267 0 60.587-104.96 128-256 128s-256-67.413-256-128c0-37.12 38.827-75.52 101.12-100.267 15.906-6.452 26.918-21.78 26.918-39.68 0-23.585-19.12-42.705-42.705-42.705-5.685 0-11.111 1.111-16.072 3.128l0.286-0.103c-96.853 38.4-154.88 105.387-154.88 179.627 0 119.467 149.76 213.333 341.333 213.333s341.333-93.867 341.333-213.333c0-74.24-58.027-141.227-154.88-179.627zM469.333 420.693v304.64c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-304.64c74.196-19.625 128-86.153 128-165.247 0-94.257-76.41-170.667-170.667-170.667s-170.667 76.41-170.667 170.667c0 79.094 53.804 145.622 126.809 164.979l1.191 0.268zM512 170.667c47.128 0 85.333 38.205 85.333 85.333s-38.205 85.333-85.333 85.333c-47.128 0-85.333-38.205-85.333-85.333v0c0-47.128 38.205-85.333 85.333-85.333v0z"],"attrs":[],"grid":0,"tags":["map-pin"]},"attrs":[],"properties":{"order":5222,"id":462,"name":"map-pin","prevSize":32,"code":60391},"setIdx":0,"setId":0,"iconIdx":743},{"icon":{"paths":["M597.333 403.2h-42.667v-42.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 42.667h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h42.667v42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM872.96 410.88c-18.172-184.913-172.865-328.206-361.026-328.206-200.295 0-362.667 162.371-362.667 362.667 0 100.401 40.798 191.273 106.721 256.941l0.011 0.011 226.133 226.56c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 225.28-226.56c65.894-65.415 106.682-156.041 106.682-256.193 0-12.403-0.626-24.66-1.847-36.741l0.124 1.521zM708.267 642.133l-196.267 196.267-196.267-196.267c-50.107-50.11-81.099-119.334-81.099-195.797 0-9.481 0.476-18.85 1.407-28.086l-0.095 1.163c8.584-86.193 55.064-160.027 122.314-205.448l0.993-0.632c42.948-28.889 95.836-46.11 152.747-46.11s109.799 17.221 153.738 46.737l-0.991-0.627c68.043 45.881 114.465 119.364 123.206 204.027l0.1 1.199c0.884 8.306 1.389 17.944 1.389 27.699 0 76.501-31.023 145.757-81.174 195.872l-0.002 0.002z"],"attrs":[],"grid":0,"tags":["map-marker-plus"]},"attrs":[],"properties":{"order":5223,"id":461,"name":"map-marker-plus","prevSize":32,"code":60392},"setIdx":0,"setId":0,"iconIdx":744},{"icon":{"paths":["M871.253 175.787c-4.422-10.46-12.58-18.618-22.76-22.935l-0.28-0.105c-4.778-2.092-10.34-3.34-16.186-3.413l-0.027-0h-170.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h67.84l-102.4 102.4c-49.247-37.18-111.489-59.551-178.956-59.551-164.949 0-298.667 133.718-298.667 298.667s133.718 298.667 298.667 298.667c164.949 0 298.667-133.718 298.667-298.667 0-67.467-22.37-129.709-60.098-179.713l0.547 0.757 102.4-102.4v67.84c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-170.667c-0.073-5.873-1.322-11.435-3.52-16.489l0.107 0.275zM597.333 725.333c-38.749 39.51-92.69 64-152.35 64-117.821 0-213.333-95.513-213.333-213.333s95.513-213.333 213.333-213.333c59.66 0 113.601 24.49 152.317 63.966l0.033 0.034c37.709 38.449 60.983 91.173 60.983 149.333s-23.274 110.885-61.016 149.368l0.033-0.034z"],"attrs":[],"grid":0,"tags":["mars"]},"attrs":[],"properties":{"order":5224,"id":460,"name":"mars","prevSize":32,"code":60393},"setIdx":0,"setId":0,"iconIdx":745},{"icon":{"paths":["M512 554.667c-0.221-0.003-0.482-0.004-0.743-0.004-35.111 0-63.573 28.463-63.573 63.573 0 19.015 8.348 36.080 21.58 47.73l0.070 0.061v59.307c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-59.307c13.301-11.711 21.65-28.776 21.65-47.791 0-35.111-28.463-63.573-63.573-63.573-0.261 0-0.522 0.002-0.783 0.005l0.040-0zM725.333 384h-341.333v-85.333c-0-0.093-0-0.204-0-0.314 0-70.692 57.308-128 128-128 35.318 0 67.296 14.304 90.455 37.436l-0.001-0.001c15.575 15.901 27.153 35.776 33.072 57.962l0.208 0.918c4.908 18.59 21.573 32.072 41.387 32.072 23.604 0 42.739-19.135 42.739-42.739 0-3.79-0.493-7.466-1.42-10.965l0.067 0.298c-10.321-38.402-29.763-71.391-55.906-97.719l0.013 0.013c-38.582-38.465-91.82-62.248-150.613-62.248-117.805 0-213.308 95.487-213.333 213.286l-0 0.002v85.333c-70.692 0-128 57.308-128 128v0 298.667c0 70.692 57.308 128 128 128v0h426.667c70.692 0 128-57.308 128-128v0-298.667c0-70.692-57.308-128-128-128v0zM768 810.667c0 23.564-19.103 42.667-42.667 42.667v0h-426.667c-23.564 0-42.667-19.103-42.667-42.667v0-298.667c0-23.564 19.103-42.667 42.667-42.667v0h426.667c23.564 0 42.667 19.103 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["lock-open-alt"]},"attrs":[],"properties":{"order":5225,"id":459,"name":"lock-open-alt","prevSize":32,"code":60394},"setIdx":0,"setId":0,"iconIdx":746},{"icon":{"paths":["M462.507 229.547c13.755-9.901 30.941-15.834 49.514-15.834 23.465 0 44.717 9.471 60.144 24.798l-0.005-0.005c15.467 15.377 25.071 36.637 25.173 60.14l0 0.020v128c0 23.564 19.103 42.667 42.667 42.667v0h42.667c23.564 0 42.667 19.103 42.667 42.667v0 14.507c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-14.507c0-70.692-57.308-128-128-128v0-85.333c0-0.040 0-0.087 0-0.134 0-47.095-19.075-89.734-49.921-120.614l0.001 0.001c-31.158-30.284-73.74-48.957-120.683-48.957-37.807 0-72.786 12.112-101.267 32.667l0.51-0.35c-10.41 7.867-17.067 20.223-17.067 34.133 0 23.564 19.103 42.667 42.667 42.667 9.653 0 18.558-3.206 25.707-8.611l-0.107 0.078zM926.293 865.707l-768-768c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293v0l227.413 225.707c-63.374 8.322-111.791 61.991-111.791 126.97 0 0.362 0.002 0.724 0.005 1.086l-0-0.055v256c0 70.692 57.308 128 128 128v0h341.333c41.572-0.143 78.457-20.082 101.74-50.878l0.233-0.322 81.067 81.493c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003zM682.667 810.667h-341.333c-23.564 0-42.667-19.103-42.667-42.667v0-256c0-23.564 19.103-42.667 42.667-42.667v0h67.84l88.32 88.32c-16.426 6.062-27.964 21.498-28.16 39.656l-0 0.024v85.333c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-67.84l167.68 167.68c-6.062 16.426-21.498 27.964-39.656 28.16l-0.024 0z"],"attrs":[],"grid":0,"tags":["lock-slash"]},"attrs":[],"properties":{"order":5226,"id":458,"name":"lock-slash","prevSize":32,"code":60395},"setIdx":0,"setId":0,"iconIdx":747},{"icon":{"paths":["M651.292 225.041c-0.034-0-0.074-0-0.114-0-51.265 0-99.37 13.532-140.937 37.219l1.404-0.737c-40.33-22.952-88.608-36.482-140.045-36.482-158.529 0-287.042 128.513-287.042 287.042s128.513 287.042 287.042 287.042c51.437 0 99.715-13.53 141.467-37.224l-1.422 0.743c40.248 22.845 88.409 36.31 139.715 36.31 158.481 0 286.955-128.474 286.955-286.955s-128.474-286.955-286.955-286.955c-0.024 0-0.049 0-0.073 0l0.004-0zM436.784 702.165c-19.248 7.111-41.478 11.35-64.661 11.626l-0.123 0.001c-111.4 0-201.708-90.308-201.708-201.708s90.308-201.708 201.708-201.708v0c23.306 0.278 45.535 4.516 66.166 12.071l-1.383-0.443c-45.013 50.226-72.533 116.939-72.533 190.080s27.52 139.854 72.771 190.35l-0.238-0.27zM511.646 657.050c-38.27-36.552-62.063-87.981-62.063-144.966s23.792-108.414 61.986-144.893l0.077-0.073c38.27 36.552 62.063 87.981 62.063 144.966s-23.792 108.414-61.986 144.893l-0.077 0.073zM651.292 713.792c-23.306-0.278-45.535-4.516-66.167-12.070l1.383 0.443c45.013-50.226 72.533-116.939 72.533-190.080s-27.52-139.854-72.771-190.35l0.238 0.27c19.248-7.112 41.478-11.35 64.661-11.627l0.123-0.001c111.4 0 201.708 90.308 201.708 201.708s-90.308 201.708-201.708 201.708h0z"],"attrs":[],"grid":0,"tags":["master-card"]},"attrs":[],"properties":{"order":5227,"id":457,"name":"master-card","prevSize":32,"code":60396},"setIdx":0,"setId":0,"iconIdx":748},{"icon":{"paths":["M85.333 576v85.333c0 23.564 19.103 42.667 42.667 42.667v0h426.667c0 70.692 57.308 128 128 128s128-57.308 128-128v0h85.333c23.564 0 42.667-19.103 42.667-42.667v0-341.333c0-70.692-57.308-128-128-128v0h-426.667c-70.692 0-128 57.308-128 128v0 298.667h-85.333v-42.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0zM640 704c0-23.564 19.103-42.667 42.667-42.667s42.667 19.103 42.667 42.667c0 23.564-19.103 42.667-42.667 42.667v0c-23.564 0-42.667-19.103-42.667-42.667v0zM341.333 448h512v170.667h-75.947c-23.501-25.787-57.228-41.906-94.72-41.906s-71.219 16.119-94.629 41.805l-0.091 0.102h-246.613zM341.333 320c0-23.564 19.103-42.667 42.667-42.667v0h426.667c23.564 0 42.667 19.103 42.667 42.667v0 42.667h-512z"],"attrs":[],"grid":0,"tags":["luggage-cart"]},"attrs":[],"properties":{"order":5228,"id":456,"name":"luggage-cart","prevSize":32,"code":60397},"setIdx":0,"setId":0,"iconIdx":749},{"icon":{"paths":["M725.333 256c-119.467 0-187.733 119.467-251.733 234.667-51.2 98.133-102.4 192-174.933 192-25.6 0-42.667 17.067-42.667 42.667s17.067 42.667 42.667 42.667c119.467 0 187.733-119.467 251.733-234.667 51.2-98.133 102.4-192 174.933-192 25.6 0 42.667-17.067 42.667-42.667s-17.067-42.667-42.667-42.667zM810.667 85.333h-597.333c-72.533 0-128 55.467-128 128v597.333c0 72.533 55.467 128 128 128h597.333c72.533 0 128-55.467 128-128v-597.333c0-72.533-55.467-128-128-128zM853.333 810.667c0 25.6-17.067 42.667-42.667 42.667h-597.333c-25.6 0-42.667-17.067-42.667-42.667v-597.333c0-25.6 17.067-42.667 42.667-42.667h597.333c25.6 0 42.667 17.067 42.667 42.667v597.333z"],"attrs":[],"grid":0,"tags":["lottiefiles"]},"attrs":[],"properties":{"order":5229,"id":455,"name":"lottiefiles","prevSize":32,"code":60398},"setIdx":0,"setId":0,"iconIdx":750},{"icon":{"paths":["M896 85.333h-768c-23.564 0-42.667 19.103-42.667 42.667v0 768c0 23.564 19.103 42.667 42.667 42.667v0h768c23.564 0 42.667-19.103 42.667-42.667v0-768c0-23.564-19.103-42.667-42.667-42.667v0zM853.333 853.333h-682.667v-682.667h682.667zM298.667 631.040h85.333v85.333c0 23.564 19.103 42.667 42.667 42.667v0h170.667c23.564 0 42.667-19.103 42.667-42.667v0-85.333h85.333c23.564 0 42.667-19.103 42.667-42.667v0-170.667c0-23.564-19.103-42.667-42.667-42.667v0h-85.333v-85.333c0-23.564-19.103-42.667-42.667-42.667v0h-170.667c-23.564 0-42.667 19.103-42.667 42.667v0 85.333h-85.333c-23.564 0-42.667 19.103-42.667 42.667v0 170.667c0 23.564 19.103 42.667 42.667 42.667v0zM341.333 460.373h85.333c23.564 0 42.667-19.103 42.667-42.667v0-85.333h85.333v85.333c0 23.564 19.103 42.667 42.667 42.667v0h85.333v85.333h-85.333c-23.564 0-42.667 19.103-42.667 42.667v0 85.333h-85.333v-85.333c0-23.564-19.103-42.667-42.667-42.667v0h-85.333z"],"attrs":[],"grid":0,"tags":["medical-square-full"]},"attrs":[],"properties":{"order":5230,"id":454,"name":"medical-square-full","prevSize":32,"code":60399},"setIdx":0,"setId":0,"iconIdx":751},{"icon":{"paths":["M512 554.667c-23.564 0-42.667 19.103-42.667 42.667v0 128c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-128c0-23.564-19.103-42.667-42.667-42.667v0zM725.333 384v-85.333c0-117.821-95.513-213.333-213.333-213.333s-213.333 95.513-213.333 213.333v0 85.333c-70.692 0-128 57.308-128 128v0 298.667c0 70.692 57.308 128 128 128v0h426.667c70.692 0 128-57.308 128-128v0-298.667c0-70.692-57.308-128-128-128v0zM384 298.667c0-70.692 57.308-128 128-128s128 57.308 128 128v0 85.333h-256zM768 810.667c0 23.564-19.103 42.667-42.667 42.667v0h-426.667c-23.564 0-42.667-19.103-42.667-42.667v0-298.667c0-23.564 19.103-42.667 42.667-42.667v0h426.667c23.564 0 42.667 19.103 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["lock-alt"]},"attrs":[],"properties":{"order":5231,"id":453,"name":"lock-alt","prevSize":32,"code":60400},"setIdx":0,"setId":0,"iconIdx":752},{"icon":{"paths":["M810.667 85.333h-597.333c-70.692 0-128 57.308-128 128v0 597.333c0 70.692 57.308 128 128 128v0h597.333c70.692 0 128-57.308 128-128v0-597.333c0-70.692-57.308-128-128-128v0zM853.333 810.667c0 23.564-19.103 42.667-42.667 42.667v0h-597.333c-23.564 0-42.667-19.103-42.667-42.667v0-597.333c0-23.564 19.103-42.667 42.667-42.667v0h597.333c23.564 0 42.667 19.103 42.667 42.667v0zM725.333 384h-85.333v-85.333c0-23.564-19.103-42.667-42.667-42.667v0h-170.667c-23.564 0-42.667 19.103-42.667 42.667v0 85.333h-85.333c-23.564 0-42.667 19.103-42.667 42.667v0 170.667c0 23.564 19.103 42.667 42.667 42.667v0h85.333v85.333c0 23.564 19.103 42.667 42.667 42.667v0h170.667c23.564 0 42.667-19.103 42.667-42.667v0-85.333h85.333c23.564 0 42.667-19.103 42.667-42.667v0-170.667c0-23.564-19.103-42.667-42.667-42.667v0zM682.667 554.667h-85.333c-23.564 0-42.667 19.103-42.667 42.667v0 85.333h-85.333v-85.333c0-23.564-19.103-42.667-42.667-42.667v0h-85.333v-85.333h85.333c23.564 0 42.667-19.103 42.667-42.667v0-85.333h85.333v85.333c0 23.564 19.103 42.667 42.667 42.667v0h85.333z"],"attrs":[],"grid":0,"tags":["medical-square"]},"attrs":[],"properties":{"order":5232,"id":452,"name":"medical-square","prevSize":32,"code":60401},"setIdx":0,"setId":0,"iconIdx":753},{"icon":{"paths":["M725.333 256h-85.333v-85.333h85.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-341.333c-117.821 0-213.333 95.513-213.333 213.333v0 597.333c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-597.333c0-70.692 57.308-128 128-128v0h170.667v85.333h-85.333c-70.692 0-128 57.308-128 128v0 210.347c-0 0.014-0 0.031-0 0.048 0 44.304 22.509 83.35 56.714 106.328l0.459 0.291 70.827 47.36v19.627c0 47.128 38.205 85.333 85.333 85.333v0 42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667c47.128 0 85.333-38.205 85.333-85.333v0-19.627l70.827-47.36c34.665-23.269 57.173-62.315 57.173-106.619 0-0.017-0-0.034-0-0.050l0 0.003v-210.347c0-70.692-57.308-128-128-128v0zM682.667 469.333h85.333v42.667h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h42.667c-0.98 13.53-8.131 25.207-18.624 32.331l-0.149 0.095-89.6 60.16c-11.744 7.618-19.448 20.597-19.626 35.387l-0 0.027v42.667h-85.333v-42.667c-0.079-14.744-7.624-27.709-19.044-35.315l-0.156-0.098-89.6-60.16c-11.576-7.705-19.121-20.669-19.2-35.401l-0-0.012v-210.347c0-23.564 19.103-42.667 42.667-42.667v0h256c23.564 0 42.667 19.103 42.667 42.667v0h-85.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["medical-drip"]},"attrs":[],"properties":{"order":5233,"id":451,"name":"medical-drip","prevSize":32,"code":60402},"setIdx":0,"setId":0,"iconIdx":754},{"icon":{"paths":["M426.667 725.333h42.667v42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-42.667v-42.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 42.667h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM810.667 256h-85.333v-42.667c0-70.692-57.308-128-128-128v0h-170.667c-70.692 0-128 57.308-128 128v0 42.667h-85.333c-70.692 0-128 57.308-128 128v0 426.667c0 70.692 57.308 128 128 128v0h597.333c70.692 0 128-57.308 128-128v0-426.667c0-70.692-57.308-128-128-128v0zM384 213.333c0-23.564 19.103-42.667 42.667-42.667v0h170.667c23.564 0 42.667 19.103 42.667 42.667v0 42.667h-256zM853.333 810.667c0 23.564-19.103 42.667-42.667 42.667v0h-597.333c-23.564 0-42.667-19.103-42.667-42.667v0-298.667h682.667zM853.333 426.667h-682.667v-42.667c0-23.564 19.103-42.667 42.667-42.667v0h597.333c23.564 0 42.667 19.103 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["medkit"]},"attrs":[],"properties":{"order":5234,"id":450,"name":"medkit","prevSize":32,"code":60403},"setIdx":0,"setId":0,"iconIdx":755},{"icon":{"paths":["M904.919 273.779h33.747v-99.558h-319.156l-106.063 391.11h-2.901l-105.099-391.11h-320.115v99.555h32.784c15.571 2.603 27.817 14.321 31.169 29.389l0.047 0.254v419.427c-3.594 14.721-15.92 25.749-31.059 27.361l-0.157 0.014h-32.784v99.558h256v-99.558h-64v-440.888h3.734l147.523 540.445h115.712l149.452-540.445h3.138v440.888h-64.003v99.558h305.776v-99.558h-33.747c-14.906-1.994-26.795-12.914-30.203-27.131l-0.049-0.244v-419.424c3.286-15.060 15.093-26.663 30.010-29.603l0.243-0.040z"],"attrs":[],"grid":0,"tags":["medium-m"]},"attrs":[],"properties":{"order":5235,"id":449,"name":"medium-m","prevSize":32,"code":60404},"setIdx":0,"setId":0,"iconIdx":756},{"icon":{"paths":["M852.958 85.419c-0.007-0-0.016-0-0.024-0-23.551 0-42.642 19.092-42.642 42.642 0 0.009 0 0.017 0 0.026l-0-0.001v27.167c-70.955 87.466-178.274 143.038-298.589 143.5l-0.078 0h-256c-70.66 0.080-127.92 57.339-128 127.992l-0 0.008v85.333c0.080 70.66 57.339 127.92 127.992 128l20.649 0-102.516 239.206c-2.186 4.96-3.459 10.743-3.459 16.823 0 23.548 19.089 42.637 42.637 42.637 0.011 0 0.021-0 0.032-0l170.665 0c0.008 0 0.016 0 0.025 0 17.485 0 32.51-10.533 39.076-25.6l0.107-0.275 116.213-271.171c109.87 8.302 205.872 61.535 270.69 141.166l0.555 0.704v27.176c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-682.667c0-0.007 0-0.016 0-0.025 0-23.55-19.091-42.642-42.642-42.642-0.009 0-0.017 0-0.026 0l0.001-0zM255.625 554.752c-23.558-0.016-42.65-19.109-42.667-42.665l-0-0.002v-85.333c0.017-23.557 19.109-42.65 42.665-42.667l42.668-0v170.667zM355.5 853.419h-77.833l91.417-213.333h77.833zM810.292 662.349c-80.531-66.726-184.832-107.308-298.604-107.599l-0.063-0h-128v-170.667h128c113.837-0.3 218.137-40.889 299.451-108.251l-0.785 0.632z"],"attrs":[],"grid":0,"tags":["megaphone"]},"attrs":[],"properties":{"order":5236,"id":448,"name":"megaphone","prevSize":32,"code":60405},"setIdx":0,"setId":0,"iconIdx":757},{"icon":{"paths":["M298.667 426.667h85.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-85.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM896 170.667h-341.333v-42.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 42.667h-341.333c-23.564 0-42.667 19.103-42.667 42.667v0 426.667c0 70.692 57.308 128 128 128v0h195.84l-98.133 97.707c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 97.707-98.133v67.84c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-67.84l97.707 98.133c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003-98.133-97.707h195.84c70.692 0 128-57.308 128-128v0-426.667c0-23.564-19.103-42.667-42.667-42.667v0zM853.333 640c0 23.564-19.103 42.667-42.667 42.667v0h-597.333c-23.564 0-42.667-19.103-42.667-42.667v0-384h682.667zM298.667 597.333h256c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-256c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["meeting-board"]},"attrs":[],"properties":{"order":5237,"id":447,"name":"meeting-board","prevSize":32,"code":60406},"setIdx":0,"setId":0,"iconIdx":758},{"icon":{"paths":["M384 469.333h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM640 597.333h-256c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h256c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM640 384h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM512 85.333c-235.641 0-426.667 191.025-426.667 426.667s191.025 426.667 426.667 426.667c235.641 0 426.667-191.025 426.667-426.667v0c0-235.641-191.025-426.667-426.667-426.667v0zM512 853.333c-188.513 0-341.333-152.82-341.333-341.333s152.82-341.333 341.333-341.333c188.513 0 341.333 152.82 341.333 341.333v0c0 188.513-152.82 341.333-341.333 341.333v0z"],"attrs":[],"grid":0,"tags":["meh-alt"]},"attrs":[],"properties":{"order":5238,"id":446,"name":"meh-alt","prevSize":32,"code":60407},"setIdx":0,"setId":0,"iconIdx":759},{"icon":{"paths":["M392.96 449.707c7.712 7.668 18.343 12.407 30.080 12.407s22.368-4.74 30.082-12.409l-0.002 0.002c7.668-7.712 12.407-18.343 12.407-30.080s-4.74-22.368-12.409-30.082l0.002 0.002c-23.51-22.342-55.377-36.084-90.453-36.084s-66.943 13.743-90.51 36.137l0.056-0.053c-9.153 7.872-14.914 19.467-14.914 32.407 0 23.564 19.103 42.667 42.667 42.667 12.94 0 24.535-5.761 32.36-14.858l0.047-0.056c7.733-7.795 18.45-12.621 30.293-12.621s22.56 4.826 30.291 12.618l0.003 0.003zM640 597.333h-256c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h256c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM751.787 389.547c-23.51-22.342-55.377-36.084-90.453-36.084s-66.943 13.743-90.51 36.137l0.056-0.053c-6.377 7.412-10.259 17.129-10.259 27.753 0 23.564 19.103 42.667 42.667 42.667 10.624 0 20.341-3.883 27.809-10.307l-0.056 0.047c7.733-7.795 18.45-12.621 30.293-12.621s22.56 4.826 30.291 12.618l0.003 0.003c7.712 7.668 18.343 12.407 30.080 12.407s22.368-4.74 30.082-12.409l-0.002 0.002c7.668-7.712 12.407-18.343 12.407-30.080s-4.74-22.368-12.409-30.082l0.002 0.002zM512 85.333c-235.641 0-426.667 191.025-426.667 426.667s191.025 426.667 426.667 426.667c235.641 0 426.667-191.025 426.667-426.667v0c0-235.641-191.025-426.667-426.667-426.667v0zM512 853.333c-188.513 0-341.333-152.82-341.333-341.333s152.82-341.333 341.333-341.333c188.513 0 341.333 152.82 341.333 341.333v0c0 188.513-152.82 341.333-341.333 341.333v0z"],"attrs":[],"grid":0,"tags":["meh-closed-eye"]},"attrs":[],"properties":{"order":5239,"id":445,"name":"meh-closed-eye","prevSize":32,"code":60408},"setIdx":0,"setId":0,"iconIdx":760},{"icon":{"paths":["M912.213 245.76c-3.064-11.207-10.279-20.368-19.849-25.917l-0.205-0.11-221.867-128c-6.176-3.68-13.62-5.855-21.572-5.855-15.661 0-29.352 8.438-36.773 21.016l-0.109 0.199-99.84 173.227-99.84-173.227c-7.53-12.777-21.22-21.215-36.882-21.215-7.952 0-15.395 2.175-21.768 5.963l0.197-0.108-221.867 128c-9.775 5.658-16.989 14.819-19.983 25.727l-0.070 0.299c-0.879 3.235-1.384 6.948-1.384 10.78 0 7.809 2.098 15.127 5.76 21.423l-0.109-0.204 170.667 291.413c-18.238 32.784-29.47 71.696-30.711 113.119l-0.009 0.374c-0.001 0.199-0.001 0.435-0.001 0.671 0 141.385 114.615 256 256 256s256-114.615 256-256c0-42.614-10.412-82.796-28.831-118.141l0.672 1.417 166.4-288.427c4.357-6.58 6.952-14.658 6.952-23.343 0-3.219-0.356-6.354-1.032-9.369l0.054 0.285zM213.333 272.213l147.627-85.333 137.387 239.787c-61.047 3.882-115.621 28.819-157.164 67.552l0.15-0.139zM512 853.333c-94.257 0-170.667-76.41-170.667-170.667v0c0-94.257 76.41-170.667 170.667-170.667v0c94.257 0 170.667 76.41 170.667 170.667s-76.41 170.667-170.667 170.667v0zM682.667 492.8c-22.367-20.485-48.699-37.085-77.651-48.474l-1.709-0.592-41.813-78.080 103.253-178.773 147.627 85.333z"],"attrs":[],"grid":0,"tags":["medal"]},"attrs":[],"properties":{"order":5240,"id":444,"name":"medal","prevSize":32,"code":60409},"setIdx":0,"setId":0,"iconIdx":761},{"icon":{"paths":["M230.827 170.667h67.84c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-170.667c-5.873 0.073-11.435 1.322-16.489 3.52l0.275-0.107c-10.46 4.422-18.618 12.58-22.935 22.76l-0.105 0.28c-2.092 4.778-3.34 10.34-3.413 16.186l-0 0.027v170.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-67.84l247.040 247.467c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003zM896 682.667c-23.564 0-42.667 19.103-42.667 42.667v0 67.84l-247.040-247.467c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l-0-0 247.467 247.040h-67.84c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h170.667c5.873-0.073 11.435-1.322 16.489-3.52l-0.275 0.107c10.46-4.422 18.618-12.58 22.935-22.76l0.105-0.28c2.092-4.778 3.34-10.34 3.413-16.186l0-0.027v-170.667c0-23.564-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["maximize-left"]},"attrs":[],"properties":{"order":5241,"id":443,"name":"maximize-left","prevSize":32,"code":60410},"setIdx":0,"setId":0,"iconIdx":762},{"icon":{"paths":["M384 469.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667c-23.564 0-42.667 19.103-42.667 42.667v0c0 23.564 19.103 42.667 42.667 42.667v0zM640 597.333h-256c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h256c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM640 384c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM512 85.333c-235.641 0-426.667 191.025-426.667 426.667s191.025 426.667 426.667 426.667c235.641 0 426.667-191.025 426.667-426.667v0c0-235.641-191.025-426.667-426.667-426.667v0zM512 853.333c-188.513 0-341.333-152.82-341.333-341.333s152.82-341.333 341.333-341.333c188.513 0 341.333 152.82 341.333 341.333v0c0 188.513-152.82 341.333-341.333 341.333v0z"],"attrs":[],"grid":0,"tags":["meh"]},"attrs":[],"properties":{"order":5242,"id":442,"name":"meh","prevSize":32,"code":60411},"setIdx":0,"setId":0,"iconIdx":763},{"icon":{"paths":["M158.293 695.040c-3.937-3.773-8.616-6.808-13.791-8.859l-0.289-0.101c-4.793-2.024-10.366-3.201-16.213-3.201s-11.42 1.176-16.495 3.305l0.281-0.105c-5.464 2.152-10.143 5.187-14.095 8.974l0.015-0.014c-3.773 3.937-6.808 8.616-8.859 13.791l-0.101 0.289c-2.109 4.883-3.336 10.568-3.336 16.539 0 11.682 4.695 22.267 12.3 29.972l-0.004-0.005c4.001 3.646 8.658 6.662 13.76 8.838l0.32 0.122c4.771 2.163 10.345 3.423 16.213 3.423s11.443-1.26 16.466-3.525l-0.253 0.102c5.422-2.298 10.079-5.314 14.119-8.995l-0.039 0.035c7.601-7.7 12.296-18.286 12.296-29.968 0-5.971-1.227-11.656-3.442-16.817l0.106 0.278c-2.152-5.464-5.187-10.143-8.974-14.095l0.014 0.015zM298.667 341.333h597.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-597.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM158.293 481.707c-7.7-7.601-18.286-12.296-29.968-12.296-5.971 0-11.656 1.227-16.817 3.442l0.278-0.106c-5.422 2.298-10.079 5.314-14.119 8.995l0.039-0.035c-3.773 3.937-6.808 8.616-8.859 13.791l-0.101 0.289c-2.163 4.771-3.423 10.345-3.423 16.213s1.26 11.443 3.525 16.466l-0.102-0.253c2.298 5.422 5.314 10.079 8.995 14.119l-0.035-0.039c4.001 3.646 8.658 6.662 13.76 8.838l0.32 0.122c4.771 2.163 10.345 3.423 16.213 3.423s11.443-1.26 16.466-3.525l-0.253 0.102c5.422-2.298 10.079-5.314 14.119-8.995l-0.039 0.035c3.646-4.001 6.662-8.658 8.838-13.76l0.122-0.32c2.163-4.771 3.423-10.345 3.423-16.213s-1.26-11.443-3.525-16.466l0.102 0.253c-2.152-5.464-5.187-10.143-8.974-14.095l0.014 0.015zM896 469.333h-597.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h597.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM158.293 268.373c-3.937-3.773-8.616-6.808-13.791-8.859l-0.289-0.101c-4.883-2.109-10.568-3.336-16.539-3.336-11.682 0-22.267 4.695-29.972 12.3l0.005-0.004c-3.646 4.001-6.662 8.658-8.838 13.76l-0.122 0.32c-2.163 4.771-3.423 10.345-3.423 16.213s1.26 11.443 3.525 16.466l-0.102-0.253c2.298 5.422 5.314 10.079 8.995 14.119l-0.035-0.039c4.001 3.646 8.658 6.662 13.76 8.838l0.32 0.122c4.883 2.109 10.568 3.336 16.539 3.336 11.682 0 22.267-4.695 29.972-12.3l-0.005 0.004c3.646-4.001 6.662-8.658 8.838-13.76l0.122-0.32c2.163-4.771 3.423-10.345 3.423-16.213s-1.26-11.443-3.525-16.466l0.102 0.253c-2.298-5.422-5.314-10.079-8.995-14.119l0.035 0.039zM896 682.667h-597.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h597.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["list-ul"]},"attrs":[],"properties":{"order":5243,"id":441,"name":"list-ul","prevSize":32,"code":60412},"setIdx":0,"setId":0,"iconIdx":764},{"icon":{"paths":["M371.627 609.707c-7.709-7.593-18.297-12.282-29.981-12.282-5.963 0-11.641 1.221-16.798 3.428l0.279-0.106c-10.745 3.972-19.068 12.295-22.954 22.774l-0.086 0.266c-2.162 4.937-3.42 10.691-3.42 16.739 0 23.566 19.104 42.67 42.67 42.67s42.67-19.104 42.67-42.67c0-6.048-1.258-11.801-3.527-17.014l0.107 0.275c-2.296-5.422-5.311-10.080-8.995-14.119l0.035 0.039zM712.96 609.707c-7.934-7.341-18.587-11.844-30.292-11.844s-22.358 4.503-30.321 11.871l0.030-0.027c-3.649 4.001-6.665 8.66-8.839 13.764l-0.121 0.32c-2.162 4.907-3.42 10.629-3.42 16.644 0 11.662 4.73 22.22 12.377 29.859l0 0c4.001 3.649 8.66 6.665 13.764 8.839l0.32 0.121c4.77 2.159 10.342 3.417 16.208 3.417s11.438-1.258 16.462-3.519l-0.254 0.102c5.421-2.306 10.078-5.321 14.124-8.997l-0.041 0.037c7.648-7.639 12.378-18.197 12.378-29.86 0-6.014-1.258-11.733-3.524-16.911l0.106 0.271c-2.294-5.425-5.309-10.085-8.991-14.126l0.035 0.039zM823.869 806.199c48.865-39.187 79.883-98.885 79.883-165.827 0-14.044-1.365-27.768-3.97-41.049l0.219 1.342-64-341.333c-19.208-99.687-105.738-173.967-209.623-173.998l-228.753-0c-103.888 0.032-190.418 74.313-209.41 172.659l-0.216 1.341-64 341.333c-2.385 11.938-3.751 25.663-3.751 39.707 0 66.942 31.018 126.64 79.467 165.504l0.417 0.323-59.631 59.634c-7.884 7.746-12.77 18.522-12.77 30.439 0 23.562 19.1 42.662 42.662 42.662 11.917 0 22.692-4.886 30.433-12.764l0.006-0.006 79.75-79.75c15.894 4.318 34.157 6.837 52.995 6.918l0.048 0h356.75c18.885-0.080 37.148-2.599 54.535-7.257l-1.493 0.34 79.751 79.749c7.692 7.558 18.247 12.223 29.892 12.223 23.562 0 42.662-19.1 42.662-42.662 0-11.645-4.666-22.2-12.229-29.898l0.006 0.006zM271.833 275.084c11.548-59.809 63.459-104.371 125.787-104.417l228.755-0c62.333 0.046 114.244 44.608 125.662 103.611l0.13 0.806 14.792 78.888c-62.515 70.884-153.543 115.362-254.959 115.362s-192.444-44.479-254.639-114.993l-0.319-0.369zM788.833 721.749c-23.568 28.341-58.838 46.251-98.291 46.251-0.059 0-0.117-0-0.176-0l0.009 0h-356.75c-70.686-0.026-127.978-57.335-127.978-128.024 0-8.331 0.796-16.475 2.315-24.363l-0.129 0.804 30.339-161.807c73.405 62.223 169.198 100.057 273.828 100.057s200.423-37.834 274.446-100.567l-0.617 0.51 30.339 161.807c1.41 7.12 2.217 15.306 2.217 23.68 0 31.153-11.166 59.699-29.713 81.853l0.163-0.2z"],"attrs":[],"grid":0,"tags":["metro"]},"attrs":[],"properties":{"order":5244,"id":440,"name":"metro","prevSize":32,"code":60413},"setIdx":0,"setId":0,"iconIdx":765},{"icon":{"paths":["M867.84 397.653l-597.333-298.667c-16.623-8.455-36.25-13.409-57.034-13.409-70.692 0-128 57.308-128 128 0 18.754 4.033 36.566 11.279 52.615l-0.326-0.807 102.4 229.12c2.226 5.165 3.52 11.178 3.52 17.493s-1.294 12.328-3.632 17.788l0.112-0.295-102.4 229.12c-6.988 15.309-11.062 33.205-11.062 52.053 0 70.682 57.29 127.982 127.967 128l0.002 0c21.007-0.216 40.792-5.234 58.377-14.004l-0.777 0.351 597.333-298.667c42.133-21.534 70.477-64.63 70.477-114.347s-28.344-92.813-69.755-114.011l-0.722-0.336zM829.867 549.973l-597.333 298.667c-5.4 2.653-11.753 4.204-18.468 4.204-23.564 0-42.667-19.103-42.667-42.667 0-6.149 1.301-11.995 3.642-17.276l-0.108 0.272 101.973-229.12c1.116-2.475 2.276-5.589 3.254-8.782l0.159-0.605h293.973c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-293.973c-1.137-3.798-2.298-6.912-3.628-9.933l0.215 0.547-101.973-229.12c-2.234-5.009-3.535-10.855-3.535-17.004 0-23.564 19.103-42.667 42.667-42.667 6.715 0 13.068 1.551 18.72 4.315l-0.252-0.111 597.333 298.667c13.89 7.227 23.212 21.512 23.212 37.973s-9.323 30.746-22.976 37.861l-0.236 0.112z"],"attrs":[],"grid":0,"tags":["message"]},"attrs":[],"properties":{"order":5245,"id":439,"name":"message","prevSize":32,"code":60414},"setIdx":0,"setId":0,"iconIdx":766},{"icon":{"paths":["M448 159.147c15.764-18.896 39.319-30.833 65.662-30.833 23.497 0 44.776 9.497 60.208 24.862l-0.003-0.003c14.535 15.272 23.478 35.984 23.478 58.785 0 0.483-0.004 0.966-0.012 1.448l0.001-0.073v145.493c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-145.493c-2.708-92.142-78.050-165.806-170.597-165.806-50.925 0-96.641 22.305-127.911 57.678l-0.158 0.182c-9.904 7.884-16.196 19.938-16.196 33.463 0 23.564 19.103 42.667 42.667 42.667 16.127 0 30.164-8.947 37.418-22.148l0.111-0.221zM798.72 566.187h8.533c0.231 0.004 0.503 0.007 0.776 0.007 20.699 0 37.955-14.74 41.846-34.295l0.045-0.272c2.326-14.886 3.655-32.054 3.655-49.533 0-4.488-0.088-8.955-0.261-13.4l0.020 0.64c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0c0 0.019 0 0.042 0 0.064 0 16.589-1.709 32.779-4.96 48.403l0.267-1.534c-0.452 2.333-0.711 5.015-0.711 7.758 0 21.255 15.542 38.88 35.881 42.13l0.243 0.032zM926.72 824.747l-768-768c-7.733-7.795-18.45-12.621-30.293-12.621s-22.56 4.826-30.291 12.618l-0.003 0.003c-7.668 7.712-12.407 18.343-12.407 30.080s4.74 22.368 12.409 30.082l243.198 244.905v107.52c0.1 94.181 76.471 170.492 170.667 170.492 31.419 0 60.855-8.49 86.139-23.301l-0.805 0.436 62.293 62.293c-41.079 29.305-92.304 46.854-147.628 46.854-141.385 0-256-114.615-256-256 0-0.272 0-0.544 0.001-0.816l-0 0.042c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0c0.162 173.343 129.512 316.425 296.952 338.165l1.714 0.182v88.32h-85.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h256c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-85.333v-88.32c62.781-8.013 118.75-32.278 165.010-68.399l-0.744 0.559 145.067 145.067c7.736 7.789 18.452 12.611 30.293 12.611 23.577 0 42.691-19.113 42.691-42.691 0-11.736-4.735-22.365-12.4-30.082l0.002 0.002zM512 554.667c-47.128 0-85.333-38.205-85.333-85.333v0-22.187l104.533 104.96c-5.755 1.614-12.366 2.548-19.193 2.56l-0.007 0z"],"attrs":[],"grid":0,"tags":["microphone-slash"]},"attrs":[],"properties":{"order":5246,"id":438,"name":"microphone-slash","prevSize":32,"code":60415},"setIdx":0,"setId":0,"iconIdx":767},{"icon":{"paths":["M469.333 554.667h85.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-85.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM810.667 853.333h-42.667v-469.333h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-46.507c-21.794-121.122-126.385-211.826-252.16-211.826s-230.366 90.704-251.927 210.269l-0.233 1.557h-46.507c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h42.667v469.333h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h597.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM512 170.667c78.868 0.264 145.116 53.984 164.425 126.809l0.268 1.191h-329.387c19.577-74.016 85.825-127.736 164.663-128l0.030-0zM682.667 853.333h-341.333v-85.333h341.333zM682.667 682.667h-341.333v-298.667h341.333z"],"attrs":[],"grid":0,"tags":["mailbox-alt"]},"attrs":[],"properties":{"order":5247,"id":437,"name":"mailbox-alt","prevSize":32,"code":60416},"setIdx":0,"setId":0,"iconIdx":768},{"icon":{"paths":["M853.333 896.229h-221.196c2.666-7.252 4.8-15.772 6.026-24.583l0.076-0.664c126.46-51.869 214.103-173.62 215.094-315.962l0.001-0.124c0-0.146 0-0.319 0-0.491 0-89.295-34.526-170.525-90.958-231.070l0.186 0.202 27.188-27.203c4.562-4.549 8.090-10.132 10.204-16.368l0.088-0.298 30.208-90.542c1.392-4.031 2.196-8.677 2.196-13.511 0-11.776-4.772-22.437-12.488-30.156l-90.542-90.521c-7.714-7.728-18.379-12.51-30.16-12.51-4.832 0-9.476 0.804-13.806 2.286l0.3-0.089-90.5 30.188c-6.533 2.215-12.114 5.749-16.666 10.312l-0.001 0.001-271.459 271.479c-7.724 7.718-12.501 18.384-12.501 30.165 0 11.78 4.776 22.445 12.498 30.163l0 0-60.414 60.401c-7.723 7.719-12.5 18.385-12.5 30.167s4.777 22.448 12.5 30.166l90.542 90.5c7.719 7.723 18.385 12.5 30.167 12.5s22.447-4.777 30.166-12.5l60.333-60.334 0.085 0.085c7.719 7.723 18.385 12.5 30.167 12.5s22.448-4.777 30.166-12.5l183.87-183.982c40.81 44.913 65.795 104.844 65.795 170.611 0 0.123-0 0.245-0 0.368l0-0.019c-0.574 101.759-59.959 189.511-145.866 231.045l-1.54 0.672c-22.667-36.849-62.772-61.050-108.53-61.050-46.856 0-87.784 25.375-109.793 63.134l-0.325 0.604c-18.426-7.182-34.145-15.133-48.972-24.381l1.228 0.714c17.319-5.438 29.685-21.295 29.799-40.057l0-0.013c0-0.003 0-0.007 0-0.011 0-23.558-19.098-42.656-42.656-42.656-0.004 0-0.008 0-0.012 0l-170.666-0c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h56.807c42.143 47.16 95.503 83.426 155.931 104.691l2.634 0.808c1.409 8.551 3.434 16.12 6.108 23.377l-0.282-0.874h-221.198c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h682.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM367.417 537.667l-30.208-30.165 30.208-30.188 30.165 30.188zM722.292 243.125l-234.125 234.272-90.542-90.624 234.167-234.188 55.958-18.667 53.208 53.229zM512 896.229c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667c23.564 0 42.667 19.103 42.667 42.667v0c-0.024 23.554-19.112 42.642-42.664 42.667l-0.002 0z"],"attrs":[],"grid":0,"tags":["microscope"]},"attrs":[],"properties":{"order":5248,"id":436,"name":"microscope","prevSize":32,"code":60417},"setIdx":0,"setId":0,"iconIdx":769},{"icon":{"paths":["M512 640c94.257 0 170.667-76.41 170.667-170.667v0-256c0-94.257-76.41-170.667-170.667-170.667s-170.667 76.41-170.667 170.667v0 256c0 94.257 76.41 170.667 170.667 170.667v0zM426.667 213.333c0-47.128 38.205-85.333 85.333-85.333s85.333 38.205 85.333 85.333v0 256c0 47.128-38.205 85.333-85.333 85.333s-85.333-38.205-85.333-85.333v0zM853.333 469.333c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0c0 141.385-114.615 256-256 256s-256-114.615-256-256v0c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0c0.162 173.343 129.512 316.425 296.952 338.165l1.714 0.182v88.32h-85.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h256c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-85.333v-88.32c169.154-21.922 298.504-165.004 298.667-338.329l0-0.017z"],"attrs":[],"grid":0,"tags":["microphone"]},"attrs":[],"properties":{"order":5249,"id":435,"name":"microphone","prevSize":32,"code":60418},"setIdx":0,"setId":0,"iconIdx":770},{"icon":{"paths":["M85.333 938.667h405.333v-405.333h-405.333v405.333zM85.333 490.667h405.333v-405.333h-405.333v405.333zM533.333 85.333v405.333h405.333v-405.333h-405.333zM533.333 938.667h405.333v-405.333h-405.333v405.333z"],"attrs":[],"grid":0,"tags":["microsoft"]},"attrs":[],"properties":{"order":5250,"id":434,"name":"microsoft","prevSize":32,"code":60419},"setIdx":0,"setId":0,"iconIdx":771},{"icon":{"paths":["M349.013 170.667h89.6c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-89.6c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM128 481.28c23.564 0 42.667-19.103 42.667-42.667v0-89.6c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 89.6c0 23.564 19.103 42.667 42.667 42.667v0zM616.96 170.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667c0-23.564-19.103-42.667-42.667-42.667v0h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM896 321.707h-193.707c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0h-252.587c-23.564-0-42.667 19.103-42.667 42.667v0 252.587c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0 193.707c0 23.564 19.103 42.667 42.667 42.667v0h531.627c23.564 0 42.667-19.103 42.667-42.667v0-531.627c0-23.564-19.103-42.667-42.667-42.667v0zM853.333 853.333h-446.293v-446.293h446.293zM170.667 85.333h-42.667c-23.564 0-42.667 19.103-42.667 42.667v0 42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM170.667 616.96c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 42.667c0 23.564 19.103 42.667 42.667 42.667v0h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["minus-path"]},"attrs":[],"properties":{"order":5251,"id":433,"name":"minus-path","prevSize":32,"code":60420},"setIdx":0,"setId":0,"iconIdx":772},{"icon":{"paths":["M384 554.667h256c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-256c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM896 85.333h-768c-23.564 0-42.667 19.103-42.667 42.667v0 768c0 23.564 19.103 42.667 42.667 42.667v0h768c23.564 0 42.667-19.103 42.667-42.667v0-768c0-23.564-19.103-42.667-42.667-42.667v0zM853.333 853.333h-682.667v-682.667h682.667z"],"attrs":[],"grid":0,"tags":["minus-square-full"]},"attrs":[],"properties":{"order":5252,"id":432,"name":"minus-square-full","prevSize":32,"code":60421},"setIdx":0,"setId":0,"iconIdx":773},{"icon":{"paths":["M512 85.333c-235.641 0-426.667 191.025-426.667 426.667s191.025 426.667 426.667 426.667c235.641 0 426.667-191.025 426.667-426.667v0c0-235.641-191.025-426.667-426.667-426.667v0zM512 853.333c-188.513 0-341.333-152.82-341.333-341.333s152.82-341.333 341.333-341.333c188.513 0 341.333 152.82 341.333 341.333v0c0 188.513-152.82 341.333-341.333 341.333v0zM682.667 469.333h-341.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h341.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["minus-circle"]},"attrs":[],"properties":{"order":5253,"id":431,"name":"minus-circle","prevSize":32,"code":60422},"setIdx":0,"setId":0,"iconIdx":774},{"icon":{"paths":["M810.667 469.333h-597.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h597.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["minus"]},"attrs":[],"properties":{"order":5254,"id":430,"name":"minus","prevSize":32,"code":60423},"setIdx":0,"setId":0,"iconIdx":775},{"icon":{"paths":["M256 319.573c23.564 0 42.667-19.103 42.667-42.667v0-25.173l122.88 122.88c23.158 23.13 55.135 37.434 90.453 37.434s67.296-14.304 90.455-37.435l-0.001 0.001 195.84-195.84c7.668-7.712 12.407-18.343 12.407-30.080s-4.74-22.368-12.409-30.082l0.002 0.002c-7.733-7.795-18.45-12.621-30.293-12.621s-22.56 4.826-30.291 12.618l-0.003 0.003-195.413 195.413c-7.733 7.795-18.45 12.621-30.293 12.621s-22.56-4.826-30.291-12.618l-0.003-0.003-122.88-122.453h25.173c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-128c-17.54 0.015-32.602 10.611-39.147 25.75l-0.106 0.277c-2.054 4.914-3.297 10.616-3.413 16.595l-0.001 0.045v128c0 23.564 19.103 42.667 42.667 42.667v0zM936.107 633.6c-115.983-90.203-263.69-144.615-424.107-144.615s-308.125 54.412-425.674 145.788l1.568-1.172c-25.138 20.385-41.421 50.84-42.661 85.131l-0.006 0.203c-0.169 2.323-0.266 5.033-0.266 7.765 0 31.491 12.826 59.987 33.539 80.548l0.007 0.007 75.093 76.8c20.691 20.684 49.272 33.477 80.841 33.477 25.076 0 48.267-8.072 67.116-21.759l-0.33 0.228 20.053-13.653c12.020-7.904 26.008-15.727 40.549-22.571l2.118-0.896c27.942-12.563 47.046-40.153 47.046-72.206 0-9.288-1.604-18.202-4.551-26.479l0.171 0.552-3.84-10.24c33.421-8.94 71.791-14.075 111.36-14.075s77.939 5.135 114.48 14.775l-3.12-0.7-3.84 10.24c-2.775 7.725-4.38 16.639-4.38 25.927 0 32.053 19.105 59.643 46.548 72.005l0.498 0.201c16.659 7.74 30.647 15.563 43.997 24.282l-1.331-0.815 20.053 13.653c17.992 13.328 40.626 21.335 65.13 21.335 0.203 0 0.405-0.001 0.608-0.002l-0.031 0c0.043 0 0.093 0 0.143 0 31.906 0 60.804-12.875 81.783-33.713l-0.006 0.006 77.227-77.653c18.583-20.146 29.979-47.168 29.979-76.851 0-3.889-0.196-7.732-0.577-11.52l0.039 0.477c-2.169-34.544-19.31-64.69-44.949-84.276l-0.278-0.204zM887.467 746.24l-76.8 77.227c-5.288 5.503-12.71 8.922-20.931 8.922-5.859 0-11.312-1.737-15.873-4.723l0.111 0.068c-8.107-5.973-16.213-11.52-25.173-17.067-12.708-8.218-27.933-16.875-43.633-24.725l-2.874-1.301 17.067-46.507c1.608-4.313 2.538-9.296 2.538-14.496 0-18.352-11.586-33.997-27.843-40.021l-0.295-0.096c-53.931-20.262-116.262-31.991-181.333-31.991s-127.402 11.728-184.995 33.186l3.662-1.195c-16.552 6.12-28.138 21.765-28.138 40.117 0 5.2 0.93 10.184 2.634 14.792l-0.096-0.296 17.067 46.933c-18.476 8.637-33.86 17.17-48.612 26.604l1.678-1.004-24.747 17.067c-4.554 3.301-10.254 5.28-16.416 5.28-8.402 0-15.945-3.68-21.105-9.516l-0.026-0.030-76.8-77.227c-5.272-5.189-8.538-12.402-8.538-20.378 0-0.186 0.002-0.371 0.005-0.557l-0 0.028c0.762-9.166 5.232-17.159 11.887-22.566l0.060-0.047c101.787-79.018 231.355-126.676 372.053-126.676s270.266 47.658 373.44 127.711l-1.387-1.035c6.715 5.454 11.184 13.447 11.939 22.495l0.008 0.118c0.003 0.157 0.005 0.343 0.005 0.529 0 7.976-3.266 15.189-8.535 20.374l-0.004 0.004z"],"attrs":[],"grid":0,"tags":["missed-call"]},"attrs":[],"properties":{"order":5255,"id":429,"name":"missed-call","prevSize":32,"code":60424},"setIdx":0,"setId":0,"iconIdx":776},{"icon":{"paths":["M682.667 85.333h-341.333c-70.692 0-128 57.308-128 128v0 597.333c0 70.692 57.308 128 128 128v0h341.333c70.692 0 128-57.308 128-128v0-597.333c0-70.692-57.308-128-128-128v0zM725.333 810.667c0 23.564-19.103 42.667-42.667 42.667v0h-341.333c-23.564 0-42.667-19.103-42.667-42.667v0-42.667h426.667zM725.333 682.667h-426.667v-469.333c0-23.564 19.103-42.667 42.667-42.667v0h341.333c23.564 0 42.667 19.103 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["mobile-android-alt"]},"attrs":[],"properties":{"order":5256,"id":428,"name":"mobile-android-alt","prevSize":32,"code":60425},"setIdx":0,"setId":0,"iconIdx":777},{"icon":{"paths":["M542.293 695.040l-6.4-5.12c-2.211-1.521-4.75-2.82-7.453-3.77l-0.227-0.070-7.68-3.413c-2.625-0.574-5.639-0.903-8.731-0.903-11.745 0-22.382 4.746-30.097 12.425l0.002-0.002c-3.646 4.001-6.662 8.658-8.838 13.76l-0.122 0.32c-2.064 4.835-3.264 10.46-3.264 16.366 0 23.564 19.103 42.667 42.667 42.667 5.791 0 11.312-1.154 16.346-3.243l-0.283 0.104c5.376-2.639 10.006-5.769 14.144-9.443l-0.064 0.056c7.601-7.7 12.296-18.286 12.296-29.968 0-5.971-1.227-11.656-3.442-16.817l0.106 0.278c-2.246-5.134-5.264-9.519-8.961-13.228l0.001 0.001zM682.667 85.333h-341.333c-70.692 0-128 57.308-128 128v0 597.333c0 70.692 57.308 128 128 128v0h341.333c70.692 0 128-57.308 128-128v0-597.333c0-70.692-57.308-128-128-128v0zM725.333 810.667c0 23.564-19.103 42.667-42.667 42.667v0h-341.333c-23.564 0-42.667-19.103-42.667-42.667v0-597.333c0-23.564 19.103-42.667 42.667-42.667v0h341.333c23.564 0 42.667 19.103 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["mobile-android"]},"attrs":[],"properties":{"order":5257,"id":427,"name":"mobile-android","prevSize":32,"code":60426},"setIdx":0,"setId":0,"iconIdx":778},{"icon":{"paths":["M421.547 602.453l-6.4-5.12-7.68-4.267-7.68-2.133c-2.518-0.528-5.413-0.83-8.377-0.83-11.709 0-22.317 4.717-30.026 12.354l0.003-0.003c-4.128 3.79-7.339 8.511-9.307 13.835l-0.079 0.245c-2.163 4.771-3.423 10.345-3.423 16.213s1.26 11.443 3.525 16.466l-0.102-0.253c4.679 10.291 12.749 18.361 22.754 22.923l0.286 0.117c4.778 2.092 10.34 3.34 16.186 3.413l0.027 0c6.024-0.116 11.726-1.359 16.948-3.527l-0.308 0.113c5.379-2.166 9.939-5.356 13.63-9.361l0.023-0.026c3.896-3.804 7.062-8.336 9.279-13.38l0.107-0.274c1.892-4.648 2.99-10.041 2.99-15.691 0-0.184-0.001-0.367-0.003-0.551l0 0.028c0.008-0.275 0.012-0.599 0.012-0.923 0-5.554-1.263-10.813-3.518-15.505l0.093 0.215c-2.069-5.492-5.116-10.185-8.964-14.084l0.004 0.004zM149.76 373.76c11.868-0.051 22.584-4.939 30.287-12.793l0.007-0.007 180.907-180.907c7.668-7.712 12.407-18.343 12.407-30.080s-4.74-22.368-12.409-30.082l0.002 0.002c-7.712-7.668-18.343-12.407-30.080-12.407s-22.368 4.74-30.082 12.409l0.002-0.002-180.907 180.907c-7.668 7.712-12.407 18.343-12.407 30.080s4.74 22.368 12.409 30.082l-0.002-0.002c7.612 7.763 18.155 12.628 29.835 12.8l0.032 0zM904.107 663.040c-7.712-7.668-18.343-12.407-30.080-12.407s-22.368 4.74-30.082 12.409l0.002-0.002-180.907 180.907c-7.795 7.733-12.621 18.45-12.621 30.294 0 23.501 19.001 42.565 42.478 42.666l0.010 0c11.868-0.051 22.584-4.939 30.287-12.793l0.007-0.007 180.907-178.773c8.322-7.806 13.506-18.871 13.506-31.147s-5.184-23.341-13.483-31.125l-0.023-0.021zM911.36 421.547c0-0.094 0-0.204 0-0.315 0-35.162-14.178-67.012-37.129-90.147l0.008 0.008-181.333-181.333c-23.51-22.342-55.377-36.084-90.453-36.084s-66.943 13.743-90.51 36.137l0.056-0.053-362.24 362.24c-23.13 23.158-37.434 55.135-37.434 90.453s14.304 67.296 37.435 90.455l-0.001-0.001 181.333 181.333c23.158 23.13 55.135 37.434 90.453 37.434s67.296-14.304 90.455-37.435l-0.001 0.001 362.24-362.24c22.943-23.126 37.12-54.976 37.12-90.138 0-0.111-0-0.222-0-0.332l0 0.017zM813.653 451.84l-361.813 361.813c-7.733 7.795-18.45 12.621-30.293 12.621s-22.56-4.826-30.291-12.618l-0.003-0.003-180.907-180.907c-7.795-7.733-12.621-18.45-12.621-30.293s4.826-22.56 12.618-30.291l0.003-0.003 361.813-361.813c7.733-7.795 18.45-12.621 30.293-12.621s22.56 4.826 30.291 12.618l0.003 0.003 180.907 180.907c7.795 7.733 12.621 18.45 12.621 30.293s-4.826 22.56-12.618 30.291l-0.003 0.003z"],"attrs":[],"grid":0,"tags":["mobile-vibrate"]},"attrs":[],"properties":{"order":5258,"id":426,"name":"mobile-vibrate","prevSize":32,"code":60427},"setIdx":0,"setId":0,"iconIdx":779},{"icon":{"paths":["M916.48 560.213c-0.277-3.142-1.035-6.037-2.203-8.712l0.070 0.179c-0.977-2.782-2.129-5.177-3.508-7.418l0.094 0.165c-1.265-2.602-2.686-4.842-4.324-6.902l0.058 0.075-6.827-5.547-3.84-3.84-628.053-362.667c-6.123-3.58-13.481-5.694-21.333-5.694-23.645 0-42.814 19.168-42.814 42.814 0 15.793 8.552 29.589 21.277 37.010l0.203 0.11 490.24 282.88h-566.187c-23.564 0-42.667 19.103-42.667 42.667v0 170.667c0 70.692 57.308 128 128 128v0h554.667c70.692 0 128-57.308 128-128v0-170.667s-0.853-3.413-0.853-5.12zM831.147 736c0 23.564-19.103 42.667-42.667 42.667v0h-553.813c-23.564 0-42.667-19.103-42.667-42.667v0-128h640zM703.147 736c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667c-23.564 0-42.667 19.103-42.667 42.667v0c-0 0.003-0 0.006-0 0.009 0 23.564 19.103 42.667 42.667 42.667 0.3 0 0.599-0.003 0.898-0.009l-0.045 0.001z"],"attrs":[],"grid":0,"tags":["modem"]},"attrs":[],"properties":{"order":5259,"id":425,"name":"modem","prevSize":32,"code":60428},"setIdx":0,"setId":0,"iconIdx":780},{"icon":{"paths":["M810.667 85.333h-597.333c-70.692 0-128 57.308-128 128v0 597.333c0 70.692 57.308 128 128 128v0h597.333c70.692 0 128-57.308 128-128v0-597.333c0-70.692-57.308-128-128-128v0zM853.333 810.667c0 23.564-19.103 42.667-42.667 42.667v0h-597.333c-23.564 0-42.667-19.103-42.667-42.667v0-597.333c0-23.564 19.103-42.667 42.667-42.667v0h597.333c23.564 0 42.667 19.103 42.667 42.667v0zM682.667 469.333h-341.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h341.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["minus-square"]},"attrs":[],"properties":{"order":5260,"id":424,"name":"minus-square","prevSize":32,"code":60429},"setIdx":0,"setId":0,"iconIdx":781},{"icon":{"paths":["M256 469.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM506.027 403.2v0l-305.067-305.493c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l-0-0 55.467 55.040h-25.173c-70.692 0-128 57.308-128 128v0 341.333c0 70.692 57.308 128 128 128v0h622.507l115.2 115.627c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003zM474.453 492.373l57.173 57.173c-5.675 3.124-12.419 5.007-19.592 5.12l-0.034 0c-23.564 0-42.667-19.103-42.667-42.667v0c0.113-7.208 1.996-13.952 5.231-19.848l-0.111 0.222zM170.667 725.333c-23.564 0-42.667-19.103-42.667-42.667v0-341.333c0-23.564 19.103-42.667 42.667-42.667v0h110.507l132.267 132.267c-18.194 21.834-29.289 50.14-29.44 81.034l-0 0.033c0 70.692 57.308 128 128 128v0c30.926-0.151 59.233-11.246 81.273-29.607l-0.206 0.167 114.773 114.773zM853.333 213.333h-313.173c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h313.173c23.564 0 42.667 19.103 42.667 42.667v0 313.173c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-313.173c0-70.692-57.308-128-128-128v0zM810.667 512c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667c0 23.564 19.103 42.667 42.667 42.667v0c23.564 0 42.667-19.103 42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["money-bill-slash"]},"attrs":[],"properties":{"order":5261,"id":423,"name":"money-bill-slash","prevSize":32,"code":60430},"setIdx":0,"setId":0,"iconIdx":782},{"icon":{"paths":["M853.333 42.667h-682.667c-70.692 0-128 57.308-128 128v0 682.667c0 70.692 57.308 128 128 128v0h682.667c70.692 0 128-57.308 128-128v0-682.667c0-70.692-57.308-128-128-128v0zM341.333 896h-170.667c-23.564 0-42.667-19.103-42.667-42.667v0-50.347c12.677 4.75 27.325 7.555 42.612 7.68l0.055 0h170.667zM341.333 725.333h-170.667c-23.564 0-42.667-19.103-42.667-42.667v0-50.347c12.677 4.75 27.325 7.555 42.612 7.68l0.055 0h170.667zM341.333 554.667h-170.667c-23.564 0-42.667-19.103-42.667-42.667v0-341.333c0-23.564 19.103-42.667 42.667-42.667v0h170.667zM597.333 896h-170.667v-256h170.667zM597.333 554.667h-170.667v-426.667h170.667zM896 853.333c0 23.564-19.103 42.667-42.667 42.667v0h-170.667v-85.333h170.667c15.341-0.125 29.989-2.93 43.552-7.968l-0.885 0.288zM896 682.667c0 23.564-19.103 42.667-42.667 42.667v0h-170.667v-85.333h170.667c15.341-0.125 29.989-2.93 43.552-7.968l-0.885 0.288zM896 512c0 23.564-19.103 42.667-42.667 42.667v0h-170.667v-426.667h170.667c23.564 0 42.667 19.103 42.667 42.667v0zM768 298.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM256 384c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667c-23.564 0-42.667 19.103-42.667 42.667v0c0 23.564 19.103 42.667 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["money-bill-stack"]},"attrs":[],"properties":{"order":5262,"id":422,"name":"money-bill-stack","prevSize":32,"code":60431},"setIdx":0,"setId":0,"iconIdx":783},{"icon":{"paths":["M256 469.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM768 469.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM853.333 213.333h-682.667c-70.692 0-128 57.308-128 128v0 341.333c0 70.692 57.308 128 128 128v0h682.667c70.692 0 128-57.308 128-128v0-341.333c0-70.692-57.308-128-128-128v0zM896 682.667c0 23.564-19.103 42.667-42.667 42.667v0h-682.667c-23.564 0-42.667-19.103-42.667-42.667v0-341.333c0-23.564 19.103-42.667 42.667-42.667v0h682.667c23.564 0 42.667 19.103 42.667 42.667v0zM512 384c-70.692 0-128 57.308-128 128s57.308 128 128 128c70.692 0 128-57.308 128-128v0c0-70.692-57.308-128-128-128v0zM512 554.667c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667c23.564 0 42.667 19.103 42.667 42.667v0c0 23.564-19.103 42.667-42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["money-bill"]},"attrs":[],"properties":{"order":5263,"id":421,"name":"money-bill","prevSize":32,"code":60432},"setIdx":0,"setId":0,"iconIdx":784},{"icon":{"paths":["M896 85.333h-256c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h213.333v213.333c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-256c0-23.564-19.103-42.667-42.667-42.667v0zM896 597.333c-23.564 0-42.667 19.103-42.667 42.667v0 213.333h-213.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h256c23.564 0 42.667-19.103 42.667-42.667v0-256c0-23.564-19.103-42.667-42.667-42.667v0zM512 256c-70.692 0-128 57.308-128 128v0 42.667c-47.128 0-85.333 38.205-85.333 85.333v0 170.667c0 47.128 38.205 85.333 85.333 85.333v0h256c47.128 0 85.333-38.205 85.333-85.333v0-170.667c0-47.128-38.205-85.333-85.333-85.333v0-42.667c0-70.692-57.308-128-128-128v0zM469.333 384c0-23.564 19.103-42.667 42.667-42.667s42.667 19.103 42.667 42.667v0 42.667h-85.333zM640 682.667h-256v-170.667h256zM128 426.667c23.564 0 42.667-19.103 42.667-42.667v0-213.333h213.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-256c-23.564 0-42.667 19.103-42.667 42.667v0 256c0 23.564 19.103 42.667 42.667 42.667v0zM384 853.333h-213.333v-213.333c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 256c0 23.564 19.103 42.667 42.667 42.667v0h256c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["lock-access"]},"attrs":[],"properties":{"order":5264,"id":420,"name":"lock-access","prevSize":32,"code":60433},"setIdx":0,"setId":0,"iconIdx":785},{"icon":{"paths":["M446.293 256l23.040-25.173v153.173c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-153.173l23.040 23.467c7.854 8.84 19.252 14.383 31.945 14.383 11.871 0 22.61-4.848 30.344-12.672l0.004-0.004c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003-97.707-97.707c-3.937-3.773-8.616-6.808-13.791-8.859l-0.289-0.101c-4.793-2.024-10.366-3.201-16.213-3.201s-11.42 1.176-16.495 3.305l0.281-0.105c-5.464 2.152-10.143 5.187-14.095 8.974l0.015-0.014-97.707 96c-7.971 7.971-12.901 18.983-12.901 31.147 0 24.327 19.721 44.048 44.048 44.048 12.164 0 23.176-4.93 31.147-12.901v0zM512 512c-70.692 0-128 57.308-128 128s57.308 128 128 128c70.692 0 128-57.308 128-128v0c0-70.692-57.308-128-128-128v0zM512 682.667c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667c23.564 0 42.667 19.103 42.667 42.667v0c0 23.564-19.103 42.667-42.667 42.667v0zM213.333 640c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667c0-23.564-19.103-42.667-42.667-42.667v0c-23.564 0-42.667 19.103-42.667 42.667v0zM810.667 640c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667c0 23.564 19.103 42.667 42.667 42.667v0c23.564 0 42.667-19.103 42.667-42.667v0zM853.333 341.333h-170.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h170.667c23.564 0 42.667 19.103 42.667 42.667v0 341.333c0 23.564-19.103 42.667-42.667 42.667v0h-682.667c-23.564 0-42.667-19.103-42.667-42.667v0-341.333c0-23.564 19.103-42.667 42.667-42.667v0h170.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-170.667c-70.692 0-128 57.308-128 128v0 341.333c0 70.692 57.308 128 128 128v0h682.667c70.692 0 128-57.308 128-128v0-341.333c0-70.692-57.308-128-128-128v0z"],"attrs":[],"grid":0,"tags":["money-insert"]},"attrs":[],"properties":{"order":5265,"id":419,"name":"money-insert","prevSize":32,"code":60434},"setIdx":0,"setId":0,"iconIdx":786},{"icon":{"paths":["M938.667 725.333h-853.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h853.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM938.667 896h-853.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h853.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM256 298.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM853.333 42.667h-682.667c-70.692 0-128 57.308-128 128v0 341.333c0 70.692 57.308 128 128 128v0h682.667c70.692 0 128-57.308 128-128v0-341.333c0-70.692-57.308-128-128-128v0zM896 512c0 23.564-19.103 42.667-42.667 42.667v0h-682.667c-23.564 0-42.667-19.103-42.667-42.667v0-341.333c0-23.564 19.103-42.667 42.667-42.667v0h682.667c23.564 0 42.667 19.103 42.667 42.667v0zM512 213.333c-70.692 0-128 57.308-128 128s57.308 128 128 128c70.692 0 128-57.308 128-128v0c0-70.692-57.308-128-128-128v0zM512 384c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667c23.564 0 42.667 19.103 42.667 42.667v0c0 23.564-19.103 42.667-42.667 42.667v0zM768 298.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["money-stack"]},"attrs":[],"properties":{"order":5266,"id":418,"name":"money-stack","prevSize":32,"code":60435},"setIdx":0,"setId":0,"iconIdx":787},{"icon":{"paths":["M512 512c-70.692 0-128 57.308-128 128s57.308 128 128 128c70.692 0 128-57.308 128-128v0c0-70.692-57.308-128-128-128v0zM512 682.667c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667c23.564 0 42.667 19.103 42.667 42.667v0c0 23.564-19.103 42.667-42.667 42.667v0zM481.707 414.293c3.937 3.773 8.616 6.808 13.791 8.859l0.289 0.101c4.771 2.163 10.345 3.423 16.213 3.423s11.443-1.26 16.466-3.525l-0.253 0.102c5.464-2.152 10.143-5.187 14.095-8.974l-0.015 0.014 97.707-96c7.971-7.971 12.901-18.983 12.901-31.147 0-24.327-19.721-44.048-44.048-44.048-12.164 0-23.176 4.93-31.147 12.901v0l-23.040 25.173v-153.173c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 153.173l-23.040-25.173c-7.971-7.971-18.983-12.901-31.147-12.901-24.327 0-44.048 19.721-44.048 44.048 0 12.164 4.93 23.176 12.901 31.147v-0zM810.667 640c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667c0 23.564 19.103 42.667 42.667 42.667v0c23.564 0 42.667-19.103 42.667-42.667v0zM853.333 341.333h-128c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h128c23.564 0 42.667 19.103 42.667 42.667v0 341.333c0 23.564-19.103 42.667-42.667 42.667v0h-682.667c-23.564 0-42.667-19.103-42.667-42.667v0-341.333c0-23.564 19.103-42.667 42.667-42.667v0h128c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-128c-70.692 0-128 57.308-128 128v0 341.333c0 70.692 57.308 128 128 128v0h682.667c70.692 0 128-57.308 128-128v0-341.333c0-70.692-57.308-128-128-128v0zM213.333 640c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667c0-23.564-19.103-42.667-42.667-42.667v0c-23.564 0-42.667 19.103-42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["money-withdraw"]},"attrs":[],"properties":{"order":5267,"id":417,"name":"money-withdraw","prevSize":32,"code":60436},"setIdx":0,"setId":0,"iconIdx":788},{"icon":{"paths":["M938.667 85.333h-853.333c-23.564 0-42.667 19.103-42.667 42.667v0 341.333c0 23.564 19.103 42.667 42.667 42.667v0h128v384c0 23.564 19.103 42.667 42.667 42.667v0h512c23.564 0 42.667-19.103 42.667-42.667v0-384h128c23.564 0 42.667-19.103 42.667-42.667v0-341.333c0-23.564-19.103-42.667-42.667-42.667v0zM298.667 853.333v-85.333c47.128 0 85.333 38.205 85.333 85.333v0zM725.333 853.333h-85.333c0-47.128 38.205-85.333 85.333-85.333v0zM725.333 682.667c-94.257 0-170.667 76.41-170.667 170.667v0h-85.333c0-94.257-76.41-170.667-170.667-170.667v0-341.333h426.667zM896 426.667h-85.333v-128c0-23.564-19.103-42.667-42.667-42.667v0h-512c-23.564 0-42.667 19.103-42.667 42.667v0 128h-85.333v-256h768zM512 640c70.692 0 128-57.308 128-128s-57.308-128-128-128c-70.692 0-128 57.308-128 128v0c0 70.692 57.308 128 128 128v0zM512 469.333c23.564 0 42.667 19.103 42.667 42.667s-19.103 42.667-42.667 42.667c-23.564 0-42.667-19.103-42.667-42.667v0c0-23.564 19.103-42.667 42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["money-withdrawal"]},"attrs":[],"properties":{"order":5268,"id":416,"name":"money-withdrawal","prevSize":32,"code":60437},"setIdx":0,"setId":0,"iconIdx":789},{"icon":{"paths":["M810.667 298.667h-128v-42.667c0-70.692-57.308-128-128-128v0h-85.333c-70.692 0-128 57.308-128 128v0 42.667h-128c-70.692 0-128 57.308-128 128v0 341.333c0 70.692 57.308 128 128 128v0h597.333c70.692 0 128-57.308 128-128v0-341.333c0-70.692-57.308-128-128-128v0zM426.667 256c0-23.564 19.103-42.667 42.667-42.667v0h85.333c23.564 0 42.667 19.103 42.667 42.667v0 42.667h-170.667zM170.667 426.667c0-23.564 19.103-42.667 42.667-42.667v0h42.667c0 47.128-38.205 85.333-85.333 85.333v0zM213.333 810.667c-23.564 0-42.667-19.103-42.667-42.667v0-42.667c47.128 0 85.333 38.205 85.333 85.333v0zM853.333 768c0 23.564-19.103 42.667-42.667 42.667v0h-42.667c0-47.128 38.205-85.333 85.333-85.333v0zM853.333 640c-94.257 0-170.667 76.41-170.667 170.667v0h-341.333c0-94.257-76.41-170.667-170.667-170.667v0-85.333c94.257 0 170.667-76.41 170.667-170.667v0h341.333c0 94.257 76.41 170.667 170.667 170.667v0zM853.333 469.333c-47.128 0-85.333-38.205-85.333-85.333v0h42.667c23.564 0 42.667 19.103 42.667 42.667v0zM512 469.333c-70.692 0-128 57.308-128 128s57.308 128 128 128c70.692 0 128-57.308 128-128v0c0-70.692-57.308-128-128-128v0zM512 640c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667c23.564 0 42.667 19.103 42.667 42.667v0c0 23.564-19.103 42.667-42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["moneybag-alt"]},"attrs":[],"properties":{"order":5269,"id":415,"name":"moneybag-alt","prevSize":32,"code":60438},"setIdx":0,"setId":0,"iconIdx":790},{"icon":{"paths":["M512 469.333c-70.692 0-128 57.308-128 128s57.308 128 128 128c70.692 0 128-57.308 128-128v0c0-70.692-57.308-128-128-128v0zM512 640c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667c23.564 0 42.667 19.103 42.667 42.667v0c0 23.564-19.103 42.667-42.667 42.667v0zM810.667 256h-128v-42.667c0-70.692-57.308-128-128-128v0h-85.333c-70.692 0-128 57.308-128 128v0 42.667h-128c-70.692 0-128 57.308-128 128v0 426.667c0 70.692 57.308 128 128 128v0h597.333c70.692 0 128-57.308 128-128v0-426.667c0-70.692-57.308-128-128-128v0zM426.667 213.333c0-23.564 19.103-42.667 42.667-42.667v0h85.333c23.564 0 42.667 19.103 42.667 42.667v0 42.667h-170.667zM170.667 384c0-23.564 19.103-42.667 42.667-42.667v0h42.667c0 47.128-38.205 85.333-85.333 85.333v0zM213.333 853.333c-23.564 0-42.667-19.103-42.667-42.667v0-42.667c47.128 0 85.333 38.205 85.333 85.333v0zM853.333 810.667c0 23.564-19.103 42.667-42.667 42.667v0h-42.667c0-47.128 38.205-85.333 85.333-85.333v0zM853.333 682.667c-94.257 0-170.667 76.41-170.667 170.667v0h-341.333c0-94.257-76.41-170.667-170.667-170.667v0-170.667c94.257 0 170.667-76.41 170.667-170.667v0h341.333c0 94.257 76.41 170.667 170.667 170.667v0zM853.333 426.667c-47.128 0-85.333-38.205-85.333-85.333v0h42.667c23.564 0 42.667 19.103 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["moneybag"]},"attrs":[],"properties":{"order":5270,"id":414,"name":"moneybag","prevSize":32,"code":60439},"setIdx":0,"setId":0,"iconIdx":791},{"icon":{"paths":["M384 810.667c5.873-0.073 11.435-1.322 16.489-3.52l-0.275 0.107c5.422-2.298 10.079-5.314 14.119-8.995l-0.039 0.035c1.861-2.018 3.552-4.252 5.014-6.64l0.106-0.187c1.617-2.068 2.923-4.477 3.791-7.085l0.049-0.169c1.445-2.207 2.612-4.762 3.368-7.488l0.045-0.192c0.1-1.277 0.157-2.765 0.157-4.267s-0.057-2.99-0.169-4.463l0.012 0.196c-0.073-5.873-1.322-11.435-3.52-16.489l0.107 0.275c-3.967-10.747-12.293-19.073-22.774-22.954l-0.266-0.086c-5.263-2.499-11.435-3.959-17.948-3.959-2.401 0-4.755 0.198-7.048 0.579l0.249-0.034-7.68 2.56c-2.777 0.917-5.185 2.223-7.306 3.88l0.053-0.040c-2.575 1.568-4.808 3.259-6.856 5.147l0.029-0.027c-3.773 3.937-6.808 8.616-8.859 13.791l-0.101 0.289c-2.159 4.933-3.415 10.683-3.415 16.725 0 0.12 0 0.24 0.001 0.36l-0-0.018c0 23.564 19.103 42.667 42.667 42.667v0zM225.707 798.293c4.001 3.646 8.658 6.662 13.76 8.838l0.32 0.122c4.778 2.092 10.34 3.34 16.186 3.413l0.027 0h8.107c3.025-0.433 5.757-1.331 8.249-2.627l-0.142 0.067c2.93-1.020 5.469-2.319 7.79-3.912l-0.11 0.072 6.4-5.12c3.646-4.001 6.662-8.658 8.838-13.76l0.122-0.32c2.18-4.493 3.454-9.774 3.454-15.352 0-0.603-0.015-1.203-0.044-1.799l0.003 0.084c0.1-1.277 0.157-2.765 0.157-4.267s-0.057-2.99-0.169-4.463l0.012 0.196c-0.513-2.882-1.403-5.459-2.632-7.832l0.072 0.152c-0.917-2.777-2.223-5.185-3.88-7.306l0.040 0.053c-1.568-2.575-3.259-4.808-5.147-6.856l0.027 0.029c-7.7-7.601-18.286-12.296-29.968-12.296-5.971 0-11.656 1.227-16.817 3.442l0.278-0.106c-5.464 2.152-10.143 5.187-14.095 8.974l0.015-0.014c-1.861 2.018-3.552 4.252-5.014 6.64l-0.106 0.187c-1.617 2.068-2.923 4.477-3.791 7.085l-0.049 0.169c-1.749 2.197-3.192 4.74-4.206 7.491l-0.061 0.189c-0.1 1.277-0.157 2.765-0.157 4.267s0.057 2.99 0.169 4.463l-0.012-0.196c0.073 5.873 1.322 11.435 3.52 16.489l-0.107-0.275c2.298 5.422 5.314 10.079 8.995 14.119l-0.035-0.039zM810.667 85.333h-597.333c-70.692 0-128 57.308-128 128v0 597.333c0 70.692 57.308 128 128 128v0h597.333c70.692 0 128-57.308 128-128v0-597.333c0-70.692-57.308-128-128-128v0zM853.333 810.667c0 23.564-19.103 42.667-42.667 42.667v0h-597.333c-23.564 0-42.667-19.103-42.667-42.667v0-128h682.667zM853.333 597.333h-682.667v-170.667h170.667c0.073 0 0.16 0.001 0.247 0.001 11.721 0 22.338-4.726 30.049-12.377l-0.003 0.003 55.040-53.333 119.467 136.533c7.568 8.595 18.463 14.106 30.651 14.505l0.069 0.002c0.073 0 0.16 0.001 0.247 0.001 11.721 0 22.338-4.726 30.049-12.377l-0.003 0.003 71.68-72.96h174.507zM853.333 341.333h-192c-0.073-0-0.16-0.001-0.247-0.001-11.721 0-22.338 4.726-30.049 12.377l0.003-0.003-52.907 53.333-119.467-136.533c-7.806-8.322-18.871-13.506-31.147-13.506s-23.341 5.184-31.125 13.483l-0.021 0.023-72.533 70.827h-153.173v-128c0-23.564 19.103-42.667 42.667-42.667v0h597.333c23.564 0 42.667 19.103 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["monitor-heart-rate"]},"attrs":[],"properties":{"order":5271,"id":413,"name":"monitor-heart-rate","prevSize":32,"code":60440},"setIdx":0,"setId":0,"iconIdx":792},{"icon":{"paths":["M810.667 85.333h-597.333c-70.692 0-128 57.308-128 128v0 426.667c0 70.692 57.308 128 128 128v0h112.64l-24.747 42.667c-7.187 12.239-11.432 26.957-11.432 42.667s4.245 30.427 11.651 43.069l-0.218-0.403c15.029 25.689 42.483 42.67 73.903 42.67 0.269 0 0.537-0.001 0.805-0.004l-0.041 0h275.627c31.385-0.033 58.799-17.005 73.595-42.264l0.218-0.403c7.187-12.239 11.432-26.957 11.432-42.667s-4.245-30.427-11.651-43.069l0.218 0.403-25.173-42.667h110.507c70.692 0 128-57.308 128-128v0-426.667c0-70.692-57.308-128-128-128v0zM374.187 853.333l52.48-85.333h170.667l51.2 85.333zM853.333 640c0 23.564-19.103 42.667-42.667 42.667v0h-597.333c-23.564 0-42.667-19.103-42.667-42.667v0-42.667h682.667zM853.333 512h-682.667v-298.667c0-23.564 19.103-42.667 42.667-42.667v0h597.333c23.564 0 42.667 19.103 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["monitor"]},"attrs":[],"properties":{"order":5272,"id":412,"name":"monitor","prevSize":32,"code":60441},"setIdx":0,"setId":0,"iconIdx":793},{"icon":{"paths":["M512 85.333c-32.425 0.127-63.914 3.851-94.175 10.794l2.868-0.554h-5.12c-189.8 45.969-328.566 214.397-328.566 415.236 0 199.295 136.64 366.676 321.348 413.57l2.95 0.635h5.973c28.165 7.827 60.669 12.753 94.179 13.642l0.541 0.011c235.641 0 426.667-191.025 426.667-426.667s-191.025-426.667-426.667-426.667v0zM426.667 842.24c-147.895-39.595-255.020-172.407-255.020-330.24s107.125-290.645 252.634-329.695l2.386-0.545c147.895 39.595 255.020 172.407 255.020 330.24s-107.125 290.645-252.634 329.695l-2.386 0.545zM619.947 835.413c91.080-78.698 148.371-194.365 148.371-323.413s-57.292-244.715-147.828-322.954l-0.544-0.459c136.138 46.942 232.19 173.96 232.19 323.413s-96.052 276.472-229.792 322.692l-2.398 0.721z"],"attrs":[],"grid":0,"tags":["moon-eclipse"]},"attrs":[],"properties":{"order":5273,"id":411,"name":"moon-eclipse","prevSize":32,"code":60442},"setIdx":0,"setId":0,"iconIdx":794},{"icon":{"paths":["M923.307 554.667c-7.322-6.086-16.821-9.78-27.183-9.78-6.385 0-12.443 1.403-17.881 3.916l0.264-0.11c-41.949 19.669-91.094 31.148-142.92 31.148-0.305 0-0.609-0-0.913-0.001l0.047 0c-191.117-0.238-346.098-154.619-347.306-345.485l-0.001-0.115c0.212-30.39 4.089-59.775 11.211-87.867l-0.544 2.533c0.509-2.473 0.8-5.315 0.8-8.226 0-23.564-19.103-42.667-42.667-42.667-5.344 0-10.459 0.983-15.173 2.777l0.293-0.098c-151.712 69.435-255.214 219.923-255.214 394.585 0 238.94 193.7 432.64 432.64 432.64 201.945 0 371.574-138.361 419.26-325.458l0.647-2.994c0.897-3.267 1.413-7.018 1.413-10.889 0-13.781-6.534-26.036-16.672-33.837l-0.1-0.074zM517.973 840.107c-190.756-1.389-344.856-156.348-344.856-347.298 0-108.795 50.024-205.905 128.325-269.586l0.637-0.502v11.52c0.243 238.843 193.797 432.397 432.617 432.64l0.023 0c0.455 0.002 0.993 0.003 1.532 0.003 31.198 0 61.597-3.42 90.843-9.906l-2.776 0.517c-59.274 110.469-173.971 184.32-305.917 184.32-0.151 0-0.302-0-0.453-0l0.024 0z"],"attrs":[],"grid":0,"tags":["moon"]},"attrs":[],"properties":{"order":5274,"id":410,"name":"moon","prevSize":32,"code":60443},"setIdx":0,"setId":0,"iconIdx":795},{"icon":{"paths":["M469.333 810.667h-128c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h128c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM853.333 640h-49.493c23.4-36.013 40.673-78.313 49.158-123.706l0.336-2.161c0.38-2.138 0.597-4.599 0.597-7.111 0-13.028-5.839-24.692-15.043-32.518l-0.061-0.050c-7.477-6.605-17.362-10.638-28.189-10.638-5.193 0-10.17 0.928-14.773 2.627l0.296-0.096c-24.419 8.592-52.575 13.586-81.889 13.653l-0.031 0c-0.004 0-0.008 0-0.013 0-141.899 0-257.1-114.306-258.546-255.863l-0.001-0.137c0.428-15.4 1.963-30.109 4.533-44.459l-0.266 1.792c0.309-1.93 0.486-4.154 0.486-6.42 0-13.173-5.97-24.951-15.351-32.778l-0.068-0.055c-7.426-6.424-17.178-10.338-27.844-10.338-5.323 0-10.418 0.975-15.116 2.755l0.293-0.098c-134.8 47.521-229.991 173.067-231.678 321.077l-0.002 0.203c0.046 68.475 20.247 132.222 54.992 185.64l-0.805-1.32h-54.187c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h682.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM694.613 640h-360.533c-48.62-46.671-78.829-112.202-78.829-184.788 0-89.461 45.889-168.205 115.412-213.976l0.964-0.596c10.46 181.483 160.184 324.693 343.357 324.693 0.039 0 0.077-0 0.116-0l-0.006 0c5.036 0.303 10.925 0.476 16.853 0.476s11.817-0.173 17.661-0.513l-0.807 0.038c-14.135 28.952-32.292 53.654-54.098 74.582l-0.089 0.085zM682.667 810.667h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["moonset"]},"attrs":[],"properties":{"order":5275,"id":409,"name":"moonset","prevSize":32,"code":60444},"setIdx":0,"setId":0,"iconIdx":796},{"icon":{"paths":["M768 426.667c94.257 0 170.667-76.41 170.667-170.667s-76.41-170.667-170.667-170.667c-94.257 0-170.667 76.41-170.667 170.667v0c0 94.257 76.41 170.667 170.667 170.667v0zM768 170.667c47.128 0 85.333 38.205 85.333 85.333s-38.205 85.333-85.333 85.333c-47.128 0-85.333-38.205-85.333-85.333v0c0-47.128 38.205-85.333 85.333-85.333v0zM718.933 532.053c-7.651-12.199-21.025-20.191-36.267-20.191s-28.616 7.991-36.162 20.013l-0.104 0.178-42.667 69.547-140.373-238.933c-7.57-12.596-21.163-20.894-36.693-20.894s-29.123 8.298-36.586 20.702l-0.107 0.192-298.667 512c-3.594 6.12-5.717 13.479-5.717 21.334 0 23.474 18.957 42.52 42.396 42.666l0.014 0h768c0.025 0 0.055 0 0.085 0 23.564 0 42.667-19.103 42.667-42.667 0-8.38-2.416-16.195-6.589-22.788l0.103 0.175zM445.867 853.333h-243.627l224.427-384 125.44 213.333-53.333 85.333zM546.133 853.333l63.573-101.12 30.293-45.227 42.667-71.68 136.533 218.027z"],"attrs":[],"grid":0,"tags":["mountains-sun"]},"attrs":[],"properties":{"order":5276,"id":408,"name":"mountains-sun","prevSize":32,"code":60445},"setIdx":0,"setId":0,"iconIdx":797},{"icon":{"paths":["M932.267 745.387l-213.333-341.333c-7.651-12.199-21.025-20.191-36.267-20.191s-28.616 7.991-36.162 20.013l-0.104 0.178-42.667 69.547-140.373-238.933c-7.57-12.596-21.163-20.894-36.693-20.894s-29.123 8.298-36.586 20.702l-0.107 0.192-298.667 512c-3.594 6.12-5.717 13.479-5.717 21.334 0 23.474 18.957 42.52 42.396 42.666l0.014 0h768c0.025 0 0.055 0 0.085 0 23.564 0 42.667-19.103 42.667-42.667 0-8.38-2.416-16.195-6.589-22.788l0.103 0.175zM445.867 725.333h-243.627l224.427-384 125.013 213.333zM546.133 725.333l93.867-146.347 42.667-71.68 136.533 218.027z"],"attrs":[],"grid":0,"tags":["mountains"]},"attrs":[],"properties":{"order":5277,"id":407,"name":"mountains","prevSize":32,"code":60446},"setIdx":0,"setId":0,"iconIdx":798},{"icon":{"paths":["M512 85.333c-164.949 0-298.667 133.718-298.667 298.667v0 256c0 164.949 133.718 298.667 298.667 298.667s298.667-133.718 298.667-298.667v0-256c0-164.949-133.718-298.667-298.667-298.667v0zM725.333 640c0 117.821-95.513 213.333-213.333 213.333s-213.333-95.513-213.333-213.333v0-256c-0-0.013-0-0.028-0-0.044 0-102.717 72.595-188.479 169.277-208.779l1.389-0.244v337.067c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-337.067c98.072 20.544 170.667 106.306 170.667 209.023 0 0.015-0 0.031-0 0.046l0-0.002z"],"attrs":[],"grid":0,"tags":["mouse-alt-2"]},"attrs":[],"properties":{"order":5278,"id":406,"name":"mouse-alt-2","prevSize":32,"code":60447},"setIdx":0,"setId":0,"iconIdx":799},{"icon":{"paths":["M512 256c-23.564 0-42.667 19.103-42.667 42.667v0 85.333c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-85.333c0-23.564-19.103-42.667-42.667-42.667v0zM512 85.333c-164.949 0-298.667 133.718-298.667 298.667v0 256c0 164.949 133.718 298.667 298.667 298.667s298.667-133.718 298.667-298.667v0-256c0-164.949-133.718-298.667-298.667-298.667v0zM725.333 640c0 117.821-95.513 213.333-213.333 213.333s-213.333-95.513-213.333-213.333v0-256c0-117.821 95.513-213.333 213.333-213.333s213.333 95.513 213.333 213.333v0z"],"attrs":[],"grid":0,"tags":["mouse-alt"]},"attrs":[],"properties":{"order":5279,"id":405,"name":"mouse-alt","prevSize":32,"code":60448},"setIdx":0,"setId":0,"iconIdx":800},{"icon":{"paths":["M512 85.333c-164.949 0-298.667 133.718-298.667 298.667v0 256c0 164.949 133.718 298.667 298.667 298.667s298.667-133.718 298.667-298.667v0-256c0-164.949-133.718-298.667-298.667-298.667v0zM298.667 384c-0-0.013-0-0.028-0-0.044 0-102.717 72.595-188.479 169.277-208.779l1.389-0.244v251.733h-170.667zM725.333 640c0 117.821-95.513 213.333-213.333 213.333s-213.333-95.513-213.333-213.333v0-128h426.667zM725.333 426.667h-170.667v-251.733c98.072 20.544 170.667 106.306 170.667 209.023 0 0.015-0 0.031-0 0.046l0-0.002z"],"attrs":[],"grid":0,"tags":["mouse"]},"attrs":[],"properties":{"order":5280,"id":404,"name":"mouse","prevSize":32,"code":60449},"setIdx":0,"setId":0,"iconIdx":801},{"icon":{"paths":["M572.16 512l268.8-268.373c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l-0 0-268.373 268.8-268.373-268.8c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l-0-0 268.8 268.373-268.8 268.373c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 268.373-268.8 268.373 268.8c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003z"],"attrs":[],"grid":0,"tags":["multiply"]},"attrs":[],"properties":{"order":5281,"id":403,"name":"multiply","prevSize":32,"code":60450},"setIdx":0,"setId":0,"iconIdx":802},{"icon":{"paths":["M815.787 94.293c-7.36-6.207-16.951-9.979-27.422-9.979-3.286 0-6.485 0.371-9.557 1.075l0.287-0.055-341.333 85.333c-18.773 4.747-32.445 21.489-32.445 41.424 0 0.437 0.007 0.872 0.020 1.306l-0.002-0.064v441.6c-18.683-9.332-40.687-14.835-63.967-14.933l-0.033-0c-82.475 0-149.333 66.859-149.333 149.333s66.859 149.333 149.333 149.333c82.475 0 149.333-66.859 149.333-149.333v0-329.387l308.907-75.947h2.987l8.107-6.4 6.4-4.267c2.045-1.908 3.869-4.003 5.462-6.273l0.084-0.127c1.592-1.866 3.010-3.965 4.179-6.215l0.087-0.185c1.224-2.221 2.121-4.807 2.543-7.549l0.017-0.131c0.213-1.219 0.334-2.622 0.334-4.053s-0.122-2.835-0.355-4.2l0.021 0.147c0.091-0.513 0.143-1.104 0.143-1.707s-0.052-1.194-0.152-1.768l0.009 0.061v-213.333c0.042-0.706 0.065-1.531 0.065-2.362 0-12.378-5.271-23.525-13.691-31.319l-0.028-0.026zM341.333 853.333c-35.346 0-64-28.654-64-64s28.654-64 64-64c35.346 0 64 28.654 64 64v0c0 35.346-28.654 64-64 64v0zM746.667 308.053l-256 64v-125.44l256-64z"],"attrs":[],"grid":0,"tags":["music-note"]},"attrs":[],"properties":{"order":5282,"id":402,"name":"music-note","prevSize":32,"code":60451},"setIdx":0,"setId":0,"iconIdx":803},{"icon":{"paths":["M512 312.747c23.564 0 42.667-19.103 42.667-42.667v0-23.467l256-64v125.44l-183.467 46.080c-21.428 2.645-37.853 20.738-37.853 42.667 0 23.733 19.24 42.973 42.973 42.973 1.804 0 3.583-0.111 5.329-0.327l-0.209 0.021h10.24l215.893-55.467h2.987l8.107-3.84 6.4-4.267c2.045-1.908 3.869-4.003 5.462-6.273l0.084-0.127c1.592-1.866 3.010-3.965 4.179-6.215l0.087-0.185c1.224-2.221 2.121-4.807 2.543-7.549l0.017-0.131c0.19-1.218 0.298-2.623 0.298-4.053s-0.108-2.835-0.317-4.207l0.019 0.154c1.428-1.597 2.365-3.66 2.557-5.936l0.003-0.038v-213.333c0.012-0.373 0.018-0.811 0.018-1.252 0-23.564-19.103-42.667-42.667-42.667-3.642 0-7.178 0.456-10.554 1.315l0.295-0.064-341.333 85.333c-18.773 4.747-32.445 21.489-32.445 41.424 0 0.437 0.007 0.872 0.020 1.306l-0.002-0.064v56.747c0 23.564 19.103 42.667 42.667 42.667v0zM926.293 867.413l-768-768c-7.136-5.564-16.231-8.921-26.109-8.921-23.564 0-42.667 19.103-42.667 42.667 0 9.45 3.072 18.182 8.272 25.253l-0.083-0.118 371.627 371.2v125.44c-18.683-9.332-40.687-14.835-63.967-14.933l-0.033-0c-82.475 0-149.333 66.859-149.333 149.333s66.859 149.333 149.333 149.333c82.475 0 149.333-66.859 149.333-149.333v0-174.507l311.040 311.467c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003zM405.333 853.333c-35.346 0-64-28.654-64-64s28.654-64 64-64c35.346 0 64 28.654 64 64v0c0 35.346-28.654 64-64 64v0z"],"attrs":[],"grid":0,"tags":["music-tune-slash"]},"attrs":[],"properties":{"order":5283,"id":401,"name":"music-tune-slash","prevSize":32,"code":60452},"setIdx":0,"setId":0,"iconIdx":804},{"icon":{"paths":["M923.733 95.573c-7.417-6.394-17.147-10.288-27.786-10.288-2.24 0-4.44 0.173-6.586 0.505l0.239-0.031-554.667 85.333c-20.651 3.22-36.267 20.879-36.267 42.184 0 0.020 0 0.039 0 0.059l-0-0.003v441.6c-18.683-9.332-40.687-14.835-63.967-14.933l-0.033-0c-82.475 0-149.333 66.859-149.333 149.333s66.859 149.333 149.333 149.333c82.475 0 149.333-66.859 149.333-149.333v0-325.973l469.333-72.107v178.347c-18.683-9.332-40.687-14.835-63.967-14.933l-0.033-0c-82.475 0-149.333 66.859-149.333 149.333s66.859 149.333 149.333 149.333c82.475 0 149.333-66.859 149.333-149.333v0-576c0-0.001 0-0.002 0-0.003 0-12.949-5.769-24.551-14.877-32.376l-0.057-0.048zM234.667 853.333c-35.346 0-64-28.654-64-64s28.654-64 64-64c35.346 0 64 28.654 64 64v0c0 35.346-28.654 64-64 64v0zM789.333 768c-35.346 0-64-28.654-64-64s28.654-64 64-64c35.346 0 64 28.654 64 64v0c0 35.346-28.654 64-64 64v0zM853.333 304.64l-469.333 72.107v-128l469.333-70.827z"],"attrs":[],"grid":0,"tags":["music"]},"attrs":[],"properties":{"order":5284,"id":400,"name":"music","prevSize":32,"code":60453},"setIdx":0,"setId":0,"iconIdx":805},{"icon":{"paths":["M810.667 256h-42.667c-70.692 0-128 57.308-128 128v0 341.333c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-170.667h128v170.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-341.333c0-70.692-57.308-128-128-128v0zM853.333 469.333h-128v-85.333c0-23.564 19.103-42.667 42.667-42.667v0h42.667c23.564 0 42.667 19.103 42.667 42.667v0zM341.333 256c-23.564 0-42.667 19.103-42.667 42.667v0 245.76l-132.693-264.96c-7.227-13.891-21.512-23.214-37.974-23.214-23.475 0-42.522 18.959-42.666 42.4l-0 0.014v426.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-245.76l132.693 264.96c7.163 13.992 21.462 23.415 37.966 23.467l0.007 0c1.474 0.198 3.177 0.311 4.907 0.311s3.433-0.113 5.103-0.332l-0.196 0.021c18.986-4.592 32.869-21.438 32.869-41.526 0-0.401-0.006-0.801-0.017-1.199l0.001 0.059v-426.667c0-23.564-19.103-42.667-42.667-42.667v0zM512 170.667c-23.564 0-42.667 19.103-42.667 42.667v0 597.333c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-597.333c0-23.564-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["n-a"]},"attrs":[],"properties":{"order":5285,"id":399,"name":"n-a","prevSize":32,"code":60454},"setIdx":0,"setId":0,"iconIdx":806},{"icon":{"paths":["M860.587 393.813l-597.333-246.613c-14.463-6.152-31.286-9.727-48.944-9.727-70.692 0-128 57.308-128 128 0 14.153 2.297 27.77 6.539 40.498l-0.261-0.904 65.707 206.933-67.413 206.933c-4.151 12.060-6.547 25.956-6.547 40.413 0 37.11 15.793 70.532 41.024 93.911l0.083 0.076c22.361 20.782 52.298 33.68 85.243 34.132l0.091 0.001c17.709-0.012 34.573-3.619 49.905-10.13l-0.838 0.316 599.467-246.613c46.69-19.787 78.848-65.231 78.848-118.187s-32.158-98.4-78.010-117.87l-0.838-0.316zM228.693 797.867c-4.809 2.039-10.401 3.224-16.27 3.224-11.19 0-21.375-4.308-28.985-11.356l0.028 0.025c-8.134-7.783-13.19-18.724-13.19-30.847 0-4.211 0.61-8.279 1.746-12.121l-0.077 0.302 62.293-192.427h585.813zM234.24 469.333l-63.573-190.72c-1.060-3.54-1.67-7.609-1.67-11.819 0-12.123 5.056-23.065 13.174-30.832l0.016-0.015c7.785-8.156 18.742-13.227 30.883-13.227 0.093 0 0.185 0 0.278 0.001l-0.014-0c6.014 0.012 11.732 1.266 16.916 3.52l-0.276-0.107 590.080 243.2z"],"attrs":[],"grid":0,"tags":["navigator"]},"attrs":[],"properties":{"order":5286,"id":398,"name":"navigator","prevSize":32,"code":60455},"setIdx":0,"setId":0,"iconIdx":807},{"icon":{"paths":["M913.493 369.067s0 0 0-2.56c-61.241-165.432-217.654-281.215-401.109-281.215-182.497 0-338.233 114.577-399.197 275.72l-0.974 2.935c-1.544 2.962-2.731 6.398-3.381 10.020l-0.033 0.22c-14.781 41.047-23.369 88.411-23.467 137.769l-0 0.044c-0.002 0.429-0.002 0.938-0.002 1.447 0 235.641 191.025 426.667 426.667 426.667s426.667-191.025 426.667-426.667c0-51.786-9.226-101.416-26.124-147.338l0.953 2.959zM512 170.667c125.541 0.133 235.196 68.019 294.382 169.056l0.872 1.61h-51.2c-23.499-25.763-57.21-41.864-94.682-41.864-41.755 0-78.84 19.993-102.204 50.928l-0.234 0.323c-13.878-5.63-29.959-9.045-46.795-9.384l-0.138-0.002c-16.974 0.341-33.056 3.757-47.843 9.71l0.909-0.323c-23.599-31.258-60.684-51.251-102.438-51.251-37.472 0-71.183 16.102-94.591 41.764l-0.090 0.101h-51.2c60.058-102.648 169.713-170.534 295.235-170.667l0.019-0zM704 426.667c0 23.564-19.103 42.667-42.667 42.667s-42.667-19.103-42.667-42.667c0-23.564 19.103-42.667 42.667-42.667v0c23.564 0 42.667 19.103 42.667 42.667v0zM405.333 426.667c0 23.564-19.103 42.667-42.667 42.667s-42.667-19.103-42.667-42.667c0-23.564 19.103-42.667 42.667-42.667v0c23.564 0 42.667 19.103 42.667 42.667v0zM512 853.333c-188.513 0-341.333-152.82-341.333-341.333v0c0.207-30.408 4.241-59.781 11.644-87.785l-0.551 2.452h52.907c-0.037 1.144-0.058 2.49-0.058 3.84 0 70.724 57.333 128.058 128.058 128.058 69.374 0 125.863-55.165 127.995-124.021l0.005-0.196c6.12-3.594 13.479-5.716 21.333-5.716s15.214 2.123 21.535 5.825l-0.201-0.109c2.137 69.053 58.626 124.218 128 124.218 70.724 0 128.058-57.333 128.058-128.058 0-1.35-0.021-2.696-0.062-4.036l0.005 0.196h52.907c6.852 25.552 10.887 54.926 11.093 85.208l0.001 0.125c0 188.513-152.82 341.333-341.333 341.333v0zM612.693 607.147c-27.277 22.134-62.42 35.536-100.693 35.536s-73.416-13.403-100.992-35.771l0.298 0.234c-7.346-6.139-16.891-9.867-27.307-9.867-23.594 0-42.72 19.126-42.72 42.72 0 13.178 5.967 24.962 15.346 32.798l0.068 0.055c41.735 35.027 96.036 56.304 155.307 56.304s113.571-21.277 155.681-56.61l-0.374 0.306c9.447-7.891 15.413-19.676 15.413-32.853 0-23.594-19.126-42.72-42.72-42.72-10.416 0-19.961 3.728-27.374 9.922l0.068-0.055z"],"attrs":[],"grid":0,"tags":["nerd"]},"attrs":[],"properties":{"order":5287,"id":397,"name":"nerd","prevSize":32,"code":60456},"setIdx":0,"setId":0,"iconIdx":808},{"icon":{"paths":["M725.333 469.333h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM725.333 640h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM469.333 384h256c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-256c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM896 128h-597.333c-23.564 0-42.667 19.103-42.667 42.667v0 128h-128c-23.564 0-42.667 19.103-42.667 42.667v0 426.667c0 70.692 57.308 128 128 128v0h554.667c94.257 0 170.667-76.41 170.667-170.667v0-554.667c0-23.564-19.103-42.667-42.667-42.667v0zM256 768c0 23.564-19.103 42.667-42.667 42.667s-42.667-19.103-42.667-42.667v0-384h85.333zM853.333 725.333c0 47.128-38.205 85.333-85.333 85.333v0h-434.347c4.75-12.677 7.555-27.325 7.68-42.612l0-0.055v-554.667h512zM469.333 554.667h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM469.333 725.333h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["newspaper"]},"attrs":[],"properties":{"order":5288,"id":396,"name":"newspaper","prevSize":32,"code":60457},"setIdx":0,"setId":0,"iconIdx":809},{"icon":{"paths":["M896 853.333h-52.907l-187.307-674.133c-15.451-54.544-64.786-93.839-123.303-93.867l-42.67-0c-57.825 0.824-106.31 39.868-121.381 92.964l-0.219 0.902-187.307 674.133h-52.907c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h768c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM450.56 201.813c5.19-18.13 21.617-31.176 41.090-31.176 0.554 0 1.106 0.011 1.656 0.032l-0.079-0.002h42.667c0.47-0.019 1.022-0.029 1.576-0.029 19.473 0 35.9 13.046 41.016 30.875l0.074 0.301 33.707 139.52h-200.533zM387.84 426.667h248.32l46.507 170.667h-341.333zM269.653 853.333l47.36-170.667h389.973l47.36 170.667z"],"attrs":[],"grid":0,"tags":["no-entry"]},"attrs":[],"properties":{"order":5289,"id":395,"name":"no-entry","prevSize":32,"code":60458},"setIdx":0,"setId":0,"iconIdx":810},{"icon":{"paths":["M829.44 227.84l-2.56-2.987c-78.286-85.404-190.353-138.752-314.88-138.752s-236.594 53.347-314.593 138.435l-0.287 0.317-2.56 2.987c-67.77 75.224-109.226 175.315-109.226 285.089 0 235.641 191.025 426.667 426.667 426.667s426.667-191.025 426.667-426.667c0-0.327-0-0.653-0.001-0.98l0 0.051c0-0.064 0-0.14 0-0.217 0-109.407-41.47-209.129-109.548-284.304l0.321 0.36zM512 170.667c0.262-0.001 0.572-0.001 0.882-0.001 60.166 0 116.636 15.824 165.475 43.537l-1.664-0.869h-329.387c47.175-26.844 103.645-42.668 163.811-42.668 0.31 0 0.62 0 0.93 0.001l-0.048-0zM245.76 298.667h532.48c37.86 47.021 63.68 105.233 71.926 168.956l0.181 1.711h-676.693c8.427-65.434 34.246-123.646 72.62-171.327l-0.514 0.66zM512 853.333c-173.343-0.162-316.425-129.512-338.165-296.952l-0.182-1.714h676.693c-21.922 169.154-165.004 298.504-338.329 298.667l-0.017 0zM341.333 341.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM597.333 341.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM469.333 765.013c6.011 3.467 13.216 5.522 20.9 5.547l0.007 0c15.854-0.028 29.676-8.699 37.010-21.55l0.11-0.21c22.245-39.725 64.066-66.135 112.057-66.135 0.205 0 0.41 0 0.615 0.001l-0.032-0c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0c-0.003-0-0.006-0-0.009-0-79.754 0-149.286 43.765-185.891 108.588l-0.553 1.065c-3.499 6.055-5.563 13.32-5.563 21.067 0 15.716 8.497 29.448 21.148 36.851l0.202 0.109z"],"attrs":[],"grid":0,"tags":["ninja"]},"attrs":[],"properties":{"order":5290,"id":394,"name":"ninja","prevSize":32,"code":60459},"setIdx":0,"setId":0,"iconIdx":811},{"icon":{"paths":["M896 256c-23.564 0-42.667 19.103-42.667 42.667v0 426.667c0 70.692-57.308 128-128 128v0h-426.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h426.667c117.821 0 213.333-95.513 213.333-213.333v0-426.667c0-23.564-19.103-42.667-42.667-42.667v0zM768 640v-426.667c0-70.692-57.308-128-128-128v0h-426.667c-70.692 0-128 57.308-128 128v0 426.667c0 70.692 57.308 128 128 128v0h426.667c70.692 0 128-57.308 128-128v0zM426.667 170.667h85.333v207.36l-15.36-12.8c-7.342-6.149-16.888-9.883-27.307-9.883s-19.965 3.734-27.373 9.937l0.067-0.054-15.36 12.8zM170.667 640v-426.667c0-23.564 19.103-42.667 42.667-42.667v0h128v298.667c-0 0.001-0 0.002-0 0.003 0 23.564 19.103 42.667 42.667 42.667 10.615 0 20.324-3.876 27.79-10.29l-0.057 0.048 57.6-48.213 57.6 48.213c7.409 6.365 17.117 10.24 27.73 10.24 0.001 0 0.002-0 0.003-0l-0 0c6.495-0.047 12.648-1.456 18.206-3.955l-0.286 0.115c14.732-6.936 24.747-21.659 24.747-38.721 0-0.037-0-0.074-0-0.111l0 0.006v-298.667h42.667c23.564 0 42.667 19.103 42.667 42.667v0 426.667c0 23.564-19.103 42.667-42.667 42.667v0h-426.667c-23.564 0-42.667-19.103-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["notebooks"]},"attrs":[],"properties":{"order":5291,"id":393,"name":"notebooks","prevSize":32,"code":60460},"setIdx":0,"setId":0,"iconIdx":812},{"icon":{"paths":["M682.667 597.333h-341.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h341.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM682.667 426.667h-256c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h256c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM853.333 170.667h-128v-42.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 42.667h-85.333v-42.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 42.667h-85.333v-42.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 42.667h-128c-23.564 0-42.667 19.103-42.667 42.667v0 597.333c0 70.692 57.308 128 128 128v0h512c70.692 0 128-57.308 128-128v0-597.333c0-23.564-19.103-42.667-42.667-42.667v0zM810.667 810.667c0 23.564-19.103 42.667-42.667 42.667v0h-512c-23.564 0-42.667-19.103-42.667-42.667v0-554.667h85.333v42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667h85.333v42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667h85.333v42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667h85.333z"],"attrs":[],"grid":0,"tags":["notes"]},"attrs":[],"properties":{"order":5292,"id":392,"name":"notes","prevSize":32,"code":60461},"setIdx":0,"setId":0,"iconIdx":813},{"icon":{"paths":["M682.667 426.667h-85.333v-85.333c0-23.564-19.103-42.667-42.667-42.667v0h-213.333c-23.564 0-42.667 19.103-42.667 42.667v0 213.333c0 23.564 19.103 42.667 42.667 42.667v0h85.333v85.333c0 23.564 19.103 42.667 42.667 42.667v0h213.333c23.564 0 42.667-19.103 42.667-42.667v0-213.333c0-23.564-19.103-42.667-42.667-42.667v0zM426.667 469.333v42.667h-42.667v-128h128v42.667h-42.667c-23.564 0-42.667 19.103-42.667 42.667v0zM640 640h-128v-128h128zM896 779.947v-535.893c26.351-14.864 43.853-42.675 43.853-74.573 0-47.128-38.205-85.333-85.333-85.333-31.898 0-59.709 17.502-74.352 43.428l-0.221 0.426h-535.893c-14.864-26.351-42.675-43.853-74.573-43.853-47.128 0-85.333 38.205-85.333 85.333 0 31.898 17.502 59.709 43.428 74.352l0.426 0.221v535.893c-26.351 14.864-43.853 42.675-43.853 74.573 0 47.128 38.205 85.333 85.333 85.333 31.898 0 59.709-17.502 74.352-43.428l0.221-0.426h535.893c14.864 26.351 42.675 43.853 74.573 43.853 47.128 0 85.333-38.205 85.333-85.333 0-31.898-17.502-59.709-43.428-74.352l-0.426-0.221zM810.667 779.947c-12.901 7.403-23.317 17.819-30.51 30.324l-0.21 0.396h-535.893c-7.403-12.901-17.819-23.317-30.324-30.51l-0.396-0.21v-535.893c12.901-7.403 23.317-17.819 30.51-30.324l0.21-0.396h535.893c7.403 12.901 17.819 23.317 30.324 30.51l0.396 0.21z"],"attrs":[],"grid":0,"tags":["object-group"]},"attrs":[],"properties":{"order":5293,"id":391,"name":"object-group","prevSize":32,"code":60462},"setIdx":0,"setId":0,"iconIdx":814},{"icon":{"paths":["M896 779.947v-279.893c26.351-14.864 43.853-42.675 43.853-74.573 0-47.128-38.205-85.333-85.333-85.333-31.898 0-59.709 17.502-74.352 43.428l-0.221 0.426h-139.947v-139.947c26.351-14.864 43.853-42.675 43.853-74.573 0-47.128-38.205-85.333-85.333-85.333-31.898 0-59.709 17.502-74.352 43.428l-0.221 0.426h-279.893c-14.864-26.351-42.675-43.853-74.573-43.853-47.128 0-85.333 38.205-85.333 85.333 0 31.898 17.502 59.709 43.428 74.352l0.426 0.221v279.893c-26.351 14.864-43.853 42.675-43.853 74.573 0 47.128 38.205 85.333 85.333 85.333 31.898 0 59.709-17.502 74.352-43.428l0.221-0.426h139.947v139.947c-26.351 14.864-43.853 42.675-43.853 74.573 0 47.128 38.205 85.333 85.333 85.333 31.898 0 59.709-17.502 74.352-43.428l0.221-0.426h279.893c14.864 26.351 42.675 43.853 74.573 43.853 47.128 0 85.333-38.205 85.333-85.333 0-31.898-17.502-59.709-43.428-74.352l-0.426-0.221zM341.333 426.667c0.194 31.22 17.125 58.443 42.264 73.169l0.403 0.218v54.613h-139.947c-7.403-12.901-17.819-23.317-30.324-30.51l-0.396-0.21v-279.893c12.901-7.403 23.317-17.819 30.51-30.324l0.21-0.396h279.893c7.403 12.901 17.819 23.317 30.324 30.51l0.396 0.21v139.947h-54.613c-15.14-25.197-42.327-41.796-73.391-41.796-46.822 0-84.836 37.71-85.329 84.416l-0 0.047zM554.667 469.333v54.613c-12.901 7.403-23.317 17.819-30.51 30.324l-0.21 0.396h-54.613v-54.613c12.901-7.403 23.317-17.819 30.51-30.324l0.21-0.396zM810.667 779.947c-12.901 7.403-23.317 17.819-30.51 30.324l-0.21 0.396h-279.893c-7.403-12.901-17.819-23.317-30.324-30.51l-0.396-0.21v-139.947h54.613c14.864 26.351 42.675 43.853 74.573 43.853 47.128 0 85.333-38.205 85.333-85.333 0-31.898-17.502-59.709-43.428-74.352l-0.426-0.221v-54.613h139.947c7.403 12.901 17.819 23.317 30.324 30.51l0.396 0.21z"],"attrs":[],"grid":0,"tags":["object-ungroup"]},"attrs":[],"properties":{"order":5294,"id":390,"name":"object-ungroup","prevSize":32,"code":60463},"setIdx":0,"setId":0,"iconIdx":815},{"icon":{"paths":["M926.293 322.987l-224.853-225.28c-7.877-7.522-18.523-12.204-30.26-12.373l-0.033-0h-318.293c-11.771 0.169-22.416 4.851-30.311 12.39l0.017-0.016-224.853 225.28c-7.606 7.667-12.323 18.211-12.373 29.857l-0 0.010v318.293c0.051 11.656 4.767 22.2 12.376 29.869l-0.003-0.003 224.853 225.28c7.877 7.522 18.523 12.204 30.26 12.373l0.033 0h318.293c11.771-0.169 22.416-4.851 30.311-12.39l-0.017 0.016 224.853-225.28c7.606-7.667 12.323-18.211 12.373-29.857l0-0.010v-318.293c-0.051-11.656-4.767-22.2-12.376-29.869l0.003 0.003zM853.333 653.227l-200.107 200.107h-282.453l-200.107-200.107v-282.453l200.107-200.107h282.453l200.107 200.107z"],"attrs":[],"grid":0,"tags":["octagon"]},"attrs":[],"properties":{"order":5295,"id":389,"name":"octagon","prevSize":32,"code":60464},"setIdx":0,"setId":0,"iconIdx":816},{"icon":{"paths":["M512 85.333v0c-234.667 0-426.667 192-426.667 426.667s192 426.667 426.667 426.667 426.667-192 426.667-426.667c0-234.667-192-426.667-426.667-426.667zM725.333 512c0 119.467-93.867 213.333-213.333 213.333s-213.333-93.867-213.333-213.333c0-119.467 93.867-213.333 213.333-213.333s213.333 93.867 213.333 213.333v0z"],"attrs":[],"grid":0,"tags":["okta"]},"attrs":[],"properties":{"order":5296,"id":388,"name":"okta","prevSize":32,"code":60465},"setIdx":0,"setId":0,"iconIdx":817},{"icon":{"paths":["M510.75 213.352c-155.458 0-155.458 218.542-155.458 292.583 0 83.334 0 304.75 156.166 304.75 155.917 0 155.917-220.25 155.917-303.167 0-195.209-52.708-294.167-156.625-294.167zM511.458 725.352c-47 0-70.833-73.833-70.833-221.667 0-93.5 12.166-205 70.125-205 62.042 0 71.292 130.833 71.292 208.833 0 144.542-23.748 217.833-70.583 217.833zM511.501 42.685c-258.209-0-438.541 191.208-438.541 465 0 232.832 164.125 473.667 438.833 473.667 274.5 0 438.542-240.833 438.542-473.667-0.002-273.792-180.458-465-438.835-465zM511.793 896.019c-221.292 0-353.5-197.458-353.5-388.333 0-227.084 141.958-379.667 353.208-379.667 211.459 0 353.5 152.583 353.5 379.667-0.001 190.875-132.126 388.333-353.209 388.333z"],"attrs":[],"grid":0,"tags":["opera-alt"]},"attrs":[],"properties":{"order":5297,"id":387,"name":"opera-alt","prevSize":32,"code":60466},"setIdx":0,"setId":0,"iconIdx":818},{"icon":{"paths":["M511.842 85.333c-233.045 0-395.861 168.881-395.861 422.357 0 225.703 158.345 430.976 396.181 430.976 237.515 0 395.856-205.592 395.856-430.976 0.001-253.477-163.13-422.357-396.175-422.357zM511.842 869.709c-144.936 0-160.899-213.892-160.899-371.597v-3.192c0-170.474 25.539-351.165 159.942-351.165s161.536 186.116 161.536 356.591c0 157.706-15.645 369.362-160.579 369.362z"],"attrs":[],"grid":0,"tags":["opera"]},"attrs":[],"properties":{"order":5298,"id":386,"name":"opera","prevSize":32,"code":60467},"setIdx":0,"setId":0,"iconIdx":819},{"icon":{"paths":["M829.44 554.667c-9.387 0-19.2-2.987-28.587-5.12-21.902-4.865-40.587-10.588-58.643-17.576l2.75 0.936c-8.677-3.257-18.705-5.142-29.174-5.142-33.468 0-62.435 19.267-76.416 47.314l-0.223 0.495-9.387 19.2c-43.295-24.339-80.587-52.66-113.523-85.363l0.030 0.030c-32.673-32.906-60.995-70.199-83.986-110.901l-1.347-2.593 17.92-11.947c28.542-14.205 47.808-43.172 47.808-76.64 0-10.468-1.885-20.497-5.334-29.763l0.192 0.59c-5.868-15.079-11.586-33.757-16.055-52.915l-0.585-2.978c-2.133-9.387-3.84-19.2-5.12-29.013-10.754-60.726-63.13-106.254-126.139-106.254-0.654 0-1.307 0.005-1.959 0.015l0.099-0.001h-128c-0.357-0.004-0.779-0.006-1.202-0.006-70.692 0-128 57.308-128 128 0 6.172 0.437 12.242 1.281 18.18l-0.079-0.681c48.095 367.748 336.77 655.549 700.837 701.876l4.017 0.417h16.213c0.056 0 0.122 0 0.188 0 32.752 0 62.631-12.301 85.269-32.536l-0.124 0.109c26.238-23.54 42.668-57.555 42.668-95.407 0-0.209-0-0.417-0.001-0.625l0 0.032v-128c-1.124-61.764-45.825-112.764-104.599-123.613l-0.788-0.121zM850.773 810.667c-0.017 12.731-5.606 24.153-14.46 31.96l-0.047 0.040c-7.878 6.831-18.231 10.994-29.556 10.994-1.914 0-3.8-0.119-5.652-0.35l0.221 0.022c-328.712-43.345-585.857-301.508-627.254-627.021l-0.373-3.593c-0.173-1.507-0.272-3.254-0.272-5.023 0-11.447 4.136-21.929 10.995-30.031l-0.056 0.068c7.847-8.9 19.269-14.49 31.997-14.507l0.003-0h128c0.283-0.007 0.615-0.011 0.949-0.011 20.394 0 37.446 14.308 41.665 33.434l0.052 0.283q2.56 17.493 6.4 34.56c5.721 25.899 12.474 48.010 20.728 69.374l-1.101-3.241-59.733 27.733c-14.801 6.91-24.874 21.669-24.874 38.78 0 6.52 1.463 12.699 4.078 18.226l-0.11-0.259c62.648 132.060 166.607 236.019 294.925 297.065l3.741 1.602c4.793 2.024 10.366 3.201 16.213 3.201s11.42-1.176 16.495-3.305l-0.281 0.105c10.842-3.955 19.439-11.858 24.21-21.927l0.11-0.259 26.453-59.733c17.866 6.724 40.404 13.471 63.467 18.851l3.947 0.776q17.067 3.84 34.56 6.4c19.409 4.271 33.717 21.324 33.717 41.718 0 0.334-0.004 0.667-0.011 0.999l0.001-0.049zM932.693 114.347c-4.422-10.46-12.58-18.618-22.76-22.935l-0.28-0.105c-4.778-2.092-10.34-3.34-16.186-3.413l-0.027-0h-170.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h67.413l-140.373 140.8c-7.668 7.712-12.407 18.343-12.407 30.080s4.74 22.368 12.409 30.082l-0.002-0.002c7.712 7.668 18.343 12.407 30.080 12.407s22.368-4.74 30.082-12.409l-0.002 0.002 140.8-140.373v67.413c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-170.667c-0.073-5.873-1.322-11.435-3.52-16.489l0.107 0.275z"],"attrs":[],"grid":0,"tags":["outgoing-call"]},"attrs":[],"properties":{"order":5299,"id":385,"name":"outgoing-call","prevSize":32,"code":60468},"setIdx":0,"setId":0,"iconIdx":820},{"icon":{"paths":["M512 554.667c-0.221-0.003-0.482-0.004-0.743-0.004-35.111 0-63.573 28.463-63.573 63.573 0 19.015 8.348 36.080 21.58 47.73l0.070 0.061v59.307c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-59.307c13.301-11.711 21.65-28.776 21.65-47.791 0-35.111-28.463-63.573-63.573-63.573-0.261 0-0.522 0.002-0.783 0.005l0.040-0zM725.333 384v-85.333c0-117.821-95.513-213.333-213.333-213.333s-213.333 95.513-213.333 213.333v0 85.333c-70.692 0-128 57.308-128 128v0 298.667c0 70.692 57.308 128 128 128v0h426.667c70.692 0 128-57.308 128-128v0-298.667c0-70.692-57.308-128-128-128v0zM384 298.667c0-70.692 57.308-128 128-128s128 57.308 128 128v0 85.333h-256zM768 810.667c0 23.564-19.103 42.667-42.667 42.667v0h-426.667c-23.564 0-42.667-19.103-42.667-42.667v0-298.667c0-23.564 19.103-42.667 42.667-42.667v0h426.667c23.564 0 42.667 19.103 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["padlock"]},"attrs":[],"properties":{"order":5300,"id":384,"name":"padlock","prevSize":32,"code":60469},"setIdx":0,"setId":0,"iconIdx":821},{"icon":{"paths":["M810.667 85.333h-597.333c-70.692 0-128 57.308-128 128v0 597.333c0 70.692 57.308 128 128 128v0h597.333c70.692 0 128-57.308 128-128v0-597.333c0-70.692-57.308-128-128-128v0zM426.667 170.667h170.667v133.547l-61.867-42.667c-6.607-4.407-14.73-7.033-23.467-7.033s-16.859 2.626-23.623 7.131l0.156-0.098-61.867 42.667zM853.333 810.667c0 23.564-19.103 42.667-42.667 42.667v0h-597.333c-23.564 0-42.667-19.103-42.667-42.667v0-597.333c0-23.564 19.103-42.667 42.667-42.667v0h128v213.333c0.045 16.18 9.088 30.237 22.388 37.435l0.226 0.112c5.664 2.969 12.373 4.711 19.489 4.711 8.615 0 16.634-2.553 23.341-6.944l-0.163 0.1 105.387-69.547 104.533 69.547c6.607 4.408 14.731 7.033 23.467 7.033 23.487 0 42.541-18.977 42.666-42.435l0-0.012v-213.333h128c23.564 0 42.667 19.103 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["package"]},"attrs":[],"properties":{"order":5301,"id":383,"name":"package","prevSize":32,"code":60470},"setIdx":0,"setId":0,"iconIdx":822},{"icon":{"paths":["M805.766 597.026c74.68-38.453 97.341-142.917 97.341-142.917s-98.307-42.245-172.987-3.651c-31.457 18.24-56.32 44.805-71.992 76.702l-0.469 1.056c1.547-12.606 2.468-27.276 2.541-42.147l0-0.098c42.187-51.077 67.775-117.22 67.775-189.339 0-4.321-0.092-8.62-0.274-12.895l0.021 0.61c-14.681-117.891-142.775-199.013-142.775-199.013s-104.177 110.19-89.357 228.227c14.781 70.429 53.349 130.070 106.741 171.525l0.66 0.493c-0.324 15.539-1.485 30.448-3.444 45.104l0.223-2.036c-17.167-37.688-45.228-67.918-80.132-87.33l-0.957-0.488c-75.68-36.372-172.735 8.664-172.735 8.664s25.74 103.75 101.386 140.122c21.892 8.886 47.287 14.042 73.885 14.042 23.318 0 45.71-3.962 66.539-11.251l-1.412 0.43c-14.5 47.285-35.729 88.429-62.972 124.809l0.751-1.048c-18.882-36.964-48.517-66.159-84.749-83.998l-1.1-0.49c-77.364-32.578-171.878 17.219-171.878 17.219s30.753 102.495 108.227 134.929c17.337 7.024 37.446 11.1 58.506 11.1 5.455 0 10.847-0.273 16.161-0.807l-0.67 0.054c-67.827 54.040-154.769 86.708-249.341 86.708-0.003 0-0.006-0-0.009-0l0.001 0c-15.838 0-28.677 12.839-28.677 28.677s12.839 28.677 28.677 28.677h-0c134.549-0.125 255.563-57.971 339.633-150.108l0.325-0.361c36.745 31.672 84.943 50.961 137.647 50.961 1.651 0 3.297-0.019 4.939-0.057l-0.244 0.004c83.63-8.81 142.521-98.057 142.521-98.057s-76.501-74.789-159.99-65.839c-21.701 2.662-41.338 9.548-58.734 19.824l0.703-0.384c15.124-27.78 28.154-60.030 37.411-93.839l0.75-3.216c23.728 9.548 51.239 15.087 80.044 15.087 29.351 0 57.358-5.751 82.957-16.187l-1.47 0.53z"],"attrs":[],"grid":0,"tags":["pagelines"]},"attrs":[],"properties":{"order":5302,"id":382,"name":"pagelines","prevSize":32,"code":60471},"setIdx":0,"setId":0,"iconIdx":823},{"icon":{"paths":["M768 42.667h-341.333c-70.692 0-128 57.308-128 128v0h-42.667c-70.692 0-128 57.308-128 128v0 128c0 70.692 57.308 128 128 128v0h256c23.564 0 42.667 19.103 42.667 42.667v0 42.667c-47.128 0-85.333 38.205-85.333 85.333v0 170.667c0 47.128 38.205 85.333 85.333 85.333v0h85.333c47.128 0 85.333-38.205 85.333-85.333v0-170.667c0-47.128-38.205-85.333-85.333-85.333v0-42.667c0-70.692-57.308-128-128-128v0h-256c-23.564 0-42.667-19.103-42.667-42.667v0-128c0-23.564 19.103-42.667 42.667-42.667v0h42.667c0 70.692 57.308 128 128 128v0h341.333c70.692 0 128-57.308 128-128v0-85.333c0-70.692-57.308-128-128-128v0zM640 725.333v170.667h-85.333v-170.667zM810.667 256c0 23.564-19.103 42.667-42.667 42.667v0h-341.333c-23.564 0-42.667-19.103-42.667-42.667v0-85.333c0-23.564 19.103-42.667 42.667-42.667v0h341.333c23.564 0 42.667 19.103 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["paint-tool"]},"attrs":[],"properties":{"order":5303,"id":381,"name":"paint-tool","prevSize":32,"code":60472},"setIdx":0,"setId":0,"iconIdx":824},{"icon":{"paths":["M725.333 128c-68.267-34.133-115.2-42.667-221.867-42.667h-247.467v516.267h247.467c98.133 0 170.667-4.267 234.667-46.933 68.267-46.933 110.933-128 106.667-213.333 4.267-89.6-42.667-170.667-119.467-213.333zM529.067 494.933h-149.333v-298.667h140.8c128 0 192 42.667 192 145.067 4.267 110.933-76.8 153.6-183.467 153.6zM256 938.667h123.733v-226.133h-123.733v226.133z"],"attrs":[],"grid":0,"tags":["pagerduty"]},"attrs":[],"properties":{"order":5304,"id":380,"name":"pagerduty","prevSize":32,"code":60473},"setIdx":0,"setId":0,"iconIdx":825},{"icon":{"paths":["M316.587 663.040c-7.668 7.712-12.407 18.343-12.407 30.080s4.74 22.368 12.409 30.082l-0.002-0.002c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.668-7.712 12.407-18.343 12.407-30.080s-4.74-22.368-12.409-30.082l0.002 0.002c-7.733-7.795-18.45-12.621-30.293-12.621s-22.56 4.826-30.291 12.618l-0.003 0.003zM316.587 300.8c-7.668 7.712-12.407 18.343-12.407 30.080s4.74 22.368 12.409 30.082l-0.002-0.002c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.668-7.712 12.407-18.343 12.407-30.080s-4.74-22.368-12.409-30.082l0.002 0.002c-7.733-7.795-18.45-12.621-30.293-12.621s-22.56 4.826-30.291 12.618l-0.003 0.003zM527.787 727.467c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0.034-0.637 0.053-1.383 0.053-2.133 0-23.564-19.103-42.667-42.667-42.667-0.019 0-0.038 0-0.056 0l0.003-0zM271.787 471.467c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0.034-0.637 0.053-1.383 0.053-2.133 0-23.564-19.103-42.667-42.667-42.667-0.019 0-0.038 0-0.056 0l0.003-0zM527.787 215.467c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0.034-0.637 0.053-1.383 0.053-2.133 0-23.564-19.103-42.667-42.667-42.667-0.019 0-0.038 0-0.056 0l0.003-0zM678.827 302.933c-7.775 7.73-12.587 18.433-12.587 30.26 0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667c0-11.827-4.812-22.53-12.585-30.257l-0.002-0.002c-7.806-8.325-18.873-13.512-31.152-13.512-11.215 0-21.42 4.327-29.035 11.403l0.027-0.024zM947.627 302.933c-78.786-155.011-237.080-259.366-419.747-259.366-259.206 0-469.333 210.128-469.333 469.333s210.128 469.333 469.333 469.333c29.985 0 59.313-2.812 87.735-8.186l-2.921 0.459c44.709-8.623 82.24-34.287 106.296-69.819l0.371-0.581c18.728-27.866 29.891-62.176 29.891-99.093 0-13.108-1.407-25.888-4.079-38.195l0.215 1.182c-2.555-12.747-4.101-27.473-4.265-42.53l-0.001-0.137c0.404-86.574 52.313-160.924 126.643-194.020l1.357-0.54c41.209-18.767 72.684-52.882 87.54-94.853l0.354-1.147c5.826-16.474 9.193-35.472 9.193-55.256 0-28.26-6.869-54.915-19.027-78.388l0.448 0.951zM875.093 407.040c-7.565 20.801-22.784 37.269-42.168 46.298l-0.499 0.209c-104.736 47.723-176.301 151.356-176.64 271.742l-0 0.044c0.069 21.177 2.24 41.805 6.316 61.74l-0.343-2.007c1.329 5.867 2.091 12.605 2.091 19.52 0 18.951-5.72 36.566-15.528 51.213l0.21-0.333c-11.52 17.798-29.826 30.363-51.171 34.068l-0.456 0.065c-20.66 4.071-44.414 6.4-68.713 6.4-0.143 0-0.286-0-0.429-0l0.022 0c-0.055 0-0.121 0-0.186 0-212.077 0-384-171.923-384-384 0-4.201 0.067-8.387 0.201-12.555l-0.015 0.609c7.089-199.041 163.791-359.298 360.676-371.995l1.137-0.059h21.76c149.859 0.039 279.651 85.916 342.887 211.135l1.006 2.198c5.352 10.84 8.482 23.6 8.482 37.091 0 9.942-1.7 19.487-4.826 28.36l0.183-0.598zM527.787 469.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["palette"]},"attrs":[],"properties":{"order":5305,"id":379,"name":"palette","prevSize":32,"code":60474},"setIdx":0,"setId":0,"iconIdx":826},{"icon":{"paths":["M768 426.667h-170.667v-298.667c0-23.564-19.103-42.667-42.667-42.667v0h-213.333c-23.564 0-42.667 19.103-42.667 42.667v0 213.333h-170.667c-23.564 0-42.667 19.103-42.667 42.667v0 512c0 23.564 19.103 42.667 42.667 42.667v0h640c23.564 0 42.667-19.103 42.667-42.667v0-426.667c0-23.564-19.103-42.667-42.667-42.667v0zM298.667 853.333h-128v-426.667h128zM512 853.333h-128v-682.667h128zM725.333 853.333h-128v-341.333h128zM896 170.667h-42.667v-42.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 42.667h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h42.667v42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["panel-add"]},"attrs":[],"properties":{"order":5306,"id":378,"name":"panel-add","prevSize":32,"code":60475},"setIdx":0,"setId":0,"iconIdx":827},{"icon":{"paths":["M915.627 248.747c-2.596-17.45-15.448-31.307-32.135-35.354l-0.292-0.060h-4.693c-110.096-27.042-236.49-42.554-366.507-42.554s-256.413 15.512-377.434 44.787l10.928-2.233h-4.693c-16.64 3.932-29.35 17.215-32.387 33.872l-0.039 0.261c-14.657 79.15-23.039 170.223-23.039 263.253s8.382 184.103 24.433 272.504l-1.394-9.251c3.077 16.919 15.787 30.201 32.137 34.075l0.29 0.058h4.693c109.751 27.786 235.969 44.219 365.86 45.223l0.647 0.004c130.060-0.094 256.442-15.642 377.47-44.906l-10.963 2.239h4.693c16.64-3.932 29.35-17.215 32.387-33.872l0.039-0.261c14.729-79.342 23.152-170.634 23.152-263.893s-8.423-184.549-24.551-273.154l1.399 9.26zM836.267 732.587c-97.453 22.375-209.362 35.199-324.267 35.199s-226.813-12.824-334.374-37.118l10.108 1.919c-10.997-66.306-17.281-142.713-17.281-220.587s6.284-154.28 18.372-228.739l-1.092 8.153c97.453-22.375 209.362-35.199 324.267-35.199s226.813 12.824 334.374 37.118l-10.108-1.919c10.997 66.306 17.281 142.713 17.281 220.587s-6.284 154.28-18.372 228.739l1.092-8.153z"],"attrs":[],"grid":0,"tags":["panorama-h-alt"]},"attrs":[],"properties":{"order":5307,"id":377,"name":"panorama-h-alt","prevSize":32,"code":60476},"setIdx":0,"setId":0,"iconIdx":828},{"icon":{"paths":["M919.040 220.16c-6.703-4.59-14.987-7.33-23.911-7.33-6.828 0-13.281 1.604-19.003 4.455l0.248-0.112c-103.286 44.321-223.495 70.092-349.723 70.092-5.151 0-10.292-0.043-15.422-0.128l0.772 0.010c-4.847 0.093-10.562 0.146-16.29 0.146-126.254 0-246.486-25.781-355.718-72.367l5.928 2.247c-5.475-2.74-11.928-4.343-18.755-4.343-8.924 0-17.209 2.74-24.058 7.424l0.146-0.095c-10.91 7.831-17.934 20.478-17.934 34.767 0 0.377 0.005 0.754 0.015 1.129l-0.001-0.055v512c0.026 14.98 7.767 28.146 19.461 35.739l0.166 0.101c6.703 4.59 14.987 7.33 23.911 7.33 6.828 0 13.281-1.604 19.003-4.455l-0.248 0.112c103.286-44.321 223.495-70.092 349.723-70.092 5.151 0 10.292 0.043 15.422 0.128l-0.772-0.010c4.847-0.093 10.562-0.146 16.29-0.146 126.254 0 246.486 25.781 355.718 72.367l-5.928-2.247c5.272 2.384 11.425 3.793 17.903 3.84l0.017 0c8.565-0.023 16.532-2.566 23.203-6.927l-0.163 0.1c11.86-7.694 19.601-20.86 19.627-35.836l0-0.004v-512c-0.026-14.98-7.767-28.146-19.461-35.739l-0.166-0.101zM853.333 704.853c-98.985-33.841-213.024-53.378-331.626-53.378-3.413 0-6.821 0.016-10.226 0.048l0.519-0.004c-2.884-0.028-6.294-0.045-9.707-0.045-118.601 0-232.64 19.536-339.073 55.566l7.446-2.188v-384c98.985 33.841 213.024 53.378 331.626 53.378 3.413 0 6.821-0.016 10.226-0.048l-0.519 0.004c2.884 0.028 6.294 0.045 9.707 0.045 118.601 0 232.64-19.536 339.073-55.566l-7.446 2.188z"],"attrs":[],"grid":0,"tags":["panorama-h"]},"attrs":[],"properties":{"order":5308,"id":376,"name":"panorama-h","prevSize":32,"code":60477},"setIdx":0,"setId":0,"iconIdx":829},{"icon":{"paths":["M736.853 512c-0.11-5.238-0.172-11.412-0.172-17.6 0-125.807 25.794-245.59 72.381-354.349l-2.235 5.869c2.74-5.475 4.343-11.928 4.343-18.755 0-8.924-2.74-17.209-7.424-24.058l0.095 0.146c-7.831-10.91-20.478-17.934-34.767-17.934-0.377 0-0.754 0.005-1.129 0.015l0.055-0.001h-512c-14.98 0.026-28.146 7.767-35.739 19.461l-0.101 0.166c-4.59 6.703-7.33 14.987-7.33 23.911 0 6.828 1.604 13.281 4.455 19.003l-0.112-0.248c44.333 102.87 70.115 222.628 70.115 348.408 0 5.614-0.051 11.216-0.154 16.805l0.012-0.839c0.11 5.238 0.172 11.412 0.172 17.6 0 125.807-25.794 245.59-72.381 354.349l2.235-5.869c-2.74 5.475-4.343 11.928-4.343 18.755 0 8.924 2.74 17.209 7.424 24.058l-0.095-0.146c7.831 10.91 20.478 17.934 34.767 17.934 0.377 0 0.754-0.005 1.129-0.015l-0.055 0.001h512c14.98-0.026 28.146-7.767 35.739-19.461l0.101-0.166c4.59-6.703 7.33-14.987 7.33-23.911 0-6.828-1.604-13.281-4.455-19.003l0.112 0.248c-44.333-102.87-70.115-222.628-70.115-348.408 0-5.614 0.051-11.216 0.154-16.805l-0.012 0.839zM704.853 853.333h-384c33.841-98.985 53.378-213.024 53.378-331.626 0-3.413-0.016-6.821-0.048-10.226l0.004 0.519c0.007-1.392 0.010-3.040 0.010-4.688 0-120.461-20.154-236.216-57.273-344.075l2.223 7.43h384c-33.841 98.985-53.378 213.024-53.378 331.626 0 3.413 0.016 6.821 0.048 10.226l-0.004-0.519c-0.007 1.392-0.010 3.040-0.010 4.688 0 120.461 20.154 236.216 57.273 344.075l-2.223-7.43z"],"attrs":[],"grid":0,"tags":["panorama-v"]},"attrs":[],"properties":{"order":5309,"id":375,"name":"panorama-v","prevSize":32,"code":60478},"setIdx":0,"setId":0,"iconIdx":830},{"icon":{"paths":["M771.413 529.92l-263.68 264.107c-31.872 28.422-74.136 45.791-120.458 45.791-100.148 0-181.333-81.186-181.333-181.333 0-46.321 17.368-88.586 45.948-120.637l-0.157 0.179 341.333-341.333c19.623-18.667 46.23-30.151 75.52-30.151s55.897 11.484 75.566 30.195l-0.046-0.043c19.156 19.405 30.987 46.081 30.987 75.52s-11.831 56.115-30.998 75.532l0.011-0.012-294.4 293.973c-5.971 6.417-14.465 10.419-23.893 10.419-18.008 0-32.606-14.598-32.606-32.606 0-8.579 3.314-16.385 8.731-22.207l-0.018 0.020 218.88-218.453c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l0-0-218.88 219.307c-21.348 21.188-34.564 50.544-34.564 82.987s13.215 61.799 34.556 82.98l0.007 0.007c21.546 20.552 50.789 33.199 82.987 33.199s61.441-12.647 83.034-33.244l-0.048 0.045 293.973-294.4c31.928-34.194 51.531-80.253 51.531-130.891 0-106.039-85.961-192-192-192-50.637 0-96.696 19.603-131.002 51.634l0.112-0.103-341.333 341.333c-42.641 47.087-68.739 109.849-68.739 178.706 0 147.276 119.391 266.667 266.667 266.667 70.131 0 133.939-27.073 181.544-71.337l-0.165 0.151 264.107-263.68c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l-0 0z"],"attrs":[],"grid":0,"tags":["paperclip"]},"attrs":[],"properties":{"order":5310,"id":374,"name":"paperclip","prevSize":32,"code":60479},"setIdx":0,"setId":0,"iconIdx":831},{"icon":{"paths":["M298.667 597.333h85.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-85.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM554.667 682.667h-256c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h256c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM810.667 85.333h-597.333c-70.692 0-128 57.308-128 128v0 597.333c0 70.692 57.308 128 128 128v0h597.333c70.692 0 128-57.308 128-128v0-597.333c0-70.692-57.308-128-128-128v0zM597.333 170.667v140.373l-64.427-35.84c-6.12-3.594-13.479-5.716-21.333-5.716s-15.214 2.123-21.535 5.825l0.201-0.109-63.573 35.84v-140.373zM853.333 810.667c0 23.564-19.103 42.667-42.667 42.667v0h-597.333c-23.564 0-42.667-19.103-42.667-42.667v0-597.333c0-23.564 19.103-42.667 42.667-42.667v0h128v213.333c0.097 15.61 8.562 29.222 21.132 36.584l0.201 0.109c6.12 3.594 13.479 5.716 21.333 5.716s15.214-2.123 21.535-5.825l-0.201 0.109 106.667-59.307 107.093 59.733c6.011 3.467 13.216 5.522 20.9 5.547l0.007 0c23.564 0 42.667-19.103 42.667-42.667v0-213.333h128c23.564 0 42.667 19.103 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["parcel"]},"attrs":[],"properties":{"order":5311,"id":373,"name":"parcel","prevSize":32,"code":60480},"setIdx":0,"setId":0,"iconIdx":832},{"icon":{"paths":["M554.667 576h-426.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h426.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM896 362.667h-768c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h768c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["paragraph"]},"attrs":[],"properties":{"order":5312,"id":372,"name":"paragraph","prevSize":32,"code":60481},"setIdx":0,"setId":0,"iconIdx":833},{"icon":{"paths":["M554.667 298.667h-128c-23.564 0-42.667 19.103-42.667 42.667v0 341.333c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-85.333h85.333c70.692 0 128-57.308 128-128v0-42.667c0-70.692-57.308-128-128-128v0zM597.333 469.333c0 23.564-19.103 42.667-42.667 42.667v0h-85.333v-128h85.333c23.564 0 42.667 19.103 42.667 42.667v0zM512 85.333c-235.641 0-426.667 191.025-426.667 426.667s191.025 426.667 426.667 426.667c235.641 0 426.667-191.025 426.667-426.667v0c0-235.641-191.025-426.667-426.667-426.667v0zM512 853.333c-188.513 0-341.333-152.82-341.333-341.333s152.82-341.333 341.333-341.333c188.513 0 341.333 152.82 341.333 341.333v0c0 188.513-152.82 341.333-341.333 341.333v0z"],"attrs":[],"grid":0,"tags":["parking-circle"]},"attrs":[],"properties":{"order":5313,"id":371,"name":"parking-circle","prevSize":32,"code":60482},"setIdx":0,"setId":0,"iconIdx":834},{"icon":{"paths":["M512 256h-128c-23.564 0-42.667 19.103-42.667 42.667v0 426.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-128h85.333c94.257 0 170.667-76.41 170.667-170.667s-76.41-170.667-170.667-170.667v0zM512 512h-85.333v-170.667h85.333c47.128 0 85.333 38.205 85.333 85.333s-38.205 85.333-85.333 85.333v0zM810.667 85.333h-597.333c-70.692 0-128 57.308-128 128v0 597.333c0 70.692 57.308 128 128 128v0h597.333c70.692 0 128-57.308 128-128v0-597.333c0-70.692-57.308-128-128-128v0zM853.333 810.667c0 23.564-19.103 42.667-42.667 42.667v0h-597.333c-23.564 0-42.667-19.103-42.667-42.667v0-597.333c0-23.564 19.103-42.667 42.667-42.667v0h597.333c23.564 0 42.667 19.103 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["parking-square"]},"attrs":[],"properties":{"order":5314,"id":370,"name":"parking-square","prevSize":32,"code":60483},"setIdx":0,"setId":0,"iconIdx":835},{"icon":{"paths":["M896 321.707h-193.707v-193.707c0-23.564-19.103-42.667-42.667-42.667v0h-531.627c-23.564 0-42.667 19.103-42.667 42.667v0 531.627c0 23.564 19.103 42.667 42.667 42.667v0h193.707v193.707c-0 23.564 19.103 42.667 42.667 42.667v0h531.627c23.564 0 42.667-19.103 42.667-42.667v0-531.627c0-23.564-19.103-42.667-42.667-42.667v0zM853.333 853.333h-446.293v-193.707c0-23.564-19.103-42.667-42.667-42.667v0h-193.707v-446.293h446.293v193.707c0 23.564 19.103 42.667 42.667 42.667v0h193.707z"],"attrs":[],"grid":0,"tags":["pathfinder-unite"]},"attrs":[],"properties":{"order":5315,"id":369,"name":"pathfinder-unite","prevSize":32,"code":60484},"setIdx":0,"setId":0,"iconIdx":836},{"icon":{"paths":["M170.667 616.96c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 42.667c0 23.564 19.103 42.667 42.667 42.667v0h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM349.013 170.667h89.6c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-89.6c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM616.96 170.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667c0-23.564-19.103-42.667-42.667-42.667v0h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM170.667 85.333h-42.667c-23.564 0-42.667 19.103-42.667 42.667v0 42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM128 481.28c23.564 0 42.667-19.103 42.667-42.667v0-89.6c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 89.6c0 23.564 19.103 42.667 42.667 42.667v0zM674.987 853.333h-89.6c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h89.6c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM896 321.707h-42.667c-23.564-0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667h-0c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667c0-23.564-19.103-42.667-42.667-42.667v0zM896 542.72c-23.564 0-42.667 19.103-42.667 42.667v0 89.6c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-89.6c0-23.564-19.103-42.667-42.667-42.667v0zM702.293 321.707c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0h-252.587c-23.564-0-42.667 19.103-42.667 42.667v0 252.587c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0h252.587c23.564 0 42.667-19.103 42.667-42.667v0-252.587c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM616.96 616.96h-209.92v-209.92h209.92zM896 810.667c-23.564 0-42.667 19.103-42.667 42.667v0c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h42.667c23.564 0 42.667-19.103 42.667-42.667v0-42.667c0-23.564-19.103-42.667-42.667-42.667v0zM407.040 853.333c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 42.667c0 23.564 19.103 42.667 42.667 42.667v0h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["pathfinder"]},"attrs":[],"properties":{"order":5316,"id":368,"name":"pathfinder","prevSize":32,"code":60485},"setIdx":0,"setId":0,"iconIdx":837},{"icon":{"paths":["M426.667 298.667c-23.564 0-42.667 19.103-42.667 42.667v0 341.333c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-341.333c0-23.564-19.103-42.667-42.667-42.667v0zM512 85.333c-235.641 0-426.667 191.025-426.667 426.667s191.025 426.667 426.667 426.667c235.641 0 426.667-191.025 426.667-426.667v0c0-235.641-191.025-426.667-426.667-426.667v0zM512 853.333c-188.513 0-341.333-152.82-341.333-341.333s152.82-341.333 341.333-341.333c188.513 0 341.333 152.82 341.333 341.333v0c0 188.513-152.82 341.333-341.333 341.333v0zM597.333 298.667c-23.564 0-42.667 19.103-42.667 42.667v0 341.333c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-341.333c0-23.564-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["pause-circle"]},"attrs":[],"properties":{"order":5317,"id":367,"name":"pause-circle","prevSize":32,"code":60486},"setIdx":0,"setId":0,"iconIdx":838},{"icon":{"paths":["M682.667 85.333c-70.692 0-128 57.308-128 128v0 597.333c0 70.692 57.308 128 128 128s128-57.308 128-128v0-597.333c0-70.692-57.308-128-128-128v0zM725.333 810.667c0 23.564-19.103 42.667-42.667 42.667s-42.667-19.103-42.667-42.667v0-597.333c0-23.564 19.103-42.667 42.667-42.667s42.667 19.103 42.667 42.667v0zM341.333 85.333c-70.692 0-128 57.308-128 128v0 597.333c0 70.692 57.308 128 128 128s128-57.308 128-128v0-597.333c0-70.692-57.308-128-128-128v0zM384 810.667c0 23.564-19.103 42.667-42.667 42.667s-42.667-19.103-42.667-42.667v0-597.333c0-23.564 19.103-42.667 42.667-42.667s42.667 19.103 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["pause"]},"attrs":[],"properties":{"order":5318,"id":366,"name":"pause","prevSize":32,"code":60487},"setIdx":0,"setId":0,"iconIdx":839},{"icon":{"paths":["M871.981 303.125c-7.348-8.214-15.348-15.551-24.016-22.045l-0.424-0.304c1.033-7.665 1.622-16.525 1.622-25.523 0-51.556-19.352-98.593-51.188-134.242l0.173 0.197c-46.25-52.125-125.083-78.542-234.333-78.542h-265.125c-39.974 0.11-73.109 29.252-79.436 67.447l-0.064 0.47-110.5 700c-0.566 3.232-0.89 6.954-0.89 10.751 0 36.128 29.287 65.415 65.415 65.415 0.049 0 0.098-0 0.148-0l-0.008 0h113.668l-3.499 22.208c-0.49 2.943-0.77 6.334-0.77 9.79 0 34.556 28.006 62.571 62.559 62.585l138.001 0c0.178 0.002 0.389 0.002 0.6 0.002 37.109 0 67.936-26.899 74.045-62.264l0.064-0.447 27.334-172 0.458-2.333h12.75c172.042 0 279.5-85.042 310.833-245.875 5.443-18.207 8.575-39.128 8.575-60.78 0-50.898-17.308-97.753-46.361-135l0.367 0.489zM334.606 584.708l-30.484 193.505-3.683 23.203h-103.916l106.292-673.417h261c82.583 0 141.542 17.25 170.333 49.667 19.024 22.021 30.612 50.927 30.612 82.54 0 12.133-1.707 23.867-4.894 34.976l0.219-0.893-0.794 4.789c-0.518 3.263-0.99 6.451-1.852 10.505-8.743 63.109-39.98 117.663-85.209 156.323l-0.343 0.286c-45.383 31.911-101.792 51-162.66 51-6.082 0-12.119-0.191-18.106-0.566l0.819 0.041h-77.792c-0.080-0-0.174-0-0.268-0-40.002 0-73.164 29.286-79.214 67.587l-0.059 0.455zM825.647 482.083c-23.5 120.666-95.666 176.875-227.083 176.875h-20.625c-0.173-0.001-0.379-0.002-0.584-0.002-37.153 0-68.008 26.964-74.063 62.391l-0.063 0.445-27.708 173.833-103.582 0.375 20.401-129.445 26.075-164.388h73.357c6.69 0 12.604-1.005 19.12-1.234 15.31-0.529 30.575-1.117 44.914-2.896 8.758-1.091 16.794-3.081 25.188-4.638 11.628-2.149 23.263-4.273 34.179-7.308 8.122-2.261 15.701-5.172 23.427-7.919 10.208-3.622 20.258-7.424 29.763-11.89 7.168-3.375 13.998-7.128 20.761-10.977 10.229-5.818 18.76-11.345 26.967-17.293l-0.84 0.579c6.071-4.378 12.029-8.87 17.707-13.696 8.21-7.1 15.685-14.332 22.741-21.956l0.168-0.184c4.821-5.143 9.758-10.135 14.221-15.669 6.793-8.573 13.546-18.215 19.731-28.246l0.749-1.306c3.263-5.213 6.88-10.036 9.883-15.523 7.686-13.696 15.171-29.921 21.419-46.747l0.8-2.459c0.37-1.018 0.899-1.877 1.26-2.901 0.171-0.479 0.422-0.878 0.591-1.359 4.216 14.66 6.64 31.499 6.64 48.904 0 15.853-2.011 31.237-5.793 45.909l0.278-1.272z"],"attrs":[],"grid":0,"tags":["paypal"]},"attrs":[],"properties":{"order":5319,"id":365,"name":"paypal","prevSize":32,"code":60488},"setIdx":0,"setId":0,"iconIdx":840},{"icon":{"paths":["M938.667 308.907c0-0.073 0.001-0.16 0.001-0.247 0-11.721-4.726-22.338-12.377-30.049l0.003 0.003-180.907-180.907c-7.709-7.648-18.326-12.374-30.047-12.374-0.087 0-0.173 0-0.26 0.001l0.013-0c-0.073-0-0.16-0.001-0.247-0.001-11.721 0-22.338 4.726-30.049 12.377l0.003-0.003-587.093 587.093c-7.648 7.709-12.374 18.326-12.374 30.047 0 0.087 0 0.173 0.001 0.26l-0-0.013v180.907c0 23.564 19.103 42.667 42.667 42.667v0h180.907c0.692 0.040 1.502 0.063 2.317 0.063 11.752 0 22.394-4.751 30.111-12.438l-0.001 0.001 463.787-466.347 121.173-118.613c3.779-4.005 6.928-8.657 9.257-13.762l0.13-0.318c0.196-1.537 0.308-3.315 0.308-5.12s-0.112-3.583-0.329-5.328l0.021 0.208c0.095-0.896 0.15-1.935 0.15-2.987s-0.054-2.091-0.16-3.115l0.011 0.128zM291.413 853.333h-120.747v-120.747l423.68-423.68 120.747 120.747zM775.253 369.493l-120.747-120.747 60.587-60.16 120.32 120.32z"],"attrs":[],"grid":0,"tags":["pen"]},"attrs":[],"properties":{"order":5320,"id":364,"name":"pen","prevSize":32,"code":60489},"setIdx":0,"setId":0,"iconIdx":841},{"icon":{"paths":["M921.173 391.253l-384-279.040c-6.96-5.134-15.707-8.217-25.173-8.217s-18.213 3.083-25.291 8.3l0.117-0.083-384 279.040c-10.659 7.851-17.497 20.353-17.497 34.452 0 4.768 0.782 9.354 2.225 13.635l-0.088-0.301 146.773 451.413c5.728 17.261 21.727 29.491 40.581 29.491 0.733 0 1.463-0.019 2.187-0.055l-0.102 0.004h472.32c0.623 0.032 1.352 0.051 2.085 0.051 18.855 0 34.853-12.23 40.495-29.19l0.087-0.301 146.773-451.413c1.115-3.628 1.757-7.799 1.757-12.12 0-14.849-7.586-27.927-19.093-35.569l-0.157-0.098zM718.507 834.56h-413.013l-128-392.533 334.507-242.347 333.653 242.347z"],"attrs":[],"grid":0,"tags":["pentagon"]},"attrs":[],"properties":{"order":5321,"id":363,"name":"pentagon","prevSize":32,"code":60490},"setIdx":0,"setId":0,"iconIdx":842},{"icon":{"paths":["M331 459c70.692 0 128-57.308 128-128s-57.308-128-128-128c-70.692 0-128 57.308-128 128v0c0.080 70.66 57.339 127.92 127.992 128l0.008 0zM331 288.333c23.564 0 42.667 19.103 42.667 42.667s-19.103 42.667-42.667 42.667c-23.564 0-42.667-19.103-42.667-42.667v0c0.016-23.558 19.109-42.65 42.665-42.667l0.002-0zM693 565c-70.692 0-128 57.308-128 128s57.308 128 128 128c70.692 0 128-57.308 128-128v0c-0.080-70.66-57.339-127.92-127.992-128l-0.008-0zM693 735.667c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667c23.564 0 42.667 19.103 42.667 42.667v0c-0.016 23.558-19.109 42.65-42.665 42.667l-0.002 0zM840.832 183.168c-7.719-7.723-18.385-12.5-30.167-12.5s-22.448 4.777-30.166 12.5l-597.334 597.334c-7.834 7.739-12.685 18.48-12.685 30.355 0 23.562 19.1 42.662 42.662 42.662 11.875 0 22.618-4.852 30.352-12.682l0.004-0.004 597.333-597.333c7.722-7.719 12.499-18.384 12.499-30.165s-4.777-22.446-12.499-30.165l-0-0z"],"attrs":[],"grid":0,"tags":["percentage"]},"attrs":[],"properties":{"order":5322,"id":362,"name":"percentage","prevSize":32,"code":60491},"setIdx":0,"setId":0,"iconIdx":843},{"icon":{"paths":["M829.44 554.667c-9.387 0-19.2-2.987-28.587-5.12-21.902-4.865-40.587-10.588-58.643-17.576l2.75 0.936c-8.677-3.257-18.705-5.142-29.174-5.142-33.468 0-62.435 19.267-76.416 47.314l-0.223 0.495-9.387 19.2c-43.295-24.339-80.587-52.66-113.523-85.363l0.030 0.030c-32.673-32.906-60.995-70.199-83.986-110.901l-1.347-2.593 17.92-11.947c28.542-14.205 47.808-43.172 47.808-76.64 0-10.468-1.885-20.497-5.334-29.763l0.192 0.59c-5.868-15.079-11.586-33.757-16.055-52.915l-0.585-2.978c-2.133-9.387-3.84-19.2-5.12-29.013-10.754-60.726-63.13-106.254-126.139-106.254-0.654 0-1.307 0.005-1.959 0.015l0.099-0.001h-128c-0.357-0.004-0.779-0.006-1.202-0.006-70.692 0-128 57.308-128 128 0 6.172 0.437 12.242 1.281 18.18l-0.079-0.681c48.095 367.748 336.77 655.549 700.837 701.876l4.017 0.417h16.213c0.056 0 0.122 0 0.188 0 32.752 0 62.631-12.301 85.269-32.536l-0.124 0.109c26.238-23.54 42.668-57.555 42.668-95.407 0-0.209-0-0.417-0.001-0.625l0 0.032v-128c-1.124-61.764-45.825-112.764-104.599-123.613l-0.788-0.121zM850.773 810.667c-0.017 12.731-5.606 24.153-14.46 31.96l-0.047 0.040c-7.553 6.9-17.65 11.127-28.735 11.127-2.206 0-4.373-0.167-6.489-0.49l0.237 0.030c-328.712-43.345-585.857-301.508-627.254-627.021l-0.373-3.593c-0.173-1.507-0.272-3.254-0.272-5.023 0-11.447 4.136-21.929 10.995-30.031l-0.056 0.068c7.847-8.9 19.269-14.49 31.997-14.507l0.003-0h128c0.283-0.007 0.615-0.011 0.949-0.011 20.394 0 37.446 14.308 41.665 33.434l0.052 0.283q2.56 17.493 6.4 34.56c5.721 25.899 12.474 48.010 20.728 69.374l-1.101-3.241-59.733 27.733c-14.801 6.91-24.874 21.669-24.874 38.78 0 6.52 1.463 12.699 4.078 18.226l-0.11-0.259c62.648 132.060 166.607 236.019 294.925 297.065l3.741 1.602c4.793 2.024 10.366 3.201 16.213 3.201s11.42-1.176 16.495-3.305l-0.281 0.105c10.842-3.955 19.439-11.858 24.21-21.927l0.11-0.259 26.453-59.733c17.866 6.724 40.404 13.471 63.467 18.851l3.947 0.776q17.067 3.84 34.56 6.4c19.409 4.271 33.717 21.324 33.717 41.718 0 0.334-0.004 0.667-0.011 0.999l0.001-0.049zM810.667 426.667c23.564 0 42.667-19.103 42.667-42.667v0-170.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 170.667c0 23.564 19.103 42.667 42.667 42.667v0zM640 426.667c23.564 0 42.667-19.103 42.667-42.667v0-170.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 170.667c0 23.564 19.103 42.667 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["phone-pause"]},"attrs":[],"properties":{"order":5323,"id":361,"name":"phone-pause","prevSize":32,"code":60492},"setIdx":0,"setId":0,"iconIdx":844},{"icon":{"paths":["M829.44 554.667c-9.387 0-19.2-2.987-28.587-5.12-21.902-4.865-40.587-10.588-58.643-17.576l2.75 0.936c-8.677-3.257-18.705-5.142-29.174-5.142-33.468 0-62.435 19.267-76.416 47.314l-0.223 0.495-9.387 19.2c-43.295-24.339-80.587-52.66-113.523-85.363l0.030 0.030c-32.673-32.906-60.995-70.199-83.986-110.901l-1.347-2.593 17.92-11.947c28.542-14.205 47.808-43.172 47.808-76.64 0-10.468-1.885-20.497-5.334-29.763l0.192 0.59c-5.868-15.079-11.586-33.757-16.055-52.915l-0.585-2.978c-2.133-9.387-3.84-19.2-5.12-29.013-10.754-60.726-63.13-106.254-126.139-106.254-0.654 0-1.307 0.005-1.959 0.015l0.099-0.001h-128c-0.357-0.004-0.779-0.006-1.202-0.006-70.692 0-128 57.308-128 128 0 6.172 0.437 12.242 1.281 18.18l-0.079-0.681c48.095 367.748 336.77 655.549 700.837 701.876l4.017 0.417h16.213c0.056 0 0.122 0 0.188 0 32.752 0 62.631-12.301 85.269-32.536l-0.124 0.109c26.238-23.54 42.668-57.555 42.668-95.407 0-0.209-0-0.417-0.001-0.625l0 0.032v-128c-1.124-61.764-45.825-112.764-104.599-123.613l-0.788-0.121zM850.773 810.667c-0.017 12.731-5.606 24.153-14.46 31.96l-0.047 0.040c-7.878 6.831-18.231 10.994-29.556 10.994-1.914 0-3.8-0.119-5.652-0.35l0.221 0.022c-328.712-43.345-585.857-301.508-627.254-627.021l-0.373-3.593c-0.173-1.507-0.272-3.254-0.272-5.023 0-11.447 4.136-21.929 10.995-30.031l-0.056 0.068c7.847-8.9 19.269-14.49 31.997-14.507l0.003-0h128c0.283-0.007 0.615-0.011 0.949-0.011 20.394 0 37.446 14.308 41.665 33.434l0.052 0.283q2.56 17.493 6.4 34.56c5.721 25.899 12.474 48.010 20.728 69.374l-1.101-3.241-59.733 27.733c-14.801 6.91-24.874 21.669-24.874 38.78 0 6.52 1.463 12.699 4.078 18.226l-0.11-0.259c62.648 132.060 166.607 236.019 294.925 297.065l3.741 1.602c4.793 2.024 10.366 3.201 16.213 3.201s11.42-1.176 16.495-3.305l-0.281 0.105c10.842-3.955 19.439-11.858 24.21-21.927l0.11-0.259 26.453-59.733c17.866 6.724 40.404 13.471 63.467 18.851l3.947 0.776q17.067 3.84 34.56 6.4c19.409 4.271 33.717 21.324 33.717 41.718 0 0.334-0.004 0.667-0.011 0.999l0.001-0.049z"],"attrs":[],"grid":0,"tags":["phone-alt"]},"attrs":[],"properties":{"order":5324,"id":360,"name":"phone-alt","prevSize":32,"code":60493},"setIdx":0,"setId":0,"iconIdx":845},{"icon":{"paths":["M209.493 558.933c7.665 12.121 20.997 20.053 36.181 20.053 0.030 0 0.060-0 0.090-0l-0.005 0c0.364 0.011 0.792 0.018 1.222 0.018 23.564 0 42.667-19.103 42.667-42.667 0-9.106-2.853-17.546-7.713-24.474l0.091 0.137c-53.351-83.493-90.646-182.369-104.974-288.531l-0.412-3.735c-0.297-1.891-0.467-4.073-0.467-6.293 0-10.863 4.060-20.778 10.745-28.311l-0.038 0.044c7.847-8.9 19.269-14.49 31.997-14.507l0.003-0h128c0.256-0.006 0.558-0.009 0.86-0.009 20.547 0 37.701 14.523 41.758 33.864l0.049 0.278c0 9.813 3.413 18.773 5.547 28.587v5.547c5.723 25.574 12.618 47.529 21.105 68.673l-1.051-2.967-59.307 28.16c-10.328 4.881-18.232 13.478-22.092 24.024l-0.095 0.296c-2.080 4.852-3.289 10.498-3.289 16.427s1.209 11.575 3.394 16.706l-0.106-0.279c4.267 8.96 8.533 17.92 13.653 27.307 7.488 12.956 21.275 21.534 37.066 21.534 7.877 0 15.255-2.134 21.588-5.856l-0.2 0.109c12.906-7.5 21.445-21.26 21.445-37.015 0-1.088-0.041-2.166-0.121-3.234l0.009 0.142 24.32-8.96c29.539-13.844 49.632-43.329 49.632-77.506 0-10.145-1.77-19.876-5.019-28.902l0.187 0.595c-6.057-15.205-11.779-33.743-16.129-52.804l-0.511-2.662v-4.267c0-8.533-3.413-17.067-4.693-24.747-9.847-61.748-62.722-108.374-126.486-108.374-0.082 0-0.164 0-0.246 0l0.013-0h-128c-0.554-0.009-1.208-0.014-1.862-0.014-37.858 0-71.877 16.436-95.312 42.561l-0.106 0.12c-19.814 22.431-31.91 52.084-31.91 84.562 0 6.141 0.432 12.181 1.269 18.091l-0.079-0.679c16.047 123.605 57.617 234.948 119.301 332.285l-1.968-3.325zM832.853 549.973l-25.6-4.693h-3.413c-22.154-4.78-41.137-10.51-59.465-17.559l2.719 0.919c-8.574-3.174-18.478-5.011-28.811-5.011-33.416 0-62.346 19.208-76.352 47.185l-0.223 0.493-8.96 19.627c-30.99-18.077-57.785-37.399-82.55-58.991l0.63 0.538 375.467-375.040c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l-768 768c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 195.84-196.267c118.046 106.406 268.493 178.991 434.856 201.353l4.184 0.46c2.554 0.202 5.53 0.318 8.533 0.318s5.979-0.115 8.924-0.342l-0.391 0.024c0.198 0.001 0.433 0.002 0.667 0.002 32.527 0 62.22-12.133 84.801-32.119l-0.135 0.117c26.238-23.54 42.668-57.555 42.668-95.407 0-0.209-0-0.417-0.001-0.625l0 0.032v-128c-0.489-62.296-45.405-113.958-104.599-124.892l-0.788-0.121zM853.333 805.973c-0.017 12.731-5.606 24.153-14.46 31.96l-0.047 0.040c-7.488 6.647-17.403 10.707-28.267 10.707-2.221 0-4.402-0.17-6.531-0.497l0.238 0.030c-151.335-20.314-284.899-84.42-390.678-178.966l0.705 0.619 75.52-75.52c41.676 36.484 89.125 67.968 140.456 92.664l3.757 1.629c4.852 2.080 10.498 3.289 16.427 3.289s11.575-1.209 16.706-3.394l-0.279 0.106c10.842-3.955 19.439-11.858 24.21-21.927l0.11-0.259 26.453-60.16c18.577 7.212 41.405 14.112 64.842 19.403l3.424 0.65h4.693l29.44 5.547c19.198 4.434 33.293 21.383 33.293 41.624 0 0.367-0.005 0.732-0.014 1.096l0.001-0.054z"],"attrs":[],"grid":0,"tags":["phone-slash"]},"attrs":[],"properties":{"order":5325,"id":359,"name":"phone-slash","prevSize":32,"code":60494},"setIdx":0,"setId":0,"iconIdx":846},{"icon":{"paths":["M846.933 237.227l76.373-76.373c9.153-7.872 14.914-19.467 14.914-32.407 0-23.564-19.103-42.667-42.667-42.667-12.94 0-24.535 5.761-32.36 14.858l-0.047 0.056-76.373 76.373-76.8-76.373c-7.412-6.377-17.129-10.259-27.753-10.259-23.564 0-42.667 19.103-42.667 42.667 0 10.624 3.883 20.341 10.307 27.809l-0.047-0.056 75.52 76.373-76.373 76.8c-7.668 7.712-12.407 18.343-12.407 30.080s4.74 22.368 12.409 30.082l-0.002-0.002c7.712 7.668 18.343 12.407 30.080 12.407s22.368-4.74 30.082-12.409l-0.002 0.002 77.653-75.52 76.373 76.373c7.712 7.668 18.343 12.407 30.080 12.407s22.368-4.74 30.082-12.409l-0.002 0.002c7.668-7.712 12.407-18.343 12.407-30.080s-4.74-22.368-12.409-30.082l0.002 0.002zM829.44 554.667c-9.387 0-19.2-2.987-28.587-5.12-21.902-4.865-40.587-10.588-58.643-17.576l2.75 0.936c-8.677-3.257-18.705-5.142-29.174-5.142-33.468 0-62.435 19.267-76.416 47.314l-0.223 0.495-9.387 19.2c-43.295-24.339-80.587-52.66-113.523-85.363l0.030 0.030c-32.673-32.906-60.995-70.199-83.986-110.901l-1.347-2.593 17.92-11.947c28.542-14.205 47.808-43.172 47.808-76.64 0-10.468-1.885-20.497-5.334-29.763l0.192 0.59c-5.868-15.079-11.586-33.757-16.055-52.915l-0.585-2.978c-2.133-9.387-3.84-19.2-5.12-29.013-10.754-60.726-63.13-106.254-126.139-106.254-0.654 0-1.307 0.005-1.959 0.015l0.099-0.001h-128c-0.357-0.004-0.779-0.006-1.202-0.006-70.692 0-128 57.308-128 128 0 6.172 0.437 12.242 1.281 18.18l-0.079-0.681c48.095 367.748 336.77 655.549 700.837 701.876l4.017 0.417h16.213c0.056 0 0.122 0 0.188 0 32.752 0 62.631-12.301 85.269-32.536l-0.124 0.109c26.238-23.54 42.668-57.555 42.668-95.407 0-0.209-0-0.417-0.001-0.625l0 0.032v-128c-1.124-61.764-45.825-112.764-104.599-123.613l-0.788-0.121zM850.773 810.667c-0.017 12.731-5.606 24.153-14.46 31.96l-0.047 0.040c-7.878 6.831-18.231 10.994-29.556 10.994-1.914 0-3.8-0.119-5.652-0.35l0.221 0.022c-328.712-43.345-585.857-301.508-627.254-627.021l-0.373-3.593c-0.173-1.507-0.272-3.254-0.272-5.023 0-11.447 4.136-21.929 10.995-30.031l-0.056 0.068c7.847-8.9 19.269-14.49 31.997-14.507l0.003-0h128c0.283-0.007 0.615-0.011 0.949-0.011 20.394 0 37.446 14.308 41.665 33.434l0.052 0.283q2.56 17.493 6.4 34.56c5.721 25.899 12.474 48.010 20.728 69.374l-1.101-3.241-59.733 27.733c-14.801 6.91-24.874 21.669-24.874 38.78 0 6.52 1.463 12.699 4.078 18.226l-0.11-0.259c62.648 132.060 166.607 236.019 294.925 297.065l3.741 1.602c4.793 2.024 10.366 3.201 16.213 3.201s11.42-1.176 16.495-3.305l-0.281 0.105c10.842-3.955 19.439-11.858 24.21-21.927l0.11-0.259 26.453-59.733c17.866 6.724 40.404 13.471 63.467 18.851l3.947 0.776q17.067 3.84 34.56 6.4c19.409 4.271 33.717 21.324 33.717 41.718 0 0.334-0.004 0.667-0.011 0.999l0.001-0.049z"],"attrs":[],"grid":0,"tags":["phone-times"]},"attrs":[],"properties":{"order":5326,"id":358,"name":"phone-times","prevSize":32,"code":60495},"setIdx":0,"setId":0,"iconIdx":847},{"icon":{"paths":["M828.16 554.667c-9.387 0-19.2-2.987-28.587-5.12-22.013-4.957-40.694-10.678-58.775-17.611l2.882 0.971c-8.677-3.257-18.705-5.142-29.174-5.142-33.468 0-62.435 19.267-76.416 47.314l-0.223 0.495-9.387 19.627c-43.301-24.804-80.684-53.083-114.061-85.469l0.141 0.136c-32.25-33.236-60.529-70.619-83.887-111.195l-1.447-2.725 19.627-8.96c28.542-14.205 47.808-43.172 47.808-76.64 0-10.468-1.885-20.497-5.334-29.763l0.192 0.59c-5.864-15.179-11.584-34.004-16.053-53.309l-0.587-3.011c-2.133-9.387-3.84-19.2-5.12-28.587-10.754-60.726-63.13-106.254-126.139-106.254-0.654 0-1.307 0.005-1.959 0.015l0.099-0.001h-128.427c-0.050-0-0.109-0-0.168-0-37.852 0-71.866 16.43-95.3 42.547l-0.106 0.12c-20.067 22.499-32.33 52.336-32.33 85.037 0 6.124 0.43 12.147 1.262 18.042l-0.078-0.678c24.761 184.743 108.284 346.528 230.841 469.347l-0.014-0.014c122.806 122.542 284.59 206.066 465.15 230.366l4.184 0.461c2.491 0.202 5.392 0.317 8.32 0.317s5.829-0.115 8.699-0.341l-0.379 0.024c0.056 0 0.122 0 0.188 0 32.752 0 62.631-12.301 85.269-32.536l-0.124 0.109c26.237-23.54 42.667-57.554 42.667-95.406 0-0.059-0-0.118-0-0.177l0 0.009v-128c-0.496-61.523-44.32-112.669-102.432-124.448l-0.822-0.139zM849.067 810.667c-0.031 12.513-5.443 23.756-14.043 31.541l-0.037 0.033c-7.553 6.9-17.65 11.127-28.735 11.127-2.206 0-4.373-0.167-6.489-0.49l0.237 0.030c-165.663-22.203-310.786-96.906-421.16-206.546l0.040 0.040c-110.471-110.471-185.803-256.080-207.795-418.623l-0.418-3.777c-0.293-1.879-0.46-4.046-0.46-6.252 0-11.085 4.227-21.182 11.157-28.768l-0.030 0.033c7.84-8.662 19.125-14.081 31.675-14.081 0.114 0 0.228 0 0.342 0.001l-0.017-0h128c0.31-0.008 0.676-0.013 1.042-0.013 20.241 0 37.19 14.095 41.568 33.005l0.056 0.288c0 11.52 3.84 23.467 6.4 34.987 5.722 25.726 12.472 47.69 20.721 68.906l-1.095-3.199-59.733 28.16c-10.256 4.787-18.139 13.224-22.089 23.6l-0.098 0.293c-2.024 4.793-3.201 10.366-3.201 16.213s1.176 11.42 3.305 16.495l-0.105-0.281c62.648 132.060 166.607 236.019 294.925 297.065l3.741 1.602c4.793 2.024 10.366 3.201 16.213 3.201s11.42-1.176 16.495-3.305l-0.281 0.105c10.67-4.048 19.107-11.931 23.783-21.925l0.11-0.262 26.88-59.733c18.204 6.96 40.749 13.712 63.869 18.951l3.545 0.675c11.093 2.56 23.040 4.693 34.56 6.4 19.198 4.434 33.293 21.383 33.293 41.624 0 0.367-0.005 0.732-0.014 1.096l0.001-0.054zM597.333 85.333c-9.813 0-20.053 0-29.867 0-22.036 1.929-39.194 20.294-39.194 42.667 0 23.649 19.171 42.821 42.821 42.821 1.277 0 2.54-0.056 3.789-0.165l-0.162 0.011h22.613c141.385 0 256 114.615 256 256v0c0 7.68 0 14.933 0 22.613-0.095 1.070-0.15 2.315-0.15 3.573 0 22.265 17.054 40.547 38.813 42.495l0.164 0.012h3.413c0.051 0 0.112 0 0.173 0 22.212 0 40.46-16.974 42.481-38.658l0.013-0.169c0-9.813 0-20.053 0-29.867 0-188.363-152.577-341.090-340.883-341.333l-0.023-0zM682.667 426.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0c0-94.257-76.41-170.667-170.667-170.667v0c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0c47.128 0 85.333 38.205 85.333 85.333v0z"],"attrs":[],"grid":0,"tags":["phone-volume"]},"attrs":[],"properties":{"order":5327,"id":357,"name":"phone-volume","prevSize":32,"code":60496},"setIdx":0,"setId":0,"iconIdx":848},{"icon":{"paths":["M829.44 554.667c-9.387 0-19.2-2.987-28.587-5.12-21.902-4.865-40.587-10.588-58.643-17.576l2.75 0.936c-8.677-3.257-18.705-5.142-29.174-5.142-33.468 0-62.435 19.267-76.416 47.314l-0.223 0.495-9.387 19.2c-43.295-24.339-80.587-52.66-113.523-85.363l0.030 0.030c-32.673-32.906-60.995-70.199-83.986-110.901l-1.347-2.593 17.92-11.947c28.542-14.205 47.808-43.172 47.808-76.64 0-10.468-1.885-20.497-5.334-29.763l0.192 0.59c-5.868-15.079-11.586-33.757-16.055-52.915l-0.585-2.978c-2.133-9.387-3.84-19.2-5.12-29.013-10.754-60.726-63.13-106.254-126.139-106.254-0.654 0-1.307 0.005-1.959 0.015l0.099-0.001h-128c-0.357-0.004-0.779-0.006-1.202-0.006-70.692 0-128 57.308-128 128 0 6.172 0.437 12.242 1.281 18.18l-0.079-0.681c48.095 367.748 336.77 655.549 700.837 701.876l4.017 0.417h16.213c0.056 0 0.122 0 0.188 0 32.752 0 62.631-12.301 85.269-32.536l-0.124 0.109c26.238-23.54 42.668-57.555 42.668-95.407 0-0.209-0-0.417-0.001-0.625l0 0.032v-128c-1.124-61.764-45.825-112.764-104.599-123.613l-0.788-0.121zM850.773 810.667c-0.017 12.731-5.606 24.153-14.46 31.96l-0.047 0.040c-7.825 6.841-18.135 11.014-29.42 11.014-1.962 0-3.895-0.126-5.791-0.371l0.224 0.024c-328.712-43.345-585.857-301.508-627.254-627.021l-0.373-3.593c-0.173-1.507-0.272-3.254-0.272-5.023 0-11.447 4.136-21.929 10.995-30.031l-0.056 0.068c7.847-8.9 19.269-14.49 31.997-14.507l0.003-0h128c0.283-0.007 0.615-0.011 0.949-0.011 20.394 0 37.446 14.308 41.665 33.434l0.052 0.283q2.56 17.493 6.4 34.56c5.721 25.899 12.474 48.010 20.728 69.374l-1.101-3.241-59.733 27.733c-14.801 6.91-24.874 21.669-24.874 38.78 0 6.52 1.463 12.699 4.078 18.226l-0.11-0.259c62.648 132.060 166.607 236.019 294.925 297.065l3.741 1.602c4.793 2.024 10.366 3.201 16.213 3.201s11.42-1.176 16.495-3.305l-0.281 0.105c10.842-3.955 19.439-11.858 24.21-21.927l0.11-0.259 26.453-59.733c17.866 6.724 40.404 13.471 63.467 18.851l3.947 0.776q17.067 3.84 34.56 6.4c19.409 4.271 33.717 21.324 33.717 41.718 0 0.334-0.004 0.667-0.011 0.999l0.001-0.049z"],"attrs":[],"grid":0,"tags":["phone"]},"attrs":[],"properties":{"order":5328,"id":356,"name":"phone","prevSize":32,"code":60497},"setIdx":0,"setId":0,"iconIdx":849},{"icon":{"paths":["M853.333 170.667c23.488-0.1 42.49-19.164 42.49-42.666 0-11.632-4.655-22.177-12.204-29.874l0.007 0.007c-7.733-7.795-18.45-12.621-30.293-12.621s-22.56 4.826-30.291 12.618l-0.003 0.003c-3.733 3.822-6.76 8.354-8.856 13.372l-0.104 0.282c-2.162 4.477-3.425 9.736-3.425 15.29 0 0.325 0.004 0.648 0.013 0.971l-0.001-0.048c0 23.564 19.103 42.667 42.667 42.667v0zM853.333 554.667c-23.564 0-42.667 19.103-42.667 42.667v0 16.64l-63.147-63.147c-21.414-21.549-51.069-34.886-83.84-34.886s-62.426 13.337-83.834 34.88l-0.006 0.006-29.867 29.867-105.813-106.24c-21.813-20.659-51.343-33.362-83.84-33.362s-62.027 12.703-83.896 33.415l0.056-0.052-63.147 63.147v-238.933c0-23.564 19.103-42.667 42.667-42.667v0h426.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-426.667c-70.692 0-128 57.308-128 128v0 512c0 70.692 57.308 128 128 128v0h512c70.692 0 128-57.308 128-128v0-213.333c0-23.564-19.103-42.667-42.667-42.667v0zM256 853.333c-23.564 0-42.667-19.103-42.667-42.667v0-152.32l123.733-123.733c6.036-5.76 14.231-9.305 23.253-9.305s17.217 3.545 23.267 9.318l-0.013-0.013 135.253 135.253 183.040 183.467zM810.667 810.667c-0.383 8.509-3.202 16.29-7.77 22.747l0.090-0.133-192.427-193.28 29.867-29.867c6.016-5.983 14.309-9.682 23.467-9.682s17.451 3.699 23.468 9.683l-0.001-0.001 123.307 124.587zM853.333 213.333c-23.564 0-42.667 19.103-42.667 42.667v0 170.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-170.667c0-23.564-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["picture"]},"attrs":[],"properties":{"order":5329,"id":355,"name":"picture","prevSize":32,"code":60498},"setIdx":0,"setId":0,"iconIdx":850},{"icon":{"paths":["M363.093 532.48c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM363.093 341.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM512 426.667c-23.564 0-42.667 19.103-42.667 42.667v0 42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667c0-23.564-19.103-42.667-42.667-42.667v0zM874.667 365.653v0c-18.32-10.723-40.338-17.054-63.836-17.054-12.208 0-24.017 1.709-35.201 4.901l0.903-0.22c-17.903 4.888-33.468 13.122-46.716 24.061l0.21-0.168-494.933-286.293c-6.12-3.594-13.479-5.716-21.333-5.716s-15.214 2.123-21.535 5.825l0.201-0.109c-13.061 7.444-21.732 21.266-21.76 37.116l-0 0.004v561.92c-50.040 17.246-85.348 63.93-85.348 118.86 0 0.663 0.005 1.325 0.015 1.986l-0.001-0.1c-0 0.013-0 0.029-0 0.046 0 69.492 55.378 126.050 124.411 127.951l0.176 0.004h24.747c293.166-0.711 548.843-160.532 685.321-397.65l2.039-3.843c9.894-17.741 15.719-38.919 15.719-61.458 0-46.579-24.88-87.348-62.076-109.74l-0.577-0.322zM256 201.813l421.973 243.627c-93.316 137.833-246.182 229.264-420.81 237.185l-1.163 0.042zM847.787 495.36c-123.978 215.48-352.933 358.235-615.23 358.235-6.759 0-13.497-0.095-20.211-0.283l0.987 0.022c-23.564 0-42.667-19.103-42.667-42.667v0c-0-0.074-0.001-0.162-0.001-0.249 0-11.932 4.898-22.721 12.794-30.464l0.007-0.007c7.661-7.393 18.104-11.947 29.61-11.947 0.090 0 0.18 0 0.27 0.001l-0.014-0h21.76c229.763-0.096 430.231-125.428 536.858-311.434l1.595-3.019c5.242-9.343 14.024-16.173 24.484-18.719l0.263-0.054c3.386-0.966 7.275-1.522 11.293-1.522 7.602 0 14.739 1.988 20.921 5.472l-0.214-0.111c13.476 7.351 22.466 21.416 22.466 37.582 0 6.988-1.68 13.584-4.658 19.406l0.112-0.241z"],"attrs":[],"grid":0,"tags":["pizza-slice"]},"attrs":[],"properties":{"order":5330,"id":354,"name":"pizza-slice","prevSize":32,"code":60499},"setIdx":0,"setId":0,"iconIdx":851},{"icon":{"paths":["M901.12 692.48c-15.312-54.881-50.508-99.801-97.147-127.458l-0.987-0.542-90.027-52.48-20.48-233.387c-1.206-14.209-9.21-26.318-20.711-33.172l-0.196-0.108-128-73.387c-6.12-3.594-13.479-5.716-21.333-5.716s-15.214 2.123-21.535 5.825l0.201-0.109c-12.876 7.133-21.587 20.405-22.184 35.76l-0.002 0.080-6.4 166.4-74.667-42.667-122.027-164.267c-7.869-10.363-20.198-16.986-34.073-16.986-20.668 0-37.903 14.695-41.828 34.207l-0.046 0.273-37.12 196.693c-2.29 9.057-3.604 19.454-3.604 30.158 0 46.685 24.993 87.532 62.328 109.892l0.582 0.323 599.893 346.027c6.191 3.702 13.656 5.891 21.633 5.891 15.327 0 28.766-8.081 36.289-20.215l0.105-0.182c18.032-30.303 28.691-66.817 28.691-105.82 0-19.579-2.686-38.531-7.709-56.507l0.352 1.474zM820.907 768l-556.373-320c-12.338-7.624-20.436-21.075-20.436-36.418 0-4.202 0.607-8.262 1.739-12.097l-0.076 0.302 19.627-104.107 70.827 93.867c3.457 4.659 7.716 8.51 12.603 11.412l0.197 0.108 142.933 82.773c6.126 3.603 13.495 5.732 21.36 5.732 23.029 0 41.797-18.245 42.637-41.069l0.002-0.077 6.827-166.4 46.507 26.88 20.48 233.387c1.302 14.281 9.467 26.408 21.129 33.17l0.205 0.11 109.227 64.427c28.352 16.57 49.24 43.298 57.827 75.077l0.2 0.869c2.767 9.478 4.359 20.365 4.359 31.625 0 7.22-0.654 14.286-1.907 21.144l0.109-0.716z"],"attrs":[],"grid":0,"tags":["plane-arrival"]},"attrs":[],"properties":{"order":5331,"id":353,"name":"plane-arrival","prevSize":32,"code":60500},"setIdx":0,"setId":0,"iconIdx":852},{"icon":{"paths":["M938.667 216.747c0-0.054 0-0.117 0-0.18 0-72.578-58.836-131.413-131.413-131.413-36.334 0-69.223 14.745-93.012 38.578l-0.002 0.002-119.893 119.893-276.907-92.16c-3.824-1.245-8.225-1.963-12.793-1.963-11.635 0-22.183 4.657-29.88 12.21l0.007-0.007-101.547 100.693c-7.618 7.703-12.323 18.3-12.323 29.995 0 17.043 9.992 31.751 24.437 38.587l0.259 0.11 221.013 100.267-110.933 110.933-72.96-36.693c-5.87-3.238-12.866-5.143-20.308-5.143-11.3 0-21.574 4.393-29.208 11.564l0.022-0.021-75.52 77.227c-7.668 7.712-12.407 18.343-12.407 30.080s4.74 22.368 12.409 30.082l-0.002-0.002 276.907 276.907c7.712 7.668 18.343 12.407 30.080 12.407s22.368-4.74 30.082-12.409l-0.002 0.002 77.227-75.52c7.815-7.736 12.654-18.466 12.654-30.326 0-6.989-1.68-13.586-4.659-19.408l0.112 0.241-36.693-72.96 110.933-110.933 100.267 221.013c6.947 14.705 21.655 24.697 38.698 24.697 11.696 0 22.292-4.706 29.999-12.327l-0.004 0.004 100.693-100.693c7.546-7.69 12.203-18.238 12.203-29.873 0-4.568-0.718-8.969-2.047-13.095l0.084 0.302-92.16-276.907 118.187-120.747c23.721-23.578 38.402-56.226 38.402-92.304 0-0.249-0.001-0.499-0.002-0.748l0 0.038zM839.68 249.6l-138.24 138.24c-7.546 7.69-12.203 18.238-12.203 29.873 0 4.568 0.718 8.969 2.047 13.095l-0.084-0.302 92.16 276.48-38.4 38.4-100.267-220.587c-5.806-12.563-17.187-21.692-30.881-24.278l-0.265-0.042c-2.303-0.441-4.953-0.693-7.661-0.693-11.853 0-22.577 4.833-30.309 12.637l-175.79 177.497c-7.73 7.723-12.512 18.395-12.512 30.185 0 6.877 1.627 13.374 4.517 19.127l-0.112-0.246 34.987 71.68-23.893 23.893-214.613-215.040 25.173-22.187 72.96 36.693c5.508 2.778 12.005 4.405 18.882 4.405 11.79 0 22.462-4.782 30.185-12.512l0-0 176.64-177.493c7.792-7.733 12.615-18.447 12.615-30.288 0-17.155-10.125-31.946-24.725-38.722l-0.263-0.11-222.293-100.267 38.4-38.4 276.48 92.16c3.824 1.245 8.225 1.963 12.793 1.963 11.635 0 22.183-4.657 29.88-12.21l-0.007 0.007 138.24-138.24c8.296-8.478 19.854-13.734 32.64-13.734s24.344 5.256 32.632 13.726l0.008 0.008c8.418 7.816 13.668 18.944 13.668 31.298 0 0.397-0.005 0.793-0.016 1.187l0.001-0.058c0.021 0.518 0.033 1.125 0.033 1.736 0 12.066-4.725 23.028-12.425 31.137l0.019-0.020z"],"attrs":[],"grid":0,"tags":["plane-departure"]},"attrs":[],"properties":{"order":5332,"id":352,"name":"plane-departure","prevSize":32,"code":60501},"setIdx":0,"setId":0,"iconIdx":853},{"icon":{"paths":["M981.333 397.653c0.818-3.217 1.287-6.91 1.287-10.713 0-7.963-2.058-15.446-5.671-21.945l0.118 0.231c-37.027-63.398-104.742-105.316-182.248-105.316-38.959 0-75.444 10.591-106.733 29.052l0.981-0.535-91.733 52.907-213.333-100.267c-5.699-3.013-12.456-4.782-19.627-4.782s-13.928 1.769-19.86 4.894l0.233-0.112-128 73.813c-12.535 7.327-20.92 20.56-21.332 35.782l-0.001 0.058c-0.011 0.357-0.017 0.777-0.017 1.198 0 15.014 7.755 28.216 19.477 35.821l0.166 0.101 140.8 88.747-74.24 42.667-203.947 24.747c-21.202 2.698-37.429 20.626-37.429 42.344 0 12.895 5.72 24.454 14.762 32.277l0.054 0.046 151.040 130.56c22.931 21.915 54.077 35.403 88.374 35.403 23.197 0 44.953-6.171 63.715-16.96l-0.622 0.33 602.453-344.32c10.289-5.421 17.968-14.629 21.257-25.725l0.077-0.302zM318.72 696.32c-5.934 3.326-13.023 5.285-20.569 5.285-12.013 0-22.867-4.965-30.621-12.955l-0.010-0.011-81.067-69.547 116.48-14.080c6.072-0.797 11.552-2.757 16.409-5.655l-0.195 0.108 143.36-82.347c12.652-7.4 21.077-20.821 21.333-36.23l0-0.036c0.002-0.152 0.003-0.331 0.003-0.51 0-15.186-7.933-28.518-19.881-36.080l-0.175-0.103-140.8-89.173 46.933-26.88 213.333 98.987c5.699 3.013 12.456 4.782 19.627 4.782s13.928-1.769 19.86-4.894l-0.233 0.112 109.227-63.147c18.015-10.279 39.588-16.339 62.577-16.339 30.738 0 58.945 10.834 81.011 28.893l-0.227-0.18z"],"attrs":[],"grid":0,"tags":["plane-fly"]},"attrs":[],"properties":{"order":5333,"id":351,"name":"plane-fly","prevSize":32,"code":60502},"setIdx":0,"setId":0,"iconIdx":854},{"icon":{"paths":["M928 512c-0.052-16.512-9.474-30.81-23.226-37.861l-0.24-0.112-261.12-130.56v-170.667c0-72.578-58.836-131.413-131.413-131.413s-131.413 58.836-131.413 131.413v0 170.667l-261.12 130.56c-13.992 7.163-23.415 21.462-23.467 37.966l-0 0.007v142.080c-0.001 0.106-0.001 0.23-0.001 0.355 0 14.466 7.2 27.251 18.211 34.967l0.137 0.091c6.746 4.675 15.105 7.469 24.116 7.469 5.441 0 10.644-1.018 15.429-2.875l-0.291 0.099 226.987-85.333v159.147l-77.653 25.6c-17.012 5.871-29.013 21.745-29.013 40.423 0 0.039 0 0.077 0 0.116l-0-0.006v104.533c0.051 11.868 4.939 22.584 12.793 30.287l0.007 0.007c7.667 7.606 18.211 12.323 29.857 12.373l0.010 0h391.253c23.564 0 42.667-19.103 42.667-42.667v0-106.667c0-0.033 0-0.071 0-0.11 0-18.678-12.002-34.552-28.714-40.333l-78.38-23.557v-158.72l226.987 85.333c4.494 1.757 9.697 2.776 15.138 2.776 9.011 0 17.37-2.794 24.257-7.562l-0.142 0.093c11.149-7.807 18.348-20.592 18.348-35.058 0-0.125-0.001-0.25-0.002-0.375l0 0.019zM616.107 507.733c-4.571-1.823-9.868-2.881-15.412-2.881-9.076 0-17.491 2.834-24.407 7.666l0.138-0.091c-11.129 7.794-18.322 20.548-18.347 34.983l-0 0.004v249.173c0.014 18.823 12.215 34.793 29.139 40.446l0.301 0.087 77.227 25.6v33.28h-305.92v-33.28l77.227-25.6c17.225-5.741 29.426-21.71 29.44-40.532l0-0.002v-249.173c-0.025-14.439-7.218-27.193-18.21-34.896l-0.137-0.091c-6.778-4.74-15.192-7.574-24.268-7.574-5.544 0-10.841 1.057-15.7 2.982l0.289-0.101-226.56 85.333v-54.613l260.693-130.56c14.165-7.054 23.756-21.377 23.893-37.955l0-0.018v-195.84c0-25.449 20.631-46.080 46.080-46.080s46.080 20.631 46.080 46.080v0 195.84c0.137 16.596 9.728 30.919 23.646 37.862l0.247 0.112 260.693 130.56v54.187z"],"attrs":[],"grid":0,"tags":["plane"]},"attrs":[],"properties":{"order":5334,"id":350,"name":"plane","prevSize":32,"code":60503},"setIdx":0,"setId":0,"iconIdx":855},{"icon":{"paths":["M682.667 438.187l-213.333-123.307c-12.239-7.188-26.957-11.433-42.667-11.433-47.098 0-85.283 38.155-85.333 85.241l-0 0.005v246.613c0.033 31.385 17.005 58.799 42.264 73.595l0.403 0.218c12.239 7.187 26.957 11.432 42.667 11.432s30.427-4.245 43.069-11.651l-0.403 0.218 213.333-123.307c25.602-15.049 42.515-42.456 42.515-73.813s-16.914-58.764-42.116-73.596l-0.4-0.218zM640 512l-213.333 123.307v-246.613l213.333 123.307zM512 85.333c-235.641 0-426.667 191.025-426.667 426.667s191.025 426.667 426.667 426.667c235.641 0 426.667-191.025 426.667-426.667v0c0-235.641-191.025-426.667-426.667-426.667v0zM512 853.333c-188.513 0-341.333-152.82-341.333-341.333s152.82-341.333 341.333-341.333c188.513 0 341.333 152.82 341.333 341.333v0c0 188.513-152.82 341.333-341.333 341.333v0z"],"attrs":[],"grid":0,"tags":["play-circle"]},"attrs":[],"properties":{"order":5335,"id":349,"name":"play-circle","prevSize":32,"code":60504},"setIdx":0,"setId":0,"iconIdx":856},{"icon":{"paths":["M791.040 384l-412.16-236.373c-20.931-12.294-46.102-19.555-72.969-19.555-80.589 0-145.92 65.331-145.92 145.92 0 0.575 0.003 1.149 0.010 1.722l-0.001-0.087v474.453c0 80.589 65.331 145.92 145.92 145.92h-0c26.871-0.047 52.032-7.329 73.65-20l-0.69 0.374 412.16-236.373c43.849-25.717 72.827-72.621 72.827-126.293s-28.977-100.576-72.141-125.921l-0.686-0.372zM748.373 562.773l-412.16 239.787c-8.71 5.024-19.155 7.987-30.293 7.987s-21.584-2.964-30.592-8.146l0.298 0.158c-18.238-10.671-30.293-30.162-30.293-52.47 0-0.004 0-0.007 0-0.011l-0 0.001v-476.16c-0-0.003-0-0.007-0-0.010 0-22.307 12.056-41.799 30.007-52.315l0.286-0.155c8.732-4.943 19.145-7.927 30.24-8.106l0.053-0.001c11.147 0.236 21.55 3.212 30.627 8.278l-0.334-0.171 412.16 238.080c18.248 10.668 30.311 30.165 30.311 52.48s-12.064 41.812-30.025 52.325l-0.286 0.155z"],"attrs":[],"grid":0,"tags":["play"]},"attrs":[],"properties":{"order":5336,"id":348,"name":"play","prevSize":32,"code":60505},"setIdx":0,"setId":0,"iconIdx":857},{"icon":{"paths":["M810.667 256h-128v-128c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 128h-170.667v-128c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 128h-128c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h42.667v213.333c-0 0.073-0.001 0.16-0.001 0.247 0 11.721 4.726 22.338 12.377 30.049l-0.003-0.003 115.627 115.2v195.84c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-170.667h85.333v170.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-195.84l115.627-115.2c7.648-7.709 12.374-18.326 12.374-30.047 0-0.087-0-0.173-0.001-0.26l0 0.013v-213.333h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM682.667 537.173l-102.827 102.827h-135.68l-102.827-102.827v-195.84h341.333zM469.333 554.667h85.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-85.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["plug"]},"attrs":[],"properties":{"order":5337,"id":347,"name":"plug","prevSize":32,"code":60506},"setIdx":0,"setId":0,"iconIdx":858},{"icon":{"paths":["M512 85.333c-235.641 0-426.667 191.025-426.667 426.667s191.025 426.667 426.667 426.667c235.641 0 426.667-191.025 426.667-426.667v0c0-235.641-191.025-426.667-426.667-426.667v0zM512 853.333c-188.513 0-341.333-152.82-341.333-341.333s152.82-341.333 341.333-341.333c188.513 0 341.333 152.82 341.333 341.333v0c0 188.513-152.82 341.333-341.333 341.333v0zM682.667 469.333h-128v-128c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 128h-128c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h128v128c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-128h128c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["plus-circle"]},"attrs":[],"properties":{"order":5338,"id":346,"name":"plus-circle","prevSize":32,"code":60507},"setIdx":0,"setId":0,"iconIdx":859},{"icon":{"paths":["M384 554.667h85.333v85.333c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-85.333h85.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-85.333v-85.333c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 85.333h-85.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM896 85.333h-768c-23.564 0-42.667 19.103-42.667 42.667v0 768c0 23.564 19.103 42.667 42.667 42.667v0h768c23.564 0 42.667-19.103 42.667-42.667v0-768c0-23.564-19.103-42.667-42.667-42.667v0zM853.333 853.333h-682.667v-682.667h682.667z"],"attrs":[],"grid":0,"tags":["plus-square"]},"attrs":[],"properties":{"order":5339,"id":345,"name":"plus-square","prevSize":32,"code":60508},"setIdx":0,"setId":0,"iconIdx":860},{"icon":{"paths":["M810.667 469.333h-256v-256c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 256h-256c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h256v256c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-256h256c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["plus"]},"attrs":[],"properties":{"order":5340,"id":344,"name":"plus","prevSize":32,"code":60509},"setIdx":0,"setId":0,"iconIdx":861},{"icon":{"paths":["M844.373 304.213c-7.884-9.914-19.944-16.214-33.477-16.214-0.081 0-0.162 0-0.242 0.001l0.012-0h-469.333v-21.333c0.115-38.826 26.142-71.543 61.691-81.772l0.602-0.148c11.079 10.702 26.042 17.445 42.576 17.918l0.091 0.002h42.667c35.346 0 64-28.654 64-64s-28.654-64-64-64v0h-42.667c-20.203 0.029-38.193 9.477-49.818 24.186l-0.102 0.134c-80.246 14.864-140.234 84.246-140.373 167.665l-0 0.015v21.333h-42.667c-0.068-0-0.149-0.001-0.23-0.001-13.532 0-25.593 6.3-33.41 16.127l-0.067 0.087c-6.253 7.375-10.056 17-10.056 27.513 0 3.407 0.399 6.721 1.154 9.897l-0.058-0.29 26.453 106.24c13.151 49.75 54.269 87.143 105.117 94.636l0.697 0.084 33.28 298.667h-37.547c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h426.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-37.547l33.28-298.667c51.119-8.124 91.703-45.56 104.337-94.257l0.196-0.889 27.733-105.813c0.696-2.886 1.096-6.2 1.096-9.607 0-10.513-3.802-20.138-10.107-27.575l0.051 0.062zM601.6 842.667h-179.2l-33.28-298.667h245.76zM742.827 426.667c-4.747 18.773-21.489 32.445-41.424 32.445-0.437 0-0.872-0.007-1.306-0.020l0.064 0.002h-377.6c-0.37 0.012-0.806 0.018-1.243 0.018-19.935 0-36.677-13.671-41.361-32.15l-0.063-0.295-11.947-53.333h488.107z"],"attrs":[],"grid":0,"tags":["podium"]},"attrs":[],"properties":{"order":5341,"id":343,"name":"podium","prevSize":32,"code":60510},"setIdx":0,"setId":0,"iconIdx":862},{"icon":{"paths":["M933.12 490.667l-192-332.373c-7.514-12.844-21.241-21.334-36.951-21.334-0.060 0-0.119 0-0.179 0l0.009-0h-384c-0.050-0-0.11-0-0.169-0-15.71 0-29.436 8.49-36.842 21.132l-0.109 0.201-192 332.373c-3.594 6.12-5.716 13.479-5.716 21.333s2.123 15.214 5.825 21.535l-0.109-0.201 192 332.373c7.514 12.844 21.241 21.334 36.951 21.334 0.060 0 0.119-0 0.179-0l-0.009 0h384c0.050 0 0.11 0 0.169 0 15.71 0 29.436-8.49 36.842-21.132l0.109-0.201 192-332.373c3.594-6.12 5.716-13.479 5.716-21.333s-2.123-15.214-5.825-21.535l0.109 0.201zM677.12 801.707h-332.373l-167.68-289.707 167.68-289.707h334.507l167.68 289.707z"],"attrs":[],"grid":0,"tags":["polygon"]},"attrs":[],"properties":{"order":5342,"id":342,"name":"polygon","prevSize":32,"code":60511},"setIdx":0,"setId":0,"iconIdx":863},{"icon":{"paths":["M960 234.667c23.564 0 42.667-19.103 42.667-42.667v0-128c0-23.564-19.103-42.667-42.667-42.667v0h-128c-23.564 0-42.667 19.103-42.667 42.667v0c0 11.782-9.551 21.333-21.333 21.333s-21.333-9.551-21.333-21.333v0c0-23.564-19.103-42.667-42.667-42.667v0h-128c-23.564 0-42.667 19.103-42.667 42.667v0c0 11.782-9.551 21.333-21.333 21.333s-21.333-9.551-21.333-21.333v0c0-23.564-19.103-42.667-42.667-42.667v0h-128c-23.564 0-42.667 19.103-42.667 42.667v0c0 11.782-9.551 21.333-21.333 21.333s-21.333-9.551-21.333-21.333v0c0-23.564-19.103-42.667-42.667-42.667v0h-128c-23.564 0-42.667 19.103-42.667 42.667v0 128c0 23.564 19.103 42.667 42.667 42.667v0c11.782 0 21.333 9.551 21.333 21.333s-9.551 21.333-21.333 21.333v0c-23.564 0-42.667 19.103-42.667 42.667v0 128c0 23.564 19.103 42.667 42.667 42.667v0c11.782 0 21.333 9.551 21.333 21.333s-9.551 21.333-21.333 21.333v0c-23.564 0-42.667 19.103-42.667 42.667v0 128c0 23.564 19.103 42.667 42.667 42.667v0c11.782 0 21.333 9.551 21.333 21.333s-9.551 21.333-21.333 21.333v0c-23.564 0-42.667 19.103-42.667 42.667v0 128c0 23.564 19.103 42.667 42.667 42.667v0h128c23.564 0 42.667-19.103 42.667-42.667v0c0-11.782 9.551-21.333 21.333-21.333s21.333 9.551 21.333 21.333v0c0 23.564 19.103 42.667 42.667 42.667v0h128c23.564 0 42.667-19.103 42.667-42.667v0c0-11.782 9.551-21.333 21.333-21.333s21.333 9.551 21.333 21.333v0c0 23.564 19.103 42.667 42.667 42.667v0h128c23.564 0 42.667-19.103 42.667-42.667v0c0-11.782 9.551-21.333 21.333-21.333s21.333 9.551 21.333 21.333v0c0 23.564 19.103 42.667 42.667 42.667v0h128c23.564 0 42.667-19.103 42.667-42.667v0-128c0-23.564-19.103-42.667-42.667-42.667v0c-11.782 0-21.333-9.551-21.333-21.333s9.551-21.333 21.333-21.333v0c23.564 0 42.667-19.103 42.667-42.667v0-128c0-23.564-19.103-42.667-42.667-42.667v0c-11.782 0-21.333-9.551-21.333-21.333s9.551-21.333 21.333-21.333v0c23.564 0 42.667-19.103 42.667-42.667v0-128c0-23.564-19.103-42.667-42.667-42.667v0c-11.782 0-21.333-9.551-21.333-21.333s9.551-21.333 21.333-21.333v0zM917.333 158.293c-37.92 16.911-63.874 54.278-63.874 97.707s25.954 80.796 63.197 97.436l0.677 0.27v60.587c-37.92 16.911-63.874 54.278-63.874 97.707s25.954 80.796 63.197 97.436l0.677 0.27v60.587c-37.92 16.911-63.874 54.278-63.874 97.707s25.954 80.796 63.197 97.436l0.677 0.27v51.627h-51.627c-16.911-37.92-54.278-63.874-97.707-63.874s-80.796 25.954-97.436 63.197l-0.27 0.677h-60.587c-16.911-37.92-54.278-63.874-97.707-63.874s-80.796 25.954-97.436 63.197l-0.27 0.677h-60.587c-16.911-37.92-54.278-63.874-97.707-63.874s-80.796 25.954-97.436 63.197l-0.27 0.677h-51.627v-51.627c37.92-16.911 63.874-54.278 63.874-97.707s-25.954-80.796-63.197-97.436l-0.677-0.27v-60.587c37.92-16.911 63.874-54.278 63.874-97.707s-25.954-80.796-63.197-97.436l-0.677-0.27v-60.587c37.92-16.911 63.874-54.278 63.874-97.707s-25.954-80.796-63.197-97.436l-0.677-0.27v-51.627h51.627c16.911 37.92 54.278 63.874 97.707 63.874s80.796-25.954 97.436-63.197l0.27-0.677h60.587c16.911 37.92 54.278 63.874 97.707 63.874s80.796-25.954 97.436-63.197l0.27-0.677h60.587c16.911 37.92 54.278 63.874 97.707 63.874s80.796-25.954 97.436-63.197l0.27-0.677h51.627zM512 213.333c-164.949 0-298.667 133.718-298.667 298.667s133.718 298.667 298.667 298.667v0c0.19 0 0.416 0.001 0.641 0.001 54.779 0 106.079-14.897 150.070-40.86l-1.378 0.753c13.711-7.282 22.89-21.472 22.89-37.806 0-23.564-19.103-42.667-42.667-42.667-8.495 0-16.409 2.482-23.059 6.761l0.169-0.102c-30.598 17.969-67.393 28.581-106.667 28.581-117.821 0-213.333-95.513-213.333-213.333s95.513-213.333 213.333-213.333c117.821 0 213.333 95.513 213.333 213.333 0 0.002-0 0.004-0 0.006l0-0v21.333c0 19.558-15.855 35.413-35.413 35.413v0c-0.001 0-0.002 0-0.003 0-19.644 0-35.597-15.804-35.837-35.391l-0-0.023v-120.747c-0.605-23.094-19.47-41.584-42.653-41.584-13.429 0-25.409 6.204-33.23 15.902l-0.064 0.082c-19.089-10.66-41.864-16.974-66.105-17.067l-0.028-0c-78.469 0-142.080 63.611-142.080 142.080s63.611 142.080 142.080 142.080v0c0.006 0 0.013 0 0.021 0 35.562 0 68.026-13.264 92.714-35.115l-0.148 0.128c21.849 21.472 51.832 34.727 84.912 34.727 66.531 0 120.538-53.619 121.168-120.001l0-0.060v-21.76c0-164.949-133.718-298.667-298.667-298.667v0zM512 568.747c-31.34 0-56.747-25.406-56.747-56.747s25.406-56.747 56.747-56.747c31.34 0 56.747 25.406 56.747 56.747v0c0.001 0.127 0.002 0.278 0.002 0.428 0 31.105-25.215 56.32-56.32 56.32-0.151 0-0.301-0.001-0.451-0.002l0.023 0z"],"attrs":[],"grid":0,"tags":["post-stamp"]},"attrs":[],"properties":{"order":5343,"id":341,"name":"post-stamp","prevSize":32,"code":60512},"setIdx":0,"setId":0,"iconIdx":864},{"icon":{"paths":["M725.333 469.333h42.667c23.564 0 42.667-19.103 42.667-42.667v0-42.667c0-23.564-19.103-42.667-42.667-42.667v0h-42.667c-23.564 0-42.667 19.103-42.667 42.667v0 42.667c0 23.564 19.103 42.667 42.667 42.667v0zM256 512h213.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-213.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM938.667 170.667h-853.333c-23.564 0-42.667 19.103-42.667 42.667v0 597.333c0 23.564 19.103 42.667 42.667 42.667v0h853.333c23.564 0 42.667-19.103 42.667-42.667v0-597.333c0-23.564-19.103-42.667-42.667-42.667v0zM896 768h-768v-512h768zM256 682.667h213.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-213.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["postcard"]},"attrs":[],"properties":{"order":5344,"id":340,"name":"postcard","prevSize":32,"code":60513},"setIdx":0,"setId":0,"iconIdx":865},{"icon":{"paths":["M682.667 640h-221.013c4.75-12.677 7.555-27.325 7.68-42.612l0-0.055v-42.667h106.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-106.667v-42.667c-0.001-0.127-0.001-0.278-0.001-0.429 0-45.95 37.25-83.2 83.2-83.2 30.374 0 56.946 16.276 71.471 40.582l0.21 0.38c7.531 12.929 21.327 21.48 37.12 21.48 23.645 0 42.814-19.168 42.814-42.814 0-7.852-2.114-15.21-5.803-21.537l0.11 0.203c-30.789-47.75-83.708-78.918-143.907-78.918-92.001 0-166.999 72.796-170.536 163.93l-0.010 0.322v42.667h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h42.667v42.667c0 23.564-19.103 42.667-42.667 42.667v0c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h341.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM512 42.667c-259.206 0-469.333 210.128-469.333 469.333s210.128 469.333 469.333 469.333c259.206 0 469.333-210.128 469.333-469.333v0c0-259.206-210.128-469.333-469.333-469.333v0zM512 896c-212.077 0-384-171.923-384-384s171.923-384 384-384c212.077 0 384 171.923 384 384v0c0 212.077-171.923 384-384 384v0z"],"attrs":[],"grid":0,"tags":["pound-circle"]},"attrs":[],"properties":{"order":5345,"id":339,"name":"pound-circle","prevSize":32,"code":60514},"setIdx":0,"setId":0,"iconIdx":866},{"icon":{"paths":["M853.333 853.333h-512c26.63-34.817 42.67-78.966 42.67-126.861 0-0.4-0.001-0.801-0.003-1.201l0 0.062v-128h256c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-256v-132.693c-0-0.050-0-0.108-0-0.167 0-115.229 93.411-208.64 208.64-208.64 76.974 0 144.211 41.683 180.373 103.708l0.534 0.992c7.53 12.777 21.22 21.215 36.882 21.215 7.952 0 15.395-2.175 21.768-5.963l-0.197 0.108c12.853-7.512 21.35-21.244 21.35-36.96 0-7.747-2.064-15.011-5.673-21.273l0.11 0.207c-51.904-88.389-146.492-146.791-254.721-146.791-162.299 0-293.923 131.331-294.399 293.519l-0 0.046v132.693h-128c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h128v128c0 70.692-57.308 128-128 128v0c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h682.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["pound"]},"attrs":[],"properties":{"order":5346,"id":338,"name":"pound","prevSize":32,"code":60515},"setIdx":0,"setId":0,"iconIdx":867},{"icon":{"paths":["M435.627 264.96l33.707-34.133v195.84c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-195.84l33.707 34.133c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003-106.667-106.667c-3.937-3.773-8.616-6.808-13.791-8.859l-0.289-0.101c-4.793-2.024-10.366-3.201-16.213-3.201s-11.42 1.176-16.495 3.305l0.281-0.105c-5.464 2.152-10.143 5.187-14.095 8.974l0.015-0.014-106.667 106.667c-7.753 7.753-12.548 18.463-12.548 30.293 0 23.661 19.181 42.841 42.841 42.841 11.83 0 22.541-4.795 30.293-12.548l-0 0zM768 322.56c-7.862-7.862-18.723-12.725-30.72-12.725-23.994 0-43.445 19.451-43.445 43.445 0 11.997 4.863 22.858 12.725 30.72h-0c49.823 49.805 80.64 118.619 80.64 194.632 0 151.989-123.211 275.2-275.2 275.2s-275.2-123.211-275.2-275.2c0-76.012 30.817-144.827 80.639-194.631l0.001-0.001c7.862-7.862 12.725-18.723 12.725-30.72 0-23.994-19.451-43.445-43.445-43.445-11.997 0-22.858 4.863-30.72 12.725l-0 0c-64.866 65.244-104.96 155.176-104.96 254.472 0 199.353 161.607 360.96 360.96 360.96s360.96-161.607 360.96-360.96c0-99.296-40.094-189.228-104.977-254.489l0.017 0.017z"],"attrs":[],"grid":0,"tags":["power"]},"attrs":[],"properties":{"order":5347,"id":337,"name":"power","prevSize":32,"code":60516},"setIdx":0,"setId":0,"iconIdx":868},{"icon":{"paths":["M810.667 85.333h-597.333c-47.128 0-85.333 38.205-85.333 85.333v0 85.333c0 47.128 38.205 85.333 85.333 85.333v0 469.333c0 70.692 57.308 128 128 128v0h341.333c70.692 0 128-57.308 128-128v0-469.333c47.128 0 85.333-38.205 85.333-85.333v0-85.333c0-47.128-38.205-85.333-85.333-85.333v0zM725.333 682.667h-256v-170.667h256zM725.333 426.667h-298.667c-23.564 0-42.667 19.103-42.667 42.667v0 256c0 23.564 19.103 42.667 42.667 42.667v0h298.667v42.667c0 23.564-19.103 42.667-42.667 42.667v0h-341.333c-23.564 0-42.667-19.103-42.667-42.667v0-469.333h426.667zM213.333 256v-85.333h597.333v85.333z"],"attrs":[],"grid":0,"tags":["prescription-bottle"]},"attrs":[],"properties":{"order":5348,"id":336,"name":"prescription-bottle","prevSize":32,"code":60517},"setIdx":0,"setId":0,"iconIdx":869},{"icon":{"paths":["M439.040 499.627c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 170.667-170.667c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l-0 0-140.373 140.8-55.040-55.467c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293v0zM896 597.333h-42.667v-426.667h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-768c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h42.667v426.667h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h341.333v49.067l-194.133 128c-12.21 7.649-20.21 21.029-20.21 36.279 0 23.564 19.103 42.667 42.667 42.667 0.355 0 0.709-0.004 1.062-0.013l-0.052 0.001c0.136 0.002 0.297 0.003 0.459 0.003 8.616 0 16.597-2.717 23.134-7.34l-0.126 0.084 147.2-97.28v61.867c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-61.867l147.2 97.28c6.411 4.539 14.392 7.256 23.008 7.256 0.161 0 0.322-0.001 0.483-0.003l-0.025 0c23.422-0.187 42.337-19.217 42.337-42.665 0-14.689-7.423-27.644-18.722-35.319l-0.149-0.095-194.133-128v-49.92h341.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM768 597.333h-512v-426.667h512z"],"attrs":[],"grid":0,"tags":["presentation-check"]},"attrs":[],"properties":{"order":5349,"id":335,"name":"presentation-check","prevSize":32,"code":60518},"setIdx":0,"setId":0,"iconIdx":870},{"icon":{"paths":["M401.493 554.667h103.253c0.073 0 0.16 0.001 0.247 0.001 11.721 0 22.338-4.726 30.049-12.377l-0.003 0.003 152.747-152.747c7.668-7.712 12.407-18.343 12.407-30.080s-4.74-22.368-12.409-30.082l0.002 0.002-103.253-102.4c-7.712-7.668-18.343-12.407-30.080-12.407s-22.368 4.74-30.082 12.409l0.002-0.002-152.747 152.747c-7.763 7.612-12.628 18.155-12.8 29.835l-0 0.032v102.4c0 23.564 19.103 42.667 42.667 42.667v0zM444.16 426.667l110.507-109.227 42.667 42.667-110.080 109.227h-42.667zM896 597.333h-42.667v-426.667h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-768c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h42.667v426.667h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h341.333v49.067l-194.133 128c-12.21 7.649-20.21 21.029-20.21 36.279 0 23.564 19.103 42.667 42.667 42.667 0.355 0 0.709-0.004 1.062-0.013l-0.052 0.001c0.136 0.002 0.297 0.003 0.459 0.003 8.616 0 16.597-2.717 23.134-7.34l-0.126 0.084 147.2-97.28v61.867c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-61.867l147.2 97.28c6.411 4.539 14.392 7.256 23.008 7.256 0.161 0 0.322-0.001 0.483-0.003l-0.025 0c23.422-0.187 42.337-19.217 42.337-42.665 0-14.689-7.423-27.644-18.722-35.319l-0.149-0.095-194.133-128v-49.92h341.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM768 597.333h-512v-426.667h512z"],"attrs":[],"grid":0,"tags":["presentation-edit"]},"attrs":[],"properties":{"order":5350,"id":334,"name":"presentation-edit","prevSize":32,"code":60519},"setIdx":0,"setId":0,"iconIdx":871},{"icon":{"paths":["M896 597.333h-42.667v-469.333c0-23.564-19.103-42.667-42.667-42.667v0h-597.333c-23.564 0-42.667 19.103-42.667 42.667v0 469.333h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h341.333v49.067l-194.133 128c-12.21 7.649-20.21 21.029-20.21 36.279 0 23.564 19.103 42.667 42.667 42.667 0.355 0 0.709-0.004 1.062-0.013l-0.052 0.001c0.136 0.002 0.297 0.003 0.459 0.003 8.616 0 16.597-2.717 23.134-7.34l-0.126 0.084 147.2-97.28v61.867c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-61.867l147.2 97.28c6.411 4.539 14.392 7.256 23.008 7.256 0.161 0 0.322-0.001 0.483-0.003l-0.025 0c23.422-0.187 42.337-19.217 42.337-42.665 0-14.689-7.423-27.644-18.722-35.319l-0.149-0.095-194.133-128v-49.92h341.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM768 597.333h-512v-426.667h512zM384 512c14.744-0.079 27.709-7.624 35.315-19.044l0.098-0.156 56.747-85.333 48.213 48.64c7.73 7.777 18.435 12.59 30.263 12.59 1.513 0 3.008-0.079 4.481-0.232l-0.184 0.016c13.1-1.478 24.261-8.694 31.047-19.038l0.1-0.162 85.333-128c3.191-5.835 5.068-12.782 5.068-20.168 0-23.564-19.103-42.667-42.667-42.667-13.392 0-25.343 6.17-33.165 15.822l-0.063 0.080-56.747 85.333-48.213-48.64c-7.73-7.777-18.435-12.59-30.263-12.59-1.513 0-3.008 0.079-4.481 0.232l0.184-0.016c-13.1 1.478-24.261 8.694-31.047 19.038l-0.1 0.162-85.333 128c-4.386 6.596-6.999 14.701-6.999 23.415 0 14.721 7.455 27.7 18.795 35.369l0.151 0.096c6.411 4.539 14.392 7.256 23.008 7.256 0.161 0 0.322-0.001 0.483-0.003l-0.025 0z"],"attrs":[],"grid":0,"tags":["presentation-line"]},"attrs":[],"properties":{"order":5351,"id":333,"name":"presentation-line","prevSize":32,"code":60520},"setIdx":0,"setId":0,"iconIdx":872},{"icon":{"paths":["M433.92 450.133c6.886 10.506 18.046 17.722 30.952 19.182l0.195 0.018c1.289 0.138 2.784 0.217 4.297 0.217 11.828 0 22.533-4.813 30.261-12.588l0.002-0.002 48.213-48.64 56.747 85.333c7.807 11.149 20.592 18.348 35.058 18.348 0.125 0 0.25-0.001 0.375-0.002l-0.019 0c0.136 0.002 0.297 0.003 0.459 0.003 8.616 0 16.597-2.717 23.134-7.34l-0.126 0.084c11.491-7.765 18.946-20.744 18.946-35.465 0-8.715-2.613-16.819-7.097-23.573l0.098 0.157-85.333-128c-6.886-10.506-18.046-17.722-30.952-19.182l-0.195-0.018c-1.289-0.138-2.784-0.217-4.297-0.217-11.828 0-22.533 4.813-30.261 12.588l-0.002 0.002-48.213 48.64-56.747-85.333c-7.346-13.494-21.421-22.498-37.599-22.498-23.564 0-42.667 19.103-42.667 42.667 0 10.172 3.56 19.513 9.502 26.845l-0.063-0.080zM896 597.333h-42.667v-426.667h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-768c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h42.667v426.667h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h341.333v49.067l-194.133 128c-12.21 7.649-20.21 21.029-20.21 36.279 0 23.564 19.103 42.667 42.667 42.667 0.355 0 0.709-0.004 1.062-0.013l-0.052 0.001c0.136 0.002 0.297 0.003 0.459 0.003 8.616 0 16.597-2.717 23.134-7.34l-0.126 0.084 147.2-97.28v61.867c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-61.867l147.2 97.28c6.411 4.539 14.392 7.256 23.008 7.256 0.161 0 0.322-0.001 0.483-0.003l-0.025 0c23.422-0.187 42.337-19.217 42.337-42.665 0-14.689-7.423-27.644-18.722-35.319l-0.149-0.095-194.133-128v-49.92h341.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM768 597.333h-512v-426.667h512z"],"attrs":[],"grid":0,"tags":["presentation-lines-alt"]},"attrs":[],"properties":{"order":5352,"id":332,"name":"presentation-lines-alt","prevSize":32,"code":60521},"setIdx":0,"setId":0,"iconIdx":873},{"icon":{"paths":["M426.667 426.667h170.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-170.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM896 597.333h-42.667v-426.667h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-768c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h42.667v426.667h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h341.333v49.067l-194.133 128c-12.21 7.649-20.21 21.029-20.21 36.279 0 23.564 19.103 42.667 42.667 42.667 0.355 0 0.709-0.004 1.062-0.013l-0.052 0.001c0.136 0.002 0.297 0.003 0.459 0.003 8.616 0 16.597-2.717 23.134-7.34l-0.126 0.084 147.2-97.28v61.867c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-61.867l147.2 97.28c6.411 4.539 14.392 7.256 23.008 7.256 0.161 0 0.322-0.001 0.483-0.003l-0.025 0c23.422-0.187 42.337-19.217 42.337-42.665 0-14.689-7.423-27.644-18.722-35.319l-0.149-0.095-194.133-128v-49.92h341.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM768 597.333h-512v-426.667h512z"],"attrs":[],"grid":0,"tags":["presentation-minus"]},"attrs":[],"properties":{"order":5353,"id":331,"name":"presentation-minus","prevSize":32,"code":60522},"setIdx":0,"setId":0,"iconIdx":874},{"icon":{"paths":["M896 597.333h-42.667v-426.667h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-768c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h42.667v426.667h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h341.333v49.067l-194.133 128c-12.21 7.649-20.21 21.029-20.21 36.279 0 23.564 19.103 42.667 42.667 42.667 0.355 0 0.709-0.004 1.062-0.013l-0.052 0.001c0.136 0.002 0.297 0.003 0.459 0.003 8.616 0 16.597-2.717 23.134-7.34l-0.126 0.084 147.2-97.28v61.867c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-61.867l147.2 97.28c6.411 4.539 14.392 7.256 23.008 7.256 0.161 0 0.322-0.001 0.483-0.003l-0.025 0c23.422-0.187 42.337-19.217 42.337-42.665 0-14.689-7.423-27.644-18.722-35.319l-0.149-0.095-194.133-128v-49.92h341.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM768 597.333h-512v-426.667h512zM410.027 523.093c10.739 6.449 23.697 10.263 37.547 10.263s26.808-3.814 37.882-10.449l-0.335 0.186 128-74.24c21.627-13.435 35.812-37.061 35.812-64s-14.185-50.565-35.493-63.815l-128.319-74.425c-10.739-6.449-23.697-10.263-37.547-10.263s-26.808 3.814-37.882 10.449l0.335-0.186c-22.327 12.761-37.132 36.43-37.132 63.557 0 0.456 0.004 0.911 0.013 1.365l-0.001-0.068v148.48c0.154 26.966 14.914 50.45 36.763 62.958l0.357 0.188zM458.24 327.68l96.427 56.32-97.28 56.32z"],"attrs":[],"grid":0,"tags":["presentation-play"]},"attrs":[],"properties":{"order":5354,"id":330,"name":"presentation-play","prevSize":32,"code":60523},"setIdx":0,"setId":0,"iconIdx":875},{"icon":{"paths":["M896 597.333h-42.667v-426.667h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-768c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h42.667v426.667h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h341.333v49.067l-194.133 128c-12.21 7.649-20.21 21.029-20.21 36.279 0 23.564 19.103 42.667 42.667 42.667 0.355 0 0.709-0.004 1.062-0.013l-0.052 0.001c0.136 0.002 0.297 0.003 0.459 0.003 8.616 0 16.597-2.717 23.134-7.34l-0.126 0.084 147.2-97.28v61.867c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-61.867l147.2 97.28c6.411 4.539 14.392 7.256 23.008 7.256 0.161 0 0.322-0.001 0.483-0.003l-0.025 0c23.422-0.187 42.337-19.217 42.337-42.665 0-14.689-7.423-27.644-18.722-35.319l-0.149-0.095-194.133-128v-49.92h341.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM768 597.333h-512v-426.667h512zM426.667 426.667h42.667v42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-42.667v-42.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 42.667h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["presentation-plus"]},"attrs":[],"properties":{"order":5355,"id":329,"name":"presentation-plus","prevSize":32,"code":60524},"setIdx":0,"setId":0,"iconIdx":876},{"icon":{"paths":["M396.373 499.627c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 55.040-55.467 55.040 55.467c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003-55.467-55.040 55.467-55.040c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l-0 0-55.040 55.467-55.040-55.467c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l-0-0 55.467 55.040-55.467 55.040c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003zM896 597.333h-42.667v-426.667h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-768c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h42.667v426.667h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h341.333v49.067l-194.133 128c-12.21 7.649-20.21 21.029-20.21 36.279 0 23.564 19.103 42.667 42.667 42.667 0.355 0 0.709-0.004 1.062-0.013l-0.052 0.001c0.136 0.002 0.297 0.003 0.459 0.003 8.616 0 16.597-2.717 23.134-7.34l-0.126 0.084 147.2-97.28v61.867c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-61.867l147.2 97.28c6.411 4.539 14.392 7.256 23.008 7.256 0.161 0 0.322-0.001 0.483-0.003l-0.025 0c23.422-0.187 42.337-19.217 42.337-42.665 0-14.689-7.423-27.644-18.722-35.319l-0.149-0.095-194.133-128v-49.92h341.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM768 597.333h-512v-426.667h512z"],"attrs":[],"grid":0,"tags":["presentation-times"]},"attrs":[],"properties":{"order":5356,"id":328,"name":"presentation-times","prevSize":32,"code":60525},"setIdx":0,"setId":0,"iconIdx":877},{"icon":{"paths":["M896 597.333h-42.667v-426.667h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-768c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h42.667v426.667h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h341.333v49.067l-194.133 128c-12.21 7.649-20.21 21.029-20.21 36.279 0 23.564 19.103 42.667 42.667 42.667 0.355 0 0.709-0.004 1.062-0.013l-0.052 0.001c0.136 0.002 0.297 0.003 0.459 0.003 8.616 0 16.597-2.717 23.134-7.34l-0.126 0.084 147.2-97.28v61.867c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-61.867l147.2 97.28c6.411 4.539 14.392 7.256 23.008 7.256 0.161 0 0.322-0.001 0.483-0.003l-0.025 0c23.422-0.187 42.337-19.217 42.337-42.665 0-14.689-7.423-27.644-18.722-35.319l-0.149-0.095-194.133-128v-49.92h341.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM768 597.333h-512v-426.667h512z"],"attrs":[],"grid":0,"tags":["presentation"]},"attrs":[],"properties":{"order":5357,"id":327,"name":"presentation","prevSize":32,"code":60526},"setIdx":0,"setId":0,"iconIdx":878},{"icon":{"paths":["M572.16 512l140.8-140.373c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l-170.667 170.667c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003 170.667 170.667c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003zM341.333 298.667c-23.564 0-42.667 19.103-42.667 42.667v0 341.333c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-341.333c0-23.564-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["previous"]},"attrs":[],"properties":{"order":5358,"id":326,"name":"previous","prevSize":32,"code":60527},"setIdx":0,"setId":0,"iconIdx":879},{"icon":{"paths":["M298.667 256c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM926.293 502.613l-404.48-403.627c-7.785-8.376-18.85-13.612-31.139-13.653l-0.008-0h-256c-0.073-0-0.16-0.001-0.247-0.001-11.721 0-22.338 4.726-30.049 12.377l0.003-0.003-106.667 106.24c-7.648 7.709-12.374 18.326-12.374 30.047 0 0.087 0 0.173 0.001 0.26l-0-0.013v256c0.169 11.771 4.851 22.416 12.39 30.311l-0.016-0.017 404.907 405.333c7.877 7.522 18.523 12.204 30.26 12.373l0.033 0c0.073 0 0.16 0.001 0.247 0.001 11.721 0 22.338-4.726 30.049-12.377l-0.003 0.003 363.093-363.093c7.648-7.709 12.374-18.326 12.374-30.047 0-0.087-0-0.173-0.001-0.26l0 0.013c-0.283-11.616-4.945-22.091-12.39-29.884l0.016 0.017zM532.907 835.84l-362.24-362.667v-221.44l81.067-81.067h221.013l362.667 362.24z"],"attrs":[],"grid":0,"tags":["pricetag-alt"]},"attrs":[],"properties":{"order":5359,"id":325,"name":"pricetag-alt","prevSize":32,"code":60528},"setIdx":0,"setId":0,"iconIdx":880},{"icon":{"paths":["M298.667 426.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM158.293 97.707c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l-0-0 99.413 97.707c-63.374 8.322-111.791 61.991-111.791 126.97 0 0.362 0.002 0.724 0.005 1.086l-0-0.055v256c0 70.692 57.308 128 128 128v0h42.667v128c0 23.564 19.103 42.667 42.667 42.667v0h426.667c23.564 0 42.667-19.103 42.667-42.667v0-67.84l97.707 98.133c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003zM256 640v42.667h-42.667c-23.564 0-42.667-19.103-42.667-42.667v0-256c0-23.564 19.103-42.667 42.667-42.667v0h67.84l256 256h-238.507c-23.564 0-42.667 19.103-42.667 42.667v0zM682.667 853.333h-341.333v-170.667h281.173l60.16 60.16zM810.667 256h-42.667v-128c0-23.564-19.103-42.667-42.667-42.667v0h-355.84c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h313.173v85.333h-142.507c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h270.507c23.564 0 42.667 19.103 42.667 42.667v0 256c0.112 0.705 0.175 1.519 0.175 2.347s-0.064 1.641-0.187 2.435l0.011-0.088c-0.549 2.567-0.863 5.517-0.863 8.54 0 20.547 14.524 37.702 33.866 41.758l0.278 0.049h8.533c0.256 0.006 0.558 0.009 0.86 0.009 20.547 0 37.701-14.523 41.758-33.864l0.049-0.278c0.624-4.618 0.98-9.956 0.98-15.377 0-1.945-0.046-3.879-0.136-5.802l0.010 0.272v-256c0-70.692-57.308-128-128-128v0z"],"attrs":[],"grid":0,"tags":["print-slash"]},"attrs":[],"properties":{"order":5360,"id":324,"name":"print-slash","prevSize":32,"code":60529},"setIdx":0,"setId":0,"iconIdx":881},{"icon":{"paths":["M298.667 426.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM810.667 256h-42.667v-128c0-23.564-19.103-42.667-42.667-42.667v0h-426.667c-23.564 0-42.667 19.103-42.667 42.667v0 128h-42.667c-70.692 0-128 57.308-128 128v0 256c0 70.692 57.308 128 128 128v0h42.667v128c0 23.564 19.103 42.667 42.667 42.667v0h426.667c23.564 0 42.667-19.103 42.667-42.667v0-128h42.667c70.692 0 128-57.308 128-128v0-256c0-70.692-57.308-128-128-128v0zM341.333 170.667h341.333v85.333h-341.333zM682.667 853.333h-341.333v-170.667h341.333zM853.333 640c0 23.564-19.103 42.667-42.667 42.667v0h-42.667v-42.667c0-23.564-19.103-42.667-42.667-42.667v0h-426.667c-23.564 0-42.667 19.103-42.667 42.667v0 42.667h-42.667c-23.564 0-42.667-19.103-42.667-42.667v0-256c0-23.564 19.103-42.667 42.667-42.667v0h597.333c23.564 0 42.667 19.103 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["print"]},"attrs":[],"properties":{"order":5361,"id":323,"name":"print","prevSize":32,"code":60530},"setIdx":0,"setId":0,"iconIdx":882},{"icon":{"paths":["M298.313 618.752c-0.003-0-0.007-0-0.011-0-23.558 0-42.656 19.098-42.656 42.656 0 0.004 0 0.008 0 0.012l-0-0.001v76.044c-52.976-59.696-85.333-138.732-85.333-225.326 0-0.018 0-0.036 0-0.054l-0 0.003c-0-0.058-0-0.127-0-0.196 0-13.162 0.817-26.133 2.404-38.866l-0.154 1.52c0.206-1.576 0.324-3.4 0.324-5.25 0-23.562-19.101-42.663-42.663-42.663-21.8 0-39.782 16.351-42.349 37.458l-0.020 0.205c-1.83 14.217-2.875 30.663-2.875 47.354 0 0.154 0 0.308 0 0.462l-0-0.024c0.062 106.253 39.093 203.378 103.573 277.869l-0.453-0.536h-60.453c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h170.667c13.997-0.181 26.317-7.2 33.794-17.863l0.089-0.134c0.497-0.656 1.133-1.143 1.596-1.835 0.284-0.425 0.292-0.927 0.557-1.359 1.913-3.173 3.464-6.843 4.461-10.735l0.062-0.286c0.575-1.89 1.046-4.144 1.322-6.458l0.019-0.193c0.122-1.318 0.768-2.453 0.768-3.802v-170.667c0-0.004 0-0.008 0-0.012 0-23.558-19.098-42.656-42.656-42.656-0.004 0-0.009 0-0.013 0l0.001-0zM362.313 256.085h-76.052c59.703-52.977 138.746-85.333 225.346-85.333 0.014 0 0.028 0 0.041 0l-0.002-0c0.215-0.001 0.47-0.001 0.725-0.001 12.97 0 25.748 0.818 38.287 2.405l-1.491-0.154c1.545 0.198 3.332 0.311 5.146 0.311 23.575 0 42.686-19.111 42.686-42.686 0-21.761-16.284-39.719-37.331-42.354l-0.209-0.021c-14.156-1.804-30.535-2.834-47.154-2.834-0.231 0-0.463 0-0.694 0.001l0.035-0c-106.252 0.060-203.377 39.088-277.869 103.565l0.535-0.453v-60.445c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 170.667c0.299 3.078 0.891 5.898 1.757 8.596l-0.080-0.288 0.010 0.052c1.123 5.575 3.218 10.514 6.118 14.872l-0.095-0.152 0.487 0.721c2.866 4.133 6.326 7.618 10.301 10.423l0.131 0.088c0.466 0.341 0.698 0.864 1.182 1.19 0.61 0.404 1.3 0.532 1.922 0.901 2.187 1.342 4.713 2.552 7.365 3.495l0.286 0.089c3.287 1.184 7.092 1.989 11.046 2.248l0.126 0.007c0.739 0.039 1.362 0.427 2.109 0.427h170.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM872.625 717.060c-1.122-5.576-3.218-10.517-6.121-14.875l0.095 0.151-0.482-0.716c-2.868-4.135-6.331-7.622-10.309-10.428l-0.131-0.088c-0.466-0.338-0.695-0.864-1.177-1.187-0.461-0.305-1.008-0.315-1.476-0.602-5.048-2.861-10.949-4.897-17.227-5.75l-0.255-0.028c-1.349-0.128-2.513-0.787-3.896-0.787h-170.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h76.049c-59.701 52.977-138.743 85.333-225.341 85.333-0.015 0-0.029-0-0.044-0l0.002 0c-0.117 0-0.256 0-0.395 0-13.086 0-25.978-0.833-38.626-2.448l1.5 0.156c-1.545-0.198-3.332-0.311-5.146-0.311-23.575 0-42.686 19.111-42.686 42.686 0 21.761 16.284 39.719 37.331 42.354l0.209 0.021c14.353 1.829 30.96 2.873 47.811 2.875l0.002 0c106.252-0.060 203.377-39.088 277.869-103.565l-0.536 0.453v60.447c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-170.667c-0.299-3.078-0.891-5.898-1.757-8.595l0.080 0.288zM895.646 234.752c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-170.667c-3.035 0.298-5.813 0.881-8.472 1.731l0.003-0.022c-5.505 1.124-10.381 3.193-14.69 6.049l0.153-0.095-0.836 0.565c-4.113 2.861-7.583 6.311-10.379 10.271l-0.088 0.131c-0.336 0.461-0.853 0.687-1.172 1.164-0.305 0.458-0.315 1-0.602 1.466-2.897 5.081-4.949 11.028-5.791 17.357l-0.027 0.249c-0.122 1.318-0.768 2.453-0.768 3.802v170.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-76.070c52.977 59.713 85.333 138.763 85.333 225.372 0 0.010-0 0.020-0 0.031l0-0.002c0 0.059 0 0.128 0 0.197 0 13.162-0.818 26.133-2.405 38.865l0.155-1.52c-0.195 1.533-0.306 3.306-0.306 5.105 0 21.757 16.268 39.715 37.304 42.373l0.211 0.022c1.517 0.186 3.272 0.292 5.053 0.292 0.055 0 0.109-0 0.164-0l-0.008 0c21.732-0.029 39.654-16.306 42.27-37.333l0.021-0.208c1.83-14.217 2.875-30.664 2.875-47.354 0-0.153-0-0.306-0-0.459l0 0.024c-0.063-106.254-39.096-203.379-103.578-277.868l0.453 0.535z"],"attrs":[],"grid":0,"tags":["process"]},"attrs":[],"properties":{"order":5362,"id":322,"name":"process","prevSize":32,"code":60531},"setIdx":0,"setId":0,"iconIdx":883},{"icon":{"paths":["M597.333 384h-170.667c-23.564 0-42.667 19.103-42.667 42.667v0 170.667c0 23.564 19.103 42.667 42.667 42.667v0h170.667c23.564 0 42.667-19.103 42.667-42.667v0-170.667c0-23.564-19.103-42.667-42.667-42.667v0zM554.667 554.667h-85.333v-85.333h85.333zM896 554.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-85.333v-85.333h85.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-93.013c-13.196-36.33-41.323-64.457-76.764-77.37l-0.89-0.283v-93.013c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 85.333h-85.333v-85.333c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 85.333h-85.333v-85.333c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 93.013c-36.33 13.196-64.457 41.323-77.37 76.764l-0.283 0.89h-93.013c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h85.333v85.333h-85.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h85.333v85.333h-85.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h93.013c13.196 36.33 41.323 64.457 76.764 77.37l0.89 0.283v93.013c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-85.333h85.333v85.333c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-85.333h85.333v85.333c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-93.013c36.33-13.196 64.457-41.323 77.37-76.764l0.283-0.89h93.013c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-85.333v-85.333zM725.333 682.667c0 23.564-19.103 42.667-42.667 42.667v0h-341.333c-23.564 0-42.667-19.103-42.667-42.667v0-341.333c0-23.564 19.103-42.667 42.667-42.667v0h341.333c23.564 0 42.667 19.103 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["processor"]},"attrs":[],"properties":{"order":5363,"id":321,"name":"processor","prevSize":32,"code":60532},"setIdx":0,"setId":0,"iconIdx":884},{"icon":{"paths":["M938.667 128l-128 644.267-388.267 128-337.067-128 34.133-174.933h145.067l-17.067 72.533 204.8 76.8 234.667-76.8 34.133-162.133h-584.533l29.867-145.067h580.267l21.333-89.6h-584.533l29.867-145.067h725.333z"],"attrs":[],"grid":0,"tags":["programming-language"]},"attrs":[],"properties":{"order":5364,"id":320,"name":"programming-language","prevSize":32,"code":60533},"setIdx":0,"setId":0,"iconIdx":885},{"icon":{"paths":["M876.373 268.373l-125.867-125.867c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l42.667 42.667-35.413 106.24c-4.129 12.030-6.512 25.891-6.512 40.309 0 35.43 14.395 67.498 37.655 90.674l0.004 0.004 125.867 128v199.68c0 23.564-19.103 42.667-42.667 42.667s-42.667-19.103-42.667-42.667v0-85.333c0-70.692-57.308-128-128-128v0h-43.52v-384c0-70.692-57.308-128-128-128v0h-256c-70.692 0-128 57.308-128 128v0 597.333c0 70.692 57.308 128 128 128v0h256c70.692 0 128-57.308 128-128v0-128h42.667c23.564 0 42.667 19.103 42.667 42.667v0 85.333c0 70.692 57.308 128 128 128s128-57.308 128-128v0-391.253c0-0.113 0-0.247 0-0.381 0-58.816-23.801-112.072-62.298-150.663l0.004 0.004zM512 810.667c0 23.564-19.103 42.667-42.667 42.667v0h-256c-23.564 0-42.667-19.103-42.667-42.667v0-298.667h341.333zM512 426.667h-341.333v-213.333c0-23.564 19.103-42.667 42.667-42.667v0h256c23.564 0 42.667 19.103 42.667 42.667v0zM853.333 487.253l-65.707-65.707c-7.546-7.69-12.203-18.238-12.203-29.873 0-4.568 0.718-8.969 2.047-13.095l-0.084 0.302 21.76-65.707 16.64 17.067c22.879 22.847 37.153 54.306 37.546 89.099l0.001 0.075z"],"attrs":[],"grid":0,"tags":["pump"]},"attrs":[],"properties":{"order":5365,"id":319,"name":"pump","prevSize":32,"code":60534},"setIdx":0,"setId":0,"iconIdx":886},{"icon":{"paths":["M725.333 938.667h-512c-70.692 0-128-57.308-128-128v0-426.667c0-70.692 57.308-128 128-128v0h42.667c1.9-92.788 77.567-167.28 170.633-167.28 58.238 0 109.664 29.171 140.462 73.698l0.372 0.568c18.39 25.929 29.522 58.138 29.866 92.929l0.001 0.085h128c23.564 0 42.667 19.103 42.667 42.667v0 128c92.788 1.9 167.28 77.567 167.28 170.633 0 58.238-29.171 109.664-73.698 140.462l-0.568 0.372c-25.929 18.39-58.138 29.522-92.929 29.866l-0.085 0.001v128c0 23.564-19.103 42.667-42.667 42.667v0zM213.333 341.333c-23.564 0-42.667 19.103-42.667 42.667v0 426.667c0 23.564 19.103 42.667 42.667 42.667v0h469.333v-135.68c-0-0.068-0.001-0.149-0.001-0.229 0-14.283 7.018-26.926 17.793-34.67l0.127-0.087c6.88-4.957 15.479-7.928 24.772-7.928 5.036 0 9.867 0.872 14.352 2.474l-0.298-0.093c8.436 3.539 18.241 5.595 28.526 5.595 17.264 0 33.175-5.793 45.895-15.541l-0.18 0.133c20.662-12.753 35.308-33.562 39.605-57.94l0.075-0.513c0.494-3.45 0.776-7.434 0.776-11.485 0-21.643-8.057-41.404-21.336-56.448l0.080 0.092c-14.9-18.003-37.249-29.388-62.257-29.388-10.933 0-21.357 2.176-30.864 6.117l0.535-0.196c-4.187 1.509-9.019 2.381-14.054 2.381-9.293 0-17.892-2.971-24.899-8.015l0.127 0.087c-10.903-7.831-17.921-20.475-17.921-34.757 0-0.081 0-0.161 0.001-0.242l-0 0.012v-135.68h-136.533c-0.721 0.044-1.565 0.068-2.414 0.068-23.564 0-42.667-19.103-42.667-42.667 0-5.070 0.884-9.934 2.508-14.446l-0.093 0.297c3.539-8.436 5.595-18.241 5.595-28.526 0-17.264-5.793-33.175-15.541-45.895l0.133 0.18c-14.655-24.578-41.102-40.785-71.333-40.785-21.945 0-41.896 8.54-56.709 22.478l0.042-0.040c-15.59 15.466-25.242 36.9-25.242 60.587 0 1.2 0.025 2.395 0.074 3.583l-0.006-0.17c0.107 10.313 2.134 20.123 5.739 29.13l-0.192-0.543c1.515 4.195 2.39 9.035 2.39 14.081 0 23.564-19.103 42.667-42.667 42.667-0.090 0-0.181-0-0.271-0.001l0.014 0z"],"attrs":[],"grid":0,"tags":["puzzle-piece"]},"attrs":[],"properties":{"order":5366,"id":318,"name":"puzzle-piece","prevSize":32,"code":60535},"setIdx":0,"setId":0,"iconIdx":887},{"icon":{"paths":["M341.333 896h-170.667c-23.564 0-42.667-19.103-42.667-42.667v0-170.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 170.667c0 70.692 57.308 128 128 128v0h170.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM938.667 640c-23.564 0-42.667 19.103-42.667 42.667v0 170.667c0 23.564-19.103 42.667-42.667 42.667v0h-170.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h170.667c70.692 0 128-57.308 128-128v0-170.667c0-23.564-19.103-42.667-42.667-42.667v0zM853.333 42.667h-170.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h170.667c23.564 0 42.667 19.103 42.667 42.667v0 170.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-170.667c0-70.692-57.308-128-128-128v0zM85.333 384c23.564 0 42.667-19.103 42.667-42.667v0-170.667c0-23.564 19.103-42.667 42.667-42.667v0h170.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-170.667c-70.692 0-128 57.308-128 128v0 170.667c0 23.564 19.103 42.667 42.667 42.667v0zM426.667 213.333h-170.667c-23.564 0-42.667 19.103-42.667 42.667v0 170.667c0 23.564 19.103 42.667 42.667 42.667v0h170.667c23.564 0 42.667-19.103 42.667-42.667v0-170.667c0-23.564-19.103-42.667-42.667-42.667v0zM384 384h-85.333v-85.333h85.333zM597.333 469.333h170.667c23.564 0 42.667-19.103 42.667-42.667v0-170.667c0-23.564-19.103-42.667-42.667-42.667v0h-170.667c-23.564 0-42.667 19.103-42.667 42.667v0 170.667c0 23.564 19.103 42.667 42.667 42.667v0zM640 298.667h85.333v85.333h-85.333zM426.667 554.667h-170.667c-23.564 0-42.667 19.103-42.667 42.667v0 170.667c0 23.564 19.103 42.667 42.667 42.667v0h170.667c23.564 0 42.667-19.103 42.667-42.667v0-170.667c0-23.564-19.103-42.667-42.667-42.667v0zM384 725.333h-85.333v-85.333h85.333zM597.333 682.667c23.564 0 42.667-19.103 42.667-42.667v0c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-42.667c-23.564 0-42.667 19.103-42.667 42.667v0 42.667c0 23.564 19.103 42.667 42.667 42.667v0zM768 554.667c-23.564 0-42.667 19.103-42.667 42.667v0 128c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h42.667c23.564 0 42.667-19.103 42.667-42.667v0-170.667c0-23.564-19.103-42.667-42.667-42.667v0zM597.333 725.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["qrcode-scan"]},"attrs":[],"properties":{"order":5367,"id":317,"name":"qrcode-scan","prevSize":32,"code":60536},"setIdx":0,"setId":0,"iconIdx":888},{"icon":{"paths":["M481.707 652.373c-1.746 1.923-3.427 4.010-4.98 6.193l-0.14 0.207c-1.521 2.211-2.82 4.75-3.77 7.453l-0.070 0.227c-1.157 2.221-2.047 4.798-2.535 7.514l-0.025 0.166c-0.1 1.277-0.157 2.765-0.157 4.267s0.057 2.99 0.169 4.463l-0.012-0.196c-0.008 0.275-0.012 0.599-0.012 0.923 0 5.554 1.263 10.813 3.518 15.505l-0.093-0.215c3.967 10.747 12.293 19.073 22.774 22.954l0.266 0.086c4.771 2.163 10.345 3.423 16.213 3.423s11.443-1.26 16.466-3.525l-0.253 0.102c10.747-3.967 19.073-12.293 22.954-22.774l0.086-0.266c1.64-4.353 2.589-9.384 2.589-14.637 0-0.554-0.011-1.106-0.032-1.656l0.002 0.079c0-0.073 0.001-0.16 0.001-0.247 0-11.721-4.726-22.338-12.377-30.049l0.003 0.003c-7.733-7.795-18.45-12.621-30.293-12.621s-22.56 4.826-30.291 12.618l-0.003 0.003zM512 85.333c-235.641 0-426.667 191.025-426.667 426.667s191.025 426.667 426.667 426.667c235.641 0 426.667-191.025 426.667-426.667v0c0-235.641-191.025-426.667-426.667-426.667v0zM512 853.333c-188.513 0-341.333-152.82-341.333-341.333s152.82-341.333 341.333-341.333c188.513 0 341.333 152.82 341.333 341.333v0c0 188.513-152.82 341.333-341.333 341.333v0zM512 298.667c-0.024-0-0.053-0-0.082-0-47.128 0-88.308 25.47-110.524 63.396l-0.327 0.604c-4.177 6.48-6.66 14.395-6.66 22.89 0 23.564 19.103 42.667 42.667 42.667 16.334 0 30.524-9.178 37.694-22.659l0.112-0.23c7.514-12.844 21.241-21.334 36.951-21.334 0.060 0 0.119 0 0.179 0l-0.009-0c23.564 0 42.667 19.103 42.667 42.667s-19.103 42.667-42.667 42.667v0c-23.564 0-42.667 19.103-42.667 42.667v0 42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-7.68c49.617-18.379 84.34-65.296 84.34-120.324 0-70.343-56.743-127.434-126.954-127.996l-0.053-0z"],"attrs":[],"grid":0,"tags":["question-circle"]},"attrs":[],"properties":{"order":5368,"id":316,"name":"question-circle","prevSize":32,"code":60537},"setIdx":0,"setId":0,"iconIdx":889},{"icon":{"paths":["M654.188 405.333c-0.002-82.475-66.862-149.334-149.338-149.334-54.984 0-103.027 29.715-128.947 73.962l-0.382 0.705c-3.586 6.115-5.704 13.468-5.704 21.314 0 23.568 19.106 42.673 42.673 42.673 15.706 0 29.43-8.485 36.838-21.12l0.109-0.201c11.287-19.246 31.863-31.972 55.413-32l0.004-0c35.346 0 64 28.654 64 64s-28.654 64-64 64v0h-0.104c-2.999 0.306-5.739 0.889-8.362 1.731l0.287-0.080c-3.155 0.334-6.029 0.945-8.786 1.82l0.312-0.085c-2.52 1.381-4.692 2.863-6.706 4.53l0.070-0.056c-2.624 1.44-4.887 2.992-6.981 4.739l0.069-0.056c-1.827 2.168-3.484 4.596-4.882 7.184l-0.112 0.227c-1.465 1.8-2.831 3.812-4.016 5.939l-0.109 0.212c-0.862 2.625-1.508 5.695-1.814 8.864l-0.014 0.178c-0.684 2.165-1.219 4.716-1.502 7.342l-0.016 0.179v42.667l0.099 0.484 0.047 20.953c0.063 23.518 19.141 42.559 42.666 42.563l0.104 0c23.52-0.061 42.563-19.141 42.563-42.669 0-0.036-0-0.072-0-0.107l0 0.006-0.065-28.219c61.972-18.848 106.336-75.381 106.586-142.314l0-0.030zM474.875 695.040c-7.795 7.733-12.621 18.45-12.621 30.294 0 23.497 18.994 42.558 42.465 42.666l0.010 0c11.788-0.099 22.46-4.798 30.326-12.386l-0.013 0.013c7.64-7.803 12.354-18.497 12.354-30.292s-4.714-22.488-12.361-30.299l0.007 0.008c-7.859-7.339-18.446-11.846-30.085-11.846-11.637 0-22.223 4.505-30.107 11.866l0.026-0.024z"],"attrs":[],"grid":0,"tags":["question"]},"attrs":[],"properties":{"order":5369,"id":315,"name":"question","prevSize":32,"code":60538},"setIdx":0,"setId":0,"iconIdx":890},{"icon":{"paths":["M384 330.667c0-117.333-110.080-192.427-114.773-195.413-6.699-4.582-14.977-7.318-23.893-7.318s-17.194 2.735-24.040 7.412l0.147-0.095c-4.693 3.413-114.773 78.080-114.773 195.413 0 76.583 62.083 138.667 138.667 138.667s138.667-62.083 138.667-138.667v0zM245.333 384c-29.455 0-53.333-23.878-53.333-53.333v0c3.743-41.936 23.551-78.634 53.144-104.372l0.19-0.162c29.96 25.767 49.828 62.538 53.296 103.972l0.038 0.561c0 29.455-23.878 53.333-53.333 53.333v0zM503.893 433.92c-6.699-4.582-14.977-7.318-23.893-7.318s-17.194 2.735-24.040 7.412l0.147-0.095c-7.253 5.12-178.773 123.733-178.773 302.080-0 111.93 90.737 202.667 202.667 202.667s202.667-90.737 202.667-202.667v0c0-181.333-170.667-297.387-178.773-302.080zM480 853.333c-64.801 0-117.333-52.532-117.333-117.333v0c0-98.56 77.227-177.92 117.76-213.333 40.107 33.707 116.907 112.213 116.907 213.333 0 64.801-52.532 117.333-117.333 117.333v0zM770.56 92.587c-6.699-4.582-14.977-7.318-23.893-7.318s-17.194 2.735-24.040 7.412l0.147-0.095c-5.973 4.267-146.773 101.547-146.773 248.747 0 94.257 76.41 170.667 170.667 170.667s170.667-76.41 170.667-170.667v0c0-148.907-140.8-244.907-146.773-248.747zM746.667 426.667c-47.128 0-85.333-38.205-85.333-85.333v0c6.284-64.393 38.032-120.341 84.903-158.382l0.43-0.338c47.486 38.23 79.303 94.259 85.264 157.804l0.069 0.916c0 47.128-38.205 85.333-85.333 85.333v0z"],"attrs":[],"grid":0,"tags":["raindrops-alt"]},"attrs":[],"properties":{"order":5370,"id":314,"name":"raindrops-alt","prevSize":32,"code":60539},"setIdx":0,"setId":0,"iconIdx":891},{"icon":{"paths":["M213.333 512c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0c117.821 0 213.333 95.513 213.333 213.333v0c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0c0-164.949-133.718-298.667-298.667-298.667v0zM213.333 170.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0c306.334 0 554.667 248.333 554.667 554.667v0c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0c0-353.462-286.538-640-640-640v0zM213.333 341.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0c212.077 0 384 171.923 384 384v0c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0c0-259.206-210.128-469.333-469.333-469.333v0z"],"attrs":[],"grid":0,"tags":["rainbow"]},"attrs":[],"properties":{"order":5371,"id":313,"name":"rainbow","prevSize":32,"code":60540},"setIdx":0,"setId":0,"iconIdx":892},{"icon":{"paths":["M448 341.333c0-148.907-140.8-244.907-146.773-248.747-6.699-4.582-14.977-7.318-23.893-7.318s-17.194 2.735-24.040 7.412l0.147-0.095c-5.973 4.267-146.773 101.547-146.773 248.747 0 94.257 76.41 170.667 170.667 170.667s170.667-76.41 170.667-170.667v0zM277.333 426.667c-47.128 0-85.333-38.205-85.333-85.333v0c6.284-64.393 38.032-120.341 84.903-158.382l0.43-0.338c47.486 38.23 79.303 94.259 85.264 157.804l0.069 0.916c0 47.128-38.205 85.333-85.333 85.333v0zM770.56 92.587c-6.699-4.582-14.977-7.318-23.893-7.318s-17.194 2.735-24.040 7.412l0.147-0.095c-5.973 4.267-146.773 101.547-146.773 248.747 0 94.257 76.41 170.667 170.667 170.667s170.667-76.41 170.667-170.667v0c0-148.907-140.8-244.907-146.773-248.747zM746.667 426.667c-47.128 0-85.333-38.205-85.333-85.333v0c6.284-64.393 38.032-120.341 84.903-158.382l0.43-0.338c47.486 38.23 79.303 94.259 85.264 157.804l0.069 0.916c0 47.128-38.205 85.333-85.333 85.333v0zM557.227 519.253c-6.699-4.582-14.977-7.318-23.893-7.318s-17.194 2.735-24.040 7.412l0.147-0.095c-5.973 4.267-146.773 101.547-146.773 248.747 0 94.257 76.41 170.667 170.667 170.667s170.667-76.41 170.667-170.667v0c0-148.907-140.8-244.907-146.773-248.747zM533.333 853.333c-47.128 0-85.333-38.205-85.333-85.333v0c6.284-64.393 38.032-120.341 84.903-158.382l0.43-0.338c47.486 38.23 79.303 94.259 85.264 157.804l0.069 0.916c0 47.128-38.205 85.333-85.333 85.333v0z"],"attrs":[],"grid":0,"tags":["raindrops"]},"attrs":[],"properties":{"order":5372,"id":312,"name":"raindrops","prevSize":32,"code":60541},"setIdx":0,"setId":0,"iconIdx":893},{"icon":{"paths":["M473.728 445.352c-22.938 13.42-38.1 37.935-38.1 65.991 0 42.084 34.116 76.2 76.2 76.2s76.2-34.116 76.2-76.2c0-14.029-3.791-27.173-10.405-38.463l0.195 0.36c-13.422-22.935-37.935-38.095-65.99-38.095-14.027 0-27.169 3.79-38.458 10.402l0.36-0.195zM815.262 528.026q-7.504-8.576-15.836-17.198 5.82-6.117 11.264-12.224c68.515-76.982 97.432-154.185 70.638-200.599-25.693-44.501-102.12-57.763-197.8-39.159q-14.136 2.766-28.117 6.24-2.676-9.226-5.693-18.347c-32.459-97.815-84.892-161.44-138.483-161.406-51.388 0.023-101.055 59.609-132.739 151.787q-4.676 13.64-8.651 27.508-9.347-2.293-18.773-4.237c-100.949-20.727-182.258-7.076-209 39.364-25.643 44.534 1.175 117.326 65.216 190.81q9.527 10.906 19.593 21.323c-7.911 8.149-15.403 16.294-22.385 24.393-62.49 72.448-87.773 144.049-62.172 188.391 26.44 45.802 106.604 60.773 204.177 41.573q11.861-2.351 23.591-5.291 4.297 15 9.427 29.739c31.544 90.328 80.932 147.995 132.139 147.977 52.883-0.031 105.896-61.99 138.016-156.107 2.537-7.438 4.938-15.162 7.214-23.115q15.153 3.77 30.5 6.69c94.010 17.786 168.64 3.797 194.195-40.576 26.388-45.836-0.82-122.711-66.322-197.536zM173.661 317.945c16.463-28.587 82.912-39.739 170.073-21.845q8.356 1.718 16.998 3.84c-7.678 32.111-14.027 71.069-17.715 110.798l-0.259 3.449c-33.468 23.676-62.741 47.393-90.4 72.836l0.634-0.576q-9.363-9.683-18.226-19.836l0.003 0.003c-54.872-62.963-76.56-121.833-61.107-148.669zM339.492 562.344c-21.784-16.495-42.029-33.393-60.404-50.389 18.362-16.89 38.62-33.732 60.359-50.182q-1.172 25.137-1.161 50.313 0.017 25.139 1.206 50.259zM339.466 730.476c-20.14 4.679-43.266 7.361-67.019 7.361-16.095 0-31.902-1.231-47.332-3.605l1.723 0.218c-21.485-1.721-40.224-12.217-52.837-27.858l-0.113-0.144c-15.534-26.909 4.768-84.395 58.211-146.356q10.078-11.648 20.817-22.688c27.081 25.041 56.401 48.849 87.199 70.713l2.705 1.823c4.002 43.746 10.426 83.203 19.355 121.701l-1.17-5.989q-10.708 2.678-21.54 4.824zM642.448 387.464q-21.465-13.525-43.461-26.182-21.645-12.459-43.81-23.982c25.301-10.638 50.172-19.724 74.182-27.128 4.88 20.579 9.476 46.86 12.719 73.559l0.369 3.733zM412.971 248.969c27.146-78.982 67.312-127.169 98.284-127.183 32.985-0.016 75.841 51.979 103.865 136.432q2.731 8.258 5.163 16.609c-42.959 13.389-78.675 27.448-113.156 43.696l5.331-2.258c-29.167-14.204-64.753-28.411-101.418-40.211l-6.059-1.685q3.683-12.797 7.992-25.401zM395.888 309.717c30.532 9.609 54.985 18.904 78.817 29.353l-5.017-1.961q-44.836 23.138-87.354 50.406c3.424-27.221 7.981-53.302 13.555-77.798zM382.396 636.573q21.203 13.574 43.026 26.143 22.261 12.817 45.114 24.557c-19.091 8.825-43.732 18.439-68.947 26.796l-5.483 1.574c-5.638-24.836-10.245-51.375-13.711-79.070zM615.172 770.781c-12.194 38.181-30.209 71.292-53.301 100.167l0.475-0.615-0.003 0.003c-11.626 16.799-29.545 28.536-50.278 31.816l-0.427 0.056c-31.070 0.018-70.727-46.293-97.703-123.539q-4.765-13.699-8.768-27.648c42.868-13.902 78.57-28.493 112.98-45.319l-5.068 2.238c29.345 14.062 65.346 28.226 102.402 40.023l6.285 1.727q-3.039 10.623-6.594 21.091zM630.627 714.281c-24.286-7.509-49.518-16.748-75.185-27.542q21.703-11.422 43.721-24.125 22.594-13.047 44.036-26.747c-3.341 30.631-7.766 57.336-13.517 83.544l0.944-5.128zM649.669 511.927q0.047 38.867-2.427 77.672c-21.021 14.226-43.214 28.117-66.304 41.448-22.995 13.276-45.778 25.477-68.128 36.518q-35.278-16.906-69.195-36.437-33.727-19.413-65.906-41.344-2.941-38.793-2.964-77.727l0.005 0.008q-0.027-38.906 2.899-77.732c21.015-14.352 43.047-28.232 65.825-41.383 22.883-13.213 45.952-25.362 68.893-36.372q34.843 16.934 68.43 36.294 33.703 19.371 66.091 40.904 2.781 39.016 2.784 78.151zM690.49 294.633c81.977-15.945 143.787-5.219 159.271 21.599 16.495 28.57-7.146 91.669-66.297 158.138l-0.003 0.003q-4.902 5.5-10.172 11.047c-27.414-24.861-57.252-48.52-88.603-70.142l-2.873-1.873c-3.685-42.57-9.804-81.139-18.404-118.763l1.104 5.742q13.24-3.258 25.976-5.75zM684.948 460.38c23.274 17.070 43.591 33.685 63.012 51.271l-0.661-0.589c-18.818 17.391-39.071 34.283-60.16 50.121l-1.994 1.433q0.992-25.34 0.976-50.706-0.012-25.771-1.174-51.53zM849.987 707.367c-15.508 26.929-75.43 38.159-155.828 22.948q-13.82-2.609-28.362-6.211c7.355-32.475 13.216-71.583 16.345-111.458l0.187-2.964c34.006-23.791 63.749-47.83 91.747-73.727l-0.565 0.517q7.528 7.82 14.32 15.568v-0.003c24.841 26.943 45.065 58.603 59.125 93.413l0.739 2.072c4.672 9.524 7.404 20.727 7.404 32.568 0 9.814-1.877 19.189-5.29 27.787l0.178-0.509z"],"attrs":[],"grid":0,"tags":["react"]},"attrs":[],"properties":{"order":5373,"id":311,"name":"react","prevSize":32,"code":60542},"setIdx":0,"setId":0,"iconIdx":894},{"icon":{"paths":["M426.667 341.333h256c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-256c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM341.333 512h341.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-341.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM341.333 682.667h341.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-341.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM853.333 85.333h-682.667c-23.564 0-42.667 19.103-42.667 42.667v0 768c0 23.564 19.103 42.667 42.667 42.667 9.653 0 18.558-3.206 25.707-8.611l-0.107 0.078 88.32-66.133 87.893 66.133c7.042 5.327 15.947 8.533 25.6 8.533s18.558-3.206 25.707-8.611l-0.107 0.078 88.32-66.133 88.32 66.133c7.042 5.327 15.947 8.533 25.6 8.533s18.558-3.206 25.707-8.611l-0.107 0.078 87.893-66.133 88.32 66.133c7.022 5.28 15.889 8.456 25.497 8.456 7.043 0 13.687-1.706 19.542-4.728l-0.239 0.112c13.992-7.163 23.415-21.462 23.467-37.966l0-0.007v-768c0-23.564-19.103-42.667-42.667-42.667v0zM810.667 810.667l-45.653-34.133c-7.042-5.327-15.947-8.533-25.6-8.533s-18.558 3.206-25.707 8.611l0.107-0.078-87.893 66.133-88.32-66.133c-7.042-5.327-15.947-8.533-25.6-8.533s-18.558 3.206-25.707 8.611l0.107-0.078-88.32 66.133-87.893-66.133c-7.042-5.327-15.947-8.533-25.6-8.533s-18.558 3.206-25.707 8.611l0.107-0.078-45.653 34.133v-640h597.333z"],"attrs":[],"grid":0,"tags":["receipt-alt"]},"attrs":[],"properties":{"order":5374,"id":310,"name":"receipt-alt","prevSize":32,"code":60543},"setIdx":0,"setId":0,"iconIdx":895},{"icon":{"paths":["M384 512h-85.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h85.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM341.333 426.667h170.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-170.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM384 682.667h-85.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h85.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM896 512h-128v-384c0-0.050 0-0.11 0-0.169 0-15.71-8.49-29.436-21.132-36.842l-0.201-0.109c-6.12-3.594-13.479-5.716-21.333-5.716s-15.214 2.123-21.535 5.825l0.201-0.109-128 73.387-128-73.387c-6.12-3.594-13.479-5.716-21.333-5.716s-15.214 2.123-21.535 5.825l0.201-0.109-128 73.387-128-73.387c-6.12-3.594-13.479-5.716-21.333-5.716s-15.214 2.123-21.535 5.825l0.201-0.109c-12.844 7.514-21.334 21.241-21.334 36.951 0 0.060 0 0.119 0 0.179l-0-0.009v682.667c0 70.692 57.308 128 128 128v0h597.333c70.692 0 128-57.308 128-128v0-256c0-23.564-19.103-42.667-42.667-42.667v0zM213.333 853.333c-23.564 0-42.667-19.103-42.667-42.667v0-608.853l85.333 48.64c6.189 3.299 13.535 5.236 21.333 5.236s15.144-1.937 21.583-5.357l-0.249 0.121 128-73.387 128 73.387c6.189 3.299 13.535 5.236 21.333 5.236s15.144-1.937 21.583-5.357l-0.249 0.121 85.333-48.64v608.853c0.125 15.341 2.93 29.989 7.968 43.552l-0.288-0.885zM853.333 810.667c0 23.564-19.103 42.667-42.667 42.667s-42.667-19.103-42.667-42.667v0-213.333h85.333zM578.56 689.92c-2.211-1.521-4.75-2.82-7.453-3.77l-0.227-0.070c-2.35-1.229-5.082-2.127-7.969-2.544l-0.137-0.016c-2.518-0.528-5.413-0.83-8.377-0.83-11.709 0-22.317 4.717-30.026 12.354l0.003-0.003c-7.522 7.877-12.204 18.523-12.373 30.26l-0 0.033c-0.002 0.155-0.003 0.339-0.003 0.523 0 5.649 1.098 11.042 3.092 15.977l-0.102-0.286c2.458 5.423 5.608 10.075 9.41 14.105l-0.023-0.025c4.001 3.646 8.658 6.662 13.76 8.838l0.32 0.122c4.771 2.163 10.345 3.423 16.213 3.423s11.443-1.26 16.466-3.525l-0.253 0.102c5.422-2.298 10.079-5.314 14.119-8.995l-0.039 0.035c7.648-7.709 12.374-18.326 12.374-30.047 0-0.087-0-0.173-0.001-0.26l0 0.013c-0.169-11.771-4.851-22.416-12.39-30.311l0.016 0.017c-1.923-1.746-4.010-3.427-6.193-4.98l-0.207-0.14zM584.533 524.373c-7.679-7.484-18.184-12.1-29.767-12.1-17.612 0-32.733 10.672-39.247 25.901l-0.106 0.278c-2.024 4.793-3.201 10.366-3.201 16.214 0 23.489 18.982 42.545 42.443 42.666l0.012 0c23.564 0 42.667-19.103 42.667-42.667v0c-0.073-5.873-1.322-11.435-3.52-16.489l0.107 0.275c-2.167-5.524-5.358-10.222-9.373-14.067l-0.014-0.013z"],"attrs":[],"grid":0,"tags":["receipt"]},"attrs":[],"properties":{"order":5375,"id":309,"name":"receipt","prevSize":32,"code":60544},"setIdx":0,"setId":0,"iconIdx":896},{"icon":{"paths":["M512 85.333c-235.641 0-426.667 191.025-426.667 426.667s191.025 426.667 426.667 426.667c235.641 0 426.667-191.025 426.667-426.667v0c0-235.641-191.025-426.667-426.667-426.667v0zM512 853.333c-188.513 0-341.333-152.82-341.333-341.333s152.82-341.333 341.333-341.333c188.513 0 341.333 152.82 341.333 341.333v0c0 188.513-152.82 341.333-341.333 341.333v0zM512 256c-141.385 0-256 114.615-256 256s114.615 256 256 256c141.385 0 256-114.615 256-256v0c0-141.385-114.615-256-256-256v0zM512 682.667c-94.257 0-170.667-76.41-170.667-170.667s76.41-170.667 170.667-170.667c94.257 0 170.667 76.41 170.667 170.667v0c0 94.257-76.41 170.667-170.667 170.667v0z"],"attrs":[],"grid":0,"tags":["record-audio"]},"attrs":[],"properties":{"order":5376,"id":308,"name":"record-audio","prevSize":32,"code":60545},"setIdx":0,"setId":0,"iconIdx":897},{"icon":{"paths":["M614.833 719.667c-23.528 17.417-53.121 27.879-85.158 27.879-5.596 0-11.117-0.319-16.547-0.94l0.663 0.062c-4.772 0.562-10.3 0.883-15.904 0.883-31.983 0-61.527-10.448-85.403-28.117l0.39 0.276c-7.715-7.662-18.345-12.397-30.081-12.397-23.578 0-42.692 19.114-42.692 42.692 0 11.715 4.719 22.329 12.36 30.043l-0.003-0.003c37.945 32.808 87.765 52.794 142.255 52.794 6.716 0 13.362-0.304 19.923-0.898l-0.845 0.062c5.701 0.529 12.328 0.83 19.026 0.83 54.512 0 104.36-19.966 142.631-52.984l-0.282 0.238c7.778-7.734 12.592-18.442 12.592-30.275 0-23.578-19.114-42.691-42.691-42.691-11.812 0-22.503 4.797-30.233 12.549l-0.001 0.001zM392.555 640.070c23.559-0.007 42.654-19.107 42.654-42.667 0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667c0 0.005 0 0.009 0 0.014l-0-0.001c0.026 23.555 19.122 42.642 42.678 42.654l0.001 0zM648.555 554.737c-0.004-0-0.008-0-0.013-0-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.56 0 42.659-19.095 42.667-42.653l0-0.001c-0.026-23.552-19.104-42.639-42.65-42.679l-0.004-0zM981.333 502.625c0-0.11 0-0.241 0-0.371 0-88.874-72.046-160.92-160.92-160.92-52.595 0-99.297 25.232-128.661 64.252l-0.297 0.412c-37.969-10.12-82.431-17.39-128.076-20.311l-2.060-0.105 36.513-243.413 89.068 30.287c0.866 69.958 57.779 126.336 127.86 126.336 70.62 0 127.869-57.249 127.869-127.869 0-0.426-0.002-0.851-0.006-1.276l0.001 0.065v-0.959c-1.746-69.591-58.245-125.419-127.936-126.083l-0.064-0c-40.382 0.311-76.238 19.42-99.29 48.997l-0.213 0.283-138.164-46.988c-4.114-1.455-8.859-2.296-13.8-2.296-21.322 0-38.988 15.656-42.128 36.1l-0.030 0.238-45.93 306.152c-51.708 2.322-100.526 9.789-147.463 21.929l4.936-1.084c-29.614-39.632-76.409-65.014-129.131-65.014-88.779 0-160.748 71.969-160.748 160.748 0 31.471 9.044 60.829 24.674 85.618l-0.391-0.664c-15.074 27.795-24.033 60.815-24.28 95.905l-0 0.076c0 167.458 206.165 298.667 469.333 298.667s469.333-131.209 469.333-298.667c-0.247-35.155-9.2-68.165-24.806-97.052l0.543 1.099c15.050-23.897 24.057-52.92 24.263-84.033l0-0.056zM814.625 128c23.564 0 42.667 19.103 42.667 42.667s-19.103 42.667-42.667 42.667c-23.564 0-42.667-19.103-42.667-42.667v0c0.394-23.404 19.263-42.273 42.629-42.666l0.037-0zM203.958 426.667c13.914 0.178 26.873 4.113 37.954 10.834l-0.334-0.188c-43.343 18.89-80.637 42.867-113.437 71.818l0.46-0.399c-0.171-2.042-0.602-4.053-0.602-6.107 0.055-41.928 34.030-75.903 75.953-75.958l0.005-0zM512 896c-208.167 0-384-97.707-384-213.333s175.833-213.333 384-213.333 384 97.707 384 213.333-175.833 213.333-384 213.333zM895.398 508.734c-32.339-28.554-69.634-52.531-110.243-70.352l-2.734-1.070c10.747-6.533 23.706-10.468 37.571-10.645l0.050-0c41.928 0.055 75.903 34.030 75.958 75.953l0 0.005c0 2.052-0.43 4.068-0.602 6.109z"],"attrs":[],"grid":0,"tags":["reddit-alien-alt"]},"attrs":[],"properties":{"order":5377,"id":307,"name":"reddit-alien-alt","prevSize":32,"code":60546},"setIdx":0,"setId":0,"iconIdx":898},{"icon":{"paths":["M896 469.333c-23.564 0-42.667 19.103-42.667 42.667v0c0.004 0.649 0.007 1.416 0.007 2.183 0 189.691-153.775 343.467-343.467 343.467s-343.467-153.775-343.467-343.467c0-189.691 153.775-343.467 343.467-343.467 97.802 0 186.056 40.878 248.61 106.48l0.13 0.137h-102.4c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h193.28c23.564 0 42.667-19.103 42.667-42.667v0-192c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 75.52c-76.467-73.193-180.385-118.249-294.827-118.249-235.641 0-426.667 191.025-426.667 426.667s191.025 426.667 426.667 426.667c235.62 0 426.631-190.99 426.667-426.601l0-0.003c0-23.564-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["redo"]},"attrs":[],"properties":{"order":5378,"id":306,"name":"redo","prevSize":32,"code":60547},"setIdx":0,"setId":0,"iconIdx":899},{"icon":{"paths":["M849.493 661.76h-193.28c-23.564-0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667h102.4c-62.247 64.969-149.715 105.347-246.615 105.347-188.199 0-340.824-152.311-341.332-340.391l-0-0.049c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0c0.657 235.144 191.43 425.512 426.665 425.512 113.821 0 217.232-44.569 293.734-117.207l-0.186 0.175v75.52c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-192c-0.226-22.94-18.521-41.533-41.321-42.238l-0.065-0.002zM640 512c0-70.692-57.308-128-128-128s-128 57.308-128 128c0 70.692 57.308 128 128 128v0c70.692 0 128-57.308 128-128v0zM469.333 512c0-23.564 19.103-42.667 42.667-42.667s42.667 19.103 42.667 42.667c0 23.564-19.103 42.667-42.667 42.667v0c-23.564 0-42.667-19.103-42.667-42.667v0zM512 85.333c-113.97 0.335-217.373 45.304-293.704 118.336l0.158-0.15v-75.52c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 192c0 23.564 19.103 42.667 42.667 42.667v0h192c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-102.4c62.247-64.97 149.716-105.348 246.616-105.348 188.049 0 340.581 152.069 341.331 339.943l0 0.072c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0c0-235.641-191.025-426.667-426.667-426.667v0z"],"attrs":[],"grid":0,"tags":["refresh"]},"attrs":[],"properties":{"order":5379,"id":305,"name":"refresh","prevSize":32,"code":60548},"setIdx":0,"setId":0,"iconIdx":900},{"icon":{"paths":["M512 85.333c-235.641 0-426.667 191.025-426.667 426.667s191.025 426.667 426.667 426.667c235.641 0 426.667-191.025 426.667-426.667v0c0-235.641-191.025-426.667-426.667-426.667v0zM512 853.333c-188.513 0-341.333-152.82-341.333-341.333s152.82-341.333 341.333-341.333c188.513 0 341.333 152.82 341.333 341.333v0c0 188.513-152.82 341.333-341.333 341.333v0zM533.333 298.667h-128c-23.564 0-42.667 19.103-42.667 42.667v0 341.333c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-85.333h85.333c23.564 0 42.667 19.103 42.667 42.667v0 42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667c-0.203-32.927-12.807-62.872-33.371-85.435l0.091 0.102c20.473-22.461 33.077-52.406 33.28-85.292l0-0.041v-42.667c0-70.692-57.308-128-128-128v0zM576 469.333c0 23.564-19.103 42.667-42.667 42.667v0h-85.333v-128h85.333c23.564 0 42.667 19.103 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["registered"]},"attrs":[],"properties":{"order":5380,"id":304,"name":"registered","prevSize":32,"code":60549},"setIdx":0,"setId":0,"iconIdx":901},{"icon":{"paths":["M234.667 746.667h-64v-469.333h332.8l-34.133 33.707c-7.789 7.736-12.611 18.452-12.611 30.293 0 23.577 19.113 42.691 42.691 42.691 11.736 0 22.365-4.735 30.082-12.4l-0.002 0.002 106.667-106.667c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003-106.667-106.667c-7.712-7.668-18.343-12.407-30.080-12.407s-22.368 4.74-30.082 12.409l0.002-0.002c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003 33.707 33.707h-375.040c-23.564 0-42.667 19.103-42.667 42.667v0 554.667c0 23.564 19.103 42.667 42.667 42.667v0h106.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM896 192h-106.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h64v469.333h-357.12l33.707-33.707c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003c-7.712-7.668-18.343-12.407-30.080-12.407s-22.368 4.74-30.082 12.409l0.002-0.002-106.667 106.667c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003 106.667 106.667c7.715 7.662 18.344 12.397 30.080 12.397 23.577 0 42.691-19.113 42.691-42.691 0-11.842-4.821-22.557-12.608-30.291l-0.002-0.002-33.707-33.707h399.787c23.564 0 42.667-19.103 42.667-42.667v0-554.667c0-23.564-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["repeat"]},"attrs":[],"properties":{"order":5381,"id":303,"name":"repeat","prevSize":32,"code":60550},"setIdx":0,"setId":0,"iconIdx":902},{"icon":{"paths":["M718.507 496.213c0.471 0.006 1.027 0.010 1.584 0.010 35.379 0 67.406-14.354 90.574-37.555l0.002-0.002 120.747-120.747c7.668-7.712 12.407-18.343 12.407-30.080s-4.74-22.368-12.409-30.082l0.002 0.002c-7.733-7.795-18.45-12.621-30.293-12.621s-22.56 4.826-30.291 12.618l-0.003 0.003-122.027 120.32c-7.733 7.795-18.45 12.621-30.293 12.621s-22.56-4.826-30.291-12.618l-0.003-0.003 151.040-150.613c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l-0 0-150.613 151.040c-7.668-7.712-12.407-18.343-12.407-30.080s4.74-22.368 12.409-30.082l-0.002 0.002 120.747-120.747c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l-120.747 120.747c-23.13 23.158-37.434 55.135-37.434 90.453s14.304 67.296 37.435 90.455l-0.001-0.001-55.467 55.040-352.853-354.133-4.267-2.56c-2.091-1.832-4.479-3.401-7.068-4.615l-0.186-0.078-7.68-2.987-5.12-3.413h-11.52c-1.154-0.194-2.484-0.305-3.84-0.305s-2.686 0.111-3.981 0.324l0.141-0.019c-2.769 1.021-5.165 2.317-7.339 3.899l0.086-0.059-6.827 4.267h-2.987l-2.56 4.267c-1.709 2.116-3.267 4.492-4.581 7.017l-0.112 0.237c-1.133 2.291-2.153 4.985-2.913 7.787l-0.074 0.32s0 2.987 0 4.693c-3.028 20.028-4.757 43.138-4.757 66.652 0 129.596 52.526 246.924 137.451 331.855l-0.001-0.001 112.64 112.213-230.827 230.4c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003c7.709 7.648 18.326 12.374 30.047 12.374 0.087 0 0.173-0 0.26-0.001l-0.013 0c0.073 0 0.16 0.001 0.247 0.001 11.721 0 22.338-4.726 30.049-12.377l-0.003 0.003 258.987-255.147 206.080-206.080c22.989 23.23 54.792 37.699 89.975 37.973l0.052 0zM392.107 573.867l-112.213-112.64c-59.527-60.318-99.38-140.182-109.074-229.106l-0.152-1.721 282.027 281.6zM658.347 598.187c-7.791-7.844-18.582-12.699-30.507-12.699-23.744 0-42.992 19.248-42.992 42.992 0 11.819 4.769 22.524 12.488 30.296l-0.002-0.002 268.8 268.8c7.55 6.889 17.64 11.109 28.715 11.109 0.405 0 0.809-0.006 1.211-0.017l-0.059 0.001c0.073 0 0.16 0.001 0.247 0.001 11.721 0 22.338-4.726 30.049-12.377l-0.003 0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003z"],"attrs":[],"grid":0,"tags":["restaurant"]},"attrs":[],"properties":{"order":5382,"id":302,"name":"restaurant","prevSize":32,"code":60551},"setIdx":0,"setId":0,"iconIdx":903},{"icon":{"paths":["M155.307 407.893c-7.346-6.139-16.891-9.867-27.307-9.867-23.594 0-42.72 19.126-42.72 42.72 0 13.178 5.967 24.962 15.346 32.798l0.068 0.055 46.080 38.4-46.080 38.4c-9.459 7.882-15.435 19.666-15.435 32.846 0 10.422 3.736 19.971 9.943 27.38l-0.054-0.067c7.882 9.459 19.666 15.435 32.846 15.435 10.422 0 19.971-3.736 27.38-9.943l-0.067 0.054 85.333-71.253c9.464-7.882 15.443-19.669 15.443-32.853s-5.98-24.971-15.375-32.798l-0.069-0.056zM384 213.333c-23.564 0-42.667 19.103-42.667 42.667v0 512c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-512c0-23.564-19.103-42.667-42.667-42.667v0zM554.667 298.667h341.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-341.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM896 725.333h-341.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h341.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM896 384h-341.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h341.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM896 554.667h-341.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h341.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["right-indent-alt"]},"attrs":[],"properties":{"order":5383,"id":301,"name":"right-indent-alt","prevSize":32,"code":60552},"setIdx":0,"setId":0,"iconIdx":904},{"icon":{"paths":["M874.667 725.333h-622.507l55.467-55.040c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l-128 128c-3.773 3.937-6.808 8.616-8.859 13.791l-0.101 0.289c-2.024 4.793-3.201 10.366-3.201 16.213s1.176 11.42 3.305 16.495l-0.105-0.281c2.152 5.464 5.187 10.143 8.974 14.095l-0.014-0.015 128 128c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003-55.467-55.040h622.507c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM490.667 426.667v170.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-426.667h85.333v426.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-426.667h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-298.667c-94.257 0-170.667 76.41-170.667 170.667s76.41 170.667 170.667 170.667v0zM490.667 170.667v170.667c-47.128 0-85.333-38.205-85.333-85.333s38.205-85.333 85.333-85.333v0z"],"attrs":[],"grid":0,"tags":["right-to-left-text-direction"]},"attrs":[],"properties":{"order":5384,"id":300,"name":"right-to-left-text-direction","prevSize":32,"code":60553},"setIdx":0,"setId":0,"iconIdx":905},{"icon":{"paths":["M384 640c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM85.333 597.333c-23.564 0-42.667 19.103-42.667 42.667v0 85.333c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-85.333c0-23.564-19.103-42.667-42.667-42.667v0zM938.667 597.333c-23.564 0-42.667 19.103-42.667 42.667v0 85.333c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-85.333c0-23.564-19.103-42.667-42.667-42.667v0zM725.333 298.667h-170.667v-54.613c25.542-14.943 42.472-42.166 42.667-73.359l0-0.028c0-47.128-38.205-85.333-85.333-85.333s-85.333 38.205-85.333 85.333v0c0.194 31.22 17.125 58.443 42.264 73.169l0.403 0.218v54.613h-170.667c-70.692 0-128 57.308-128 128v0 384c0 70.692 57.308 128 128 128v0h426.667c70.692 0 128-57.308 128-128v0-384c0-70.692-57.308-128-128-128v0zM585.387 384l-21.333 85.333h-104.107l-21.333-85.333zM768 810.667c0 23.564-19.103 42.667-42.667 42.667v0h-426.667c-23.564 0-42.667-19.103-42.667-42.667v0-384c0-23.564 19.103-42.667 42.667-42.667v0h52.053l33.28 138.24c4.747 18.773 21.489 32.445 41.424 32.445 0.437 0 0.872-0.007 1.306-0.020l-0.064 0.002h170.667c0.37 0.012 0.806 0.018 1.243 0.018 19.935 0 36.677-13.671 41.361-32.15l0.063-0.295 33.28-138.24h52.053c23.564 0 42.667 19.103 42.667 42.667v0zM640 640c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["robot"]},"attrs":[],"properties":{"order":5385,"id":299,"name":"robot","prevSize":32,"code":60554},"setIdx":0,"setId":0,"iconIdx":906},{"icon":{"paths":["M810.667 277.333h-256v-106.667h197.12c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-479.573c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h197.12v106.667h-256c-70.692 0-128 57.308-128 128v0 405.333c0 70.692 57.308 128 128 128v0h597.333c70.692 0 128-57.308 128-128v0-405.333c0-70.692-57.308-128-128-128v0zM469.333 853.333h-256c-23.564 0-42.667-19.103-42.667-42.667v0-160h298.667c-0.115 0.833-0.181 1.795-0.181 2.773s0.066 1.94 0.193 2.883l-0.012-0.11v192c-0.093 0.768-0.145 1.658-0.145 2.56s0.053 1.792 0.156 2.666l-0.010-0.106zM853.333 810.667c0 23.564-19.103 42.667-42.667 42.667v0h-256c0.093-0.768 0.145-1.658 0.145-2.56s-0.053-1.792-0.156-2.666l0.010 0.106v-192c0.115-0.833 0.181-1.795 0.181-2.773s-0.066-1.94-0.193-2.883l0.012 0.11h298.667zM853.333 565.333h-682.667v-160c0-23.564 19.103-42.667 42.667-42.667v0h597.333c23.564 0 42.667 19.103 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["rope-way"]},"attrs":[],"properties":{"order":5386,"id":298,"name":"rope-way","prevSize":32,"code":60555},"setIdx":0,"setId":0,"iconIdx":907},{"icon":{"paths":["M964.312 87.979c-4.018-14.9-15.517-26.399-30.118-30.348l-0.299-0.069c-36.216-9.793-77.797-15.418-120.692-15.418-146.619 0-277.886 65.724-365.949 169.318l-0.567 0.684-47.57 56.483-111.138-26.815c-11.622-4.185-25.033-6.605-39.009-6.605-45.74 0-85.427 25.915-105.18 63.863l-0.311 0.657-93.875 166.396c-3.465 6.031-5.508 13.261-5.508 20.968 0 20.4 14.319 37.456 33.455 41.666l0.283 0.052 131.104 28.104c-10.157 29.648-18.446 64.734-23.358 100.893l-0.329 2.961c-0.227 1.654-0.357 3.565-0.357 5.506 0 11.787 4.778 22.457 12.502 30.181l132.271 132.271c7.718 7.724 18.383 12.501 30.164 12.501 0 0 0.001-0 0.001-0l-0 0c1.229 0 2.458-0.063 3.709-0.167 39.309-3.608 75.428-10.999 109.984-21.908l-3.677 1.001 27.464 128.136c4.272 19.415 21.33 33.729 41.73 33.729 7.702 0 14.928-2.040 21.166-5.61l-0.209 0.11 166.625-93.979c37.578-23.115 62.257-64.014 62.257-110.676 0-10.747-1.309-21.188-3.776-31.172l0.186 0.89-28.531-117.717 52.781-48.534c104.521-88.272 170.449-219.404 170.449-365.934 0-43.164-5.721-84.991-16.445-124.765l0.768 3.346zM152.417 457.521l66.396-117.75c5.982-11.417 17.748-19.074 31.302-19.074 5.194 0 10.125 1.124 14.564 3.143l-0.221-0.090 73.276 17.758-27.733 32.93c-25.066 29.865-47.592 63.411-66.345 99.243l-1.466 3.077zM684.479 808.333l-115.875 65.352-18.325-85.531c39.246-19.791 73.074-42.803 103.51-69.579l-0.538 0.464 31.724-29.169 17.213 71.024c0.872 3.289 1.373 7.065 1.373 10.957 0 15.051-7.487 28.354-18.939 36.387l-0.142 0.095zM753.354 511.147l-157.208 144.479c-59.8 51.939-135.304 87.278-218.508 98.090l-2.096 0.222-102.583-102.583c14.771-85.692 51.033-161.097 103.016-222.828l-0.579 0.706 71.609-85.021c1.153-1.204 2.245-2.495 3.256-3.85l0.077-0.108 61.224-72.69c73.074-85.915 181.266-140.060 302.104-140.060 26.090 0 51.591 2.524 76.271 7.341l-2.5-0.406c4.563 22.483 7.175 48.327 7.175 74.78 0 121.026-54.664 229.285-140.65 301.432l-0.608 0.497zM713.973 248.16c-35.346 0-64 28.654-64 64s28.654 64 64 64c35.346 0 64-28.654 64-64v0c0-0.001 0-0.003 0-0.004 0-35.344-28.652-63.997-63.997-63.997-0.002 0-0.004 0-0.005 0l0-0z"],"attrs":[],"grid":0,"tags":["rocket"]},"attrs":[],"properties":{"order":5387,"id":297,"name":"rocket","prevSize":32,"code":60556},"setIdx":0,"setId":0,"iconIdx":908},{"icon":{"paths":["M512 256c-243.2 0-426.667 91.733-426.667 213.333 0 104.533 136.107 186.88 328.96 208.213l-17.92 17.493c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 85.333-85.333c3.773-3.937 6.808-8.616 8.859-13.791l0.101-0.289c2.024-4.793 3.201-10.366 3.201-16.213s-1.176-11.42-3.305-16.495l0.105 0.281c-2.152-5.464-5.187-10.143-8.974-14.095l0.014 0.015-85.333-85.333c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l-0-0 5.12 4.693c-145.493-20.48-230.827-77.653-230.827-120.32 0-52.053 133.12-128 341.333-128s341.333 75.947 341.333 128c0 35.413-61.867 85.333-179.627 110.933-19.863 3.907-34.639 21.18-34.639 41.905 0 3.141 0.339 6.203 0.984 9.151l-0.052-0.282c4.231 19.46 21.308 33.821 41.74 33.821 3.2 0 6.319-0.352 9.318-1.020l-0.284 0.053c155.733-34.133 247.893-106.667 247.893-194.56 0-121.6-183.467-213.333-426.667-213.333z"],"attrs":[],"grid":0,"tags":["rotate-360"]},"attrs":[],"properties":{"order":5388,"id":296,"name":"rotate-360","prevSize":32,"code":60557},"setIdx":0,"setId":0,"iconIdx":909},{"icon":{"paths":["M122.88 720.213c-25.096 23.432-40.74 56.712-40.74 93.646 0 70.692 57.308 128 128 128 36.934 0 70.215-15.643 93.577-40.665l0.069-0.074c23.13-23.158 37.434-55.135 37.434-90.453s-14.304-67.296-37.435-90.455l0.001 0.001c-23.51-22.342-55.377-36.084-90.453-36.084s-66.943 13.743-90.51 36.137l0.056-0.053zM243.627 840.96v0c-7.733 7.795-18.45 12.621-30.293 12.621s-22.56-4.826-30.291-12.618l-0.003-0.003c-7.795-7.733-12.621-18.45-12.621-30.293s4.826-22.56 12.618-30.291l0.003-0.003c7.733-7.795 18.45-12.621 30.293-12.621s22.56 4.826 30.291 12.618l0.003 0.003c7.795 7.733 12.621 18.45 12.621 30.293s-4.826 22.56-12.618 30.291l-0.003 0.003zM213.333 512c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0c117.821 0 213.333 95.513 213.333 213.333v0c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0c0-164.949-133.718-298.667-298.667-298.667v0zM213.333 341.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0c212.077 0 384 171.923 384 384v0c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0c0-259.206-210.128-469.333-469.333-469.333v0z"],"attrs":[],"grid":0,"tags":["rss-alt"]},"attrs":[],"properties":{"order":5389,"id":295,"name":"rss-alt","prevSize":32,"code":60558},"setIdx":0,"setId":0,"iconIdx":910},{"icon":{"paths":["M128 597.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0c70.692 0 128 57.308 128 128v0c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0c0-117.821-95.513-213.333-213.333-213.333v0zM97.707 780.373c-7.647 7.709-12.373 18.325-12.373 30.046 0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667c0-11.721-4.726-22.337-12.376-30.049l0.003 0.003c-7.733-7.795-18.45-12.621-30.293-12.621s-22.56 4.826-30.291 12.618l-0.003 0.003zM810.667 170.667h-597.333c-70.692 0-128 57.308-128 128v0c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0c0-23.564 19.103-42.667 42.667-42.667v0h597.333c23.564 0 42.667 19.103 42.667 42.667v0 426.667c0 23.564-19.103 42.667-42.667 42.667v0h-170.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h170.667c70.692 0 128-57.308 128-128v0-426.667c0-70.692-57.308-128-128-128v0zM128 426.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0c164.949 0 298.667 133.718 298.667 298.667v0c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0c0-212.077-171.923-384-384-384v0z"],"attrs":[],"grid":0,"tags":["rss-interface"]},"attrs":[],"properties":{"order":5390,"id":294,"name":"rss-interface","prevSize":32,"code":60559},"setIdx":0,"setId":0,"iconIdx":911},{"icon":{"paths":["M122.88 720.213c-23.13 23.158-37.434 55.135-37.434 90.453s14.304 67.296 37.435 90.455l-0.001-0.001c23.158 23.13 55.135 37.434 90.453 37.434s67.296-14.304 90.455-37.435l-0.001 0.001c21.285-22.796 34.354-53.502 34.354-87.26 0-70.692-57.308-128-128-128-33.758 0-64.464 13.069-87.335 34.423l0.074-0.069zM243.627 840.96c-7.753 7.753-18.463 12.548-30.293 12.548-23.661 0-42.841-19.181-42.841-42.841 0-11.83 4.795-22.541 12.548-30.293l-0 0c7.733-7.795 18.45-12.621 30.293-12.621s22.56 4.826 30.291 12.618l0.003 0.003c7.795 7.733 12.621 18.45 12.621 30.293s-4.826 22.56-12.618 30.291l-0.003 0.003zM213.333 512c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0c117.821 0 213.333 95.513 213.333 213.333v0c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0c0-164.949-133.718-298.667-298.667-298.667v0zM213.333 341.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0c212.077 0 384 171.923 384 384v0c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0c-0.355-129.553-52.767-246.796-137.411-331.971l0.024 0.024c-85.151-84.619-202.393-137.031-331.878-137.387l-0.069-0zM666.027 357.973c-116.131-115.381-276.021-186.84-452.603-187.306l-0.091-0c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0c306.334 0 554.667 248.333 554.667 554.667v0c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0c-0.467-176.671-71.925-336.562-187.34-452.727l0.034 0.034z"],"attrs":[],"grid":0,"tags":["rss"]},"attrs":[],"properties":{"order":5391,"id":293,"name":"rss","prevSize":32,"code":60560},"setIdx":0,"setId":0,"iconIdx":912},{"icon":{"paths":["M896 85.333h-768c-23.564 0-42.667 19.103-42.667 42.667v0 768c0 23.564 19.103 42.667 42.667 42.667v0h256c23.564 0 42.667-19.103 42.667-42.667v0-469.333h469.333c23.564 0 42.667-19.103 42.667-42.667v0-256c0-23.564-19.103-42.667-42.667-42.667v0zM853.333 341.333h-85.333v-42.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 42.667h-85.333v-42.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 42.667h-85.333v-42.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 42.667h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h42.667v85.333h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h42.667v85.333h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h42.667v85.333h-170.667v-682.667h682.667z"],"attrs":[],"grid":0,"tags":["ruler-combined"]},"attrs":[],"properties":{"order":5392,"id":292,"name":"ruler-combined","prevSize":32,"code":60561},"setIdx":0,"setId":0,"iconIdx":913},{"icon":{"paths":["M964.693 300.8l-239.36-241.493c-7.709-7.648-18.326-12.374-30.047-12.374-0.087 0-0.173 0-0.26 0.001l0.013-0c-11.656 0.051-22.2 4.767-29.869 12.376l0.003-0.003-605.867 603.733c-7.668 7.712-12.407 18.343-12.407 30.080s4.74 22.368 12.409 30.082l-0.002-0.002 241.493 241.493c7.709 7.648 18.326 12.374 30.047 12.374 0.087 0 0.173-0 0.26-0.001l-0.013 0c11.656-0.051 22.2-4.767 29.869-12.376l-0.003 0.003 603.733-603.733c7.668-7.712 12.407-18.343 12.407-30.080s-4.74-22.368-12.409-30.082l0.002 0.002zM813.653 391.253l-30.293-30.293c-7.712-7.668-18.343-12.407-30.080-12.407s-22.368 4.74-30.082 12.409l0.002-0.002c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003 30.293 30.293-60.587 60.16-90.453-90.453c-7.412-6.377-17.129-10.259-27.753-10.259-23.564 0-42.667 19.103-42.667 42.667 0 10.624 3.883 20.341 10.307 27.809l-0.047-0.056 90.453 90.453-60.587 60.587-29.867-30.293c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l0 0 30.293 29.867-60.16 60.587-90.88-90.453c-7.712-7.668-18.343-12.407-30.080-12.407s-22.368 4.74-30.082 12.409l0.002-0.002c-7.668 7.712-12.407 18.343-12.407 30.080s4.74 22.368 12.409 30.082l-0.002-0.002 90.453 90.453-60.16 60.587-181.333-181.333 543.147-543.147 181.333 181.333z"],"attrs":[],"grid":0,"tags":["ruler"]},"attrs":[],"properties":{"order":5393,"id":291,"name":"ruler","prevSize":32,"code":60562},"setIdx":0,"setId":0,"iconIdx":914},{"icon":{"paths":["M768 298.667h-94.293c-8.826-32.747-23.521-61.281-43.034-85.812l0.367 0.478h136.96c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-469.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h149.333c59.014 0.214 109.94 34.626 134.011 84.442l0.389 0.892h-283.733c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h298.667c-10.77 72.584-72.503 127.689-147.167 128l-0.033 0h-151.467c-0.896-0.095-1.935-0.15-2.987-0.15s-2.091 0.054-3.115 0.16l0.128-0.011c-1.282-0.21-2.761-0.33-4.267-0.33s-2.984 0.12-4.425 0.351l0.159-0.021c-3.097 1.071-5.782 2.517-8.182 4.321l0.076-0.054-5.12 2.987c-2.305 2.088-4.285 4.474-5.893 7.112l-0.080 0.141c-1.322 1.731-2.594 3.684-3.717 5.73l-0.123 0.243c-0.181 1.154-0.285 2.485-0.285 3.84s0.104 2.686 0.303 3.985l-0.018-0.145c-2.922 4.048-4.791 9.031-5.116 14.43l-0.004 0.077s0 0 0 0c-0.095 0.896-0.15 1.935-0.15 2.987s0.054 2.091 0.16 3.115l-0.011-0.128c-0.21 1.282-0.33 2.761-0.33 4.267s0.12 2.984 0.351 4.425l-0.021-0.159c1.071 3.097 2.517 5.782 4.321 8.182l-0.054-0.076s0 3.413 2.987 5.12l256 298.667c7.873 9.166 19.476 14.935 32.427 14.935 23.565 0 42.669-19.103 42.669-42.669 0-10.615-3.876-20.324-10.29-27.79l0.048 0.057-192.427-228.267h56.32c0.289 0.001 0.63 0.002 0.972 0.002 122.092 0 222.408-93.24 233.624-212.399l0.071-0.937h85.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["rupee-sign"]},"attrs":[],"properties":{"order":5394,"id":290,"name":"rupee-sign","prevSize":32,"code":60563},"setIdx":0,"setId":0,"iconIdx":915},{"icon":{"paths":["M512 85.333c-235.108 0.705-425.427 191.459-425.427 426.665 0 182.976 115.179 339.050 276.99 399.675l2.944 0.967h2.56c42.514 15.937 91.647 25.161 142.933 25.161s100.418-9.224 145.827-26.104l-2.894 0.942h2.56c164.755-61.592 279.934-217.666 279.934-400.642 0-235.206-190.319-425.96-425.359-426.665l-0.068-0zM597.333 842.24c-25.599 7.047-54.993 11.097-85.333 11.097s-59.734-4.050-87.671-11.638l2.338 0.541v-159.573h170.667zM682.667 807.253v-337.92c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-85.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0 128h-170.667v-128c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-85.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0 337.92c-102.747-60.116-170.667-169.928-170.667-295.603 0-188.513 152.82-341.333 341.333-341.333s341.333 152.82 341.333 341.333c0 125.675-67.92 235.487-169.056 294.731l-1.611 0.872z"],"attrs":[],"grid":0,"tags":["sad-cry"]},"attrs":[],"properties":{"order":5395,"id":289,"name":"sad-cry","prevSize":32,"code":60564},"setIdx":0,"setId":0,"iconIdx":916},{"icon":{"paths":["M512 85.333c-235.108 0.705-425.427 191.459-425.427 426.665 0 182.976 115.179 339.050 276.99 399.675l2.944 0.967h2.56c42.514 15.937 91.647 25.161 142.933 25.161s100.418-9.224 145.827-26.104l-2.894 0.942h2.56c164.755-61.592 279.934-217.666 279.934-400.642 0-235.206-190.319-425.96-425.359-426.665l-0.068-0zM597.333 842.24c-25.599 7.047-54.993 11.097-85.333 11.097s-59.734-4.050-87.671-11.638l2.338 0.541v-133.547c24.24-15.281 53.728-24.348 85.333-24.348s61.094 9.067 86.004 24.742l-0.671-0.394zM682.667 807.253v-337.92c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-85.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0 144.64c-25.41-9.276-54.745-14.641-85.333-14.641s-59.923 5.365-87.116 15.204l1.783-0.564v-144.64c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-85.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0 337.92c-102.747-60.116-170.667-169.928-170.667-295.603 0-188.513 152.82-341.333 341.333-341.333s341.333 152.82 341.333 341.333c0 125.675-67.92 235.487-169.056 294.731l-1.611 0.872z"],"attrs":[],"grid":0,"tags":["sad-crying"]},"attrs":[],"properties":{"order":5396,"id":288,"name":"sad-crying","prevSize":32,"code":60565},"setIdx":0,"setId":0,"iconIdx":917},{"icon":{"paths":["M384 499.627l12.373-12.8 12.373 12.8c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003-12.8-12.373 12.8-12.373c7.609-7.818 12.302-18.507 12.302-30.293 0-23.996-19.453-43.449-43.449-43.449-12.21 0-23.244 5.037-31.137 13.146l-0.009 0.010-12.373 12.8-10.667-12.8c-7.903-8.119-18.936-13.155-31.147-13.155-23.996 0-43.449 19.453-43.449 43.449 0 11.786 4.693 22.476 12.312 30.303l-0.009-0.010 12.8 12.373-12.8 12.373c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003zM358.4 654.080c-9.337 7.879-15.226 19.588-15.226 32.672 0 10.306 3.654 19.759 9.738 27.134l-0.058-0.073c7.882 9.459 19.666 15.435 32.846 15.435 10.422 0 19.971-3.736 27.38-9.943l-0.067 0.054c27.277-22.134 62.42-35.536 100.693-35.536s73.416 13.403 100.992 35.771l-0.298-0.234c7.343 6.152 16.892 9.888 27.314 9.888 13.18 0 24.964-5.976 32.791-15.366l0.056-0.069c6.025-7.302 9.68-16.755 9.68-27.061 0-13.084-5.89-24.793-15.163-32.62l-0.064-0.052c-42.245-34.48-96.763-55.37-156.16-55.37s-113.915 20.89-156.608 55.724l0.448-0.354zM512 85.333c-235.641 0-426.667 191.025-426.667 426.667s191.025 426.667 426.667 426.667c235.641 0 426.667-191.025 426.667-426.667v0c0-235.641-191.025-426.667-426.667-426.667v0zM512 853.333c-188.513 0-341.333-152.82-341.333-341.333s152.82-341.333 341.333-341.333c188.513 0 341.333 152.82 341.333 341.333v0c0 188.513-152.82 341.333-341.333 341.333v0zM725.333 353.707c-7.733-7.795-18.45-12.621-30.293-12.621s-22.56 4.826-30.291 12.618l-0.003 0.003-12.373 12.8-12.373-12.8c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l-0-0 12.8 12.373-12.8 12.373c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 12.373-12.8 12.373 12.8c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003-12.8-12.373 12.8-12.373c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003z"],"attrs":[],"grid":0,"tags":["sad-dizzy"]},"attrs":[],"properties":{"order":5397,"id":287,"name":"sad-dizzy","prevSize":32,"code":60566},"setIdx":0,"setId":0,"iconIdx":918},{"icon":{"paths":["M387.413 520.96l64-64c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003-64-64c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l-0-0 34.133 33.707-34.133 33.707c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003c7.709 7.648 18.326 12.374 30.047 12.374 0.087 0 0.173-0 0.26-0.001l-0.013 0c0.073 0 0.16 0.001 0.247 0.001 11.721 0 22.338-4.726 30.049-12.377l-0.003 0.003zM356.693 654.080c-9.337 7.879-15.226 19.588-15.226 32.672 0 10.306 3.654 19.759 9.738 27.134l-0.058-0.073c7.882 9.459 19.666 15.435 32.846 15.435 10.422 0 19.971-3.736 27.38-9.943l-0.067 0.054c27.277-22.134 62.42-35.536 100.693-35.536s73.416 13.403 100.992 35.771l-0.298-0.234c7.343 6.152 16.892 9.888 27.314 9.888 13.18 0 24.964-5.976 32.791-15.366l0.056-0.069c6.025-7.302 9.68-16.755 9.68-27.061 0-13.084-5.89-24.793-15.163-32.62l-0.064-0.052c-42.1-34.061-96.295-54.681-155.307-54.681s-113.207 20.62-155.775 55.047l0.468-0.366zM707.413 332.373c-7.733-7.795-18.45-12.621-30.293-12.621s-22.56 4.826-30.291 12.618l-0.003 0.003-64 64c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003 64 64c7.709 7.648 18.326 12.374 30.047 12.374 0.087 0 0.173-0 0.26-0.001l-0.013 0c0.073 0 0.16 0.001 0.247 0.001 11.721 0 22.338-4.726 30.049-12.377l-0.003 0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003-33.707-33.707 33.707-33.707c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003zM512 85.333c-235.641 0-426.667 191.025-426.667 426.667s191.025 426.667 426.667 426.667c235.641 0 426.667-191.025 426.667-426.667v0c0-235.641-191.025-426.667-426.667-426.667v0zM512 853.333c-188.513 0-341.333-152.82-341.333-341.333s152.82-341.333 341.333-341.333c188.513 0 341.333 152.82 341.333 341.333v0c0 188.513-152.82 341.333-341.333 341.333v0z"],"attrs":[],"grid":0,"tags":["sad-squint"]},"attrs":[],"properties":{"order":5398,"id":286,"name":"sad-squint","prevSize":32,"code":60567},"setIdx":0,"setId":0,"iconIdx":919},{"icon":{"paths":["M356.693 654.080c-9.337 7.879-15.226 19.588-15.226 32.672 0 10.306 3.654 19.759 9.738 27.134l-0.058-0.073c7.882 9.459 19.666 15.435 32.846 15.435 10.422 0 19.971-3.736 27.38-9.943l-0.067 0.054c27.277-22.134 62.42-35.536 100.693-35.536s73.416 13.403 100.992 35.771l-0.298-0.234c7.328 6.107 16.843 9.813 27.223 9.813 0.029 0 0.059-0 0.088-0l-0.005 0c23.382-0.238 42.246-19.248 42.246-42.665 0-12.952-5.771-24.556-14.882-32.381l-0.057-0.048c-42.1-34.061-96.295-54.681-155.307-54.681s-113.207 20.62-155.775 55.047l0.468-0.366zM392.96 449.707c7.712 7.668 18.343 12.407 30.080 12.407s22.368-4.74 30.082-12.409l-0.002 0.002c7.668-7.712 12.407-18.343 12.407-30.080s-4.74-22.368-12.409-30.082l0.002 0.002c-23.51-22.342-55.377-36.084-90.453-36.084s-66.943 13.743-90.51 36.137l0.056-0.053c-9.153 7.872-14.914 19.467-14.914 32.407 0 23.564 19.103 42.667 42.667 42.667 12.94 0 24.535-5.761 32.36-14.858l0.047-0.056c7.733-7.795 18.45-12.621 30.293-12.621s22.56 4.826 30.291 12.618l0.003 0.003zM512 85.333c-235.641 0-426.667 191.025-426.667 426.667s191.025 426.667 426.667 426.667c235.641 0 426.667-191.025 426.667-426.667v0c0-235.641-191.025-426.667-426.667-426.667v0zM512 853.333c-188.513 0-341.333-152.82-341.333-341.333s152.82-341.333 341.333-341.333c188.513 0 341.333 152.82 341.333 341.333v0c0 188.513-152.82 341.333-341.333 341.333v0zM751.787 389.547c-23.51-22.342-55.377-36.084-90.453-36.084s-66.943 13.743-90.51 36.137l0.056-0.053c-6.377 7.412-10.259 17.129-10.259 27.753 0 23.564 19.103 42.667 42.667 42.667 10.624 0 20.341-3.883 27.809-10.307l-0.056 0.047c7.733-7.795 18.45-12.621 30.293-12.621s22.56 4.826 30.291 12.618l0.003 0.003c7.712 7.668 18.343 12.407 30.080 12.407s22.368-4.74 30.082-12.409l-0.002 0.002c7.668-7.712 12.407-18.343 12.407-30.080s-4.74-22.368-12.409-30.082l0.002 0.002z"],"attrs":[],"grid":0,"tags":["sad"]},"attrs":[],"properties":{"order":5399,"id":285,"name":"sad","prevSize":32,"code":60568},"setIdx":0,"setId":0,"iconIdx":920},{"icon":{"paths":["M597.333 640h-85.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h85.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM682.667 341.333v-128c0-23.564-19.103-42.667-42.667-42.667v0h-42.667v-42.667h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-203.271c-0.195-0.001-0.426-0.001-0.657-0.001-76.516 0-142.789 43.852-175.059 107.795l-0.514 1.123c-2.812 5.536-4.46 12.072-4.46 18.993 0 23.567 19.105 42.672 42.672 42.672 16.575 0 30.943-9.45 38.009-23.257l0.112-0.241c18.58-36.888 56.149-61.751 99.525-61.751 0.13 0 0.26 0 0.391 0.001l-0.020-0h75.271v42.667h-42.667c-23.564 0-42.667 19.103-42.667 42.667v0 128c-70.66 0.080-127.92 57.339-128 127.992l-0 0.008v384c0.080 70.66 57.339 127.92 127.992 128l256.008 0c70.66-0.080 127.92-57.339 128-127.992l0-0.008v-384c-0.080-70.66-57.339-127.92-127.992-128l-0.008-0zM512 256h85.333v85.333h-85.333zM725.333 853.333c-0.032 23.551-19.115 42.635-42.664 42.667l-0.003 0h-256c-23.551-0.032-42.635-19.115-42.667-42.664l-0-0.003v-384c0.032-23.551 19.115-42.635 42.664-42.667l0.003-0h256c23.551 0.032 42.635 19.115 42.667 42.664l0 0.003z"],"attrs":[],"grid":0,"tags":["sanitizer-alt"]},"attrs":[],"properties":{"order":5400,"id":284,"name":"sanitizer-alt","prevSize":32,"code":60569},"setIdx":0,"setId":0,"iconIdx":921},{"icon":{"paths":["M554.667 512c-70.692 0-128 57.308-128 128s57.308 128 128 128c70.692 0 128-57.308 128-128v0c-0.080-70.66-57.339-127.92-127.992-128l-0.008-0zM554.667 682.667c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667c23.564 0 42.667 19.103 42.667 42.667v0c-0.032 23.551-19.115 42.635-42.664 42.667l-0.003 0zM802.146 324.271l-119.479-89.599v-106.672h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-355.979c-0.172-0.001-0.376-0.001-0.58-0.001-58.722 0-111.865 23.885-150.244 62.471l-0.009 0.009-35.353 35.355c-7.884 7.746-12.77 18.522-12.77 30.439 0 23.562 19.1 42.662 42.662 42.662 11.917 0 22.692-4.886 30.433-12.764l0.006-0.006 35.354-35.354c23.216-23.074 55.179-37.369 90.481-37.478l0.021-0h57.312v106.669l-119.5 89.6c-31.137 23.671-51.063 60.696-51.167 102.381l-0 0.017v512c0 23.564 19.103 42.667 42.667 42.667v0h512c23.564 0 42.667-19.103 42.667-42.667v0-512c-0.103-41.705-20.038-78.733-50.87-102.164l-0.317-0.231zM512 128h85.333v85.333h-85.333zM768 896h-426.667v-469.333c0.034-13.906 6.679-26.253 16.957-34.069l0.106-0.077 125.167-93.854h142.208l125.146 93.854c10.396 7.885 17.051 20.235 17.083 34.14l0 0.005z"],"attrs":[],"grid":0,"tags":["sanitizer"]},"attrs":[],"properties":{"order":5401,"id":283,"name":"sanitizer","prevSize":32,"code":60570},"setIdx":0,"setId":0,"iconIdx":922},{"icon":{"paths":["M883.627 396.373l-256-256c-3.822-3.733-8.354-6.76-13.372-8.856l-0.282-0.104c-4.914-2.054-10.616-3.297-16.595-3.413l-0.045-0.001h-341.333c-70.692 0-128 57.308-128 128v0 512c0 70.692 57.308 128 128 128v0h512c70.692 0 128-57.308 128-128v0-341.333c0-0.073 0.001-0.16 0.001-0.247 0-11.721-4.726-22.338-12.377-30.049l0.003 0.003zM384 213.333h170.667v85.333h-170.667zM640 810.667h-256v-128c0-23.564 19.103-42.667 42.667-42.667v0h170.667c23.564 0 42.667 19.103 42.667 42.667v0zM810.667 768c0 23.564-19.103 42.667-42.667 42.667v0h-42.667v-128c0-70.692-57.308-128-128-128v0h-170.667c-70.692 0-128 57.308-128 128v0 128h-42.667c-23.564 0-42.667-19.103-42.667-42.667v0-512c0-23.564 19.103-42.667 42.667-42.667v0h42.667v128c0 23.564 19.103 42.667 42.667 42.667v0h256c23.564 0 42.667-19.103 42.667-42.667v0-67.84l170.667 170.667z"],"attrs":[],"grid":0,"tags":["save"]},"attrs":[],"properties":{"order":5402,"id":282,"name":"save","prevSize":32,"code":60571},"setIdx":0,"setId":0,"iconIdx":923},{"icon":{"paths":["M896 682.667c-23.564 0-42.667 19.103-42.667 42.667v0 67.84l-281.173-281.173 90.88-90.453c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l0-0-90.453 90.88-281.173-281.173h67.84c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-170.667c-5.873 0.073-11.435 1.322-16.489 3.52l0.275-0.107c-10.46 4.422-18.618 12.58-22.935 22.76l-0.105 0.28c-2.092 4.778-3.34 10.34-3.413 16.186l-0 0.027v170.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-67.84l281.173 281.173-90.88 90.453c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003c7.709 7.648 18.326 12.374 30.047 12.374 0.087 0 0.173-0 0.26-0.001l-0.013 0c0.073 0 0.16 0.001 0.247 0.001 11.721 0 22.338-4.726 30.049-12.377l-0.003 0.003 90.453-90.88 281.173 281.173h-67.84c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h170.667c5.873-0.073 11.435-1.322 16.489-3.52l-0.275 0.107c10.46-4.422 18.618-12.58 22.935-22.76l0.105-0.28c2.092-4.778 3.34-10.34 3.413-16.186l0-0.027v-170.667c0-23.564-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["scaling-left"]},"attrs":[],"properties":{"order":5403,"id":281,"name":"scaling-left","prevSize":32,"code":60572},"setIdx":0,"setId":0,"iconIdx":924},{"icon":{"paths":["M935.253 111.787c-4.422-10.46-12.58-18.618-22.76-22.935l-0.28-0.105c-4.778-2.092-10.34-3.34-16.186-3.413l-0.027-0h-170.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h67.84l-281.173 281.173-90.453-90.88c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l-0-0 90.88 90.453-281.173 281.173v-67.84c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 170.667c0.073 5.873 1.322 11.435 3.52 16.489l-0.107-0.275c4.422 10.46 12.58 18.618 22.76 22.935l0.28 0.105c4.778 2.092 10.34 3.34 16.186 3.413l0.027 0h170.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-67.84l281.173-281.173 90.453 90.88c7.709 7.648 18.326 12.374 30.047 12.374 0.087 0 0.173-0 0.26-0.001l-0.013 0c0.073 0 0.16 0.001 0.247 0.001 11.721 0 22.338-4.726 30.049-12.377l-0.003 0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003-90.88-90.453 281.173-281.173v67.84c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-170.667c-0.073-5.873-1.322-11.435-3.52-16.489l0.107 0.275z"],"attrs":[],"grid":0,"tags":["scaling-right"]},"attrs":[],"properties":{"order":5404,"id":280,"name":"scaling-right","prevSize":32,"code":60573},"setIdx":0,"setId":0,"iconIdx":925},{"icon":{"paths":["M810.667 85.333h-597.333c-70.692 0-128 57.308-128 128v0 597.333c0 70.692 57.308 128 128 128v0h597.333c7.462-0.107 14.674-0.879 21.667-2.258l-0.761 0.125 12.8-2.987h5.12l15.787-5.973 5.547-2.987c4.267-2.56 8.96-4.693 13.227-7.68 5.997-4.436 11.284-8.911 16.266-13.703l-0.052 0.050 2.987-3.84c4.082-4.135 7.862-8.592 11.29-13.32l0.23-0.333 3.84-5.547c2.713-4.245 5.287-9.154 7.438-14.284l0.242-0.65c1.055-1.801 2.060-3.911 2.889-6.106l0.097-0.294c2.133-5.12 3.413-10.667 5.12-16.213v-6.4c2.282-7.555 3.809-16.305 4.256-25.34l0.010-0.26v-597.333c0-70.692-57.308-128-128-128v0zM213.333 853.333c-23.564 0-42.667-19.103-42.667-42.667v0-183.893l140.373-140.8c7.733-7.795 18.45-12.621 30.293-12.621s22.56 4.826 30.291 12.618l0.003 0.003 366.933 367.36zM853.333 810.667c-0.044 5.54-1.136 10.813-3.089 15.646l0.102-0.286c-1.089 2.306-2.227 4.264-3.506 6.116l0.093-0.142c-1.227 1.927-2.491 3.599-3.877 5.162l0.037-0.042-228.267-228.267 37.547-37.547c7.733-7.795 18.45-12.621 30.293-12.621s22.56 4.826 30.291 12.618l0.003 0.003 140.373 140.8zM853.333 591.36l-80.213-79.36c-23.51-22.342-55.377-36.084-90.453-36.084s-66.943 13.743-90.51 36.137l0.056-0.053-37.547 37.547-122.88-122.88c-23.51-22.342-55.377-36.084-90.453-36.084s-66.943 13.743-90.51 36.137l0.056-0.053-80.213 79.36v-292.693c0-23.564 19.103-42.667 42.667-42.667v0h597.333c23.564 0 42.667 19.103 42.667 42.667v0zM576 256c-35.346 0-64 28.654-64 64s28.654 64 64 64c35.346 0 64-28.654 64-64v0c0-35.346-28.654-64-64-64v0z"],"attrs":[],"grid":0,"tags":["scenery"]},"attrs":[],"properties":{"order":5405,"id":279,"name":"scenery","prevSize":32,"code":60574},"setIdx":0,"setId":0,"iconIdx":926},{"icon":{"paths":["M926.293 431.787l-334.080-334.080c-7.73-7.774-18.432-12.585-30.258-12.585-21.532 0-39.339 15.95-42.25 36.679l-0.026 0.225-31.147 219.307-85.333 85.333-14.080-8.107c-5.449-2.71-11.868-4.295-18.657-4.295-23.564 0-42.667 19.103-42.667 42.667 0 12.291 5.197 23.368 13.513 31.153l0.024 0.022-49.067 49.92-14.080-8.107c-5.225-2.458-11.347-3.893-17.805-3.893-23.564 0-42.667 19.103-42.667 42.667 0 12.085 5.024 22.996 13.098 30.759l0.014 0.013-49.92 49.493-13.653-8.96c-6.133-3.613-13.511-5.748-21.388-5.748-15.791 0-29.578 8.578-36.956 21.329l-0.11 0.205c-3.308 5.921-5.256 12.991-5.256 20.515 0 13.401 6.179 25.36 15.842 33.182l0.080 0.063-21.76 21.76c-3.844 3.895-6.891 8.588-8.869 13.807l-0.091 0.273c-2.092 4.778-3.34 10.34-3.413 16.186l-0 0.027v134.4c0 23.564 19.103 42.667 42.667 42.667v0h133.547c5.873-0.073 11.435-1.322 16.489-3.52l-0.275 0.107c5.492-2.069 10.185-5.116 14.084-8.964l-0.004 0.004 72.533-72.96 14.080 8.107c6.176 3.68 13.62 5.855 21.572 5.855 15.661 0 29.352-8.438 36.773-21.016l0.109-0.199c3.492-6.051 5.553-13.308 5.553-21.047 0-13.343-6.124-25.255-15.715-33.079l-0.077-0.061 49.92-49.493 14.080 8.107c6.011 3.467 13.216 5.522 20.9 5.547l0.007 0c21.858-2.029 38.837-20.279 38.837-42.494 0-12.146-5.075-23.106-13.22-30.876l-0.017-0.016 49.92-49.493 14.080 8.107c6.011 3.467 13.216 5.522 20.9 5.547l0.007 0c23.234-0.428 41.905-19.364 41.905-42.66 0-13.188-5.983-24.978-15.383-32.804l-0.069-0.056 33.707-33.707 219.733-31.147c16.295-2.38 29.452-13.684 34.473-28.712l0.087-0.301c1.729-4.46 2.73-9.622 2.73-15.017 0-12.016-4.967-22.871-12.959-30.626l-0.011-0.010zM244.053 853.333h-73.387v-73.387l24.32-24.32 93.013 55.040zM350.293 746.667l-94.293-53.333 48.64-48.64 92.587 53.333zM461.653 635.733l-93.013-53.76 49.067-48.64 94.293 53.333zM573.013 524.373l-93.013-55.040 48.64-48.64 73.387 73.387zM677.547 450.133l-103.68-103.68 18.347-128 213.333 213.333z"],"attrs":[],"grid":0,"tags":["screw"]},"attrs":[],"properties":{"order":5406,"id":278,"name":"screw","prevSize":32,"code":60575},"setIdx":0,"setId":0,"iconIdx":927},{"icon":{"paths":["M200.96 268.373c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l-0-0 183.467 183.040-183.467 183.040c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 213.333-213.333c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003zM700.16 512l183.467-183.040c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l-213.333 213.333c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003 213.333 213.333c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003z"],"attrs":[],"grid":0,"tags":["scroll-h"]},"attrs":[],"properties":{"order":5407,"id":277,"name":"scroll-h","prevSize":32,"code":60576},"setIdx":0,"setId":0,"iconIdx":928},{"icon":{"paths":["M481.707 414.293c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 213.333-213.333c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l-0 0-183.040 183.467-183.040-183.467c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l-0-0zM542.293 609.707c-7.733-7.795-18.45-12.621-30.293-12.621s-22.56 4.826-30.291 12.618l-0.003 0.003-213.333 213.333c-7.753 7.753-12.548 18.463-12.548 30.293 0 23.661 19.181 42.841 42.841 42.841 11.83 0 22.541-4.795 30.293-12.548l-0 0 183.040-183.467 183.040 183.467c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003z"],"attrs":[],"grid":0,"tags":["scroll"]},"attrs":[],"properties":{"order":5408,"id":276,"name":"scroll","prevSize":32,"code":60577},"setIdx":0,"setId":0,"iconIdx":929},{"icon":{"paths":["M512 597.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667c-23.564 0-42.667 19.103-42.667 42.667v0c0 23.564 19.103 42.667 42.667 42.667v0zM725.333 597.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667c-23.564 0-42.667 19.103-42.667 42.667v0c0 23.564 19.103 42.667 42.667 42.667v0zM512 768c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667c-23.564 0-42.667 19.103-42.667 42.667v0c0 23.564 19.103 42.667 42.667 42.667v0zM725.333 768c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667c-23.564 0-42.667 19.103-42.667 42.667v0c0 23.564 19.103 42.667 42.667 42.667v0zM298.667 597.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667c-23.564 0-42.667 19.103-42.667 42.667v0c0 23.564 19.103 42.667 42.667 42.667v0zM810.667 170.667h-42.667v-42.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 42.667h-341.333v-42.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 42.667h-42.667c-70.692 0-128 57.308-128 128v0 512c0 70.692 57.308 128 128 128v0h597.333c70.692 0 128-57.308 128-128v0-512c0-70.692-57.308-128-128-128v0zM853.333 810.667c0 23.564-19.103 42.667-42.667 42.667v0h-597.333c-23.564 0-42.667-19.103-42.667-42.667v0-384h682.667zM853.333 341.333h-682.667v-42.667c0-23.564 19.103-42.667 42.667-42.667v0h597.333c23.564 0 42.667 19.103 42.667 42.667v0zM298.667 768c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667c-23.564 0-42.667 19.103-42.667 42.667v0c0 23.564 19.103 42.667 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["schedule"]},"attrs":[],"properties":{"order":5409,"id":275,"name":"schedule","prevSize":32,"code":60578},"setIdx":0,"setId":0,"iconIdx":930},{"icon":{"paths":["M898.987 718.080l-88.32-90.453c-23.521-22.391-55.421-36.166-90.54-36.166-19.769 0-38.519 4.365-55.337 12.184l0.81-0.338-38.4-38.4c37.18-49.247 59.551-111.489 59.551-178.956 0-164.949-133.718-298.667-298.667-298.667s-298.667 133.718-298.667 298.667c0 164.949 133.718 298.667 298.667 298.667 67.467 0 129.709-22.37 179.713-60.098l-0.757 0.547 37.973 37.973c-8.781 16.89-13.932 36.88-13.932 58.072 0 34.874 13.946 66.49 36.566 89.576l-0.021-0.022 90.453 90.453c23.158 23.13 55.135 37.434 90.453 37.434s67.296-14.304 90.455-37.435l-0.001 0.001c23.773-23.26 38.512-55.669 38.512-91.52s-14.739-68.26-38.489-91.497l-0.023-0.023zM537.173 537.173c-38.587 38.492-91.843 62.293-150.659 62.293-117.821 0-213.333-95.513-213.333-213.333s95.513-213.333 213.333-213.333c58.816 0 112.072 23.801 150.663 62.298l-0.004-0.004c38.72 38.625 62.675 92.035 62.675 151.040s-23.955 112.415-62.67 151.036l-0.004 0.004zM838.827 838.827c-7.733 7.795-18.45 12.621-30.293 12.621s-22.56-4.826-30.291-12.618l-0.003-0.003-90.453-90.453c-7.795-7.733-12.621-18.45-12.621-30.293s4.826-22.56 12.618-30.291l0.003-0.003c7.733-7.795 18.45-12.621 30.293-12.621s22.56 4.826 30.291 12.618l0.003 0.003 90.453 90.453c7.795 7.733 12.621 18.45 12.621 30.293s-4.826 22.56-12.618 30.291l-0.003 0.003z"],"attrs":[],"grid":0,"tags":["search-alt"]},"attrs":[],"properties":{"order":5410,"id":274,"name":"search-alt","prevSize":32,"code":60579},"setIdx":0,"setId":0,"iconIdx":931},{"icon":{"paths":["M926.293 865.707l-158.293-157.013c52.603-65.159 84.442-148.987 84.442-240.252 0-212.077-171.923-384-384-384s-384 171.923-384 384c0 212.077 171.923 384 384 384 91.265 0 175.093-31.838 240.984-85.014l-0.733 0.572 157.013 157.013c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.418-7.666 11.989-18.126 11.989-29.653s-4.571-21.987-12-29.665l0.011 0.012zM469.333 768c-164.949 0-298.667-133.718-298.667-298.667s133.718-298.667 298.667-298.667c164.949 0 298.667 133.718 298.667 298.667v0c0 164.949-133.718 298.667-298.667 298.667v0zM640 426.667h-341.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h341.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["search-minus"]},"attrs":[],"properties":{"order":5411,"id":273,"name":"search-minus","prevSize":32,"code":60580},"setIdx":0,"setId":0,"iconIdx":932},{"icon":{"paths":["M926.293 865.707l-158.293-157.013c52.603-65.159 84.442-148.987 84.442-240.252 0-212.077-171.923-384-384-384s-384 171.923-384 384c0 212.077 171.923 384 384 384 91.265 0 175.093-31.838 240.984-85.014l-0.733 0.572 157.013 157.013c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.418-7.666 11.989-18.126 11.989-29.653s-4.571-21.987-12-29.665l0.011 0.012zM469.333 768c-164.949 0-298.667-133.718-298.667-298.667s133.718-298.667 298.667-298.667c164.949 0 298.667 133.718 298.667 298.667v0c0 164.949-133.718 298.667-298.667 298.667v0z"],"attrs":[],"grid":0,"tags":["search"]},"attrs":[],"properties":{"order":5412,"id":272,"name":"search","prevSize":32,"code":60581},"setIdx":0,"setId":0,"iconIdx":933},{"icon":{"paths":["M682.667 85.333h-341.333c-70.692 0-128 57.308-128 128v0 597.333c0 70.692 57.308 128 128 128v0h341.333c70.692 0 128-57.308 128-128v0-597.333c0-70.692-57.308-128-128-128v0zM725.333 810.667c0 23.564-19.103 42.667-42.667 42.667v0h-341.333c-23.564 0-42.667-19.103-42.667-42.667v0-42.667h426.667zM512 597.333c55.254 0.16 102.258 35.305 120.038 84.442l0.282 0.891h-240.64c18.062-50.028 65.066-85.173 120.3-85.333l0.020-0zM469.333 469.333c0-23.564 19.103-42.667 42.667-42.667s42.667 19.103 42.667 42.667c0 23.564-19.103 42.667-42.667 42.667v0c-23.564 0-42.667-19.103-42.667-42.667v0zM725.333 682.667h-4.267c-13.108-61.071-50.921-111.461-102.225-141.105l-1.029-0.548c13.827-20.077 22.112-44.904 22.187-71.661l0-0.019c0-70.692-57.308-128-128-128s-128 57.308-128 128v0c0.075 26.776 8.359 51.603 22.468 72.112l-0.281-0.432c-52.332 30.192-90.145 80.582-103 140.25l-0.253 1.403h-4.267v-469.333c0-23.564 19.103-42.667 42.667-42.667v0h341.333c23.564 0 42.667 19.103 42.667 42.667v0zM512 213.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["selfie"]},"attrs":[],"properties":{"order":5413,"id":271,"name":"selfie","prevSize":32,"code":60582},"setIdx":0,"setId":0,"iconIdx":934},{"icon":{"paths":["M341.333 725.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM341.333 469.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM341.333 213.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM853.333 213.333c0-70.692-57.308-128-128-128v0h-426.667c-70.692 0-128 57.308-128 128v0 85.333c0.203 32.927 12.807 62.872 33.371 85.435l-0.091-0.102c-20.473 22.461-33.077 52.406-33.28 85.292l-0 0.041v85.333c0.203 32.927 12.807 62.872 33.371 85.435l-0.091-0.102c-20.473 22.461-33.077 52.406-33.28 85.292l-0 0.041v85.333c0 70.692 57.308 128 128 128v0h426.667c70.692 0 128-57.308 128-128v0-85.333c-0.203-32.927-12.807-62.872-33.371-85.435l0.091 0.102c20.473-22.461 33.077-52.406 33.28-85.292l0-0.041v-85.333c-0.203-32.927-12.807-62.872-33.371-85.435l0.091 0.102c20.473-22.461 33.077-52.406 33.28-85.292l0-0.041zM768 810.667c0 23.564-19.103 42.667-42.667 42.667v0h-426.667c-23.564 0-42.667-19.103-42.667-42.667v0-85.333c0-23.564 19.103-42.667 42.667-42.667v0h426.667c23.564 0 42.667 19.103 42.667 42.667v0zM768 554.667c0 23.564-19.103 42.667-42.667 42.667v0h-426.667c-23.564 0-42.667-19.103-42.667-42.667v0-85.333c0-23.564 19.103-42.667 42.667-42.667v0h426.667c23.564 0 42.667 19.103 42.667 42.667v0zM768 298.667c0 23.564-19.103 42.667-42.667 42.667v0h-426.667c-23.564 0-42.667-19.103-42.667-42.667v0-85.333c0-23.564 19.103-42.667 42.667-42.667v0h426.667c23.564 0 42.667 19.103 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["server-alt"]},"attrs":[],"properties":{"order":5414,"id":270,"name":"server-alt","prevSize":32,"code":60583},"setIdx":0,"setId":0,"iconIdx":935},{"icon":{"paths":["M640 426.667h-128v-128c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 128h-128c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h128v128c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-128h128c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM926.293 865.707l-158.293-157.013c52.603-65.159 84.442-148.987 84.442-240.252 0-212.077-171.923-384-384-384s-384 171.923-384 384c0 212.077 171.923 384 384 384 91.265 0 175.093-31.838 240.984-85.014l-0.733 0.572 157.013 157.013c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.418-7.666 11.989-18.126 11.989-29.653s-4.571-21.987-12-29.665l0.011 0.012zM469.333 768c-164.949 0-298.667-133.718-298.667-298.667s133.718-298.667 298.667-298.667c164.949 0 298.667 133.718 298.667 298.667v0c0 164.949-133.718 298.667-298.667 298.667v0z"],"attrs":[],"grid":0,"tags":["search-plus"]},"attrs":[],"properties":{"order":5415,"id":269,"name":"search-plus","prevSize":32,"code":60584},"setIdx":0,"setId":0,"iconIdx":936},{"icon":{"paths":["M469.333 554.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM298.667 554.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM938.667 170.667c0-70.692-57.308-128-128-128v0h-597.333c-70.692 0-128 57.308-128 128v0 170.667c0.203 32.927 12.807 62.872 33.371 85.435l-0.091-0.102c-20.473 22.461-33.077 52.406-33.28 85.292l-0 0.041v170.667c0 70.692 57.308 128 128 128v0h256v85.333h-341.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h768c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-341.333v-85.333h256c70.692 0 128-57.308 128-128v0-170.667c-0.203-32.927-12.807-62.872-33.371-85.435l0.091 0.102c20.473-22.461 33.077-52.406 33.28-85.292l0-0.041zM853.333 682.667c0 23.564-19.103 42.667-42.667 42.667v0h-597.333c-23.564 0-42.667-19.103-42.667-42.667v0-170.667c0-23.564 19.103-42.667 42.667-42.667v0h597.333c23.564 0 42.667 19.103 42.667 42.667v0zM853.333 341.333c0 23.564-19.103 42.667-42.667 42.667v0h-597.333c-23.564 0-42.667-19.103-42.667-42.667v0-170.667c0-23.564 19.103-42.667 42.667-42.667v0h597.333c23.564 0 42.667 19.103 42.667 42.667v0zM469.333 213.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM298.667 213.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["server-connection"]},"attrs":[],"properties":{"order":5416,"id":268,"name":"server-connection","prevSize":32,"code":60585},"setIdx":0,"setId":0,"iconIdx":937},{"icon":{"paths":["M341.333 256c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667c-23.564 0-42.667 19.103-42.667 42.667v0c0 23.564 19.103 42.667 42.667 42.667v0zM896 810.667h-263.68c-13.196-36.33-41.323-64.457-76.764-77.37l-0.89-0.283v-93.013h170.667c70.692 0 128-57.308 128-128v0-85.333c-0.203-32.927-12.807-62.872-33.371-85.435l0.091 0.102c20.473-22.461 33.077-52.406 33.28-85.292l0-0.041v-85.333c0-70.692-57.308-128-128-128v0h-426.667c-70.692 0-128 57.308-128 128v0 85.333c0.203 32.927 12.807 62.872 33.371 85.435l-0.091-0.102c-20.473 22.461-33.077 52.406-33.28 85.292l-0 0.041v85.333c0 70.692 57.308 128 128 128v0h170.667v93.013c-36.33 13.196-64.457 41.323-77.37 76.764l-0.283 0.89h-263.68c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h263.68c18.382 49.611 65.296 84.33 120.32 84.33s101.938-34.719 120.032-83.444l0.288-0.886h263.68c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM256 170.667c0-23.564 19.103-42.667 42.667-42.667v0h426.667c23.564 0 42.667 19.103 42.667 42.667v0 85.333c0 23.564-19.103 42.667-42.667 42.667v0h-426.667c-23.564 0-42.667-19.103-42.667-42.667v0zM298.667 554.667c-23.564 0-42.667-19.103-42.667-42.667v0-85.333c0-23.564 19.103-42.667 42.667-42.667v0h426.667c23.564 0 42.667 19.103 42.667 42.667v0 85.333c0 23.564-19.103 42.667-42.667 42.667v0zM512 896c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667c23.564 0 42.667 19.103 42.667 42.667v0c0 23.564-19.103 42.667-42.667 42.667v0zM341.333 426.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["server-network"]},"attrs":[],"properties":{"order":5417,"id":267,"name":"server-network","prevSize":32,"code":60586},"setIdx":0,"setId":0,"iconIdx":938},{"icon":{"paths":["M341.333 256h128c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-128c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM682.667 256c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667c-23.564 0-42.667 19.103-42.667 42.667v0c0 23.564 19.103 42.667 42.667 42.667v0zM682.667 426.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM896 810.667h-263.68c-13.196-36.33-41.323-64.457-76.764-77.37l-0.89-0.283v-93.013h170.667c70.692 0 128-57.308 128-128v0-85.333c-0.203-32.927-12.807-62.872-33.371-85.435l0.091 0.102c20.473-22.461 33.077-52.406 33.28-85.292l0-0.041v-85.333c0-70.692-57.308-128-128-128v0h-426.667c-70.692 0-128 57.308-128 128v0 85.333c0.203 32.927 12.807 62.872 33.371 85.435l-0.091-0.102c-20.473 22.461-33.077 52.406-33.28 85.292l-0 0.041v85.333c0 70.692 57.308 128 128 128v0h170.667v93.013c-36.33 13.196-64.457 41.323-77.37 76.764l-0.283 0.89h-263.68c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h263.68c18.382 49.611 65.296 84.33 120.32 84.33s101.938-34.719 120.032-83.444l0.288-0.886h263.68c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM256 170.667c0-23.564 19.103-42.667 42.667-42.667v0h426.667c23.564 0 42.667 19.103 42.667 42.667v0 85.333c0 23.564-19.103 42.667-42.667 42.667v0h-426.667c-23.564 0-42.667-19.103-42.667-42.667v0zM298.667 554.667c-23.564 0-42.667-19.103-42.667-42.667v0-85.333c0-23.564 19.103-42.667 42.667-42.667v0h426.667c23.564 0 42.667 19.103 42.667 42.667v0 85.333c0 23.564-19.103 42.667-42.667 42.667v0zM512 896c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667c23.564 0 42.667 19.103 42.667 42.667v0c0 23.564-19.103 42.667-42.667 42.667v0zM469.333 426.667h-128c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h128c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["server-network-alt"]},"attrs":[],"properties":{"order":5418,"id":266,"name":"server-network-alt","prevSize":32,"code":60587},"setIdx":0,"setId":0,"iconIdx":939},{"icon":{"paths":["M640 725.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM469.333 725.333h-85.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h85.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM469.333 469.333h-85.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h85.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM640 469.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM981.333 341.333c0-70.692-57.308-128-128-128v0h-42.667c0-70.692-57.308-128-128-128v0h-341.333c-70.692 0-128 57.308-128 128v0h-42.667c-70.692 0-128 57.308-128 128v0 85.333c0.203 32.927 12.807 62.872 33.371 85.435l-0.091-0.102c-20.473 22.461-33.077 52.406-33.28 85.292l-0 0.041v85.333c0 70.692 57.308 128 128 128v0h42.667c0 70.692 57.308 128 128 128v0h341.333c70.692 0 128-57.308 128-128v0h42.667c70.692 0 128-57.308 128-128v0-85.333c-0.203-32.927-12.807-62.872-33.371-85.435l0.091 0.102c20.473-22.461 33.077-52.406 33.28-85.292l0-0.041zM213.333 725.333h-42.667c-23.564 0-42.667-19.103-42.667-42.667v0-85.333c0-23.564 19.103-42.667 42.667-42.667v0h42.667c0.203 32.927 12.807 62.872 33.371 85.435l-0.091-0.102c-20.473 22.461-33.077 52.406-33.28 85.292l-0 0.041zM213.333 469.333h-42.667c-23.564 0-42.667-19.103-42.667-42.667v0-85.333c0-23.564 19.103-42.667 42.667-42.667v0h42.667c0.203 32.927 12.807 62.872 33.371 85.435l-0.091-0.102c-20.473 22.461-33.077 52.406-33.28 85.292l-0 0.041zM725.333 810.667c0 23.564-19.103 42.667-42.667 42.667v0h-341.333c-23.564 0-42.667-19.103-42.667-42.667v0-85.333c0-23.564 19.103-42.667 42.667-42.667v0h341.333c23.564 0 42.667 19.103 42.667 42.667v0zM725.333 554.667c0 23.564-19.103 42.667-42.667 42.667v0h-341.333c-23.564 0-42.667-19.103-42.667-42.667v0-85.333c0-23.564 19.103-42.667 42.667-42.667v0h341.333c23.564 0 42.667 19.103 42.667 42.667v0zM725.333 298.667c0 23.564-19.103 42.667-42.667 42.667v0h-341.333c-23.564 0-42.667-19.103-42.667-42.667v0-85.333c0-23.564 19.103-42.667 42.667-42.667v0h341.333c23.564 0 42.667 19.103 42.667 42.667v0zM896 682.667c0 23.564-19.103 42.667-42.667 42.667v0h-42.667c-0.203-32.927-12.807-62.872-33.371-85.435l0.091 0.102c20.473-22.461 33.077-52.406 33.28-85.292l0-0.041h42.667c23.564 0 42.667 19.103 42.667 42.667v0zM896 426.667c0 23.564-19.103 42.667-42.667 42.667v0h-42.667c-0.203-32.927-12.807-62.872-33.371-85.435l0.091 0.102c20.473-22.461 33.077-52.406 33.28-85.292l0-0.041h42.667c23.564 0 42.667 19.103 42.667 42.667v0zM640 213.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM469.333 213.333h-85.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h85.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["servers"]},"attrs":[],"properties":{"order":5419,"id":265,"name":"servers","prevSize":32,"code":60588},"setIdx":0,"setId":0,"iconIdx":940},{"icon":{"paths":["M234.667 384h170.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-170.667c-70.692 0-128 57.308-128 128s57.308 128 128 128v0h85.333c23.564 0 42.667 19.103 42.667 42.667s-19.103 42.667-42.667 42.667v0h-170.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h170.667c70.692 0 128-57.308 128-128s-57.308-128-128-128v0h-85.333c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667v0zM913.92 325.12c-4.422-10.46-12.58-18.618-22.76-22.935l-0.28-0.105c-4.793-2.024-10.366-3.201-16.213-3.201s-11.42 1.176-16.495 3.305l0.281-0.105c-5.464 2.152-10.143 5.187-14.095 8.974l0.015-0.014-119.040 119.467-119.040-119.467c-3.937-3.773-8.616-6.808-13.791-8.859l-0.289-0.101c-4.793-2.024-10.366-3.201-16.213-3.201s-11.42 1.176-16.495 3.305l0.281-0.105c-10.46 4.422-18.618 12.58-22.935 22.76l-0.105 0.28c-2.092 4.778-3.34 10.34-3.413 16.186l-0 0.027v341.333c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-238.507l76.373 76.8c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 76.373-76.8v238.507c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-341.333c-0.073-5.873-1.322-11.435-3.52-16.489l0.107 0.275z"],"attrs":[],"grid":0,"tags":["servicemark"]},"attrs":[],"properties":{"order":5420,"id":264,"name":"servicemark","prevSize":32,"code":60589},"setIdx":0,"setId":0,"iconIdx":941},{"icon":{"paths":["M640 725.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM384 725.333h-128c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h128c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM768 725.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM640 469.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM384 469.333h-128c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h128c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM768 213.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM768 469.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM938.667 213.333c0-70.692-57.308-128-128-128v0h-597.333c-70.692 0-128 57.308-128 128v0 85.333c0.203 32.927 12.807 62.872 33.371 85.435l-0.091-0.102c-20.473 22.461-33.077 52.406-33.28 85.292l-0 0.041v85.333c0.203 32.927 12.807 62.872 33.371 85.435l-0.091-0.102c-20.473 22.461-33.077 52.406-33.28 85.292l-0 0.041v85.333c0 70.692 57.308 128 128 128v0h597.333c70.692 0 128-57.308 128-128v0-85.333c-0.203-32.927-12.807-62.872-33.371-85.435l0.091 0.102c20.473-22.461 33.077-52.406 33.28-85.292l0-0.041v-85.333c-0.203-32.927-12.807-62.872-33.371-85.435l0.091 0.102c20.473-22.461 33.077-52.406 33.28-85.292l0-0.041zM853.333 810.667c0 23.564-19.103 42.667-42.667 42.667v0h-597.333c-23.564 0-42.667-19.103-42.667-42.667v0-85.333c0-23.564 19.103-42.667 42.667-42.667v0h597.333c23.564 0 42.667 19.103 42.667 42.667v0zM853.333 554.667c0 23.564-19.103 42.667-42.667 42.667v0h-597.333c-23.564 0-42.667-19.103-42.667-42.667v0-85.333c0-23.564 19.103-42.667 42.667-42.667v0h597.333c23.564 0 42.667 19.103 42.667 42.667v0zM853.333 298.667c0 23.564-19.103 42.667-42.667 42.667v0h-597.333c-23.564 0-42.667-19.103-42.667-42.667v0-85.333c0-23.564 19.103-42.667 42.667-42.667v0h597.333c23.564 0 42.667 19.103 42.667 42.667v0zM640 213.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM384 213.333h-128c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h128c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["server"]},"attrs":[],"properties":{"order":5421,"id":263,"name":"server","prevSize":32,"code":60590},"setIdx":0,"setId":0,"iconIdx":942},{"icon":{"paths":["M849.067 540.16c-6.59-7.473-10.613-17.347-10.613-28.16s4.023-20.687 10.653-28.207l-0.040 0.047 54.613-61.44c6.762-7.519 10.897-17.517 10.897-28.481 0-7.898-2.146-15.294-5.886-21.638l0.109 0.199-85.333-147.627c-7.509-12.865-21.248-21.372-36.973-21.372-3.073 0-6.071 0.325-8.96 0.942l0.28-0.050-80.213 16.213c-2.595 0.561-5.577 0.883-8.634 0.883-18.689 0-34.571-12.015-40.343-28.743l-0.090-0.3-26.027-78.080c-5.871-17.012-21.745-29.013-40.423-29.013-0.039 0-0.077 0-0.116 0l0.006-0h-170.667c-0.664-0.037-1.442-0.058-2.224-0.058-18.699 0-34.589 12.029-40.353 28.771l-0.090 0.3-23.893 78.080c-5.862 17.027-21.744 29.043-40.433 29.043-3.057 0-6.038-0.321-8.913-0.932l0.279 0.050-82.347-16.213c-1.794-0.267-3.864-0.42-5.97-0.42-15.533 0-29.127 8.3-36.589 20.707l-0.107 0.193-85.333 147.627c-3.844 6.281-6.121 13.884-6.121 22.019 0 10.693 3.933 20.467 10.432 27.954l-0.045-0.053 54.187 61.44c6.59 7.473 10.613 17.347 10.613 28.16s-4.023 20.687-10.653 28.207l0.040-0.047-54.187 61.44c-6.454 7.435-10.387 17.209-10.387 27.901 0 8.135 2.276 15.737 6.227 22.206l-0.106-0.187 85.333 147.627c7.509 12.865 21.248 21.372 36.973 21.372 3.073 0 6.071-0.325 8.96-0.942l-0.28 0.050 80.213-16.213c2.595-0.561 5.577-0.883 8.634-0.883 18.689 0 34.571 12.015 40.343 28.743l0.090 0.3 26.027 78.080c5.854 17.042 21.743 29.071 40.443 29.071 0.782 0 1.56-0.021 2.332-0.063l-0.108 0.005h170.667c0.033 0 0.071 0 0.11 0 18.678 0 34.552-12.002 40.333-28.714l0.090-0.3 26.027-78.080c5.862-17.027 21.744-29.043 40.433-29.043 3.057 0 6.038 0.321 8.913 0.932l-0.279-0.050 80.213 16.213c2.609 0.567 5.607 0.892 8.68 0.892 15.725 0 29.464-8.507 36.864-21.17l0.109-0.202 85.333-147.627c3.632-6.145 5.777-13.541 5.777-21.439 0-10.964-4.136-20.962-10.932-28.52l0.034 0.039zM785.493 597.333l34.133 38.4-54.613 94.72-50.347-10.24c-7.706-1.649-16.56-2.593-25.635-2.593-56.362 0-104.215 36.428-121.301 87.024l-0.264 0.902-16.213 47.787h-109.227l-15.36-48.64c-17.35-51.498-65.203-87.927-121.565-87.927-9.074 0-17.928 0.944-26.469 2.74l0.834-0.147-50.347 10.24-55.467-94.293 34.133-38.4c20.227-22.54 32.594-52.493 32.594-85.333s-12.368-62.793-32.7-85.453l0.105 0.119-34.133-38.4 54.613-93.867 50.347 10.24c7.706 1.649 16.56 2.593 25.635 2.593 56.362 0 104.215-36.428 121.301-87.024l0.264-0.902 16.213-48.213h109.227l16.213 48.64c17.35 51.498 65.203 87.927 121.565 87.927 9.074 0 17.928-0.944 26.469-2.74l-0.834 0.147 50.347-10.24 54.613 94.72-34.133 38.4c-19.998 22.48-32.215 52.267-32.215 84.907s12.217 62.426 32.328 85.036l-0.113-0.13zM496.64 341.333c-94.257 0-170.667 76.41-170.667 170.667s76.41 170.667 170.667 170.667c94.257 0 170.667-76.41 170.667-170.667v0c0-94.257-76.41-170.667-170.667-170.667v0zM496.64 597.333c-47.128 0-85.333-38.205-85.333-85.333s38.205-85.333 85.333-85.333c47.128 0 85.333 38.205 85.333 85.333v0c0 47.128-38.205 85.333-85.333 85.333v0z"],"attrs":[],"grid":0,"tags":["setting"]},"attrs":[],"properties":{"order":5422,"id":262,"name":"setting","prevSize":32,"code":60591},"setIdx":0,"setId":0,"iconIdx":943},{"icon":{"paths":["M768 597.333c-52.94 0.361-100.107 24.771-131.17 62.839l-0.244 0.308-217.6-100.267c4.865-14.396 7.673-30.977 7.673-48.213s-2.808-33.817-7.991-49.309l0.318 1.096 217.6-100.267c31.529 37.851 78.675 61.767 131.408 61.767 94.257 0 170.667-76.41 170.667-170.667s-76.41-170.667-170.667-170.667c-94.257 0-170.667 76.41-170.667 170.667 0 0.485 0.002 0.97 0.006 1.454l-0-0.074c0.14 10.802 1.221 21.258 3.164 31.407l-0.177-1.114-225.28 103.68c-30.743-30.080-72.863-48.64-119.317-48.64-94.257 0-170.667 76.41-170.667 170.667s76.41 170.667 170.667 170.667c46.455 0 88.574-18.56 119.348-48.67l-0.031 0.030 225.28 103.68c-1.766 9.036-2.846 19.491-2.985 30.174l-0.001 0.119c0 94.257 76.41 170.667 170.667 170.667s170.667-76.41 170.667-170.667c0-94.257-76.41-170.667-170.667-170.667v0zM768 170.667c47.128 0 85.333 38.205 85.333 85.333s-38.205 85.333-85.333 85.333c-47.128 0-85.333-38.205-85.333-85.333v0c0-47.128 38.205-85.333 85.333-85.333v0zM256 597.333c-47.128 0-85.333-38.205-85.333-85.333s38.205-85.333 85.333-85.333c47.128 0 85.333 38.205 85.333 85.333v0c0 47.128-38.205 85.333-85.333 85.333v0zM768 853.333c-47.128 0-85.333-38.205-85.333-85.333s38.205-85.333 85.333-85.333c47.128 0 85.333 38.205 85.333 85.333v0c0 47.128-38.205 85.333-85.333 85.333v0z"],"attrs":[],"grid":0,"tags":["share-alt"]},"attrs":[],"properties":{"order":5423,"id":261,"name":"share-alt","prevSize":32,"code":60592},"setIdx":0,"setId":0,"iconIdx":944},{"icon":{"paths":["M926.165 481.835l-341.333-341.333c-7.721-7.722-18.387-12.498-30.169-12.498-23.562 0-42.663 19.101-42.663 42.663 0 0 0 0 0 0l0 0v151.25c-240.055 22.879-426.363 223.343-426.667 467.386l-0 0.031v64c-0 0.001-0 0.002-0 0.003 0 23.564 19.103 42.667 42.667 42.667 13.522 0 25.575-6.29 33.392-16.104l0.067-0.087c82.335-97.457 200.969-162.007 334.788-172.661l1.712-0.11c2.125-0.271 7.458-0.687 14.042-1.104v147.396c-0 0-0 0-0 0 0 23.562 19.101 42.663 42.663 42.663 11.782 0 22.449-4.776 30.169-12.498l341.333-341.333c7.722-7.719 12.499-18.384 12.499-30.165s-4.777-22.446-12.499-30.165l-0-0zM597.333 750.333v-89c0-0.003 0-0.007 0-0.011 0-23.558-19.098-42.656-42.656-42.656-0.004 0-0.008 0-0.012 0l0.001-0c-10.875 0-55.292 2.104-66.625 3.627-120.442 11.395-228.474 56.946-316.399 126.734l1.232-0.944c21.767-193.467 184.337-342.501 381.766-342.75l0.025-0c0.003 0 0.007 0 0.011 0 23.558 0 42.656-19.098 42.656-42.656 0-0.004-0-0.008-0-0.012l0 0.001v-89l238.333 238.333z"],"attrs":[],"grid":0,"tags":["share"]},"attrs":[],"properties":{"order":5424,"id":260,"name":"share","prevSize":32,"code":60593},"setIdx":0,"setId":0,"iconIdx":945},{"icon":{"paths":["M837.547 155.733c-7.264-5.913-16.631-9.495-26.834-9.495-3.19 0-6.299 0.35-9.29 1.014l0.284-0.053c-21.046 4.614-45.221 7.258-70.014 7.258-73.136 0-140.899-23.002-196.451-62.165l1.078 0.721c-6.788-4.762-15.222-7.61-24.32-7.61s-17.532 2.848-24.457 7.701l0.137-0.091c-54.474 38.443-122.237 61.444-195.373 61.444-24.792 0-48.967-2.643-72.259-7.663l2.245 0.406c-2.707-0.611-5.816-0.961-9.006-0.961-10.203 0-19.57 3.582-26.912 9.556l0.078-0.062c-9.665 7.885-15.787 19.795-15.787 33.135 0 0.051 0 0.102 0 0.153l-0-0.008v317.867c-0 0.071-0 0.154-0 0.238 0 128.357 62.977 242.005 159.718 311.73l1.135 0.779 155.733 110.933c6.875 4.946 15.465 7.91 24.747 7.91s17.871-2.964 24.874-7.997l-0.127 0.087 155.733-110.933c97.876-70.504 160.853-184.152 160.853-312.509 0-0.084-0-0.167-0-0.251l0 0.013v-317.867c0-0.043 0-0.094 0-0.145 0-13.34-6.122-25.25-15.71-33.074l-0.077-0.061zM768 506.88c0 0.061 0 0.133 0 0.206 0 99.792-48.942 188.154-124.133 242.39l-0.881 0.604-130.987 93.44-130.987-93.44c-76.071-54.841-125.013-143.202-125.013-242.994 0-0.072 0-0.145 0-0.217l-0 0.012v-268.8c10.9 0.99 23.577 1.554 36.385 1.554 81.11 0 156.934-22.633 221.501-61.927l-1.886 1.066c62.681 38.228 138.505 60.861 219.615 60.861 12.808 0 25.485-0.564 38.006-1.67l-1.621 0.115zM577.707 409.173l-114.773 115.2-37.973-38.4c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l68.267 68.267c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 146.773-145.493c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l0-0z"],"attrs":[],"grid":0,"tags":["shield-check"]},"attrs":[],"properties":{"order":5425,"id":259,"name":"shield-check","prevSize":32,"code":60594},"setIdx":0,"setId":0,"iconIdx":946},{"icon":{"paths":["M551.253 640c-0.917-2.777-2.223-5.185-3.88-7.306l0.040 0.053-5.12-6.4c-7.733-7.795-18.45-12.621-30.293-12.621s-22.56 4.826-30.291 12.618l-0.003 0.003c-2.003 1.826-3.704 3.935-5.053 6.274l-0.067 0.126c-1.617 2.068-2.923 4.477-3.791 7.085l-0.049 0.169c-1.159 2.347-2.051 5.070-2.535 7.931l-0.025 0.176c-0.1 1.214-0.157 2.627-0.157 4.053s0.057 2.84 0.169 4.238l-0.012-0.184c-0.008 0.289-0.013 0.629-0.013 0.971 0 5.683 1.263 11.071 3.523 15.899l-0.097-0.23c6.616 15.517 21.741 26.197 39.36 26.197 5.807 0 11.343-1.16 16.389-3.261l-0.282 0.104c5.423-2.458 10.075-5.608 14.105-9.41l-0.025 0.023c3.733-3.822 6.76-8.354 8.856-13.372l0.104-0.282c2.147-4.908 3.401-10.626 3.413-16.635l0-0.005c0.1-1.214 0.157-2.627 0.157-4.053s-0.057-2.84-0.169-4.238l0.012 0.184c-1.078-3.096-2.523-5.781-4.322-8.185l0.056 0.078zM512 314.027c-23.564 0-42.667 19.103-42.667 42.667v0 128c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-128c0-23.564-19.103-42.667-42.667-42.667v0zM837.547 155.733c-7.264-5.913-16.631-9.495-26.834-9.495-3.19 0-6.299 0.35-9.29 1.014l0.284-0.053c-21.046 4.614-45.221 7.258-70.014 7.258-73.136 0-140.899-23.002-196.451-62.165l1.078 0.721c-6.788-4.762-15.222-7.61-24.32-7.61s-17.532 2.848-24.457 7.701l0.137-0.091c-54.474 38.443-122.237 61.444-195.373 61.444-24.792 0-48.967-2.643-72.259-7.663l2.245 0.406c-2.707-0.611-5.816-0.961-9.006-0.961-10.203 0-19.57 3.582-26.912 9.556l0.078-0.062c-9.665 7.885-15.787 19.795-15.787 33.135 0 0.051 0 0.102 0 0.153l-0-0.008v317.867c-0 0.071-0 0.154-0 0.238 0 128.357 62.977 242.005 159.718 311.73l1.135 0.779 155.733 110.933c6.875 4.946 15.465 7.91 24.747 7.91s17.871-2.964 24.874-7.997l-0.127 0.087 155.733-110.933c97.876-70.504 160.853-184.152 160.853-312.509 0-0.084-0-0.167-0-0.251l0 0.013v-317.867c0-0.043 0-0.094 0-0.145 0-13.34-6.122-25.25-15.71-33.074l-0.077-0.061zM768 506.88c0 0.061 0 0.133 0 0.206 0 99.792-48.942 188.154-124.133 242.39l-0.881 0.604-130.987 93.44-130.987-93.44c-76.071-54.841-125.013-143.202-125.013-242.994 0-0.072 0-0.145 0-0.217l-0 0.012v-268.8c10.9 0.99 23.577 1.554 36.385 1.554 81.11 0 156.934-22.633 221.501-61.927l-1.886 1.066c62.681 38.228 138.505 60.861 219.615 60.861 12.808 0 25.485-0.564 38.006-1.67l-1.621 0.115z"],"attrs":[],"grid":0,"tags":["shield-exclamation"]},"attrs":[],"properties":{"order":5426,"id":258,"name":"shield-exclamation","prevSize":32,"code":60595},"setIdx":0,"setId":0,"iconIdx":947},{"icon":{"paths":["M597.333 469.333h-42.667v-42.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 42.667h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h42.667v42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM837.583 155.729c-7.309-5.936-16.728-9.531-26.986-9.531-3.073 0-6.071 0.323-8.961 0.936l0.281-0.050c-21.166 4.679-45.478 7.36-70.415 7.36-73.038 0-140.704-22.995-196.156-62.14l1.071 0.718c-6.806-4.81-15.275-7.688-24.417-7.688s-17.611 2.878-24.551 7.777l0.134-0.090c-54.362 38.436-122.015 61.437-195.040 61.437-24.954 0-49.281-2.686-72.707-7.784l2.247 0.41c-2.634-0.578-5.66-0.91-8.762-0.91-23.557 0-42.654 19.097-42.654 42.654 0 0.009 0 0.018 0 0.027l-0-0.001v318.165c0.137 128.303 63.045 241.885 159.663 311.703l1.128 0.776 155.753 111.232c6.885 4.963 15.491 7.938 24.791 7.938s17.906-2.975 24.918-8.024l-0.126 0.087 155.75-111.25c97.749-70.584 160.659-184.162 160.789-312.44l0-0.020v-318.165c-0-13.33-6.106-25.233-15.674-33.066l-0.076-0.060zM768 507.021c-0.116 99.779-49.034 188.109-124.164 242.417l-0.877 0.603-130.959 93.521-130.959-93.5c-76.004-54.923-124.92-143.257-125.041-243.022l-0-0.019v-268.813c11.018 1.016 23.829 1.595 36.775 1.595 80.991 0 156.687-22.669 221.090-62.008l-1.865 1.059c62.538 38.28 138.234 60.95 219.225 60.95 12.946 0 25.757-0.579 38.409-1.713l-1.633 0.118z"],"attrs":[],"grid":0,"tags":["shield-plus"]},"attrs":[],"properties":{"order":5427,"id":257,"name":"shield-plus","prevSize":32,"code":60596},"setIdx":0,"setId":0,"iconIdx":948},{"icon":{"paths":["M481.707 625.493c-7.606 7.667-12.323 18.211-12.373 29.857l-0 0.010c0.012 6.014 1.266 11.732 3.52 16.916l-0.107-0.276c6.675 15.382 21.731 25.945 39.253 25.945 23.535 0 42.62-19.056 42.667-42.581l0-0.004c-0.051-11.656-4.767-22.2-12.376-29.869l0.003 0.003c-7.733-7.795-18.45-12.621-30.293-12.621s-22.56 4.826-30.291 12.618l-0.003 0.003zM837.547 156.16c-7.264-5.913-16.631-9.495-26.834-9.495-3.19 0-6.299 0.35-9.29 1.014l0.284-0.053c-21.046 4.614-45.221 7.258-70.014 7.258-73.136 0-140.899-23.002-196.451-62.165l1.078 0.721c-6.788-4.762-15.222-7.61-24.32-7.61s-17.532 2.848-24.457 7.701l0.137-0.091c-54.377 38.242-121.968 61.117-194.903 61.117-24.961 0-49.297-2.679-72.735-7.766l2.251 0.41c-2.707-0.611-5.816-0.961-9.006-0.961-10.203 0-19.57 3.582-26.912 9.556l0.078-0.062c-9.665 7.885-15.787 19.795-15.787 33.135 0 0.051 0 0.102 0 0.153l-0-0.008v317.867c-0 0.071-0 0.154-0 0.238 0 128.357 62.977 242.005 159.718 311.73l1.135 0.779 155.733 110.933c6.875 4.946 15.465 7.91 24.747 7.91s17.871-2.964 24.874-7.997l-0.127 0.087 155.733-110.933c97.876-70.504 160.853-184.152 160.853-312.509 0-0.084-0-0.167-0-0.251l0 0.013v-317.867c0-0.043 0-0.094 0-0.145 0-13.34-6.122-25.25-15.71-33.074l-0.077-0.061zM768 506.88c0 0.061 0 0.133 0 0.206 0 99.792-48.942 188.154-124.133 242.39l-0.881 0.604-130.987 93.44-130.987-93.44c-76.071-54.841-125.013-143.202-125.013-242.994 0-0.072 0-0.145 0-0.217l-0 0.012v-268.8c10.9 0.99 23.577 1.554 36.385 1.554 81.11 0 156.934-22.633 221.501-61.927l-1.886 1.066c62.681 38.228 138.505 60.861 219.615 60.861 12.808 0 25.485-0.564 38.006-1.67l-1.621 0.115zM512 314.027c-0.024-0-0.053-0-0.082-0-47.128 0-88.308 25.47-110.524 63.396l-0.327 0.604c-3.062 5.737-4.86 12.547-4.86 19.777 0 23.564 19.103 42.667 42.667 42.667 15.070 0 28.314-7.812 35.905-19.608l0.102-0.169c7.515-12.843 21.241-21.333 36.95-21.333 23.564 0 42.667 19.103 42.667 42.667 0 23.504-19.006 42.57-42.488 42.666l-0.009 0c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0c70.692 0 128-57.308 128-128s-57.308-128-128-128v0z"],"attrs":[],"grid":0,"tags":["shield-question"]},"attrs":[],"properties":{"order":5428,"id":256,"name":"shield-question","prevSize":32,"code":60597},"setIdx":0,"setId":0,"iconIdx":949},{"icon":{"paths":["M837.547 155.733c-7.264-5.913-16.631-9.495-26.834-9.495-3.19 0-6.299 0.35-9.29 1.014l0.284-0.053c-21.046 4.614-45.221 7.258-70.014 7.258-73.136 0-140.899-23.002-196.451-62.165l1.078 0.721c-6.788-4.762-15.222-7.61-24.32-7.61s-17.532 2.848-24.457 7.701l0.137-0.091c-54.474 38.443-122.237 61.444-195.373 61.444-24.792 0-48.967-2.643-72.259-7.663l2.245 0.406c-2.707-0.611-5.816-0.961-9.006-0.961-10.203 0-19.57 3.582-26.912 9.556l0.078-0.062c-9.665 7.885-15.787 19.795-15.787 33.135 0 0.051 0 0.102 0 0.153l-0-0.008v317.867c-0 0.071-0 0.154-0 0.238 0 128.357 62.977 242.005 159.718 311.73l1.135 0.779 155.733 110.933c6.875 4.946 15.465 7.91 24.747 7.91s17.871-2.964 24.874-7.997l-0.127 0.087 155.733-110.933c97.876-70.504 160.853-184.152 160.853-312.509 0-0.084-0-0.167-0-0.251l0 0.013v-317.867c0-0.043 0-0.094 0-0.145 0-13.34-6.122-25.25-15.71-33.074l-0.077-0.061zM768 506.88c0 0.061 0 0.133 0 0.206 0 99.792-48.942 188.154-124.133 242.39l-0.881 0.604-130.987 93.44-130.987-93.44c-76.071-54.841-125.013-143.202-125.013-242.994 0-0.072 0-0.145 0-0.217l-0 0.012v-268.8c10.9 0.99 23.577 1.554 36.385 1.554 81.11 0 156.934-22.633 221.501-61.927l-1.886 1.066c62.681 38.228 138.505 60.861 219.615 60.861 12.808 0 25.485-0.564 38.006-1.67l-1.621 0.115z"],"attrs":[],"grid":0,"tags":["shield"]},"attrs":[],"properties":{"order":5429,"id":255,"name":"shield","prevSize":32,"code":60598},"setIdx":0,"setId":0,"iconIdx":950},{"icon":{"paths":["M154.453 737.28c6.452 15.906 21.78 26.918 39.68 26.918 23.585 0 42.705-19.12 42.705-42.705 0-5.685-1.111-11.111-3.128-16.072l0.103 0.286-47.787-120.32 283.307-62.72v202.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-202.667l283.307 62.72-47.787 120.32c-1.921 4.681-3.037 10.114-3.037 15.808 0 17.897 11.020 33.221 26.644 39.556l0.286 0.102c4.646 1.89 10.036 2.987 15.683 2.987 0.036 0 0.073-0 0.109-0l-0.006 0c0.012 0 0.027 0 0.041 0 17.878 0 33.189-10.996 39.536-26.595l0.103-0.285 66.133-166.827c1.874-4.629 2.962-9.997 2.962-15.62 0-7.406-1.887-14.372-5.207-20.442l0.111 0.223c-5.785-10.878-15.84-18.837-27.87-21.702l-0.29-0.058-137.387-30.293v-183.893c0-23.564-19.103-42.667-42.667-42.667v0h-85.333v-128c0-23.564-19.103-42.667-42.667-42.667v0h-170.667c-23.564 0-42.667 19.103-42.667 42.667v0 128h-85.333c-23.564 0-42.667 19.103-42.667 42.667v0 183.893l-137.387 29.44c-12.32 2.923-22.375 10.882-28.048 21.53l-0.112 0.23c-3.208 5.848-5.095 12.813-5.095 20.22 0 5.623 1.088 10.991 3.064 15.907l-0.102-0.287zM469.333 170.667h85.333v85.333h-85.333zM341.333 341.333h341.333v122.027l-161.28-36.693h-18.773l-161.28 36.693zM883.627 822.613c-16.268 5.053-30.403 11.575-43.467 19.661l0.8-0.461c-12.831 7.629-28.289 12.138-44.8 12.138s-31.969-4.509-45.21-12.363l0.41 0.225c-27.862-15.999-61.255-25.435-96.853-25.435s-68.992 9.436-97.817 25.943l0.964-0.508c-12.994 7.539-28.591 11.988-45.227 11.988s-32.233-4.449-45.666-12.223l0.439 0.235c-27.88-15.922-61.27-25.309-96.853-25.309s-68.973 9.388-97.829 25.821l0.976-0.512c-12.831 7.629-28.289 12.138-44.8 12.138s-31.969-4.509-45.21-12.363l0.41 0.225c-12.264-7.625-26.399-14.147-41.343-18.841l-1.324-0.359c-4.255-1.562-9.169-2.465-14.293-2.465-20.203 0-37.126 14.041-41.543 32.897l-0.057 0.289c-1.105 3.612-1.741 7.763-1.741 12.063 0 19.163 12.633 35.375 30.025 40.763l0.302 0.081c9.239 2.544 17.326 6.191 24.682 10.882l-0.362-0.216c24.433 14.576 53.848 23.269 85.277 23.466l0.056 0c0.010 0 0.021 0 0.033 0 32.679 0 63.285-8.874 89.54-24.343l-0.826 0.45c15.751-8.851 34.573-14.064 54.613-14.064s38.862 5.213 55.184 14.358l-0.571-0.294c25.243 14.686 55.556 23.355 87.893 23.355s62.65-8.669 88.741-23.809l-0.848 0.454c15.751-8.851 34.573-14.064 54.613-14.064s38.862 5.213 55.184 14.358l-0.571-0.294c24.984 15.151 55.178 24.117 87.467 24.117s62.483-8.967 88.229-24.546l-0.762 0.428c6.994-4.476 15.081-8.123 23.69-10.517l0.63-0.15c19.65-4.080 34.207-21.25 34.207-41.82 0-3.788-0.494-7.461-1.42-10.958l0.067 0.298c-4.576-19.008-21.433-32.913-41.537-32.913-4.831 0-9.474 0.803-13.803 2.282l0.3-0.089z"],"attrs":[],"grid":0,"tags":["ship"]},"attrs":[],"properties":{"order":5430,"id":254,"name":"ship","prevSize":32,"code":60599},"setIdx":0,"setId":0,"iconIdx":951},{"icon":{"paths":["M938.667 213.333h-853.333c-23.564 0-42.667 19.103-42.667 42.667v0 170.667c0.16 55.254 35.305 102.258 84.442 120.038l0.891 0.282v391.68c0 23.564 19.103 42.667 42.667 42.667v0h682.667c23.564 0 42.667-19.103 42.667-42.667v0-391.68c50.028-18.062 85.173-65.066 85.333-120.3l0-0.020v-170.667c0-23.564-19.103-42.667-42.667-42.667v0zM640 298.667h85.333v128c0 23.564-19.103 42.667-42.667 42.667s-42.667-19.103-42.667-42.667v0zM469.333 298.667h85.333v128c0 23.564-19.103 42.667-42.667 42.667s-42.667-19.103-42.667-42.667v0zM298.667 298.667h85.333v128c0 23.564-19.103 42.667-42.667 42.667s-42.667-19.103-42.667-42.667v0zM170.667 469.333c-23.564 0-42.667-19.103-42.667-42.667v0-128h85.333v128c0 23.564-19.103 42.667-42.667 42.667v0zM597.333 896h-170.667v-85.333c0-47.128 38.205-85.333 85.333-85.333s85.333 38.205 85.333 85.333v0zM810.667 896h-128v-85.333c0-94.257-76.41-170.667-170.667-170.667s-170.667 76.41-170.667 170.667v0 85.333h-128v-349.013c16.457-6.205 30.617-14.877 42.803-25.719l-0.137 0.119c22.54 20.227 52.493 32.594 85.333 32.594s62.793-12.368 85.453-32.7l-0.119 0.105c22.54 20.227 52.493 32.594 85.333 32.594s62.793-12.368 85.453-32.7l-0.119 0.105c22.54 20.227 52.493 32.594 85.333 32.594s62.793-12.368 85.453-32.7l-0.119 0.105c12.050 10.723 26.21 19.395 41.737 25.29l0.929 0.31zM896 426.667c0 23.564-19.103 42.667-42.667 42.667s-42.667-19.103-42.667-42.667v0-128h85.333zM183.467 128h669.867c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-669.867c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["shop"]},"attrs":[],"properties":{"order":5431,"id":253,"name":"shop","prevSize":32,"code":60600},"setIdx":0,"setId":0,"iconIdx":952},{"icon":{"paths":["M926.293 865.707l-768-768c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293v0l72.96 72.533v276.053c0.065 128.285 63.027 241.852 159.717 311.541l1.136 0.779 155.733 111.36c6.875 4.946 15.465 7.91 24.747 7.91s17.871-2.964 24.874-7.997l-0.127 0.087 155.733-111.36c13.653-9.712 25.621-19.514 36.893-30.051l-0.199 0.185 136.533 136.96c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003zM642.987 750.080l-130.987 93.44-130.987-93.44c-76.071-54.841-125.013-143.202-125.013-242.994 0-0.072 0-0.145 0-0.217l-0 0.012v-190.72l412.587 413.013c-8.107 7.253-16.64 14.080-25.6 20.907zM429.653 216.32c31.604-10.702 58.813-23.397 84.324-38.641l-1.977 1.095c62.047 38.336 137.266 61.053 217.791 61.053 13.453 0 26.758-0.634 39.886-1.874l-1.677 0.128v268.8c0 0.142 0 0.309 0 0.477 0 17.619-1.552 34.876-4.528 51.641l0.26-1.771c-0.36 2.083-0.566 4.481-0.566 6.927 0 21.203 15.466 38.794 35.733 42.106l0.246 0.033h6.827c0.163 0.002 0.356 0.004 0.549 0.004 21.155 0 38.714-15.396 42.083-35.594l0.034-0.249c3.196-19.197 5.056-41.356 5.12-63.937l0-0.063v-317.44c-0.090-13.235-6.193-25.027-15.71-32.792l-0.077-0.061c-7.319-6.077-16.811-9.765-27.165-9.765-2.919 0-5.769 0.293-8.523 0.851l0.274-0.046c-21.449 4.864-46.081 7.651-71.365 7.651-72.887 0-140.365-23.164-195.472-62.532l1.023 0.694c-6.788-4.762-15.222-7.61-24.32-7.61s-17.532 2.848-24.457 7.701l0.137-0.091c-24.551 17.151-52.789 31.602-82.933 41.95l-2.401 0.716c-17.071 5.875-29.118 21.797-29.118 40.533 0 23.622 19.149 42.771 42.771 42.771 4.886 0 9.581-0.819 13.954-2.328l-0.301 0.090z"],"attrs":[],"grid":0,"tags":["shield-slash"]},"attrs":[],"properties":{"order":5432,"id":252,"name":"shield-slash","prevSize":32,"code":60601},"setIdx":0,"setId":0,"iconIdx":953},{"icon":{"paths":["M810.667 298.667h-128v-42.667c0-94.257-76.41-170.667-170.667-170.667s-170.667 76.41-170.667 170.667v0 42.667h-128c-23.564 0-42.667 19.103-42.667 42.667v0 469.333c0 70.692 57.308 128 128 128v0h426.667c70.692 0 128-57.308 128-128v0-469.333c0-23.564-19.103-42.667-42.667-42.667v0zM426.667 256c0-47.128 38.205-85.333 85.333-85.333s85.333 38.205 85.333 85.333v0 42.667h-170.667zM768 810.667c0 23.564-19.103 42.667-42.667 42.667v0h-426.667c-23.564 0-42.667-19.103-42.667-42.667v0-426.667h85.333v42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667h170.667v42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667h85.333z"],"attrs":[],"grid":0,"tags":["shopping-bag"]},"attrs":[],"properties":{"order":5433,"id":251,"name":"shopping-bag","prevSize":32,"code":60602},"setIdx":0,"setId":0,"iconIdx":954},{"icon":{"paths":["M597.333 768c23.564 0 42.667-19.103 42.667-42.667v0-85.333c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 85.333c0 23.564 19.103 42.667 42.667 42.667v0zM426.667 768c23.564 0 42.667-19.103 42.667-42.667v0-85.333c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 85.333c0 23.564 19.103 42.667 42.667 42.667v0zM810.667 256h-58.88l-73.813-147.2c-6.6-15.554-21.743-26.265-39.388-26.265-23.564 0-42.667 19.103-42.667 42.667 0 8.126 2.272 15.721 6.215 22.186l-0.106-0.188 54.187 108.8h-288.427l54.187-108.8c2.073-4.845 3.279-10.483 3.279-16.402 0-23.564-19.103-42.667-42.667-42.667-15.438 0-28.961 8.199-36.452 20.481l-0.106 0.188-73.813 147.2h-58.88c-69.85 1.096-126.053 57.977-126.053 127.985 0 55.944 35.89 103.506 85.902 120.916l0.898 0.272 31.573 318.293c6.721 64.969 61.173 115.202 127.359 115.202 0.226 0 0.451-0.001 0.676-0.002l-0.035 0h357.547c0.191 0.001 0.416 0.002 0.641 0.002 66.185 0 120.638-50.233 127.312-114.653l0.046-0.549 31.573-318.293c50.895-17.691 86.771-65.245 86.771-121.178 0-70.298-56.67-127.36-126.817-127.995l-0.060-0zM733.44 814.933c-2.24 21.656-20.391 38.401-42.453 38.401-0.075 0-0.15-0-0.225-0.001l0.012 0h-357.547c-0.064 0-0.139 0.001-0.214 0.001-22.062 0-40.213-16.744-42.437-38.218l-0.015-0.183-30.293-302.933h503.467zM810.667 426.667h-597.333c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667v0h597.333c23.564 0 42.667 19.103 42.667 42.667s-19.103 42.667-42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["shopping-basket"]},"attrs":[],"properties":{"order":5434,"id":250,"name":"shopping-basket","prevSize":32,"code":60603},"setIdx":0,"setId":0,"iconIdx":955},{"icon":{"paths":["M917.333 640c-0.204-53.609-33.332-99.429-80.206-118.307l-0.86-0.306 79.787-298.667c0.885-3.245 1.393-6.971 1.393-10.815 0-9.966-3.417-19.133-9.142-26.395l0.069 0.091c-7.873-9.176-19.482-14.952-32.44-14.952-0.445 0-0.889 0.007-1.331 0.020l0.065-0.002h-584.533l-14.080-53.76c-5.055-18.333-21.581-31.574-41.199-31.574-0.066 0-0.132 0-0.197 0l0.010-0h-85.333v85.333h52.48l105.813 395.093c5.046 18.345 21.578 31.598 41.206 31.598 0.514 0 1.025-0.009 1.534-0.027l-0.074 0.002h439.040c23.564 0 42.667 19.103 42.667 42.667s-19.103 42.667-42.667 42.667v0h-554.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h50.347c-4.865 12.99-7.68 28.001-7.68 43.67 0 70.692 57.308 128 128 128s128-57.308 128-128c0-15.669-2.815-30.68-7.968-44.556l0.288 0.886h100.693c-4.862 12.987-7.676 27.995-7.676 43.66 0 70.692 57.308 128 128 128s128-57.308 128-128c0-0.349-0.001-0.698-0.004-1.046l0 0.053c-0.086-23.122-6.414-44.748-17.386-63.303l0.319 0.583c36.031-22.981 59.613-62.697 59.733-107.929l0-0.018zM750.507 512h-366.507l-70.827-256h506.027zM405.333 853.333c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667c23.564 0 42.667 19.103 42.667 42.667v0c0 23.564-19.103 42.667-42.667 42.667v0zM746.667 853.333c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667c23.564 0 42.667 19.103 42.667 42.667v0c0 23.564-19.103 42.667-42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["shopping-cart-alt"]},"attrs":[],"properties":{"order":5435,"id":249,"name":"shopping-cart-alt","prevSize":32,"code":60604},"setIdx":0,"setId":0,"iconIdx":956},{"icon":{"paths":["M362.667 810.667c-35.346 0-64 28.654-64 64s28.654 64 64 64c35.346 0 64-28.654 64-64v0c0-35.346-28.654-64-64-64v0zM810.667 682.667h-512c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667v0h362.292c58.105-0.193 107.117-38.903 122.853-91.923l0.232-0.91 67.645-236.771c1.043-3.513 1.643-7.549 1.643-11.725 0-23.564-19.1-42.667-42.663-42.671l-523.133-0c-18.121-49.946-65.035-85.040-120.185-85.333l-0.036-0h-39.313c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h39.313c19.363 0.070 35.694 12.968 40.943 30.634l0.077 0.303 6.636 23.242 0.010 0.216 70 245c-64.556 7.147-114.312 61.397-114.312 127.268 0 70.693 57.307 128.001 127.999 128.003l512 0c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM754.104 298.667l-52.105 182.375c-5.321 17.986-21.665 30.896-41.034 30.958l-0.007 0h-287.438l-10.877-38.068-50.049-175.266zM704 810.667c-35.346 0-64 28.654-64 64s28.654 64 64 64c35.346 0 64-28.654 64-64v0c0-35.346-28.654-64-64-64v0z"],"attrs":[],"grid":0,"tags":["shopping-cart"]},"attrs":[],"properties":{"order":5436,"id":248,"name":"shopping-cart","prevSize":32,"code":60605},"setIdx":0,"setId":0,"iconIdx":957},{"icon":{"paths":["M926.293 314.88l-217.173-217.173c-7.712-7.668-18.343-12.407-30.080-12.407s-22.368 4.74-30.082 12.409l0.002-0.002c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003 76.373 78.080-231.253 232.96-42.667-42.667c-23.179-23.257-55.242-37.648-90.667-37.648s-67.488 14.39-90.663 37.644l-0.004 0.004-147.2 145.92c-23.197 23.169-37.547 55.192-37.547 90.566 0 0.11 0 0.221 0 0.331l-0-0.017v147.2c0 70.692 57.308 128 128 128v0h147.2c0.093 0 0.203 0 0.314 0 35.374 0 67.397-14.35 90.565-37.546l0.001-0.001 145.92-146.347c23.257-23.179 37.648-55.242 37.648-90.667s-14.39-67.488-37.644-90.663l-0.004-0.004-42.667-42.667 232.96-232.107 78.080 78.080c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c8.188-7.789 13.28-18.767 13.28-30.933s-5.092-23.144-13.262-30.917l-0.018-0.017zM537.6 694.187l-146.773 146.773c-7.709 7.648-18.326 12.374-30.047 12.374-0.087 0-0.173-0-0.26-0.001l0.013 0h-147.2c-23.564 0-42.667-19.103-42.667-42.667v0-147.2c-0-0.073-0.001-0.16-0.001-0.247 0-11.721 4.726-22.338 12.377-30.049l-0.003 0.003 146.773-146.773c7.712-7.668 18.343-12.407 30.080-12.407s22.368 4.74 30.082 12.409l-0.002-0.002 42.667 42.667-37.973 38.4c-7.668 7.712-12.407 18.343-12.407 30.080s4.74 22.368 12.409 30.082l-0.002-0.002c7.713 7.673 18.347 12.416 30.089 12.416 0.672 0 1.341-0.016 2.005-0.046l-0.094 0.003c11.656-0.051 22.2-4.767 29.869-12.376l-0.003 0.003 38.4-37.973 42.667 42.667c8.188 7.789 13.28 18.767 13.28 30.933s-5.092 23.144-13.262 30.917l-0.018 0.017z"],"attrs":[],"grid":0,"tags":["shovel"]},"attrs":[],"properties":{"order":5437,"id":247,"name":"shovel","prevSize":32,"code":60606},"setIdx":0,"setId":0,"iconIdx":958},{"icon":{"paths":["M456.96 481.707l-106.667-106.667c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l0 0 34.133 33.707h-195.84c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h195.84l-34.133 33.707c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 106.667-106.667c3.773-3.937 6.808-8.616 8.859-13.791l0.101-0.289c2.024-4.793 3.201-10.366 3.201-16.213s-1.176-11.42-3.305-16.495l0.105 0.281c-2.152-5.464-5.187-10.143-8.974-14.095l0.014 0.015zM896 469.333h-195.84l34.133-33.707c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l-106.667 106.667c-3.773 3.937-6.808 8.616-8.859 13.791l-0.101 0.289c-2.024 4.793-3.201 10.366-3.201 16.213s1.176 11.42 3.305 16.495l-0.105-0.281c2.152 5.464 5.187 10.143 8.974 14.095l-0.014-0.015 106.667 106.667c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003-34.133-33.707h195.84c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["shrink"]},"attrs":[],"properties":{"order":5438,"id":246,"name":"shrink","prevSize":32,"code":60607},"setIdx":0,"setId":0,"iconIdx":959},{"icon":{"paths":["M128 426.667c23.564 0 42.667-19.103 42.667-42.667v0-153.173l194.56 195.84c7.772 8.055 18.662 13.057 30.72 13.057s22.948-5.002 30.708-13.044l0.012-0.013c7.668-7.712 12.407-18.343 12.407-30.080s-4.74-22.368-12.409-30.082l0.002 0.002-195.84-195.84h153.173c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-256c-5.873 0.073-11.435 1.322-16.489 3.52l0.275-0.107c-10.46 4.422-18.618 12.58-22.935 22.76l-0.105 0.28c-2.092 4.778-3.34 10.34-3.413 16.186l-0 0.027v256c0 23.564 19.103 42.667 42.667 42.667v0zM652.8 597.333c-7.412-6.377-17.129-10.259-27.753-10.259-23.564 0-42.667 19.103-42.667 42.667 0 10.624 3.883 20.341 10.307 27.809l-0.047-0.056 267.52 267.947c7.709 7.648 18.326 12.374 30.047 12.374 0.087 0 0.173-0 0.26-0.001l-0.013 0c0.073 0 0.16 0.001 0.247 0.001 11.721 0 22.338-4.726 30.049-12.377l-0.003 0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003zM384 853.333h-153.173l695.467-695.040c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l-695.040 695.467v-153.173c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 256c0.073 5.873 1.322 11.435 3.52 16.489l-0.107-0.275c4.422 10.46 12.58 18.618 22.76 22.935l0.28 0.105c4.778 2.092 10.34 3.34 16.186 3.413l0.027 0h256c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["shuffle"]},"attrs":[],"properties":{"order":5439,"id":245,"name":"shuffle","prevSize":32,"code":60608},"setIdx":0,"setId":0,"iconIdx":960},{"icon":{"paths":["M813.653 210.347c-77.694-80.363-186.469-130.256-306.896-130.256-235.641 0-426.667 191.025-426.667 426.667 0 120.428 49.893 229.203 130.137 306.781l0.12 0.115c77.694 80.363 186.469 130.256 306.896 130.256 235.641 0 426.667-191.025 426.667-426.667 0-120.428-49.893-229.203-130.137-306.781l-0.12-0.115zM777.813 298.667h-233.387l100.267-100.267c53.238 23.076 97.867 57.168 132.63 99.649l0.49 0.618zM384 196.267c38.255-15.753 82.667-24.899 129.214-24.899 12.647 0 25.136 0.675 37.433 1.991l-1.527-0.133-165.12 165.12zM298.667 246.187v233.387l-100.267-100.267c23.076-53.238 57.168-97.867 99.649-132.63l0.618-0.49zM196.267 640c-15.769-38.196-24.925-82.545-24.925-129.032 0-12.711 0.685-25.263 2.019-37.62l-0.134 1.532 165.12 165.12zM246.187 725.333h233.387l-100.267 100.267c-53.238-23.076-97.867-57.168-132.63-99.649l-0.49-0.618zM640 827.733c-38.216 15.764-82.585 24.916-129.093 24.916-12.69 0-25.221-0.681-37.558-2.010l1.531 0.134 165.12-165.12zM640 564.907l-75.093 75.093h-106.24l-74.667-75.093v-105.813l75.093-75.093h105.813l75.093 75.093zM725.333 778.24v-233.813l100.267 100.267c-23.076 53.238-57.168 97.867-99.649 132.63l-0.618 0.49zM685.653 384h142.080c15.764 38.216 24.916 82.585 24.916 129.093 0 12.69-0.681 25.221-2.010 37.558l0.134-1.531z"],"attrs":[],"grid":0,"tags":["shutter"]},"attrs":[],"properties":{"order":5440,"id":244,"name":"shutter","prevSize":32,"code":60609},"setIdx":0,"setId":0,"iconIdx":961},{"icon":{"paths":["M384 469.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667c-23.564 0-42.667 19.103-42.667 42.667v0c0 23.564 19.103 42.667 42.667 42.667v0zM640 469.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667c-23.564 0-42.667 19.103-42.667 42.667v0c0 23.564 19.103 42.667 42.667 42.667v0zM651.52 605.867c-7.042-5.327-15.947-8.533-25.6-8.533s-18.558 3.206-25.707 8.611l0.107-0.078-31.573 23.467-31.147-23.467c-7.042-5.327-15.947-8.533-25.6-8.533s-18.558 3.206-25.707 8.611l0.107-0.078-31.147 23.467-31.573-23.467c-7.042-5.327-15.947-8.533-25.6-8.533s-18.558 3.206-25.707 8.611l0.107-0.078-56.747 42.667c-10.41 7.867-17.067 20.223-17.067 34.133 0 23.564 19.103 42.667 42.667 42.667 9.653 0 18.558-3.206 25.707-8.611l-0.107 0.078 31.147-23.467 31.573 23.467 5.12 2.56c2.707 1.477 5.844 2.655 9.153 3.371l0.233 0.042h5.12c1.602 0.213 3.453 0.335 5.333 0.335s3.732-0.122 5.548-0.357l-0.214 0.023h4.267c5.529-1.507 10.365-3.849 14.642-6.919l-0.135 0.092 31.147-23.467 31.147 23.467c6.997 5.221 15.815 8.359 25.365 8.359 6.263 0 12.212-1.35 17.57-3.774l-0.269 0.109 4.267-2.133c1.796-0.641 3.35-1.508 4.73-2.588l-0.037 0.028 31.573-23.467 31.147 23.467c7.042 5.327 15.947 8.533 25.6 8.533v0c13.911 0 26.267-6.657 34.056-16.959l0.078-0.107c5.327-7.042 8.533-15.947 8.533-25.6 0-13.911-6.657-26.267-16.959-34.056l-0.107-0.078zM512 85.333c-235.641 0-426.667 191.025-426.667 426.667s191.025 426.667 426.667 426.667c235.641 0 426.667-191.025 426.667-426.667v0c0-235.641-191.025-426.667-426.667-426.667v0zM512 853.333c-188.513 0-341.333-152.82-341.333-341.333s152.82-341.333 341.333-341.333c188.513 0 341.333 152.82 341.333 341.333v0c0 188.513-152.82 341.333-341.333 341.333v0z"],"attrs":[],"grid":0,"tags":["sick"]},"attrs":[],"properties":{"order":5441,"id":243,"name":"sick","prevSize":32,"code":60610},"setIdx":0,"setId":0,"iconIdx":962},{"icon":{"paths":["M682.667 682.667h-238.507l140.8-140.373c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003-140.8-140.373h238.507c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-341.333c-17.632 0.091-32.726 10.863-39.149 26.172l-0.105 0.281c-2.109 4.883-3.336 10.568-3.336 16.539 0 11.682 4.695 22.267 12.3 29.972l-0.004-0.005 183.467 183.040-183.467 183.040c-7.601 7.7-12.296 18.286-12.296 29.968 0 5.971 1.227 11.656 3.442 16.817l-0.106-0.278c6.527 15.59 21.621 26.363 39.242 26.453l0.012 0h341.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["sigma"]},"attrs":[],"properties":{"order":5442,"id":242,"name":"sigma","prevSize":32,"code":60611},"setIdx":0,"setId":0,"iconIdx":963},{"icon":{"paths":["M929.28 506.88l-85.333-106.667c-7.844-9.864-19.821-16.149-33.269-16.213l-0.011-0h-256v-256c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 42.667h-256c-13.459 0.064-25.436 6.35-33.213 16.126l-0.067 0.087-85.333 106.667c-5.728 7.198-9.19 16.421-9.19 26.453s3.462 19.256 9.257 26.541l-0.067-0.087 85.333 106.667c7.844 9.864 19.821 16.149 33.269 16.213l0.011 0h256v384h-85.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h256c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-85.333v-170.667h256c13.459-0.064 25.436-6.35 33.213-16.126l0.067-0.087 85.333-106.667c5.728-7.198 9.19-16.421 9.19-26.453s-3.462-19.256-9.257-26.541l0.067 0.087zM469.333 384h-235.52l-51.2-64 51.2-64h235.52zM790.187 597.333h-235.52v-128h235.52l51.2 64z"],"attrs":[],"grid":0,"tags":["sign-alt"]},"attrs":[],"properties":{"order":5443,"id":241,"name":"sign-alt","prevSize":32,"code":60612},"setIdx":0,"setId":0,"iconIdx":964},{"icon":{"paths":["M874.667 644.267c-5.532-2.808-12.063-4.453-18.978-4.453-16.635 0-31.047 9.52-38.084 23.409l-0.112 0.243c-57.073 113.416-172.551 189.866-305.886 189.866-188.513 0-341.333-152.82-341.333-341.333s152.82-341.333 341.333-341.333c0.138 0 0.276 0 0.414 0l-0.021-0c0.435-0.002 0.95-0.003 1.465-0.003 132.82 0 247.765 76.532 303.143 187.903l0.885 1.967c7.206 14.183 21.688 23.733 38.4 23.733 23.711 0 42.933-19.222 42.933-42.933 0-6.999-1.675-13.606-4.645-19.444l0.113 0.244c-71.439-141.476-215.634-236.8-382.093-236.8-235.641 0-426.667 191.025-426.667 426.667s191.025 426.667 426.667 426.667c166.459 0 310.653-95.324 380.974-234.361l1.119-2.439c2.862-5.578 4.54-12.169 4.54-19.153 0-16.836-9.752-31.395-23.915-38.336l-0.252-0.111zM896 469.333h-409.173l98.133-97.707c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l-170.667 170.667c-3.773 3.937-6.808 8.616-8.859 13.791l-0.101 0.289c-2.024 4.793-3.201 10.366-3.201 16.213s1.176 11.42 3.305 16.495l-0.105-0.281c2.152 5.464 5.187 10.143 8.974 14.095l-0.014-0.015 170.667 170.667c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003-98.133-97.707h409.173c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["sign-in-alt"]},"attrs":[],"properties":{"order":5444,"id":240,"name":"sign-in-alt","prevSize":32,"code":60613},"setIdx":0,"setId":0,"iconIdx":965},{"icon":{"paths":["M682.667 213.333h-128v-85.333c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 85.333h-213.333c-13.459 0.064-25.436 6.35-33.213 16.126l-0.067 0.087-85.333 106.667c-5.728 7.198-9.19 16.421-9.19 26.453s3.462 19.256 9.257 26.541l-0.067-0.087 85.333 106.667c7.844 9.864 19.821 16.149 33.269 16.213l0.011 0h213.333v341.333h-85.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h256c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-85.333v-341.333h128c23.564 0 42.667-19.103 42.667-42.667v0-213.333c0-23.564-19.103-42.667-42.667-42.667v0zM640 426.667h-363.52l-51.2-64 51.2-64h363.52z"],"attrs":[],"grid":0,"tags":["sign-left"]},"attrs":[],"properties":{"order":5445,"id":239,"name":"sign-left","prevSize":32,"code":60614},"setIdx":0,"setId":0,"iconIdx":966},{"icon":{"paths":["M537.173 554.667l-98.133 97.707c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 170.667-170.667c3.773-3.937 6.808-8.616 8.859-13.791l0.101-0.289c2.024-4.793 3.201-10.366 3.201-16.213s-1.176-11.42-3.305-16.495l0.105 0.281c-2.152-5.464-5.187-10.143-8.974-14.095l0.014 0.015-170.667-170.667c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l0 0 98.133 97.707h-409.173c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM512 85.333c-0.566-0.003-1.235-0.004-1.905-0.004-166.461 0-310.657 95.326-380.977 234.365l-1.118 2.439c-2.858 5.594-4.533 12.201-4.533 19.2 0 23.711 19.222 42.933 42.933 42.933 16.712 0 31.194-9.549 38.287-23.489l0.113-0.244c57.074-113.414 172.551-189.864 305.885-189.864 188.513 0 341.333 152.82 341.333 341.333 0 188.051-152.072 340.584-339.947 341.331l-0.071 0c-0.435 0.002-0.95 0.003-1.465 0.003-132.82 0-247.765-76.532-303.143-187.903l-0.885-1.967c-7.206-14.183-21.688-23.733-38.4-23.733-23.711 0-42.933 19.222-42.933 42.933 0 6.999 1.675 13.606 4.645 19.444l-0.113-0.244c71.439 141.476 215.634 236.8 382.093 236.8 235.641 0 426.667-191.025 426.667-426.667 0-235.571-190.911-426.552-426.455-426.667l-0.011-0z"],"attrs":[],"grid":0,"tags":["sign-out-alt"]},"attrs":[],"properties":{"order":5446,"id":238,"name":"sign-out-alt","prevSize":32,"code":60615},"setIdx":0,"setId":0,"iconIdx":967},{"icon":{"paths":["M298.667 256v213.333c0 23.564 19.103 42.667 42.667 42.667v0h128v341.333h-85.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h256c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-85.333v-341.333h213.333c0.043 0 0.094 0 0.145 0 13.34 0 25.25-6.122 33.074-15.71l0.061-0.077 85.333-106.667c5.831-7.235 9.36-16.539 9.36-26.667s-3.529-19.432-9.424-26.749l0.064 0.082-85.333-106.667c-7.844-9.864-19.821-16.149-33.269-16.213l-0.011-0h-213.333v-85.333c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 85.333h-128c-23.564 0-42.667 19.103-42.667 42.667v0zM384 298.667h363.52l51.2 64-51.2 64h-363.52z"],"attrs":[],"grid":0,"tags":["sign-right"]},"attrs":[],"properties":{"order":5447,"id":237,"name":"sign-right","prevSize":32,"code":60616},"setIdx":0,"setId":0,"iconIdx":968},{"icon":{"paths":["M426.667 597.333c-23.564 0-42.667 19.103-42.667 42.667v0 256c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-256c0-23.564-19.103-42.667-42.667-42.667v0zM213.333 768c-23.564 0-42.667 19.103-42.667 42.667v0 85.333c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-85.333c0-23.564-19.103-42.667-42.667-42.667v0zM853.333 85.333c-23.564 0-42.667 19.103-42.667 42.667v0 768c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-768c0-23.564-19.103-42.667-42.667-42.667v0zM640 384c-23.564 0-42.667 19.103-42.667 42.667v0 469.333c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-469.333c0-23.564-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["signal-alt"]},"attrs":[],"properties":{"order":5448,"id":236,"name":"signal-alt","prevSize":32,"code":60617},"setIdx":0,"setId":0,"iconIdx":969},{"icon":{"paths":["M256 640c-23.564 0-42.667 19.103-42.667 42.667v0 128c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-128c0-23.564-19.103-42.667-42.667-42.667v0zM426.667 512c-23.564 0-42.667 19.103-42.667 42.667v0 256c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-256c0-23.564-19.103-42.667-42.667-42.667v0zM768 170.667c-23.564 0-42.667 19.103-42.667 42.667v0 597.333c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-597.333c0-23.564-19.103-42.667-42.667-42.667v0zM597.333 341.333c-23.564 0-42.667 19.103-42.667 42.667v0 426.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-426.667c0-23.564-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["signal"]},"attrs":[],"properties":{"order":5449,"id":235,"name":"signal","prevSize":32,"code":60618},"setIdx":0,"setId":0,"iconIdx":970},{"icon":{"paths":["M853.333 512c0-23.564-19.103-42.667-42.667-42.667v0h-323.84l98.133-97.707c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l-170.667 170.667c-3.773 3.937-6.808 8.616-8.859 13.791l-0.101 0.289c-2.024 4.793-3.201 10.366-3.201 16.213s1.176 11.42 3.305 16.495l-0.105-0.281c2.152 5.464 5.187 10.143 8.974 14.095l-0.014-0.015 170.667 170.667c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003-98.133-97.707h323.84c23.564 0 42.667-19.103 42.667-42.667v0zM725.333 85.333h-426.667c-70.692 0-128 57.308-128 128v0 597.333c0 70.692 57.308 128 128 128v0h426.667c70.692 0 128-57.308 128-128v0-128c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 128c0 23.564-19.103 42.667-42.667 42.667v0h-426.667c-23.564 0-42.667-19.103-42.667-42.667v0-597.333c0-23.564 19.103-42.667 42.667-42.667v0h426.667c23.564 0 42.667 19.103 42.667 42.667v0 128c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-128c0-70.692-57.308-128-128-128v0z"],"attrs":[],"grid":0,"tags":["signin"]},"attrs":[],"properties":{"order":5450,"id":234,"name":"signin","prevSize":32,"code":60619},"setIdx":0,"setId":0,"iconIdx":971},{"icon":{"paths":["M170.667 512c0 23.564 19.103 42.667 42.667 42.667v0h323.84l-98.133 97.707c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 170.667-170.667c3.773-3.937 6.808-8.616 8.859-13.791l0.101-0.289c2.024-4.793 3.201-10.366 3.201-16.213s-1.176-11.42-3.305-16.495l0.105 0.281c-2.152-5.464-5.187-10.143-8.974-14.095l0.014 0.015-170.667-170.667c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l0 0 98.133 97.707h-323.84c-23.564 0-42.667 19.103-42.667 42.667v0zM725.333 85.333h-426.667c-70.692 0-128 57.308-128 128v0 128c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-128c0-23.564 19.103-42.667 42.667-42.667v0h426.667c23.564 0 42.667 19.103 42.667 42.667v0 597.333c0 23.564-19.103 42.667-42.667 42.667v0h-426.667c-23.564 0-42.667-19.103-42.667-42.667v0-128c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 128c0 70.692 57.308 128 128 128v0h426.667c70.692 0 128-57.308 128-128v0-597.333c0-70.692-57.308-128-128-128v0z"],"attrs":[],"grid":0,"tags":["signout"]},"attrs":[],"properties":{"order":5451,"id":233,"name":"signout","prevSize":32,"code":60620},"setIdx":0,"setId":0,"iconIdx":972},{"icon":{"paths":["M384 469.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667c-23.564 0-42.667 19.103-42.667 42.667v0c0 23.564 19.103 42.667 42.667 42.667v0zM640 469.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667c-23.564 0-42.667 19.103-42.667 42.667v0c0 23.564 19.103 42.667 42.667 42.667v0zM682.667 597.333c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0h-42.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0h-42.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0h42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0h42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM512 85.333c-235.641 0-426.667 191.025-426.667 426.667s191.025 426.667 426.667 426.667c235.641 0 426.667-191.025 426.667-426.667v0c0-235.641-191.025-426.667-426.667-426.667v0zM512 853.333c-188.513 0-341.333-152.82-341.333-341.333s152.82-341.333 341.333-341.333c188.513 0 341.333 152.82 341.333 341.333v0c0 188.513-152.82 341.333-341.333 341.333v0z"],"attrs":[],"grid":0,"tags":["silence"]},"attrs":[],"properties":{"order":5452,"id":232,"name":"silence","prevSize":32,"code":60621},"setIdx":0,"setId":0,"iconIdx":973},{"icon":{"paths":["M597.333 384h-170.667c-23.564 0-42.667 19.103-42.667 42.667v0 512c0 23.564 19.103 42.667 42.667 42.667v0h170.667c23.564 0 42.667-19.103 42.667-42.667v0-512c0-23.564-19.103-42.667-42.667-42.667v0zM554.667 896h-85.333v-426.667h85.333zM938.667 42.667h-170.667c-23.564 0-42.667 19.103-42.667 42.667v0 853.333c0 23.564 19.103 42.667 42.667 42.667v0h170.667c23.564 0 42.667-19.103 42.667-42.667v0-853.333c0-23.564-19.103-42.667-42.667-42.667v0zM896 896h-85.333v-768h85.333zM256 640h-170.667c-23.564 0-42.667 19.103-42.667 42.667v0 256c0 23.564 19.103 42.667 42.667 42.667v0h170.667c23.564 0 42.667-19.103 42.667-42.667v0-256c0-23.564-19.103-42.667-42.667-42.667v0zM213.333 896h-85.333v-170.667h85.333z"],"attrs":[],"grid":0,"tags":["signal-alt-3"]},"attrs":[],"properties":{"order":5453,"id":231,"name":"signal-alt-3","prevSize":32,"code":60622},"setIdx":0,"setId":0,"iconIdx":974},{"icon":{"paths":["M326.827 520.96c7.709 7.648 18.326 12.374 30.047 12.374 0.087 0 0.173-0 0.26-0.001l-0.013 0c0.073 0 0.16 0.001 0.247 0.001 11.721 0 22.338-4.726 30.049-12.377l-0.003 0.003 64-64c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003-64-64c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l-0-0 34.133 33.707-34.133 33.707c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003zM646.827 520.96c7.709 7.648 18.326 12.374 30.047 12.374 0.087 0 0.173-0 0.26-0.001l-0.013 0c0.073 0 0.16 0.001 0.247 0.001 11.721 0 22.338-4.726 30.049-12.377l-0.003 0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003-33.707-33.707 33.707-33.707c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l-64 64c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003zM651.52 606.293c-7.042-5.327-15.947-8.533-25.6-8.533s-18.558 3.206-25.707 8.611l0.107-0.078-31.573 23.467-31.147-23.467c-7.042-5.327-15.947-8.533-25.6-8.533s-18.558 3.206-25.707 8.611l0.107-0.078-31.147 23.467-31.573-23.467c-7.042-5.327-15.947-8.533-25.6-8.533s-18.558 3.206-25.707 8.611l0.107-0.078-56.747 42.667c-10.41 7.867-17.067 20.223-17.067 34.133 0 23.564 19.103 42.667 42.667 42.667 9.653 0 18.558-3.206 25.707-8.611l-0.107 0.078 31.147-23.467 31.573 23.467c1.466 0.943 3.153 1.804 4.925 2.493l0.195 0.067c2.707 1.477 5.844 2.655 9.153 3.371l0.233 0.042h20.48c5.368-1.61 10.047-3.94 14.225-6.925l-0.145 0.099 31.147-23.467 31.147 23.467c6.997 5.221 15.815 8.359 25.365 8.359 6.263 0 12.212-1.35 17.57-3.774l-0.269 0.109 4.267-2.133c1.796-0.641 3.35-1.508 4.73-2.588l-0.037 0.028 31.573-23.467 31.147 23.467c7.042 5.327 15.947 8.533 25.6 8.533l0-0c13.911 0 26.267-6.657 34.056-16.959l0.078-0.107c5.327-7.042 8.533-15.947 8.533-25.6 0-13.911-6.657-26.267-16.959-34.056l-0.107-0.078zM512 85.333c-235.641 0-426.667 191.025-426.667 426.667s191.025 426.667 426.667 426.667c235.641 0 426.667-191.025 426.667-426.667v0c0-235.641-191.025-426.667-426.667-426.667v0zM512 853.333c-188.513 0-341.333-152.82-341.333-341.333s152.82-341.333 341.333-341.333c188.513 0 341.333 152.82 341.333 341.333v0c0 188.513-152.82 341.333-341.333 341.333v0z"],"attrs":[],"grid":0,"tags":["silent-squint"]},"attrs":[],"properties":{"order":5454,"id":230,"name":"silent-squint","prevSize":32,"code":60623},"setIdx":0,"setId":0,"iconIdx":975},{"icon":{"paths":["M725.333 149.333h-426.667c-82.475 0-149.333 66.859-149.333 149.333v0 426.667c0 82.475 66.859 149.333 149.333 149.333v0h426.667c82.475 0 149.333-66.859 149.333-149.333v0-426.667c0-82.475-66.859-149.333-149.333-149.333v0zM448 234.667h128v128h-128zM362.667 789.333h-64c-35.346 0-64-28.654-64-64v0-64h128zM576 789.333h-128v-128h128zM789.333 725.333c0 35.346-28.654 64-64 64v0h-64v-128h128zM789.333 576h-554.667v-277.333c0-35.346 28.654-64 64-64v0h64v170.667c0 23.564 19.103 42.667 42.667 42.667v0h384zM789.333 362.667h-128v-128h64c35.346 0 64 28.654 64 64v0z"],"attrs":[],"grid":0,"tags":["sim-card"]},"attrs":[],"properties":{"order":5455,"id":229,"name":"sim-card","prevSize":32,"code":60624},"setIdx":0,"setId":0,"iconIdx":976},{"icon":{"paths":["M213.333 128c-70.692 0-128 57.308-128 128v0 512c0 70.692 57.308 128 128 128s128-57.308 128-128v0-512c0-70.692-57.308-128-128-128v0zM256 768c0 23.564-19.103 42.667-42.667 42.667s-42.667-19.103-42.667-42.667v0-512c0-23.564 19.103-42.667 42.667-42.667s42.667 19.103 42.667 42.667v0zM882.347 411.733l-285.013-170.24c-16.114-9.652-35.55-15.36-56.32-15.36s-40.206 5.708-56.826 15.64l0.506-0.28c-34.627 20.451-57.592 57.416-58.026 99.778l-0.001 0.062v341.333c-0 0.090-0 0.196-0 0.302 0 43.044 23.263 80.655 57.902 100.946l0.552 0.299c16.081 9.78 35.524 15.569 56.32 15.569s40.239-5.789 56.807-15.843l-0.487 0.275 284.587-170.667c34.039-20.944 56.393-57.995 56.393-100.267s-22.354-79.322-55.886-99.976l-0.507-0.291zM839.68 539.733l-284.16 170.667c-3.834 2.348-8.474 3.739-13.44 3.739s-9.606-1.391-13.554-3.804l0.114 0.065c-9.962-5.216-16.643-15.48-16.643-27.305 0-0.151 0.001-0.301 0.003-0.451l-0 0.023v-341.333c-0.005-0.208-0.008-0.452-0.008-0.698 0-11.314 6.116-21.199 15.223-26.53l0.145-0.079c3.812-2.148 8.368-3.413 13.22-3.413 0.002 0 0.005 0 0.007 0l-0-0c5.048 0.037 9.756 1.461 13.772 3.907l-0.119-0.067 284.16 170.667c9.041 5.855 14.939 15.892 14.939 27.307s-5.898 21.451-14.812 27.23l-0.126 0.077z"],"attrs":[],"grid":0,"tags":["skip-forward-alt"]},"attrs":[],"properties":{"order":5456,"id":228,"name":"skip-forward-alt","prevSize":32,"code":60625},"setIdx":0,"setId":0,"iconIdx":977},{"icon":{"paths":["M938.667 640h-85.333v-128c0-23.564-19.103-42.667-42.667-42.667v0h-256v-85.333h85.333c23.564 0 42.667-19.103 42.667-42.667v0-256c0-23.564-19.103-42.667-42.667-42.667v0h-256c-23.564 0-42.667 19.103-42.667 42.667v0 256c0 23.564 19.103 42.667 42.667 42.667v0h85.333v85.333h-256c-23.564 0-42.667 19.103-42.667 42.667v0 128h-85.333c-23.564 0-42.667 19.103-42.667 42.667v0 256c0 23.564 19.103 42.667 42.667 42.667v0h256c23.564 0 42.667-19.103 42.667-42.667v0-256c0-23.564-19.103-42.667-42.667-42.667v0h-85.333v-85.333h512v85.333h-85.333c-23.564 0-42.667 19.103-42.667 42.667v0 256c0 23.564 19.103 42.667 42.667 42.667v0h256c23.564 0 42.667-19.103 42.667-42.667v0-256c0-23.564-19.103-42.667-42.667-42.667v0zM298.667 725.333v170.667h-170.667v-170.667zM426.667 298.667v-170.667h170.667v170.667zM896 896h-170.667v-170.667h170.667z"],"attrs":[],"grid":0,"tags":["sitemap"]},"attrs":[],"properties":{"order":5457,"id":227,"name":"sitemap","prevSize":32,"code":60626},"setIdx":0,"setId":0,"iconIdx":978},{"icon":{"paths":["M645.937 504c-15.845-10.332-34.116-18.94-53.549-24.888l-1.534-0.404c-11.937-3.61-25.153-7.141-38.844-10.544-11.909-3.32-26.083-6.727-43.614-10.581-23.737-5.024-44.237-11.255-63.965-19.018l2.696 0.935c-10.542-4.172-19.382-10.702-26.182-18.972l-0.088-0.111c-4.318-5.862-6.911-13.227-6.911-21.197 0-1.031 0.043-2.051 0.128-3.060l-0.009 0.132c-0-0.031-0-0.067-0-0.104 0-9.6 3.278-18.434 8.776-25.444l-0.068 0.090c7.825-9.139 17.901-16.133 29.376-20.146l0.478-0.146c16.578-5.884 35.698-9.285 55.613-9.285 1.806 0 3.605 0.028 5.397 0.083l-0.262-0.006c0.77-0.013 1.679-0.021 2.589-0.021 15.879 0 31.224 2.29 45.721 6.559l-1.143-0.289c10.805 3.078 20.235 7.773 28.56 13.882l-0.248-0.174c5.535 3.977 10.155 8.836 13.749 14.417l0.126 0.208c7.332 13.53 21.424 22.563 37.626 22.563 23.557 0 42.654-19.097 42.654-42.654 0-7.449-1.91-14.452-5.266-20.547l0.111 0.22c-9.275-16.207-21.229-29.802-35.405-40.637l-0.324-0.238c-15.984-12.382-34.726-22.148-55.059-28.231l-1.21-0.311c-20.888-6.408-44.899-10.098-69.772-10.098-0.952 0-1.903 0.005-2.853 0.016l0.144-0.001c-1.609-0.037-3.505-0.057-5.406-0.057-30.888 0-60.49 5.504-87.879 15.584l1.765-0.568c-27.251 10.072-50.032 26.842-67.094 48.353l-0.24 0.314c-16.085 21.045-25.777 47.723-25.792 76.664l-0 0.003c-0.024 0.904-0.038 1.969-0.038 3.037 0 27.734 9.32 53.291 25 73.709l-0.212-0.287c15.992 20.024 36.648 35.667 60.359 45.388l0.996 0.361c14.973 6.032 33.577 11.997 52.661 16.749l3.107 0.655c0.357 0.117 0.597 0.404 0.961 0.512 8.166 2.458 21.229 5.75 40.104 9.833 7.354 1.579 14.284 3.323 21.211 5.055 0.672 0.201 1.643 0.412 2.289 0.612l0.771 0.117c10.596 2.701 20.781 5.492 30.104 8.341 12.398 3.674 23.21 8.669 33.104 14.977l-0.521-0.311c6.331 4.030 11.52 9.298 15.339 15.5l0.119 0.208c3.236 6.53 5.129 14.218 5.129 22.349 0 0.918-0.024 1.831-0.072 2.737l0.005-0.127c0.045 0.785 0.070 1.703 0.070 2.627 0 10.743-3.447 20.68-9.294 28.767l0.099-0.144c-8.714 11.256-20.327 19.876-33.728 24.792l-0.522 0.168c-17.254 6.857-37.247 10.833-58.169 10.833-1.846 0-3.684-0.031-5.515-0.092l0.266 0.007c-1.817 0.075-3.95 0.118-6.092 0.118-24.177 0-47.080-5.452-67.547-15.193l0.952 0.408c-10.642-5.745-19.448-13.612-26.112-23.094l-0.159-0.239c-4.576-5.955-7.664-13.276-8.585-21.257l-0.019-0.201c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0c0.772 26.347 9.553 50.5 23.978 70.274l-0.248-0.357c14.821 21.172 34.026 38.271 56.387 50.245l0.863 0.422c30.714 15.33 66.907 24.302 105.196 24.302 2.363 0 4.718-0.034 7.065-0.102l-0.344 0.008c1.744 0.045 3.798 0.070 5.858 0.070 32.529 0 63.568-6.377 91.936-17.949l-1.627 0.587c29.055-11.343 53.152-30.049 70.735-53.859l0.305-0.433c15.608-21.654 24.963-48.719 24.963-77.968 0-1.491-0.024-2.976-0.073-4.456l0.006 0.216c0.013-0.687 0.020-1.497 0.020-2.31 0-23.087-5.936-44.788-16.364-63.661l0.344 0.678c-10.743-18.249-25.029-33.301-42.023-44.606l-0.496-0.31zM954.083 584.167c3.765-21.807 5.917-46.922 5.917-72.539 0-247.218-200.41-447.628-447.628-447.628-25.618 0-50.732 2.152-75.174 6.285l2.634-0.368c-35.055-17.196-76.292-27.252-119.878-27.252-153.143 0-277.291 124.147-277.291 277.291 0 43.586 10.056 84.823 27.975 121.518l-0.723-1.64c-3.765 21.807-5.917 46.922-5.917 72.539 0 247.218 200.41 447.628 447.628 447.628 25.618 0 50.732-2.152 75.174-6.285l-2.634 0.368c35.055 17.196 76.292 27.252 119.878 27.252 153.143 0 277.291-124.147 277.291-277.291 0-43.586-10.056-84.823-27.975-121.518l0.723 1.64zM704 896c-33.959-0.014-65.856-8.83-93.537-24.292l0.975 0.5c-5.969-3.356-13.103-5.333-20.698-5.333-2.9 0-5.733 0.288-8.472 0.838l0.274-0.046c-21.309 4.451-45.796 7-70.878 7-200.11 0-362.33-162.221-362.33-362.33 0-0.118 0-0.237 0-0.355l-0 0.018c0.048-25.004 2.594-49.384 7.402-72.941l-0.402 2.358c0.506-2.469 0.795-5.307 0.795-8.212 0-7.581-1.97-14.701-5.427-20.877l0.111 0.216c-14.974-26.706-23.794-58.608-23.794-92.571 0-106.024 85.95-191.974 191.974-191.974 33.962 0 65.864 8.819 93.541 24.292l-0.972-0.499c5.958 3.362 13.082 5.343 20.669 5.343 2.911 0 5.754-0.292 8.501-0.847l-0.274 0.046c21.309-4.451 45.796-7 70.878-7 200.11 0 362.33 162.221 362.33 362.33 0 0.118-0 0.237-0 0.355l0-0.018c-0.048 25.004-2.594 49.384-7.402 72.941l0.402-2.358c-0.505 2.469-0.795 5.306-0.795 8.211 0 7.582 1.971 14.704 5.429 20.88l-0.111-0.216c14.986 26.712 23.813 58.624 23.813 92.598 0 106.008-85.936 191.944-191.944 191.944-0.020 0-0.041-0-0.061-0l0.003 0z"],"attrs":[],"grid":0,"tags":["skype-alt"]},"attrs":[],"properties":{"order":5458,"id":226,"name":"skype-alt","prevSize":32,"code":60627},"setIdx":0,"setId":0,"iconIdx":979},{"icon":{"paths":["M914.539 603.969c5.739-25.686 9.027-55.188 9.027-85.457 0-0.351-0-0.702-0.001-1.053l0 0.054c-1.302-222.317-181.826-402.038-404.325-402.038-0.959 0-1.917 0.003-2.874 0.010l0.147-0.001c-0.297-0.001-0.648-0.001-1-0.001-24.15 0-47.786 2.201-70.719 6.415l2.387-0.364c-35.636-22.713-79.071-36.201-125.657-36.201-129.397 0-234.491 104.058-236.164 233.058l-0.002 0.158c0.029 43.371 11.973 83.945 32.736 118.635l-0.585-1.055c-4.975 24.106-7.899 51.869-8.049 80.287l-0 0.119c1.904 218.612 179.565 395.096 398.445 395.096 3.026 0 6.045-0.034 9.055-0.101l-0.448 0.008c0.812 0.007 1.771 0.010 2.732 0.010 25.346 0 50.090-2.58 73.983-7.491l-2.36 0.405c31.873 19.631 70.074 32.075 111.007 34.18l0.577 0.024c1.305 0.026 2.844 0.042 4.387 0.042 128.024 0 231.808-103.784 231.808-231.808 0-37.499-8.904-72.919-24.713-104.26l0.607 1.328zM701.425 682.372c-17.553 23.354-41.052 41.358-68.271 51.895l-1.058 0.36c-29.627 12.135-64.011 19.18-100.040 19.18-2.635 0-5.262-0.038-7.879-0.113l0.385 0.009c-2.564 0.089-5.576 0.139-8.6 0.139-41.834 0-81.406-9.684-116.596-26.934l1.564 0.692c-22.854-12.335-41.741-29.287-55.961-49.73l-0.344-0.522c-12.351-16.732-20.112-37.526-21.070-60.080l-0.008-0.225c-0.004-0.204-0.006-0.446-0.006-0.687 0-11.37 5.052-21.561 13.034-28.449l0.048-0.041c8.228-7.497 19.217-12.089 31.279-12.089 0.65 0 1.297 0.013 1.941 0.040l-0.092-0.003c0.496-0.022 1.078-0.034 1.662-0.034 9.715 0 18.627 3.439 25.586 9.165l-0.070-0.056c8.198 7.661 14.684 17.046 18.894 27.586l0.182 0.516c5.564 14.234 12.682 26.53 21.362 37.537l-0.234-0.308c8.048 10.488 18.534 18.718 30.631 23.912l0.497 0.19c14.742 6.381 31.909 10.093 49.943 10.093 1.173 0 2.342-0.016 3.508-0.047l-0.172 0.004c2.035 0.119 4.416 0.186 6.812 0.186 24.69 0 47.704-7.178 67.068-19.561l-0.5 0.299c16.731-9.908 27.846-27.749 28.151-48.209l0.001-0.043c0.027-0.604 0.042-1.313 0.042-2.025 0-13.831-5.798-26.308-15.096-35.132l-0.021-0.020c-10.718-10.165-23.909-17.829-38.572-21.994l-0.657-0.16c-16.049-5.024-38.203-10.049-65.328-16.049-35.454-7.574-66.039-16.918-95.479-28.535l4.046 1.407c-23.44-9.551-43.058-24.326-58.092-42.954l-0.213-0.273c-13.232-17.445-21.196-39.518-21.196-63.452 0-1.364 0.026-2.722 0.077-4.074l-0.006 0.195c-0-0.039-0-0.085-0-0.13 0-25.785 8.698-49.537 23.321-68.484l-0.193 0.261c16.832-20.857 38.94-36.818 64.313-45.932l1.016-0.318c28.1-10.228 60.537-16.143 94.355-16.143 2.523 0 5.039 0.033 7.546 0.098l-0.37-0.008c1.040-0.014 2.268-0.022 3.498-0.022 27.411 0 53.879 4.037 78.842 11.549l-1.934-0.5c21.512 6.341 40.243 15.972 56.681 28.464l-0.429-0.312c13.413 10.070 24.502 22.433 32.863 36.597l0.317 0.58c6.185 10.688 9.895 23.484 10.049 37.134l0 0.045c0 0.034 0 0.073 0 0.113 0 11.848-5.021 22.524-13.051 30.016l-0.024 0.022c-7.716 8.080-18.574 13.104-30.605 13.104-0.545 0-1.087-0.010-1.627-0.031l0.078 0.002c-0.733 0.046-1.59 0.072-2.453 0.072-9.289 0-17.865-3.049-24.783-8.201l0.11 0.079c-7.927-7.424-14.623-16.034-19.836-25.571l-0.266-0.531c-8.304-16.336-19.462-30.067-32.948-41.049l-0.229-0.18c-15.259-9.685-33.844-15.435-53.772-15.435-3.004 0-5.977 0.131-8.914 0.386l0.381-0.027c-1.603-0.080-3.481-0.125-5.369-0.125-21.77 0-42.13 6.032-59.502 16.516l0.517-0.29c-13.851 7.559-23.28 21.693-24.097 38.095l-0.004 0.108c0.058 9.085 3.072 17.454 8.126 24.208l-0.076-0.107c6.157 7.348 13.905 13.155 22.732 16.925l0.395 0.15c8.387 4.675 18.1 8.483 28.344 10.919l0.781 0.157c10.052 3.026 26.155 7.026 49.229 12.052 28.151 6.049 54.304 13.076 77.429 20.099 22.562 6.785 42.229 16.021 60.182 27.675l-0.9-0.548c15.688 10.411 28.516 23.88 37.891 39.642l0.309 0.561c8.87 16.386 14.084 35.872 14.084 56.576 0 0.968-0.011 1.933-0.034 2.895l0.003-0.143c0.073 1.588 0.115 3.45 0.115 5.321 0 27.057-8.714 52.079-23.488 72.413l0.246-0.355z"],"attrs":[],"grid":0,"tags":["skype"]},"attrs":[],"properties":{"order":5459,"id":225,"name":"skype","prevSize":32,"code":60628},"setIdx":0,"setId":0,"iconIdx":980},{"icon":{"paths":["M810.667 128c-70.692 0-128 57.308-128 128v0 121.173l-384-229.12c-20.048-12.157-44.277-19.351-70.187-19.351s-50.139 7.194-70.799 19.695l0.612-0.344c-43.889 25.284-72.961 71.938-72.961 125.382 0 0.171 0 0.341 0.001 0.511l-0-0.026v476.16c-0.012 0.704-0.019 1.534-0.019 2.366 0 53.624 29.268 100.412 72.7 125.261l0.706 0.372c19.575 11.272 43.047 17.921 68.072 17.921 0.219 0 0.437-0.001 0.655-0.002l-0.034 0c26.347-0.182 50.92-7.616 71.869-20.402l-0.615 0.349 384-229.12v121.173c0 70.692 57.308 128 128 128s128-57.308 128-128v0-512c0-70.692-57.308-128-128-128v0zM653.653 564.48l-397.653 238.080c-7.778 4.812-17.209 7.664-27.307 7.664s-19.529-2.852-27.533-7.794l0.226 0.13c-18.459-10.402-30.721-29.876-30.721-52.214 0-0.093 0-0.187 0.001-0.28l-0 0.014v-476.16c-0.010-0.402-0.015-0.875-0.015-1.35 0-22.172 12.080-41.523 30.018-51.829l0.291-0.154c7.6-4.422 16.698-7.095 26.407-7.253l0.046-0.001c0.167-0.002 0.364-0.003 0.561-0.003 10.395 0 20.084 3.022 28.236 8.236l397.869 237.954c17.592 11.112 29.105 30.451 29.105 52.48s-11.513 41.368-28.851 52.33l-0.254 0.15zM853.333 768c0 23.564-19.103 42.667-42.667 42.667s-42.667-19.103-42.667-42.667v0-512c0-23.564 19.103-42.667 42.667-42.667s42.667 19.103 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["skip-forward"]},"attrs":[],"properties":{"order":5460,"id":224,"name":"skip-forward","prevSize":32,"code":60629},"setIdx":0,"setId":0,"iconIdx":981},{"icon":{"paths":["M661.333 298.667c-23.564 0-42.667 19.103-42.667 42.667v0 72.107l-170.667-98.56c-12.239-7.188-26.957-11.433-42.667-11.433-47.098 0-85.283 38.155-85.333 85.241l-0 0.005v246.613c0.033 31.385 17.005 58.799 42.264 73.595l0.403 0.218c12.239 7.187 26.957 11.432 42.667 11.432s30.427-4.245 43.069-11.651l-0.403 0.218 170.667-98.56v72.107c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-341.333c0-23.564-19.103-42.667-42.667-42.667v0zM618.667 512l-213.333 123.307v-246.613l213.333 122.88zM512 85.333c-235.641 0-426.667 191.025-426.667 426.667s191.025 426.667 426.667 426.667c235.641 0 426.667-191.025 426.667-426.667v0c0-235.641-191.025-426.667-426.667-426.667v0zM512 853.333c-188.513 0-341.333-152.82-341.333-341.333s152.82-341.333 341.333-341.333c188.513 0 341.333 152.82 341.333 341.333v0c0 188.513-152.82 341.333-341.333 341.333v0z"],"attrs":[],"grid":0,"tags":["skip-forward-circle"]},"attrs":[],"properties":{"order":5461,"id":223,"name":"skip-forward-circle","prevSize":32,"code":60630},"setIdx":0,"setId":0,"iconIdx":982},{"icon":{"paths":["M938.667 469.333c-0.087-1.022-0.137-2.212-0.137-3.413s0.050-2.391 0.147-3.567l-0.010 0.154c0-11.947-3.413-23.893-5.547-35.84v0c-8.617-38.404-21.4-72.3-38.187-103.736l1.067 2.189c-58.471-117.734-166.422-203.381-295.897-230.344l-2.769-0.482-35.84-5.547h-22.613l-26.88-3.413c-14.507 0-29.013 0-42.667 0h-6.827l-35.84 8.533c-167.593 35.252-297.336 165.138-331.887 330.024l-0.487 2.776c-2.133 11.947-3.84 23.893-5.547 35.84 0.087 1.022 0.137 2.212 0.137 3.413s-0.050 2.391-0.147 3.567l0.010-0.154c0 14.080 0 28.587 0 42.667s0 29.013 0 42.667c0.087 1.022 0.137 2.212 0.137 3.413s-0.050 2.391-0.147 3.567l0.010-0.154c0 11.947 3.413 23.893 5.547 35.84v0c7.431 38.252 19.101 72.254 34.771 103.925l-1.064-2.378c58.471 117.734 166.422 203.381 295.897 230.344l2.769 0.482 35.84 5.547 6.827 3.413h20.48c7.68 0 14.933 0 22.613 0 14.507 0 29.013 0 42.667-2.133h6.827l35.413-6.4c167.593-35.252 297.336-165.138 331.887-330.024l0.487-2.776c2.133-11.947 3.84-23.893 5.547-35.84 1.045-2.637 2.191-4.884 3.518-7.006l-0.104 0.179c0-14.080 2.133-28.587 2.133-42.667s-2.133-29.013-2.133-42.667zM561.493 174.933l21.333 2.987c79.539 17.379 147.009 60.525 194.898 120.084l0.515 0.663h-290.987zM444.587 178.347v0l17.067-2.56-146.773 250.88-71.68-124.587c48.864-62.232 117.835-106.725 197.010-123.756l2.244-0.404zM195.84 640c-6.955-16.446-13.128-35.991-17.511-56.203l-0.409-2.25c0-9.387-3.413-19.2-4.267-29.013-0.098-0.769-0.154-1.658-0.154-2.56s0.056-1.791 0.165-2.664l-0.011 0.104c-1.087-10.363-1.707-22.389-1.707-34.56s0.62-24.197 1.83-36.048l-0.123 1.488c-0.098-0.769-0.154-1.658-0.154-2.56s0.056-1.791 0.165-2.664l-0.011 0.104c0-9.813 2.56-19.627 4.267-29.013v0c4.274-21.458 9.873-40.181 16.997-58.133l-0.784 2.239 147.2 251.733zM464.64 849.493l-21.333-2.987c-80.412-17.020-148.693-60.406-197.031-120.511l-0.515-0.662h290.987zM438.187 640l-73.813-128 73.813-128h147.627l73.813 128-73.813 128zM581.547 846.080v0l-17.067 2.56 144.64-251.307 71.68 124.587c-48.864 62.232-117.835 106.725-197.010 123.756l-2.244 0.404zM851.627 547.413c0.098 0.769 0.154 1.658 0.154 2.56s-0.056 1.791-0.165 2.664l0.011-0.104c0 9.813-2.56 19.627-4.267 29.013v0c-4.396 20.887-9.984 39.015-17.006 56.409l0.793-2.223-148.48-251.733h143.787c6.955 16.446 13.128 35.991 17.511 56.203l0.409 2.25c0 9.387 3.413 19.2 4.267 29.013 0.098 0.769 0.154 1.658 0.154 2.56s-0.056 1.791-0.165 2.664l0.011-0.104c1.087 10.363 1.707 22.389 1.707 34.56s-0.62 24.197-1.83 36.048l0.123-1.488z"],"attrs":[],"grid":0,"tags":["shutter-alt"]},"attrs":[],"properties":{"order":5462,"id":222,"name":"shutter-alt","prevSize":32,"code":60631},"setIdx":0,"setId":0,"iconIdx":983},{"icon":{"paths":["M298.667 256h-42.667v-128c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 128h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h170.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM213.333 426.667c-23.564 0-42.667 19.103-42.667 42.667v0 426.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-426.667c0-23.564-19.103-42.667-42.667-42.667v0zM512 768c-23.564 0-42.667 19.103-42.667 42.667v0 85.333c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-85.333c0-23.564-19.103-42.667-42.667-42.667v0zM896 426.667h-42.667v-298.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 298.667h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h170.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM810.667 597.333c-23.564 0-42.667 19.103-42.667 42.667v0 256c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-256c0-23.564-19.103-42.667-42.667-42.667v0zM597.333 597.333h-42.667v-469.333c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 469.333h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h170.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["sliders-v"]},"attrs":[],"properties":{"order":5463,"id":221,"name":"sliders-v","prevSize":32,"code":60632},"setIdx":0,"setId":0,"iconIdx":984},{"icon":{"paths":["M896 469.333h-50.529c-17.85-50.109-64.88-85.334-120.138-85.334s-102.288 35.225-119.861 84.445l-0.277 0.889h-186.391c-17.85-50.109-64.88-85.334-120.138-85.334s-102.288 35.225-119.861 84.445l-0.277 0.889h-50.529c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h50.531c17.848 50.11 64.878 85.337 120.137 85.337s102.288-35.227 119.86-84.448l0.277-0.889h186.394c17.848 50.11 64.878 85.337 120.137 85.337s102.288-35.227 119.86-84.448l0.277-0.889h50.529c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM298.667 554.667c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667c23.564 0 42.667 19.103 42.667 42.667v0c-0.032 23.551-19.115 42.635-42.664 42.667l-0.003 0zM725.333 554.667c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667c23.564 0 42.667 19.103 42.667 42.667v0c-0.032 23.551-19.115 42.635-42.664 42.667l-0.003 0z"],"attrs":[],"grid":0,"tags":["slider-h-range"]},"attrs":[],"properties":{"order":5464,"id":220,"name":"slider-h-range","prevSize":32,"code":60633},"setIdx":0,"setId":0,"iconIdx":985},{"icon":{"paths":["M896 469.333h-135.862c-17.85-50.109-64.88-85.334-120.138-85.334s-102.288 35.225-119.861 84.445l-0.277 0.889h-391.862c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h391.865c17.848 50.11 64.878 85.337 120.137 85.337s102.288-35.227 119.86-84.448l0.277-0.889h135.862c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM640 554.667c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667c23.564 0 42.667 19.103 42.667 42.667v0c-0.032 23.551-19.115 42.635-42.664 42.667l-0.003 0z"],"attrs":[],"grid":0,"tags":["slider-h"]},"attrs":[],"properties":{"order":5465,"id":219,"name":"slider-h","prevSize":32,"code":60634},"setIdx":0,"setId":0,"iconIdx":986},{"icon":{"paths":["M853.333 349.013v-221.013c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 221.013c-49.611 18.382-84.33 65.296-84.33 120.32s34.719 101.938 83.444 120.032l0.886 0.288v306.347c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-306.347c49.611-18.382 84.33-65.296 84.33-120.32s-34.719-101.938-83.444-120.032l-0.886-0.288zM810.667 512c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667c23.564 0 42.667 19.103 42.667 42.667v0c0 23.564-19.103 42.667-42.667 42.667v0zM554.667 605.013v-477.013c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 477.013c-49.611 18.382-84.33 65.296-84.33 120.32s34.719 101.938 83.444 120.032l0.886 0.288v50.347c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-50.347c49.611-18.382 84.33-65.296 84.33-120.32s-34.719-101.938-83.444-120.032l-0.886-0.288zM512 768c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667c23.564 0 42.667 19.103 42.667 42.667v0c0 23.564-19.103 42.667-42.667 42.667v0zM256 263.68v-135.68c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 135.68c-49.611 18.382-84.33 65.296-84.33 120.32s34.719 101.938 83.444 120.032l0.886 0.288v391.68c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-391.68c49.611-18.382 84.33-65.296 84.33-120.32s-34.719-101.938-83.444-120.032l-0.886-0.288zM213.333 426.667c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667c23.564 0 42.667 19.103 42.667 42.667v0c0 23.564-19.103 42.667-42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["sliders-v-alt"]},"attrs":[],"properties":{"order":5466,"id":218,"name":"sliders-v-alt","prevSize":32,"code":60635},"setIdx":0,"setId":0,"iconIdx":987},{"icon":{"paths":["M981.333 405.333c-0.103-82.433-66.9-149.23-149.323-149.333l-0.010-0c-23.318 0.129-45.318 5.645-64.858 15.365l0.858-0.386v-78.979c0-0.068 0-0.148 0-0.228 0-82.349-66.757-149.105-149.105-149.105-41.906 0-79.774 17.288-106.862 45.12l-0.032 0.033c-27.109-28.162-65.13-45.654-107.235-45.654-82.163 0-148.768 66.606-148.768 148.768 0 23.677 5.531 46.062 15.372 65.934l-0.389-0.868h-78.979c-0.068-0-0.148-0-0.228-0-82.349 0-149.105 66.757-149.105 149.105 0 41.906 17.288 79.774 45.12 106.862l0.033 0.032c-28.162 27.109-45.654 65.13-45.654 107.235 0 82.163 66.606 148.768 148.768 148.768 23.677 0 46.062-5.531 65.934-15.372l-0.868 0.389v78.979c-0 0.068-0 0.148-0 0.228 0 82.349 66.757 149.105 149.105 149.105 41.906 0 79.774-17.288 106.862-45.12l0.032-0.033c27.109 28.162 65.13 45.654 107.235 45.654 82.163 0 148.768-66.606 148.768-148.768 0-23.677-5.531-46.062-15.372-65.934l0.389 0.868h78.979c0.068 0 0.148 0 0.228 0 82.349 0 149.105-66.757 149.105-149.105 0-41.906-17.288-79.774-45.12-106.862l-0.033-0.032c27.849-27.045 45.135-64.836 45.154-106.663l0-0.003zM554.667 192c0-35.346 28.654-64 64-64s64 28.654 64 64v0 213.333c0 35.346-28.654 64-64 64s-64-28.654-64-64v0zM256 618.667c0 35.346-28.654 64-64 64s-64-28.654-64-64c0-35.346 28.654-64 64-64v0h64zM469.333 832c0 35.346-28.654 64-64 64s-64-28.654-64-64v0-213.333c0-35.346 28.654-64 64-64s64 28.654 64 64v0zM405.333 469.333h-213.333c-35.346 0-64-28.654-64-64s28.654-64 64-64v0h213.333c35.346 0 64 28.654 64 64s-28.654 64-64 64v0zM469.333 256h-64c-35.346 0-64-28.654-64-64s28.654-64 64-64c35.346 0 64 28.654 64 64v0zM512 514.487c-0.826-0.844-1.643-1.661-2.487-2.487 0.844-0.826 1.661-1.643 2.487-2.487 0.826 0.844 1.643 1.661 2.487 2.487-0.844 0.826-1.661 1.643-2.487 2.487zM618.667 896c-35.33-0.040-63.96-28.67-64-63.996l-0-0.004v-64h64c35.346 0 64 28.654 64 64s-28.654 64-64 64v0zM832 682.667h-213.333c-35.346 0-64-28.654-64-64s28.654-64 64-64v0h213.333c35.346 0 64 28.654 64 64s-28.654 64-64 64v0zM832 469.333h-64v-64c0-35.346 28.654-64 64-64s64 28.654 64 64c0 35.346-28.654 64-64 64v0z"],"attrs":[],"grid":0,"tags":["slack-alt"]},"attrs":[],"properties":{"order":5467,"id":217,"name":"slack-alt","prevSize":32,"code":60636},"setIdx":0,"setId":0,"iconIdx":988},{"icon":{"paths":["M85.333 625.92c0 47.128 38.205 85.333 85.333 85.333s85.333-38.205 85.333-85.333v0-85.333h-85.333c-47.128 0-85.333 38.205-85.333 85.333v0zM624.64 483.413c47.128 0 85.333-38.205 85.333-85.333v0-227.413c0-47.128-38.205-85.333-85.333-85.333s-85.333 38.205-85.333 85.333v0 227.413c-0 0.001-0 0.003-0 0.004 0 47.128 38.205 85.333 85.333 85.333 0.3 0 0.6-0.002 0.899-0.005l-0.046 0zM936.96 398.080c0-47.128-38.205-85.333-85.333-85.333s-85.333 38.205-85.333 85.333v0 85.333h85.333c0.508 0.011 1.107 0.017 1.707 0.017 47.128 0 85.333-38.205 85.333-85.333 0-0.006-0-0.012-0-0.018l0 0.001zM398.507 540.587c-47.128 0-85.333 38.205-85.333 85.333v0 227.413c0 47.128 38.205 85.333 85.333 85.333s85.333-38.205 85.333-85.333v0-227.413c0-47.128-38.205-85.333-85.333-85.333v0zM625.493 768h-85.333v85.333c0 47.128 38.205 85.333 85.333 85.333s85.333-38.205 85.333-85.333c0-47.128-38.205-85.333-85.333-85.333v0zM853.333 540.587h-227.84c-47.128 0-85.333 38.205-85.333 85.333s38.205 85.333 85.333 85.333v0h227.84c47.128 0 85.333-38.205 85.333-85.333s-38.205-85.333-85.333-85.333v0zM398.507 312.747h-227.84c-47.128 0-85.333 38.205-85.333 85.333s38.205 85.333 85.333 85.333v0h227.84c47.128 0 85.333-38.205 85.333-85.333s-38.205-85.333-85.333-85.333v0zM398.507 85.333c-47.128 0-85.333 38.205-85.333 85.333s38.205 85.333 85.333 85.333v0h85.333v-85.333c0-47.128-38.205-85.333-85.333-85.333v0z"],"attrs":[],"grid":0,"tags":["slack"]},"attrs":[],"properties":{"order":5468,"id":216,"name":"slack","prevSize":32,"code":60637},"setIdx":0,"setId":0,"iconIdx":989},{"icon":{"paths":["M612.693 607.147c-27.277 22.134-62.42 35.536-100.693 35.536s-73.416-13.403-100.992-35.771l0.298 0.234c-7.346-6.139-16.891-9.867-27.307-9.867-23.594 0-42.72 19.126-42.72 42.72 0 13.178 5.967 24.962 15.346 32.798l0.068 0.055c41.735 35.027 96.036 56.304 155.307 56.304s113.571-21.277 155.681-56.61l-0.374 0.306c9.447-7.891 15.413-19.676 15.413-32.853 0-23.594-19.126-42.72-42.72-42.72-10.416 0-19.961 3.728-27.374 9.922l0.068-0.055zM392.96 449.707c7.712 7.668 18.343 12.407 30.080 12.407s22.368-4.74 30.082-12.409l-0.002 0.002c7.668-7.712 12.407-18.343 12.407-30.080s-4.74-22.368-12.409-30.082l0.002 0.002c-23.51-22.342-55.377-36.084-90.453-36.084s-66.943 13.743-90.51 36.137l0.056-0.053c-9.153 7.872-14.914 19.467-14.914 32.407 0 23.564 19.103 42.667 42.667 42.667 12.94 0 24.535-5.761 32.36-14.858l0.047-0.056c7.733-7.795 18.45-12.621 30.293-12.621s22.56 4.826 30.291 12.618l0.003 0.003zM751.787 389.547c-23.51-22.342-55.377-36.084-90.453-36.084s-66.943 13.743-90.51 36.137l0.056-0.053c-6.377 7.412-10.259 17.129-10.259 27.753 0 23.564 19.103 42.667 42.667 42.667 10.624 0 20.341-3.883 27.809-10.307l-0.056 0.047c7.733-7.795 18.45-12.621 30.293-12.621s22.56 4.826 30.291 12.618l0.003 0.003c7.712 7.668 18.343 12.407 30.080 12.407s22.368-4.74 30.082-12.409l-0.002 0.002c7.668-7.712 12.407-18.343 12.407-30.080s-4.74-22.368-12.409-30.082l0.002 0.002zM512 85.333c-235.641 0-426.667 191.025-426.667 426.667s191.025 426.667 426.667 426.667c235.641 0 426.667-191.025 426.667-426.667v0c0-235.641-191.025-426.667-426.667-426.667v0zM512 853.333c-188.513 0-341.333-152.82-341.333-341.333s152.82-341.333 341.333-341.333c188.513 0 341.333 152.82 341.333 341.333v0c0 188.513-152.82 341.333-341.333 341.333v0z"],"attrs":[],"grid":0,"tags":["smile-beam"]},"attrs":[],"properties":{"order":5469,"id":215,"name":"smile-beam","prevSize":32,"code":60638},"setIdx":0,"setId":0,"iconIdx":990},{"icon":{"paths":["M612.693 607.147c-27.277 22.134-62.42 35.536-100.693 35.536s-73.416-13.403-100.992-35.771l0.298 0.234c-7.346-6.139-16.891-9.867-27.307-9.867-23.594 0-42.72 19.126-42.72 42.72 0 13.178 5.967 24.962 15.346 32.798l0.068 0.055c41.735 35.027 96.036 56.304 155.307 56.304s113.571-21.277 155.681-56.61l-0.374 0.306c9.447-7.891 15.413-19.676 15.413-32.853 0-23.594-19.126-42.72-42.72-42.72-10.416 0-19.961 3.728-27.374 9.922l0.068-0.055zM384 499.627l12.373-12.8 12.373 12.8c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003-12.8-12.373 12.8-12.373c7.609-7.818 12.302-18.507 12.302-30.293 0-23.996-19.453-43.449-43.449-43.449-12.21 0-23.244 5.037-31.137 13.146l-0.009 0.010-12.373 12.8-10.667-12.8c-7.903-8.119-18.936-13.155-31.147-13.155-23.996 0-43.449 19.453-43.449 43.449 0 11.786 4.693 22.476 12.312 30.303l-0.009-0.010 12.8 12.373-12.8 12.373c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003zM512 85.333c-235.641 0-426.667 191.025-426.667 426.667s191.025 426.667 426.667 426.667c235.641 0 426.667-191.025 426.667-426.667v0c0-235.641-191.025-426.667-426.667-426.667v0zM512 853.333c-188.513 0-341.333-152.82-341.333-341.333s152.82-341.333 341.333-341.333c188.513 0 341.333 152.82 341.333 341.333v0c0 188.513-152.82 341.333-341.333 341.333v0zM725.333 353.707c-7.733-7.795-18.45-12.621-30.293-12.621s-22.56 4.826-30.291 12.618l-0.003 0.003-12.373 12.8-12.373-12.8c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l-0-0 12.8 12.373-12.8 12.373c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 12.373-12.8 12.373 12.8c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003-12.8-12.373 12.8-12.373c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003z"],"attrs":[],"grid":0,"tags":["smile-dizzy"]},"attrs":[],"properties":{"order":5470,"id":214,"name":"smile-dizzy","prevSize":32,"code":60639},"setIdx":0,"setId":0,"iconIdx":991},{"icon":{"paths":["M384 469.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667c-23.564 0-42.667 19.103-42.667 42.667v0c0 23.564 19.103 42.667 42.667 42.667v0zM604.16 520.96c7.709 7.648 18.326 12.374 30.047 12.374 0.087 0 0.173-0 0.26-0.001l-0.013 0c0.073 0 0.16 0.001 0.247 0.001 11.721 0 22.338-4.726 30.049-12.377l-0.003 0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003-33.707-33.707 33.707-33.707c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l-64 64c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003zM512 85.333c-235.641 0-426.667 191.025-426.667 426.667s191.025 426.667 426.667 426.667c235.641 0 426.667-191.025 426.667-426.667v0c0-235.641-191.025-426.667-426.667-426.667v0zM512 853.333c-188.513 0-341.333-152.82-341.333-341.333s152.82-341.333 341.333-341.333c188.513 0 341.333 152.82 341.333 341.333v0c0 188.513-152.82 341.333-341.333 341.333v0zM612.693 607.147c-27.277 22.134-62.42 35.536-100.693 35.536s-73.416-13.403-100.992-35.771l0.298 0.234c-7.346-6.139-16.891-9.867-27.307-9.867-23.594 0-42.72 19.126-42.72 42.72 0 13.178 5.967 24.962 15.346 32.798l0.068 0.055c41.735 35.027 96.036 56.304 155.307 56.304s113.571-21.277 155.681-56.61l-0.374 0.306c9.447-7.891 15.413-19.676 15.413-32.853 0-23.594-19.126-42.72-42.72-42.72-10.416 0-19.961 3.728-27.374 9.922l0.068-0.055z"],"attrs":[],"grid":0,"tags":["smile-squint-wink-alt"]},"attrs":[],"properties":{"order":5471,"id":213,"name":"smile-squint-wink-alt","prevSize":32,"code":60640},"setIdx":0,"setId":0,"iconIdx":992},{"icon":{"paths":["M359.253 520.96c7.709 7.648 18.326 12.374 30.047 12.374 0.087 0 0.173-0 0.26-0.001l-0.013 0c0.073 0 0.16 0.001 0.247 0.001 11.721 0 22.338-4.726 30.049-12.377l-0.003 0.003 64-64c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003-64-64c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l33.707 33.707-33.707 33.707c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003zM612.693 606.293c-27.277 22.134-62.42 35.536-100.693 35.536s-73.416-13.403-100.992-35.771l0.298 0.234c-7.346-6.139-16.891-9.867-27.307-9.867-23.594 0-42.72 19.126-42.72 42.72 0 13.178 5.967 24.962 15.346 32.798l0.068 0.055c41.735 35.027 96.036 56.304 155.307 56.304s113.571-21.277 155.681-56.61l-0.374 0.306c9.447-7.891 15.413-19.676 15.413-32.853 0-23.594-19.126-42.72-42.72-42.72-10.416 0-19.961 3.728-27.374 9.922l0.068-0.055zM640 384c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM512 85.333c-235.641 0-426.667 191.025-426.667 426.667s191.025 426.667 426.667 426.667c235.641 0 426.667-191.025 426.667-426.667v0c0-235.641-191.025-426.667-426.667-426.667v0zM512 853.333c-188.513 0-341.333-152.82-341.333-341.333s152.82-341.333 341.333-341.333c188.513 0 341.333 152.82 341.333 341.333v0c0 188.513-152.82 341.333-341.333 341.333v0z"],"attrs":[],"grid":0,"tags":["smile-squint-wink"]},"attrs":[],"properties":{"order":5472,"id":212,"name":"smile-squint-wink","prevSize":32,"code":60641},"setIdx":0,"setId":0,"iconIdx":993},{"icon":{"paths":["M384 469.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667c-23.564 0-42.667 19.103-42.667 42.667v0c0 23.564 19.103 42.667 42.667 42.667v0zM612.693 607.147c-27.277 22.134-62.42 35.536-100.693 35.536s-73.416-13.403-100.992-35.771l0.298 0.234c-7.346-6.139-16.891-9.867-27.307-9.867-23.594 0-42.72 19.126-42.72 42.72 0 13.178 5.967 24.962 15.346 32.798l0.068 0.055c41.735 35.027 96.036 56.304 155.307 56.304s113.571-21.277 155.681-56.61l-0.374 0.306c9.447-7.891 15.413-19.676 15.413-32.853 0-23.594-19.126-42.72-42.72-42.72-10.416 0-19.961 3.728-27.374 9.922l0.068-0.055zM512 85.333c-235.641 0-426.667 191.025-426.667 426.667s191.025 426.667 426.667 426.667c235.641 0 426.667-191.025 426.667-426.667v0c0-235.641-191.025-426.667-426.667-426.667v0zM512 853.333c-188.513 0-341.333-152.82-341.333-341.333s152.82-341.333 341.333-341.333c188.513 0 341.333 152.82 341.333 341.333v0c0 188.513-152.82 341.333-341.333 341.333v0zM751.787 389.547c-23.51-22.342-55.377-36.084-90.453-36.084s-66.943 13.743-90.51 36.137l0.056-0.053c-6.377 7.412-10.259 17.129-10.259 27.753 0 23.564 19.103 42.667 42.667 42.667 10.624 0 20.341-3.883 27.809-10.307l-0.056 0.047c7.733-7.795 18.45-12.621 30.293-12.621s22.56 4.826 30.291 12.618l0.003 0.003c7.712 7.668 18.343 12.407 30.080 12.407s22.368-4.74 30.082-12.409l-0.002 0.002c7.668-7.712 12.407-18.343 12.407-30.080s-4.74-22.368-12.409-30.082l0.002 0.002z"],"attrs":[],"grid":0,"tags":["smile-wink-alt"]},"attrs":[],"properties":{"order":5473,"id":211,"name":"smile-wink-alt","prevSize":32,"code":60642},"setIdx":0,"setId":0,"iconIdx":994},{"icon":{"paths":["M612.693 607.147c-27.277 22.134-62.42 35.536-100.693 35.536s-73.416-13.403-100.992-35.771l0.298 0.234c-7.346-6.139-16.891-9.867-27.307-9.867-23.594 0-42.72 19.126-42.72 42.72 0 13.178 5.967 24.962 15.346 32.798l0.068 0.055c41.735 35.027 96.036 56.304 155.307 56.304s113.571-21.277 155.681-56.61l-0.374 0.306c9.447-7.891 15.413-19.676 15.413-32.853 0-23.594-19.126-42.72-42.72-42.72-10.416 0-19.961 3.728-27.374 9.922l0.068-0.055zM448 426.667c0-35.346-28.654-64-64-64s-64 28.654-64 64c0 35.346 28.654 64 64 64v0c35.346 0 64-28.654 64-64v0zM640 384h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM512 85.333c-235.641 0-426.667 191.025-426.667 426.667s191.025 426.667 426.667 426.667c235.641 0 426.667-191.025 426.667-426.667v0c0-235.641-191.025-426.667-426.667-426.667v0zM512 853.333c-188.513 0-341.333-152.82-341.333-341.333s152.82-341.333 341.333-341.333c188.513 0 341.333 152.82 341.333 341.333v0c0 188.513-152.82 341.333-341.333 341.333v0z"],"attrs":[],"grid":0,"tags":["smile-wink"]},"attrs":[],"properties":{"order":5474,"id":210,"name":"smile-wink","prevSize":32,"code":60643},"setIdx":0,"setId":0,"iconIdx":995},{"icon":{"paths":["M612.693 607.147c-27.277 22.134-62.42 35.536-100.693 35.536s-73.416-13.403-100.992-35.771l0.298 0.234c-7.346-6.139-16.891-9.867-27.307-9.867-23.594 0-42.72 19.126-42.72 42.72 0 13.178 5.967 24.962 15.346 32.798l0.068 0.055c41.735 35.027 96.036 56.304 155.307 56.304s113.571-21.277 155.681-56.61l-0.374 0.306c9.447-7.891 15.413-19.676 15.413-32.853 0-23.594-19.126-42.72-42.72-42.72-10.416 0-19.961 3.728-27.374 9.922l0.068-0.055zM384 469.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667c-23.564 0-42.667 19.103-42.667 42.667v0c0 23.564 19.103 42.667 42.667 42.667v0zM640 384c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM512 85.333c-235.641 0-426.667 191.025-426.667 426.667s191.025 426.667 426.667 426.667c235.641 0 426.667-191.025 426.667-426.667v0c0-235.641-191.025-426.667-426.667-426.667v0zM512 853.333c-188.513 0-341.333-152.82-341.333-341.333s152.82-341.333 341.333-341.333c188.513 0 341.333 152.82 341.333 341.333v0c0 188.513-152.82 341.333-341.333 341.333v0z"],"attrs":[],"grid":0,"tags":["smile"]},"attrs":[],"properties":{"order":5475,"id":209,"name":"smile","prevSize":32,"code":60644},"setIdx":0,"setId":0,"iconIdx":996},{"icon":{"paths":["M930.029 724.786c-122.292-20.148-177.107-145.13-179.371-150.438l-0.232-0.5c-4.214-6.785-6.712-15.018-6.712-23.834 0-5.174 0.86-10.147 2.446-14.784l-0.095 0.321c8.214-19.354 35.386-27.977 53.391-33.693 4.495-1.425 8.747-2.773 12.081-4.096 32.544-12.854 39.161-26.161 39-35.068-1.806-11.428-10.252-20.478-21.197-23.153l-0.194-0.040-0.242-0.091c-4.456-1.842-9.63-2.912-15.054-2.912-0.052 0-0.105 0-0.157 0l0.008-0c-0.164-0.003-0.357-0.005-0.551-0.005-4.628 0-9.027 0.976-13.004 2.734l0.206-0.081c-11.848 6.124-25.706 10.19-40.386 11.331l-0.372 0.023c-0.249 0.006-0.542 0.010-0.836 0.010-8.254 0-15.841-2.853-21.829-7.627l0.071 0.055c0.39-7.25 0.853-14.729 1.357-22.633l0.171-2.786c2.752-18.298 4.323-39.413 4.323-60.896 0-39.56-5.329-77.875-15.309-114.267l0.707 3.025c-35.528-79.538-113.938-133.966-205.059-133.966-1.006 0-2.010 0.007-3.012 0.020l0.152-0.002q-8.582 0.090-17.169 0.161c-0.821-0.011-1.79-0.017-2.761-0.017-91.023 0-169.34 54.399-204.214 132.46l-0.566 1.419c-9.277 33.353-14.609 71.652-14.609 111.196 0 21.447 1.568 42.528 4.597 63.134l-0.282-2.338q0.828 12.745 1.536 25.502c-6.085 4.803-13.866 7.705-22.324 7.705-0.91 0-1.811-0.034-2.704-0.099l0.119 0.007c-15.906-0.7-30.693-4.844-43.843-11.699l0.579 0.275c-2.92-1.323-6.331-2.095-9.922-2.095-0.191 0-0.382 0.002-0.572 0.007l0.028-0.001c-0.417-0.018-0.907-0.028-1.399-0.028-15.037 0-27.894 9.328-33.103 22.513l-0.084 0.241c-3.495 18.373 22.737 31.683 38.685 37.982 3.371 1.338 7.604 2.679 12.078 4.096 17.992 5.711 45.187 14.339 53.398 33.7 1.488 4.316 2.347 9.289 2.347 14.463 0 8.819-2.497 17.056-6.822 24.040l0.113-0.196-0.229 0.492c-12.604 27.109-27.855 50.457-45.932 71.288l0.315-0.371c-32.94 40.735-79.351 69.427-132.377 79.313l-1.376 0.213c-4.89 0.827-8.568 5.032-8.568 10.095 0 0.202 0.006 0.403 0.017 0.602l-0.001-0.028c0.122 2.025 0.597 3.909 1.364 5.635l-0.041-0.103c7.5 17.542 45.151 32.026 108.878 41.856 5.958 0.922 8.479 10.636 11.958 26.547 1.391 6.37 2.831 12.982 4.838 19.807 1.259 5.667 6.243 9.841 12.202 9.841 0.5 0 0.993-0.029 1.477-0.086l-0.059 0.006c6.64-0.38 12.845-1.307 18.852-2.745l-0.722 0.146c14.295-3.263 30.769-5.224 47.669-5.408l0.133-0.001c12.196 0.031 24.122 1.089 35.724 3.094l-1.258-0.18c25.261 6.528 47.234 18.105 65.746 33.665l-0.253-0.207c30.835 26.456 70.665 43.228 114.348 45.214l0.412 0.015c1.44 0 2.877-0.052 4.271-0.171 1.755 0.083 4.063 0.171 6.482 0.171 44.119-2.013 83.969-18.794 115.081-45.474l-0.255 0.214c18.242-15.337 40.193-26.902 64.281-33.168l1.149-0.254c10.344-1.821 22.273-2.88 34.443-2.914l0.031-0c16.971 0.082 33.466 1.922 49.371 5.348l-1.569-0.283c5.344 1.227 11.571 2.049 17.948 2.286l0.185 0.005h0.998c0.286 0.024 0.619 0.038 0.955 0.038 5.712 0 10.484-4.023 11.638-9.389l0.014-0.078c1.982-6.735 3.433-13.141 4.859-19.683 3.448-15.829 5.969-25.497 11.951-26.422 63.744-9.847 101.393-24.31 108.843-41.753 0.738-1.636 1.224-3.537 1.352-5.535l0.002-0.048c0.010-0.169 0.016-0.367 0.016-0.566 0-5.065-3.677-9.271-8.507-10.094l-0.061-0.009z"],"attrs":[],"grid":0,"tags":["snapchat-ghost"]},"attrs":[],"properties":{"order":5476,"id":208,"name":"snapchat-ghost","prevSize":32,"code":60645},"setIdx":0,"setId":0,"iconIdx":997},{"icon":{"paths":["M902.827 688.213l-85.333-49.067 37.973-10.24c19.045-4.549 32.986-21.423 32.986-41.554 0-23.564-19.103-42.667-42.667-42.667-4.462 0-8.765 0.685-12.808 1.956l0.302-0.082-120.32 32.427-115.627-66.987 115.627-66.987 120.32 32.427h11.093c1.666 0.229 3.591 0.359 5.547 0.359 23.762 0 43.026-19.263 43.026-43.026 0-21.807-16.223-39.825-37.258-42.643l-0.221-0.024-37.973-8.107 85.333-49.067c12.929-7.531 21.48-21.327 21.48-37.12 0-23.645-19.168-42.814-42.814-42.814-7.852 0-15.21 2.114-21.537 5.803l0.203-0.11-92.16 53.76 12.8-47.36c1.189-3.741 1.874-8.043 1.874-12.506 0-23.564-19.103-42.667-42.667-42.667-20.13 0-37.005 13.941-41.495 32.695l-0.059 0.291-34.987 128-108.8 65.28v-133.547l88.32-88.32c7.668-7.712 12.407-18.343 12.407-30.080s-4.74-22.368-12.409-30.082l0.002 0.002c-7.733-7.795-18.45-12.621-30.293-12.621s-22.56 4.826-30.291 12.618l-0.003 0.003-27.733 27.733v-98.56c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 105.387l-34.56-34.56c-7.733-7.795-18.45-12.621-30.293-12.621s-22.56 4.826-30.291 12.618l-0.003 0.003c-7.668 7.712-12.407 18.343-12.407 30.080s4.74 22.368 12.409 30.082l-0.002-0.002 95.147 95.147v128l-109.653-64.853-34.987-128c-4.549-19.045-21.423-32.986-41.554-32.986-23.564 0-42.667 19.103-42.667 42.667 0 4.462 0.685 8.765 1.956 12.808l-0.082-0.302 13.653 45.653-92.16-52.907c-6.123-3.58-13.481-5.694-21.333-5.694-23.645 0-42.814 19.168-42.814 42.814 0 15.793 8.552 29.589 21.277 37.010l0.203 0.11 85.333 48.213-35.84 11.093c-21.256 2.842-37.479 20.86-37.479 42.667 0 23.762 19.263 43.026 43.026 43.026 1.956 0 3.881-0.13 5.767-0.383l-0.221 0.024h11.093l120.32-32.427 113.493 64-115.627 66.987-120.32-32.427c-4.414-1.69-9.519-2.668-14.852-2.668-23.564 0-42.667 19.103-42.667 42.667 0 21.731 16.246 39.667 37.255 42.327l0.211 0.022 37.973 10.24-85.333 49.067c-12.929 7.531-21.48 21.327-21.48 37.12 0 23.645 19.168 42.814 42.814 42.814 7.852 0 15.21-2.114 21.537-5.803l-0.203 0.11 90.027-52.907-12.8 47.36c-1.211 3.774-1.91 8.116-1.91 12.622 0 19.537 13.131 36.007 31.049 41.066l0.301 0.073c1.665 0.2 3.592 0.315 5.547 0.315s3.882-0.114 5.777-0.336l-0.23 0.022c0.435 0.016 0.947 0.025 1.461 0.025 19.628 0 36.16-13.253 41.136-31.299l0.070-0.3 34.987-128 107.947-65.28v133.547l-88.32 88.32c-7.668 7.712-12.407 18.343-12.407 30.080s4.74 22.368 12.409 30.082l-0.002-0.002c7.709 7.861 18.426 12.749 30.284 12.8l0.010 0c11.868-0.051 22.584-4.939 30.287-12.793l0.007-0.007 27.733-27.733v98.56c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-105.387l34.56 34.56c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.668-7.712 12.407-18.343 12.407-30.080s-4.74-22.368-12.409-30.082l0.002 0.002-95.147-95.147v-128l109.653 63.573 34.987 128c5.046 18.345 21.578 31.598 41.206 31.598 0.514 0 1.025-0.009 1.534-0.027l-0.074 0.002c1.665 0.2 3.592 0.315 5.547 0.315s3.882-0.114 5.777-0.336l-0.23 0.022c18.445-4.978 31.795-21.559 31.795-41.258 0-3.992-0.548-7.857-1.574-11.522l0.072 0.3-15.36-45.653 91.307 52.907c6.123 3.58 13.481 5.694 21.333 5.694 23.645 0 42.814-19.168 42.814-42.814 0-15.793-8.552-29.589-21.277-37.010l-0.203-0.11z"],"attrs":[],"grid":0,"tags":["snowflake"]},"attrs":[],"properties":{"order":5477,"id":207,"name":"snowflake","prevSize":32,"code":60646},"setIdx":0,"setId":0,"iconIdx":998},{"icon":{"paths":["M471.893 857.6c-10.878-5.096-20.096-11.993-27.665-20.403l-0.068-0.077c-13.404-12.97-23.36-29.423-28.414-47.901l-0.172-0.739c-10.008-35.309-29.549-65.212-55.66-87.697l-0.234-0.197c2.028-9.322 3.19-20.031 3.19-31.011 0-42.677-17.551-81.254-45.829-108.908l-0.028-0.027c-25.792-29.481-63.484-47.997-105.501-47.997-34.527 0-66.134 12.504-90.54 33.23l0.201-0.166c-20.584 24.267-33.101 55.941-33.101 90.539 0 42.094 18.528 79.861 47.874 105.589l0.16 0.138c24.588 25.047 57.059 42.279 93.39 47.676l0.903 0.11h15.36c0.11 0 0.24 0.001 0.37 0.001 24.074 0 46.515-6.996 65.399-19.066l-0.489 0.292c10.289 10.74 17.879 24.146 21.632 39.077l0.128 0.603c9.736 33.712 27.503 62.521 51.14 85.276l0.060 0.058c14.443 15.089 31.37 27.655 50.149 37.070l1.051 0.477c5.434 2.692 11.832 4.267 18.599 4.267 0.061 0 0.123-0 0.184-0l-0.009 0c0.052 0 0.114 0 0.176 0 23.564 0 42.667-19.103 42.667-42.667 0-16.798-9.708-31.329-23.819-38.289l-0.25-0.111zM269.653 696.747c-6.34 5.371-14.613 8.637-23.649 8.637-2.197 0-4.349-0.193-6.439-0.563l0.221 0.032c-17.826-2.242-33.45-10.299-45.221-22.181l-0.006-0.006c-24.32-23.893-31.147-59.307-15.36-75.52 6.102-5.31 14.129-8.547 22.913-8.547 0.345 0 0.688 0.005 1.030 0.015l-0.050-0.001c20.714 0.427 39.348 8.989 52.904 22.61l0.003 0.003c12.366 11.634 20.86 27.26 23.417 44.812l0.050 0.415c0.214 1.49 0.337 3.21 0.337 4.959 0 9.832-3.867 18.761-10.163 25.349l0.013-0.014zM909.653 435.627c-15.385-5.239-28.443-13.896-38.768-25.108l-0.059-0.065c-13.404-12.97-23.36-29.423-28.414-47.901l-0.172-0.739c-10.008-35.309-29.549-65.212-55.66-87.697l-0.234-0.197c1.808-8.807 2.843-18.929 2.843-29.293 0-43.548-18.275-82.828-47.574-110.588l-0.069-0.065c-25.792-29.481-63.484-47.997-105.501-47.997-34.527 0-66.134 12.504-90.54 33.23l0.201-0.166c-20.584 24.267-33.101 55.941-33.101 90.539 0 42.094 18.528 79.861 47.874 105.589l0.16 0.138c25.111 25.438 58.393 42.756 95.585 47.695l0.842 0.091h15.36c0.11 0 0.24 0.001 0.37 0.001 24.074 0 46.515-6.996 65.399-19.066l-0.489 0.292c10.289 10.74 17.879 24.146 21.632 39.077l0.128 0.603c9.896 33.66 27.633 62.435 51.154 85.289l0.046 0.045c19.754 20.285 44.041 36.053 71.232 45.678l1.302 0.402c4.061 1.236 8.742 2.007 13.584 2.132l0.069 0.001c0.033 0 0.071 0 0.11 0 18.678 0 34.552-12.002 40.333-28.714l0.090-0.3c1.151-3.683 1.814-7.918 1.814-12.307 0-18.875-12.257-34.888-29.246-40.513l-0.301-0.086zM696.32 270.080c-6.34 5.371-14.613 8.637-23.649 8.637-2.197 0-4.349-0.193-6.439-0.563l0.221 0.032c-17.826-2.242-33.45-10.299-45.221-22.181l-0.006-0.006c-24.32-23.893-31.147-59.307-15.36-75.52 6.102-5.31 14.129-8.547 22.913-8.547 0.345 0 0.688 0.005 1.030 0.015l-0.050-0.001c20.714 0.427 39.348 8.989 52.904 22.61l0.003 0.003c12.366 11.634 20.86 27.26 23.417 44.812l0.050 0.415c0.214 1.49 0.337 3.21 0.337 4.959 0 9.832-3.867 18.761-10.163 25.349l0.013-0.014zM926.293 872.533c-17.492-67.901-69.912-120.322-136.496-137.524l-1.318-0.289c-23.334-6.752-43.322-18.873-59.298-34.978l-0.009-0.009c-16.153-15.669-28.075-35.614-33.94-58.010l-0.194-0.87c-19.313-67.92-72.13-120.171-138.983-138.345l-1.391-0.322c-23.273-6.036-43.223-17.962-58.848-34.1l-0.032-0.033c-16.252-15.825-28.298-35.891-34.355-58.411l-0.205-0.895c-8.531-30.744-23.26-57.357-42.855-79.577l0.188 0.217c5.379-15.74 8.485-33.873 8.485-52.732 0-3.965-0.137-7.897-0.407-11.793l0.029 0.526c-6.23-47.216-27.9-88.491-59.688-119.422l-0.046-0.044c-31.143-32.231-72.717-54.204-119.271-60.471l-1.049-0.116c-4.378-0.465-9.458-0.73-14.6-0.73-40.677 0-77.478 16.595-104.001 43.385l-0.012 0.012c-26.801 26.535-43.397 63.336-43.397 104.013 0 5.142 0.265 10.222 0.783 15.227l-0.052-0.627c6.23 47.216 27.9 88.491 59.688 119.422l0.046 0.044c31.143 32.231 72.717 54.204 119.271 60.471l1.049 0.116h18.347c0.93 0.022 2.026 0.034 3.125 0.034 30.743 0 59.245-9.591 82.679-25.944l-0.47 0.311c5.539 8.714 10.061 18.786 13.039 29.501l0.188 0.792c20.948 74.772 78.746 132.429 152.064 152.809l1.536 0.364c38.161 10.716 67.569 40.264 77.896 77.725l0.184 0.782c20.74 74.992 78.607 132.86 152.067 153.237l1.533 0.363c38.008 10.932 67.1 40.874 76.638 78.603l0.162 0.757c1.94 7.596 4.275 14.128 7.132 20.372l-0.306-0.746c7.205 13.697 21.285 22.907 37.529 23.040l0.018 0c6.841-0.253 13.258-1.798 19.102-4.397l-0.329 0.131c14.61-6.982 24.523-21.642 24.523-38.617 0-6.584-1.491-12.819-4.154-18.387l0.111 0.257s-1.28-4.267-1.707-5.12zM325.973 325.973c-27.307 26.88-81.92 17.493-119.893-20.053-18.573-17.781-31.36-41.471-35.333-68.042l-0.080-0.651c-0.481-2.917-0.755-6.279-0.755-9.705 0-15.942 5.948-30.496 15.746-41.561l-0.057 0.066c10.493-9.566 24.51-15.425 39.896-15.425 0.975 0 1.944 0.024 2.907 0.070l-0.136-0.005c30.784 1.459 58.207 14.744 78.044 35.375l0.036 0.038c18.413 17.827 31.055 41.517 34.91 68.053l0.076 0.64c0.441 2.794 0.693 6.015 0.693 9.296 0 16.135-6.093 30.847-16.103 41.961l0.050-0.056z"],"attrs":[],"grid":0,"tags":["sperms"]},"attrs":[],"properties":{"order":5478,"id":206,"name":"sperms","prevSize":32,"code":60647},"setIdx":0,"setId":0,"iconIdx":999},{"icon":{"paths":["M896 469.333h-67.84l55.467-55.040c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l0-0-115.2 115.627h-93.013l98.133-97.707c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l-0 0-97.707 98.133v-93.013l115.627-115.2c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l-0 0-55.040 55.467v-67.84c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 67.84l-55.040-55.467c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l-0-0 115.627 115.2v93.013l-97.707-98.133c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293v0l98.133 97.707h-93.013l-115.2-115.627c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l-0-0 55.467 55.040h-67.84c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h67.84l-55.467 55.040c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 115.2-115.627h93.013l-98.133 97.707c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 97.707-98.133v93.013l-115.627 115.2c-7.753 7.753-12.548 18.463-12.548 30.293 0 23.661 19.181 42.841 42.841 42.841 11.83 0 22.541-4.795 30.293-12.548l-0 0 55.040-55.467v67.84c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-67.84l55.040 55.467c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003-115.627-115.2v-93.013l97.707 98.133c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003-98.133-97.707h93.013l115.2 115.627c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003-55.467-55.040h67.84c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["snow-flake"]},"attrs":[],"properties":{"order":5479,"id":205,"name":"snow-flake","prevSize":32,"code":60648},"setIdx":0,"setId":0,"iconIdx":1000},{"icon":{"paths":["M896 384c-23.564 0-42.667 19.103-42.667 42.667v0 128h-682.667v-128c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 170.667c0 23.564 19.103 42.667 42.667 42.667v0h768c23.564 0 42.667-19.103 42.667-42.667v0-170.667c0-23.564-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["space-key"]},"attrs":[],"properties":{"order":5480,"id":204,"name":"space-key","prevSize":32,"code":60649},"setIdx":0,"setId":0,"iconIdx":1001},{"icon":{"paths":["M898.56 523.947c-0.326-66.696-27.496-126.983-71.25-170.663l-0.003-0.003-229.973-233.387c-21.846-21.823-52.014-35.318-85.333-35.318s-63.487 13.496-85.334 35.319l0.001-0.001-229.973 231.253c-43.758 43.684-70.928 103.971-71.253 170.605l-0 0.062c-0.012 0.888-0.018 1.938-0.018 2.988 0 134.316 108.884 243.2 243.2 243.2 0.307 0 0.613-0.001 0.919-0.002l-0.048 0c-11.511 38.82-29.49 72.54-52.923 101.69l0.443-0.57c-5.948 7.276-9.552 16.669-9.552 26.904 0 23.564 19.103 42.667 42.667 42.667 0.508 0 1.014-0.009 1.518-0.027l-0.073 0.002h320.853c0.043 0 0.094 0 0.145 0 23.564 0 42.667-19.103 42.667-42.667 0-10.224-3.596-19.609-9.593-26.957l0.061 0.077c-23.030-28.564-41.016-62.292-51.953-99.055l-0.527-2.065c0.762 0.009 1.661 0.014 2.562 0.014 134.080 0 242.773-108.693 242.773-242.773 0-0.305-0.001-0.609-0.002-0.914l0 0.047zM768 636.16c-29.096 28.667-69.064 46.369-113.167 46.369-15.301 0-30.105-2.131-44.13-6.112l1.137 0.276c-1.086-0.098-2.35-0.154-3.627-0.154s-2.54 0.056-3.788 0.166l0.162-0.011h-8.533c-3.62 0.686-6.769 1.572-9.803 2.695l0.416-0.135h-6.4c-2.098 1.382-3.917 2.93-5.529 4.674l-0.018 0.020c-2.779 1.688-5.166 3.668-7.229 5.946l-0.024 0.027c-0.757 1.797-1.614 3.341-2.615 4.777l0.055-0.083c-1.588 2.623-3.296 5.841-4.842 9.15l-0.278 0.663c-0.1 1.15-0.157 2.488-0.157 3.84s0.057 2.69 0.169 4.013l-0.012-0.173c0 2.56 0 5.12 0 7.68v0 0c3.647 49.154 16.166 94.562 35.967 135.812l-0.98-2.266h-165.547c19.203-37.18 32.521-80.525 37.408-126.39l0.139-1.61c0-2.56 0-5.12 0-8.107 0.1-1.15 0.157-2.488 0.157-3.84s-0.057-2.69-0.169-4.013l0.012 0.173c-1.555-3.911-3.419-7.286-5.644-10.383l0.097 0.143c-0.755-1.628-1.609-3.029-2.6-4.321l0.040 0.054c-1.861-2.412-4.129-4.408-6.717-5.914l-0.11-0.059c-1.687-1.636-3.496-3.174-5.402-4.59l-0.145-0.103h-5.973c-2.841-1.348-6.139-2.388-9.596-2.957l-0.218-0.030h-8.107c-1.15-0.1-2.488-0.157-3.84-0.157s-2.69 0.057-4.013 0.169l0.173-0.012c-12.296 3.334-26.414 5.25-40.979 5.25-46.296 0-88.073-19.353-117.68-50.411l-0.062-0.065c-28.612-28.787-46.346-68.414-46.507-112.182l-0-0.031c-0-0.147-0.001-0.32-0.001-0.494 0-43.672 17.781-83.19 46.499-111.711l0.009-0.009 230.4-231.253c6.219-6.059 14.727-9.796 24.107-9.796s17.887 3.737 24.114 9.803l-0.008-0.007 233.387 231.253c28.726 28.53 46.507 68.048 46.507 111.72 0 0.174-0 0.347-0.001 0.52l0-0.027c-0.307 43.774-18.006 83.356-46.523 112.23l0.016-0.016z"],"attrs":[],"grid":0,"tags":["spade"]},"attrs":[],"properties":{"order":5481,"id":203,"name":"spade","prevSize":32,"code":60650},"setIdx":0,"setId":0,"iconIdx":1002},{"icon":{"paths":["M938.667 412.587c-5.546-15.728-19.622-27.083-36.531-28.575l-0.162-0.012-242.773-35.413-108.8-220.587c-7.071-14.361-21.602-24.069-38.4-24.069s-31.329 9.707-38.289 23.819l-0.111 0.25-108.8 220.16-242.773 35.84c-16.295 2.38-29.452 13.684-34.473 28.712l-0.087 0.301c-1.181 3.729-1.862 8.018-1.862 12.465 0 11.798 4.788 22.477 12.527 30.201l0.001 0.001 176.213 170.667-42.667 242.347c-0.479 2.4-0.753 5.158-0.753 7.981 0 14.239 6.975 26.849 17.695 34.599l0.125 0.086c6.889 4.975 15.503 7.957 24.814 7.957 7.313 0 14.197-1.84 20.213-5.082l-0.227 0.112 218.453-113.92 217.6 114.347c5.609 3.221 12.331 5.12 19.497 5.12 0.046 0 0.091-0 0.137-0l-0.007 0c0.045 0 0.099 0 0.152 0 9.401 0 18.091-3.040 25.142-8.191l-0.121 0.084c10.845-7.836 17.82-20.446 17.82-34.685 0-2.823-0.274-5.582-0.797-8.251l0.044 0.27-42.667-242.347 176.213-170.667c9.255-7.876 15.087-19.534 15.087-32.554 0-3.899-0.523-7.676-1.503-11.265l0.070 0.299zM676.267 583.253c-8.023 7.768-13.003 18.636-13.003 30.668 0 2.581 0.229 5.109 0.668 7.564l-0.038-0.259 30.72 178.773-160.427-85.333c-5.806-3.153-12.713-5.006-20.053-5.006s-14.247 1.853-20.279 5.118l0.226-0.112-160.427 85.333 30.72-178.773c0.401-2.196 0.63-4.724 0.63-7.305 0-12.032-4.98-22.901-12.992-30.657l-0.011-0.011-128-128 179.627-26.027c14.318-2.046 26.186-10.949 32.315-23.22l0.112-0.247 75.947-162.56 80.213 162.987c6.241 12.517 18.109 21.421 32.198 23.44l0.228 0.027 179.627 26.027z"],"attrs":[],"grid":0,"tags":["star"]},"attrs":[],"properties":{"order":5482,"id":202,"name":"star","prevSize":32,"code":60651},"setIdx":0,"setId":0,"iconIdx":1003},{"icon":{"paths":["M481.707 435.627c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 128-128c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l-0 0-97.707 98.133-97.707-98.133c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l-0-0zM542.293 631.040c-7.733-7.795-18.45-12.621-30.293-12.621s-22.56 4.826-30.291 12.618l-0.003 0.003-128 128c-7.753 7.753-12.548 18.463-12.548 30.293 0 23.661 19.181 42.841 42.841 42.841 11.83 0 22.541-4.795 30.293-12.548l-0 0 97.707-98.133 97.707 98.133c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003z"],"attrs":[],"grid":0,"tags":["sorting"]},"attrs":[],"properties":{"order":5483,"id":201,"name":"sorting","prevSize":32,"code":60652},"setIdx":0,"setId":0,"iconIdx":1004},{"icon":{"paths":["M640 597.333h-256c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h256c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM387.413 520.96l64-64c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003-64-64c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l-0-0 34.133 33.707-34.133 33.707c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003c7.709 7.648 18.326 12.374 30.047 12.374 0.087 0 0.173-0 0.26-0.001l-0.013 0c0.073 0 0.16 0.001 0.247 0.001 11.721 0 22.338-4.726 30.049-12.377l-0.003 0.003zM512 85.333c-235.641 0-426.667 191.025-426.667 426.667s191.025 426.667 426.667 426.667c235.641 0 426.667-191.025 426.667-426.667v0c0-235.641-191.025-426.667-426.667-426.667v0zM512 853.333c-188.513 0-341.333-152.82-341.333-341.333s152.82-341.333 341.333-341.333c188.513 0 341.333 152.82 341.333 341.333v0c0 188.513-152.82 341.333-341.333 341.333v0zM707.413 332.373c-7.733-7.795-18.45-12.621-30.293-12.621s-22.56 4.826-30.291 12.618l-0.003 0.003-64 64c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003 64 64c7.709 7.648 18.326 12.374 30.047 12.374 0.087 0 0.173-0 0.26-0.001l-0.013 0c0.073 0 0.16 0.001 0.247 0.001 11.721 0 22.338-4.726 30.049-12.377l-0.003 0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003-33.707-33.707 33.707-33.707c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003z"],"attrs":[],"grid":0,"tags":["squint"]},"attrs":[],"properties":{"order":5484,"id":200,"name":"squint","prevSize":32,"code":60653},"setIdx":0,"setId":0,"iconIdx":1005},{"icon":{"paths":["M810.667 128c-70.692 0-128 57.308-128 128v0 512c0 70.692 57.308 128 128 128s128-57.308 128-128v0-512c0-70.692-57.308-128-128-128v0zM853.333 768c0 23.564-19.103 42.667-42.667 42.667s-42.667-19.103-42.667-42.667v0-512c0-23.564 19.103-42.667 42.667-42.667s42.667 19.103 42.667 42.667v0zM538.88 240.213c-16.114-9.652-35.55-15.36-56.32-15.36s-40.206 5.708-56.826 15.64l0.506-0.28-284.587 170.667c-34.039 20.944-56.393 57.995-56.393 100.267s22.354 79.322 55.886 99.976l0.507 0.291 284.587 170.667c16.081 9.78 35.524 15.569 56.32 15.569s40.239-5.789 56.807-15.843l-0.487 0.275c34.678-20.283 57.766-57.077 58.452-99.316l0.001-0.097v-341.333c-0.047-42.996-23.298-80.551-57.902-100.821l-0.552-0.299zM512 682.667c0.005 0.208 0.008 0.452 0.008 0.698 0 11.314-6.116 21.199-15.223 26.53l-0.145 0.079c-3.834 2.348-8.474 3.739-13.44 3.739s-9.606-1.391-13.554-3.804l0.114 0.065-284.16-170.667c-9.041-5.855-14.939-15.892-14.939-27.307s5.898-21.451 14.812-27.23l0.126-0.077 284.16-170.667c3.897-2.379 8.605-3.803 13.643-3.84l0.010-0c0.002-0 0.004-0 0.007-0 4.852 0 9.408 1.265 13.357 3.484l-0.137-0.071c9.259 5.408 15.38 15.297 15.38 26.616 0 0.393-0.007 0.784-0.022 1.173l0.002-0.056z"],"attrs":[],"grid":0,"tags":["step-backward-alt"]},"attrs":[],"properties":{"order":5485,"id":199,"name":"step-backward-alt","prevSize":32,"code":60654},"setIdx":0,"setId":0,"iconIdx":1006},{"icon":{"paths":["M937.529 285.047c-0.059-16.237-1.59-32.077-4.466-47.443l0.252 1.619c-3.371-19.914-9.401-37.764-17.799-54.203l0.489 1.055c-9.656-18.25-21.486-33.874-35.429-47.322l-0.055-0.053c-20.963-20.532-47.084-35.878-76.235-43.915l-1.236-0.291c-22.218-5.617-47.725-8.84-73.985-8.84-2.79 0-5.572 0.036-8.345 0.109l0.41-0.008-0.158-0.421h-418.078l-0.023 0.422c-1.044-0.009-2.279-0.014-3.515-0.014-15.303 0-30.427 0.768-45.335 2.268l1.878-0.153c-18.611 2.025-35.605 6.004-51.741 11.785l1.561-0.488c-54.095 20.802-95.031 65.159-110.721 120.16l-0.313 1.282c-5.609 22.17-8.828 47.621-8.828 73.824 0 2.616 0.032 5.224 0.096 7.824l-0.007-0.385-0.281 419.762v0.037c-0.001 0.337-0.002 0.736-0.002 1.135 0 19.642 1.405 38.957 4.121 57.848l-0.255-2.16c3.133 21.421 9.247 40.756 17.975 58.579l-0.514-1.162c12.733 24.727 29.994 45.419 50.863 61.701l0.408 0.307c14.6 11.718 31.634 21.171 50.129 27.461l1.173 0.346c24.557 7.868 52.806 12.402 82.114 12.402 0.785 0 1.569-0.003 2.353-0.010l-0.12 0.001c17.893 0.112 35.773 0.56 53.675 0.484 129.99-0.547 259.982 0.939 389.977-0.802 18.358-0.414 35.983-2.373 53.097-5.756l-1.948 0.321c33.302-6.001 62.44-20.769 85.818-41.811l-0.157 0.139c27.693-24.166 47.719-56.48 56.355-93.187l0.239-1.203c4.699-21.317 7.39-45.803 7.39-70.918 0-1.321-0.007-2.64-0.022-3.957l0.002 0.201v-5c-0-1.94-0.738-425.963-0.805-431.569zM823.349 679.706c-5.456 12.774-33.024 23.365-79.698 30.573-4.38 0.677-6.226 7.758-8.75 19.349-1.044 4.786-2.106 9.479-3.56 14.412-0.856 3.986-4.35 6.931-8.531 6.931-0.246 0-0.489-0.010-0.729-0.030l0.032 0.002h-0.732c-4.804-0.177-9.365-0.78-13.776-1.774l0.498 0.094c-10.498-2.3-22.576-3.646-34.958-3.705l-0.044-0c-8.933 0.024-17.667 0.799-26.165 2.265l0.923-0.132c-18.479 4.774-34.552 13.242-48.094 24.623l0.185-0.152c-22.594 19.381-51.774 31.668-83.778 33.13l-0.303 0.011c-1.771 0-3.461-0.063-4.745-0.125-1.021 0.088-2.073 0.125-3.127 0.125-32.288-1.465-61.452-13.745-84.217-33.273l0.186 0.156c-13.371-11.241-29.46-19.719-47.115-24.314l-0.842-0.186c-7.574-1.335-16.306-2.11-25.216-2.133l-0.021-0c-12.471 0.135-24.533 1.571-36.152 4.178l1.152-0.217c-3.87 0.946-8.414 1.625-13.068 1.894l-0.208 0.010c-0.312 0.038-0.672 0.059-1.038 0.059-4.363 0-8.012-3.057-8.922-7.147l-0.011-0.061c-1.472-4.998-2.526-9.839-3.544-14.503-2.547-11.651-4.395-18.763-8.755-19.437-46.665-7.2-74.236-17.805-79.725-30.648-0.533-1.189-0.881-2.569-0.967-4.021l-0.002-0.033c-0.007-0.125-0.012-0.272-0.012-0.419 0-3.708 2.693-6.787 6.231-7.387l0.044-0.006c39.834-7.394 73.817-28.404 97.694-57.925l0.241-0.307c13.007-14.98 24.175-32.076 32.837-50.579l0.566-1.346 0.171-0.359c3.084-4.971 4.911-11.002 4.911-17.459 0-3.788-0.629-7.43-1.788-10.826l0.070 0.236c-6.013-14.177-25.925-20.495-39.099-24.675-3.276-1.036-6.375-2.018-8.844-3-11.68-4.612-30.886-14.359-28.328-27.813 3.877-9.831 13.293-16.66 24.303-16.66 0.359 0 0.717 0.007 1.073 0.022l-0.051-0.002c0.12-0.003 0.261-0.005 0.402-0.005 2.629 0 5.125 0.565 7.375 1.581l-0.113-0.046c9.204 4.817 20.031 7.85 31.515 8.357l0.162 0.006c0.566 0.043 1.225 0.067 1.89 0.067 6.194 0 11.892-2.124 16.406-5.683l-0.056 0.043q-0.515-9.34-1.125-18.674c-2.011-13.377-3.16-28.814-3.16-44.52 0-28.954 3.904-56.997 11.214-83.63l-0.518 2.212c25.953-58.196 83.299-98.027 149.949-98.027 0.711 0 1.42 0.005 2.129 0.014l-0.107-0.001 12.573-0.117c0.622-0.008 1.356-0.013 2.091-0.013 66.722 0 124.137 39.852 149.739 97.052l0.416 1.039c6.789 24.432 10.692 52.488 10.692 81.456 0 15.731-1.151 31.193-3.373 46.306l0.207-1.715-0.128 2.039c-0.367 5.786-0.706 11.264-0.995 16.573 4.337 3.455 9.896 5.544 15.943 5.544 0.212 0 0.424-0.003 0.635-0.008l-0.031 0.001c11.020-0.852 21.167-3.829 30.286-8.521l-0.445 0.208c2.761-1.228 5.983-1.944 9.371-1.944 0.142 0 0.285 0.001 0.427 0.004l-0.021-0c0.031-0 0.067-0 0.104-0 3.973 0 7.764 0.782 11.226 2.202l-0.023-0.004c8.158 1.987 14.343 8.615 15.651 16.867l0.015 0.118c0.117 6.518-4.729 16.263-28.56 25.677-2.44 0.966-5.555 1.953-8.844 2.997-13.184 4.185-33.081 10.5-39.094 24.669-1.092 3.161-1.722 6.803-1.722 10.592 0 6.455 1.829 12.482 4.997 17.592l-0.082-0.143 0.171 0.367c24.41 54.787 72.027 95.445 130.014 109.874l1.327 0.28c3.582 0.61 6.274 3.691 6.274 7.4 0 0.145-0.004 0.289-0.012 0.432l0.001-0.020c-0.094 1.497-0.449 2.888-1.021 4.161l0.030-0.076z"],"attrs":[],"grid":0,"tags":["snapchat-square"]},"attrs":[],"properties":{"order":5486,"id":198,"name":"snapchat-square","prevSize":32,"code":60655},"setIdx":0,"setId":0,"iconIdx":1007},{"icon":{"paths":["M896 85.333h-768c-23.564 0-42.667 19.103-42.667 42.667v0 768c0 23.564 19.103 42.667 42.667 42.667v0h768c23.564 0 42.667-19.103 42.667-42.667v0-768c0-23.564-19.103-42.667-42.667-42.667v0zM853.333 853.333h-682.667v-682.667h682.667z"],"attrs":[],"grid":0,"tags":["square"]},"attrs":[],"properties":{"order":5487,"id":197,"name":"square","prevSize":32,"code":60656},"setIdx":0,"setId":0,"iconIdx":1008},{"icon":{"paths":["M725.333 85.333h-426.667c-117.821 0-213.333 95.513-213.333 213.333v0 426.667c0 117.821 95.513 213.333 213.333 213.333v0h426.667c117.821 0 213.333-95.513 213.333-213.333v0-426.667c0-117.821-95.513-213.333-213.333-213.333v0zM853.333 725.333c0 70.692-57.308 128-128 128v0h-426.667c-70.692 0-128-57.308-128-128v0-426.667c0-70.692 57.308-128 128-128v0h426.667c70.692 0 128 57.308 128 128v0z"],"attrs":[],"grid":0,"tags":["square-shape"]},"attrs":[],"properties":{"order":5488,"id":196,"name":"square-shape","prevSize":32,"code":60657},"setIdx":0,"setId":0,"iconIdx":1009},{"icon":{"paths":["M217.6 682.667c-12.8-21.333-38.4-25.6-59.733-17.067-21.333 12.8-25.6 38.4-17.067 59.733 12.8 21.333 38.4 25.6 59.733 17.067 21.333-12.8 25.6-38.4 17.067-59.733 0 0 0 0 0 0zM200.533 281.6c-21.333-8.533-46.933-4.267-59.733 17.067-8.533 21.333-4.267 46.933 17.067 59.733 21.333 8.533 46.933 4.267 59.733-17.067 8.533-21.333 4.267-46.933-17.067-59.733zM866.133 358.4c21.333-12.8 25.6-38.4 17.067-59.733-12.8-21.333-38.4-25.6-59.733-17.067-21.333 12.8-25.6 38.4-17.067 59.733 12.8 21.333 38.4 25.6 59.733 17.067zM170.667 512c0-25.6-17.067-42.667-42.667-42.667s-42.667 17.067-42.667 42.667 17.067 42.667 42.667 42.667 42.667-17.067 42.667-42.667zM307.2 802.133c-21.333 4.267-38.4 29.867-29.867 51.2 4.267 21.333 29.867 38.4 51.2 29.867 21.333-4.267 38.4-29.867 29.867-51.2-4.267-21.333-25.6-34.133-51.2-29.867zM896 469.333c-25.6 0-42.667 17.067-42.667 42.667s17.067 42.667 42.667 42.667 42.667-17.067 42.667-42.667-17.067-42.667-42.667-42.667zM866.133 665.6c-21.333-12.8-46.933-4.267-59.733 17.067s-4.267 46.933 17.067 59.733c21.333 12.8 46.933 4.267 59.733-17.067 0 0 0 0 0 0 8.533-21.333 4.267-46.933-17.067-59.733zM725.333 140.8c-21.333-12.8-46.933-4.267-59.733 17.067s-4.267 46.933 17.067 59.733c21.333 12.8 46.933 4.267 59.733-17.067 0 0 0 0 0 0 8.533-21.333 4.267-46.933-17.067-59.733zM716.8 802.133c-21.333-4.267-46.933 8.533-51.2 29.867s8.533 46.933 29.867 51.2c21.333 4.267 46.933-8.533 51.2-29.867s-8.533-42.667-29.867-51.2zM512 853.333c-25.6 0-42.667 17.067-42.667 42.667s17.067 42.667 42.667 42.667 42.667-17.067 42.667-42.667-17.067-42.667-42.667-42.667zM512 85.333c-25.6 0-42.667 17.067-42.667 42.667s17.067 42.667 42.667 42.667 42.667-17.067 42.667-42.667-17.067-42.667-42.667-42.667z"],"attrs":[],"grid":0,"tags":["spinner"]},"attrs":[],"properties":{"order":5489,"id":195,"name":"spinner","prevSize":32,"code":60658},"setIdx":0,"setId":0,"iconIdx":1010},{"icon":{"paths":["M896 85.333h-768c-23.564 0-42.667 19.103-42.667 42.667v0 768c0 23.564 19.103 42.667 42.667 42.667v0h768c23.564 0 42.667-19.103 42.667-42.667v0-768c0-23.564-19.103-42.667-42.667-42.667v0zM853.333 853.333h-682.667v-682.667h682.667z"],"attrs":[],"grid":0,"tags":["square-full"]},"attrs":[],"properties":{"order":5490,"id":194,"name":"square-full","prevSize":32,"code":60659},"setIdx":0,"setId":0,"iconIdx":1011},{"icon":{"paths":["M554.667 128c-164.949 0-298.667 133.718-298.667 298.667s133.718 298.667 298.667 298.667v0c117.821 0 213.333-95.513 213.333-213.333s-95.513-213.333-213.333-213.333v0c-70.692 0-128 57.308-128 128s57.308 128 128 128v0c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667v0c70.692 0 128 57.308 128 128s-57.308 128-128 128v0c-117.821 0-213.333-95.513-213.333-213.333s95.513-213.333 213.333-213.333v0c164.949 0 298.667 133.718 298.667 298.667s-133.718 298.667-298.667 298.667v0c-212.077 0-384-171.923-384-384v0c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0c0 259.206 210.128 469.333 469.333 469.333v0c212.077 0 384-171.923 384-384s-171.923-384-384-384v0z"],"attrs":[],"grid":0,"tags":["spin"]},"attrs":[],"properties":{"order":5491,"id":193,"name":"spin","prevSize":32,"code":60660},"setIdx":0,"setId":0,"iconIdx":1012},{"icon":{"paths":["M640 341.333h-256c-23.564 0-42.667 19.103-42.667 42.667v0 256c0 23.564 19.103 42.667 42.667 42.667v0h256c23.564 0 42.667-19.103 42.667-42.667v0-256c0-23.564-19.103-42.667-42.667-42.667v0zM597.333 597.333h-170.667v-170.667h170.667zM512 85.333c-235.641 0-426.667 191.025-426.667 426.667s191.025 426.667 426.667 426.667c235.641 0 426.667-191.025 426.667-426.667v0c0-235.641-191.025-426.667-426.667-426.667v0zM512 853.333c-188.513 0-341.333-152.82-341.333-341.333s152.82-341.333 341.333-341.333c188.513 0 341.333 152.82 341.333 341.333v0c0 188.513-152.82 341.333-341.333 341.333v0z"],"attrs":[],"grid":0,"tags":["stop-circle"]},"attrs":[],"properties":{"order":5492,"id":192,"name":"stop-circle","prevSize":32,"code":60661},"setIdx":0,"setId":0,"iconIdx":1013},{"icon":{"paths":["M452.267 240.213c-20.415 3.774-35.672 21.438-35.672 42.667 0 23.943 19.41 43.352 43.352 43.352 2.715 0 5.371-0.249 7.947-0.727l-0.267 0.041c12.753-2.317 27.5-3.708 42.547-3.839l0.119-0.001c141.385-0 256 114.615 256 256v0c-0.132 15.167-1.523 29.914-4.075 44.26l0.235-1.593c-0.429 2.272-0.675 4.886-0.675 7.557 0 20.785 14.863 38.099 34.54 41.894l0.268 0.043h7.68c0.207 0.004 0.451 0.006 0.696 0.006 20.851 0 38.209-14.957 41.929-34.727l0.041-0.265c3.761-17.557 6.076-37.851 6.397-58.629l0.003-0.251c-0.21-79.385-27.488-152.358-73.086-210.22l0.552 0.727 38.827-38.4c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l0-0-38.4 38.827c-57-44.575-129.658-71.528-208.605-71.68l-0.035-0c-0.181-0-0.394-0.001-0.608-0.001-20.91 0-41.348 2.019-61.131 5.873l2.005-0.325zM426.667 192h170.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-170.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM575.573 579.413s0-2.133 0-3.413 0-2.133 0-3.413l57.173-56.747c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l-56.747 56.747h-6.827l-264.96-264.96c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l59.307 59.307c-44.271 56.997-70.973 129.56-70.973 208.36 0 188.513 152.82 341.333 341.333 341.333 78.8 0 151.363-26.702 209.135-71.552l-0.775 0.579 59.307 59.307c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003zM512 832c-0.211 0.001-0.46 0.001-0.709 0.001-141.385 0-256-114.615-256-256 0-56.060 18.020-107.911 48.582-150.078l-0.513 0.744 145.067 144.64s0 2.133 0 3.413c-0.008 0.381-0.013 0.831-0.013 1.281 0 35.201 28.418 63.764 63.564 63.999l0.022 0h3.413l144.64 145.067c-41.102 29.354-92.368 46.934-147.74 46.934-0.11 0-0.22-0-0.33-0l0.017 0z"],"attrs":[],"grid":0,"tags":["stopwatch-slash"]},"attrs":[],"properties":{"order":5493,"id":191,"name":"stopwatch-slash","prevSize":32,"code":60662},"setIdx":0,"setId":0,"iconIdx":1014},{"icon":{"paths":["M371.627 311.040c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293v0l140.8 140.373-140.8 140.373c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 170.667-170.667c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003zM682.667 298.667c-23.564 0-42.667 19.103-42.667 42.667v0 341.333c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-341.333c0-23.564-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["step-forward"]},"attrs":[],"properties":{"order":5494,"id":190,"name":"step-forward","prevSize":32,"code":60663},"setIdx":0,"setId":0,"iconIdx":1015},{"icon":{"paths":["M865.28 146.347c-20.070-12.071-44.295-19.212-70.187-19.212s-50.116 7.14-70.811 19.559l0.625-0.348-383.573 230.827v-121.173c0-70.692-57.308-128-128-128s-128 57.308-128 128v0 512c0 70.692 57.308 128 128 128s128-57.308 128-128v0-121.173l384 229.12c20.453 12.509 45.187 19.954 71.652 20.053l0.028 0c25.284-0.024 48.973-6.831 69.352-18.701l-0.658 0.354c44.138-25.222 73.406-72.010 73.406-125.634 0-0.832-0.007-1.662-0.021-2.491l0.002 0.125v-475.733c0.006-0.507 0.010-1.106 0.010-1.705 0-53.792-29.452-100.706-73.109-125.495l-0.714-0.373zM256 768c0 23.564-19.103 42.667-42.667 42.667s-42.667-19.103-42.667-42.667v0-512c0-23.564 19.103-42.667 42.667-42.667s42.667 19.103 42.667 42.667v0zM853.333 750.080c0.010 0.402 0.015 0.875 0.015 1.35 0 22.172-12.080 41.523-30.018 51.829l-0.291 0.154c-7.778 4.812-17.209 7.664-27.307 7.664s-19.529-2.852-27.533-7.794l0.226 0.13-398.080-238.933c-17.592-11.112-29.105-30.451-29.105-52.48s11.513-41.368 28.851-52.33l0.254-0.15 397.653-238.080c7.942-5.088 17.631-8.11 28.025-8.11 0.197 0 0.394 0.001 0.591 0.003l-0.030-0c9.755 0.159 18.853 2.831 26.717 7.395l-0.264-0.141c18.228 10.46 30.309 29.811 30.309 51.983 0 0.475-0.006 0.948-0.017 1.42l0.001-0.070z"],"attrs":[],"grid":0,"tags":["step-backward"]},"attrs":[],"properties":{"order":5495,"id":189,"name":"step-backward","prevSize":32,"code":60664},"setIdx":0,"setId":0,"iconIdx":1016},{"icon":{"paths":["M938.667 85.333h-853.333c-23.564 0-42.667 19.103-42.667 42.667v0 170.667c0.16 55.254 35.305 102.258 84.442 120.038l0.891 0.282v477.013c0 23.564 19.103 42.667 42.667 42.667v0h682.667c23.564 0 42.667-19.103 42.667-42.667v0-477.013c50.028-18.062 85.173-65.066 85.333-120.3l0-0.020v-170.667c0-23.564-19.103-42.667-42.667-42.667v0zM640 170.667h85.333v128c0 23.564-19.103 42.667-42.667 42.667s-42.667-19.103-42.667-42.667v0zM469.333 170.667h85.333v128c0 23.564-19.103 42.667-42.667 42.667s-42.667-19.103-42.667-42.667v0zM298.667 170.667h85.333v128c0 23.564-19.103 42.667-42.667 42.667s-42.667-19.103-42.667-42.667v0zM170.667 341.333c-23.564 0-42.667-19.103-42.667-42.667v0-128h85.333v128c0 23.564-19.103 42.667-42.667 42.667v0zM597.333 853.333h-170.667v-170.667c0-47.128 38.205-85.333 85.333-85.333s85.333 38.205 85.333 85.333v0zM810.667 853.333h-128v-170.667c0-94.257-76.41-170.667-170.667-170.667s-170.667 76.41-170.667 170.667v0 170.667h-128v-434.347c16.457-6.205 30.617-14.877 42.803-25.719l-0.137 0.119c22.54 20.227 52.493 32.594 85.333 32.594s62.793-12.368 85.453-32.7l-0.119 0.105c22.54 20.227 52.493 32.594 85.333 32.594s62.793-12.368 85.453-32.7l-0.119 0.105c22.54 20.227 52.493 32.594 85.333 32.594s62.793-12.368 85.453-32.7l-0.119 0.105c12.050 10.723 26.21 19.395 41.737 25.29l0.929 0.31zM896 298.667c0 23.564-19.103 42.667-42.667 42.667s-42.667-19.103-42.667-42.667v0-128h85.333z"],"attrs":[],"grid":0,"tags":["store-alt"]},"attrs":[],"properties":{"order":5496,"id":188,"name":"store-alt","prevSize":32,"code":60665},"setIdx":0,"setId":0,"iconIdx":1017},{"icon":{"paths":["M936.583 666.208c-54.345-12.949-99.193-46.532-126.704-91.814l-0.504-0.894c-7.78-11.379-20.696-18.75-35.333-18.75-23.564 0-42.667 19.103-42.667 42.667 0 8.927 2.741 17.213 7.428 24.063l-0.094-0.146c26.798 40.488 61.070 73.83 101.113 98.778l1.387 0.806c-5.75 1.084-12 2.125-18.833 3.209-24.745 5.4-43.408 25.954-45.897 51.258l-0.019 0.241c-13.070-2.341-28.116-3.68-43.474-3.68-15.005 0-29.712 1.278-44.017 3.73l1.533-0.217c-32.201 7.26-60.336 21.482-83.863 41.052l0.322-0.26c-23.948 21.311-55.068 35.030-89.329 37.146l-0.422 0.021h-11.125c-34.721-2.144-65.872-15.894-89.981-37.378l0.148 0.13c-22.877-19.058-50.569-33.157-80.958-40.238l-1.334-0.262c-12.927-2.172-27.821-3.413-43.005-3.413-15.55 0-30.797 1.302-45.636 3.803l1.601-0.223c-2.397-25.439-20.805-45.979-44.94-51.55l-0.393-0.076c-6.708-1.041-12.875-2.083-18.542-3.167 29.732-17.388 55.035-38.67 76.243-63.548l0.34-0.409c9.497-10.961 18.427-23.059 26.38-35.829l0.704-1.213c4.061-6.412 6.472-14.219 6.472-22.589 0-23.561-19.1-42.661-42.661-42.661-15.161 0-28.475 7.909-36.041 19.826l-0.103 0.174c-6.149 9.933-12.454 18.519-19.361 26.573l0.236-0.282c-26.777 33.328-64.57 56.843-107.786 65.030l-1.13 0.178c-25.116 4.090-44.056 25.626-44.056 51.586 0 0.395 0.004 0.788 0.013 1.181l-0.001-0.058c-0 0.030-0 0.065-0 0.1 0 8.212 1.812 16 5.058 22.988l-0.141-0.337c13.458 30.542 49.292 49.835 118.791 62.917l1.334 5.542c1.208 5.041 2.458 10.167 3.916 14.833 6.626 23.455 27.839 40.355 52.999 40.355 0.543 0 1.083-0.008 1.622-0.023l-0.079 0.002c9.241-0.243 18.063-1.581 26.484-3.89l-0.776 0.181c11.894-2.523 25.561-3.968 39.565-3.968 9.958 0 19.745 0.731 29.311 2.141l-1.084-0.131c18.533 5.589 34.551 14.63 48.065 26.461l-0.148-0.127c37.567 31.192 85.762 50.774 138.463 52.698l0.412 0.012h11.125c53.442-2.022 101.908-21.795 140.042-53.552l-0.376 0.304c13.429-11.737 29.605-20.697 47.414-25.786l0.877-0.214c7.752-1.433 16.671-2.252 25.782-2.252 0.296 0 0.592 0.001 0.888 0.003l-0.046-0c0.095-0 0.208-0 0.32-0 14.334 0 28.282 1.655 41.663 4.785l-1.232-0.243c7.782 1.528 16.832 2.504 26.072 2.705l0.178 0.003c0.43 0.012 0.937 0.019 1.445 0.019 24.547 0 45.239-16.502 51.589-39.017l0.091-0.378c1.625-5.208 2.875-10.208 4.041-15.125l1.333-5.291c69.291-13.041 105.25-32.208 118.083-61.458 3.103-5.946 5.067-12.935 5.414-20.347l0.004-0.112c0.107-1.262 0.168-2.732 0.168-4.216 0-26.244-19.041-48.040-44.062-52.328l-0.315-0.045zM162.208 475.667c2.398 0.476 5.154 0.748 7.974 0.748 15.774 0 29.559-8.522 36.999-21.213l0.109-0.202c15.807 8.219 34.376 13.438 54.063 14.404l0.312 0.012c0.301 0.004 0.657 0.007 1.013 0.007 20.576 0 39.256-8.116 53.013-21.322l-0.026 0.025c8.361-7.813 13.572-18.907 13.572-31.217 0-0.876-0.026-1.745-0.078-2.608l0.006 0.119-1.542-25.667c-2.525-17.353-3.967-37.389-3.967-57.761 0-33.401 3.876-65.897 11.202-97.062l-0.567 2.862c28.874-64.465 92.468-108.564 166.362-108.564 1.001 0 2 0.008 2.997 0.024l-0.151-0.002 16.542-0.167c0.722-0.010 1.575-0.016 2.429-0.016 73.971 0 137.631 44.147 166.070 107.531l0.462 1.152c6.759 28.325 10.635 60.845 10.635 94.27 0 20.391-1.442 40.444-4.23 60.065l0.262-2.252-0.417 6.959-1.167 18.917c-0.021 0.502-0.032 1.091-0.032 1.683 0 12.368 5.119 23.54 13.354 31.514l0.012 0.011c13.756 13.278 32.508 21.459 53.171 21.459 0.116 0 0.231-0 0.347-0.001l-0.018 0c19.629-1.759 37.612-7.322 53.706-15.949l-0.747 0.366c6.774 15.159 21.716 25.533 39.081 25.542l0.751 0c23.243-0.423 41.923-19.364 41.923-42.669 0-0.263-0.002-0.525-0.007-0.787l0.001 0.039c-2.366-29.559-22.763-53.78-50.088-61.793l-0.495-0.124c-9.152-3.853-19.79-6.092-30.951-6.092-11.579 0-22.596 2.41-32.576 6.755l0.527-0.204c2.118-15.54 3.326-33.501 3.326-51.743 0-43.101-6.748-84.626-19.244-123.577l0.793 2.861c-42.189-94.559-135.379-159.275-243.684-159.275-1.268 0-2.535 0.009-3.799 0.027l0.191-0.002-16.75 0.167c-0.964-0.013-2.104-0.020-3.244-0.020-108.155 0-201.205 64.674-242.586 157.458l-0.672 1.687c-11.717 36.338-18.472 78.145-18.472 121.529 0 18.751 1.262 37.207 3.705 55.288l-0.233-2.108c-1.458-0.667-3.042-1.417-4.75-2.208-9.038-3.762-19.537-5.946-30.546-5.946-36.276 0-67.011 23.719-77.544 56.495l-0.16 0.576c-0.487 2.42-0.765 5.202-0.765 8.049 0 20.723 14.751 38.001 34.326 41.905l0.272 0.045z"],"attrs":[],"grid":0,"tags":["snapchat-alt"]},"attrs":[],"properties":{"order":5497,"id":187,"name":"snapchat-alt","prevSize":32,"code":60666},"setIdx":0,"setId":0,"iconIdx":1018},{"icon":{"paths":["M695.040 609.707l-183.040 183.467-183.040-183.467c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l213.333 213.333c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 213.333-213.333c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l0-0zM328.96 414.293l183.040-183.467 183.040 183.467c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003-213.333-213.333c-7.733-7.795-18.45-12.621-30.293-12.621s-22.56 4.826-30.291 12.618l-0.003 0.003-213.333 213.333c-7.753 7.753-12.548 18.463-12.548 30.293 0 23.661 19.181 42.841 42.841 42.841 11.83 0 22.541-4.795 30.293-12.548v0z"],"attrs":[],"grid":0,"tags":["sort"]},"attrs":[],"properties":{"order":5498,"id":186,"name":"sort","prevSize":32,"code":60667},"setIdx":0,"setId":0,"iconIdx":1019},{"icon":{"paths":["M268.373 609.707l-12.373 12.8v-323.84c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 323.84l-12.373-12.8c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l85.333 85.333c3.937 3.773 8.616 6.808 13.791 8.859l0.289 0.101c4.771 2.163 10.345 3.423 16.213 3.423s11.443-1.26 16.466-3.525l-0.253 0.102c5.464-2.152 10.143-5.187 14.095-8.974l-0.015 0.014 85.333-85.333c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l0-0zM469.333 341.333h426.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-426.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM896 469.333h-426.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h426.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM896 682.667h-426.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h426.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["sort-amount-down"]},"attrs":[],"properties":{"order":5499,"id":185,"name":"sort-amount-down","prevSize":32,"code":60668},"setIdx":0,"setId":0,"iconIdx":1020},{"icon":{"paths":["M362.667 725.333h-110.333l12.501-12.501c7.607-7.701 12.306-18.289 12.306-29.975 0-23.562-19.1-42.662-42.662-42.662-11.687 0-22.276 4.699-29.981 12.311l0.004-0.004-85.321 85.32c-7.691 7.739-12.444 18.404-12.444 30.18s4.754 22.441 12.447 30.182l-0.002-0.002 85.321 85.318c7.692 7.558 18.247 12.223 29.892 12.223 23.562 0 42.662-19.1 42.662-42.662 0-11.645-4.666-22.2-12.229-29.898l0.006 0.006-12.499-12.501h110.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM904.82 737.82l-85.322-85.319c-7.692-7.558-18.247-12.223-29.892-12.223-23.562 0-42.662 19.1-42.662 42.662 0 11.645 4.666 22.2 12.229 29.898l-0.006-0.006 12.501 12.501h-110.336c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h110.333l-12.501 12.501c-7.834 7.739-12.685 18.48-12.685 30.355 0 23.562 19.1 42.662 42.662 42.662 11.875 0 22.618-4.852 30.352-12.682l0.004-0.004 85.321-85.32c7.691-7.739 12.444-18.404 12.444-30.18s-4.754-22.441-12.447-30.182l0.002 0.002zM880.651 416.93c22.652-25.752 36.527-59.706 36.682-96.897l0-0.032c0-82.475-66.859-149.333-149.333-149.333s-149.333 66.859-149.333 149.333v0c0.155 37.224 14.030 71.177 36.824 97.095l-0.142-0.165c-60.7 38.083-100.505 104.575-100.682 180.377l-0 0.026c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0c0-70.692 57.308-128 128-128s128 57.308 128 128v0c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0c-0.177-75.828-39.982-142.321-99.796-179.884l-0.886-0.519zM768 384c-35.346 0-64-28.654-64-64s28.654-64 64-64c35.346 0 64 28.654 64 64v0c-0.040 35.33-28.67 63.96-63.996 64l-0.004 0zM368.651 416.93c22.652-25.752 36.527-59.706 36.682-96.897l0-0.032c0-82.475-66.859-149.333-149.333-149.333s-149.333 66.859-149.333 149.333v0c0.155 37.224 14.030 71.177 36.824 97.095l-0.142-0.165c-60.7 38.083-100.505 104.575-100.682 180.377l-0 0.026c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0c0-70.692 57.308-128 128-128s128 57.308 128 128v0c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0c-0.177-75.828-39.982-142.321-99.796-179.884l-0.886-0.519zM256 384c-35.346 0-64-28.654-64-64s28.654-64 64-64c35.346 0 64 28.654 64 64v0c-0.040 35.33-28.67 63.96-63.996 64l-0.004 0z"],"attrs":[],"grid":0,"tags":["social-distancing"]},"attrs":[],"properties":{"order":5500,"id":184,"name":"social-distancing","prevSize":32,"code":60669},"setIdx":0,"setId":0,"iconIdx":1021},{"icon":{"paths":["M682.667 725.333c23.564 0 42.667-19.103 42.667-42.667v0c0.1-1.277 0.157-2.765 0.157-4.267s-0.057-2.99-0.169-4.463l0.012 0.196c-0.513-2.882-1.403-5.459-2.632-7.832l0.072 0.152c-1.020-2.93-2.319-5.469-3.912-7.79l0.072 0.11-5.12-6.4c-4.001-3.646-8.658-6.662-13.76-8.838l-0.32-0.122c-4.793-2.024-10.366-3.201-16.213-3.201s-11.42 1.176-16.495 3.305l0.281-0.105c-5.422 2.298-10.079 5.314-14.119 8.995l0.039-0.035-5.12 6.4c-1.521 2.211-2.82 4.75-3.77 7.453l-0.070 0.227c-1.157 2.221-2.047 4.798-2.535 7.514l-0.025 0.166c-0.1 1.277-0.157 2.765-0.157 4.267s0.057 2.99 0.169 4.463l-0.012-0.196c0 23.564 19.103 42.667 42.667 42.667v0zM768 85.333h-512c-70.692 0-128 57.308-128 128v0 512c0.143 41.572 20.082 78.457 50.878 101.74l0.322 0.233-38.827 38.4c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 72.533-72.96h477.013l72.533 72.96c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003-38.827-38.4c31.118-23.516 51.057-60.401 51.2-101.95l0-0.023v-512c0-70.692-57.308-128-128-128v0zM213.333 341.333h256v170.667h-256zM810.667 725.333c0 23.564-19.103 42.667-42.667 42.667v0h-512c-23.564 0-42.667-19.103-42.667-42.667v0-128h597.333zM810.667 512h-256v-170.667h256zM810.667 256h-597.333v-42.667c0-23.564 19.103-42.667 42.667-42.667v0h512c23.564 0 42.667 19.103 42.667 42.667v0zM341.333 725.333c23.564 0 42.667-19.103 42.667-42.667v0c0.1-1.277 0.157-2.765 0.157-4.267s-0.057-2.99-0.169-4.463l0.012 0.196c-0.513-2.882-1.403-5.459-2.632-7.832l0.072 0.152c-1.020-2.93-2.319-5.469-3.912-7.79l0.072 0.11-5.12-6.4c-4.001-3.646-8.658-6.662-13.76-8.838l-0.32-0.122c-4.793-2.024-10.366-3.201-16.213-3.201s-11.42 1.176-16.495 3.305l0.281-0.105c-5.422 2.298-10.079 5.314-14.119 8.995l0.039-0.035-5.12 6.4c-1.521 2.211-2.82 4.75-3.77 7.453l-0.070 0.227c-1.749 2.197-3.192 4.74-4.206 7.491l-0.061 0.189c-0.1 1.277-0.157 2.765-0.157 4.267s0.057 2.99 0.169 4.463l-0.012-0.196c0.051 11.656 4.767 22.2 12.376 29.869l-0.003-0.003c7.709 7.861 18.426 12.749 30.284 12.8l0.010 0z"],"attrs":[],"grid":0,"tags":["subway"]},"attrs":[],"properties":{"order":5501,"id":183,"name":"subway","prevSize":32,"code":60670},"setIdx":0,"setId":0,"iconIdx":1022},{"icon":{"paths":["M640 725.333h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM896 725.333v-341.333c0-70.692-57.308-128-128-128v0h-213.333v-85.333h170.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-426.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h170.667v85.333h-213.333c-70.692 0-128 57.308-128 128v0 341.333c0.143 41.572 20.082 78.457 50.878 101.74l0.322 0.233-38.827 38.4c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 72.533-72.96h477.013l72.533 72.96c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003-38.827-38.4c31.118-23.516 51.057-60.401 51.2-101.95l0-0.023zM213.333 384c0-23.564 19.103-42.667 42.667-42.667v0h213.333v170.667h-256zM810.667 725.333c0 23.564-19.103 42.667-42.667 42.667v0h-512c-23.564 0-42.667-19.103-42.667-42.667v0-128h597.333zM810.667 512h-256v-170.667h213.333c23.564 0 42.667 19.103 42.667 42.667v0zM341.333 725.333h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["subway-alt"]},"attrs":[],"properties":{"order":5502,"id":182,"name":"subway-alt","prevSize":32,"code":60671},"setIdx":0,"setId":0,"iconIdx":1023},{"icon":{"paths":["M780.8 366.507l38.827-38.4c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l0-0-38.4 38.827c-57.087-44.503-129.834-71.354-208.853-71.354s-151.766 26.851-209.616 71.926l0.763-0.572-38.827-39.253c-7.769-7.716-18.474-12.486-30.293-12.486-23.744 0-42.992 19.248-42.992 42.992 0 11.925 4.855 22.716 12.697 30.504l0.002 0.002 39.253 38.827c-44.951 56.854-72.107 129.579-72.107 208.646 0 0.148 0 0.295 0 0.443l-0-0.023c-0.001 0.26-0.001 0.567-0.001 0.874 0 188.513 152.82 341.333 341.333 341.333s341.333-152.82 341.333-341.333c0-79.693-27.311-153.008-73.085-211.094l0.552 0.727zM512 832c-141.385 0-256-114.615-256-256s114.615-256 256-256c141.385 0 256 114.615 256 256v0c0 141.385-114.615 256-256 256v0zM426.667 192h170.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-170.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM554.667 448c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 80.64c-13.118 11.77-21.333 28.777-21.333 47.703 0 35.346 28.654 64 64 64s64-28.654 64-64c0-18.926-8.215-35.933-21.274-47.65l-0.060-0.053z"],"attrs":[],"grid":0,"tags":["stopwatch"]},"attrs":[],"properties":{"order":5503,"id":181,"name":"stopwatch","prevSize":32,"code":60672},"setIdx":0,"setId":0,"iconIdx":1024},{"icon":{"paths":["M554.667 682.667h-426.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h426.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM128 341.333h768c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-768c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM896 469.333h-768c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h768c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["subject"]},"attrs":[],"properties":{"order":5504,"id":180,"name":"subject","prevSize":32,"code":60673},"setIdx":0,"setId":0,"iconIdx":1025},{"icon":{"paths":["M661.333 314.88c-12.239-7.187-26.957-11.432-42.667-11.432s-30.427 4.245-43.069 11.651l0.403-0.218-170.667 98.56v-72.107c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 341.333c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-72.107l170.667 98.56c12.239 7.187 26.957 11.432 42.667 11.432s30.427-4.245 43.069-11.651l-0.403 0.218c25.662-15.015 42.633-42.428 42.667-73.809l0-0.005v-246.613c-0.033-31.385-17.005-58.799-42.264-73.595l-0.403-0.218zM618.667 635.307l-213.333-123.307 213.333-123.307zM512 85.333c-235.641 0-426.667 191.025-426.667 426.667s191.025 426.667 426.667 426.667c235.641 0 426.667-191.025 426.667-426.667v0c0-235.641-191.025-426.667-426.667-426.667v0zM512 853.333c-188.513 0-341.333-152.82-341.333-341.333s152.82-341.333 341.333-341.333c188.513 0 341.333 152.82 341.333 341.333v0c0 188.513-152.82 341.333-341.333 341.333v0z"],"attrs":[],"grid":0,"tags":["step-backward-circle"]},"attrs":[],"properties":{"order":5505,"id":179,"name":"step-backward-circle","prevSize":32,"code":60674},"setIdx":0,"setId":0,"iconIdx":1026},{"icon":{"paths":["M768 192h128c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-128c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM896 277.333h-768c-23.564 0-42.667 19.103-42.667 42.667v0 170.667c0 23.564 19.103 42.667 42.667 42.667v0h66.133l218.027 109.227-110.080 55.040c-22.911-22.314-54.202-36.121-88.718-36.267l-0.028-0c-70.692 0-128 57.308-128 128s57.308 128 128 128c70.692 0 128-57.308 128-128v0c0.2-2.3 0.315-4.977 0.315-7.68s-0.114-5.38-0.338-8.025l0.024 0.345 168.107-85.333 173.227 89.6c-0.1 1.658-0.157 3.595-0.157 5.547s0.057 3.889 0.169 5.812l-0.012-0.266c0 70.692 57.308 128 128 128s128-57.308 128-128c0-70.692-57.308-128-128-128v0c-36.030 0.147-68.525 15.158-91.695 39.213l-0.038 0.040-116.053-58.027 218.027-109.227h75.093c23.564 0 42.667-19.103 42.667-42.667v0-170.667c0-23.564-19.103-42.667-42.667-42.667v0zM213.333 832c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667c23.564 0 42.667 19.103 42.667 42.667v0c0 23.564-19.103 42.667-42.667 42.667v0zM810.667 746.667c23.564 0 42.667 19.103 42.667 42.667s-19.103 42.667-42.667 42.667c-23.564 0-42.667-19.103-42.667-42.667v0c0-23.564 19.103-42.667 42.667-42.667v0zM507.733 594.773l-123.733-61.44h245.333zM853.333 448h-682.667v-85.333h682.667z"],"attrs":[],"grid":0,"tags":["stretcher"]},"attrs":[],"properties":{"order":5506,"id":178,"name":"stretcher","prevSize":32,"code":60675},"setIdx":0,"setId":0,"iconIdx":1027},{"icon":{"paths":["M938.667 333.653c0.098-1.213 0.154-2.627 0.154-4.053s-0.056-2.84-0.166-4.238l0.012 0.185-85.333-213.333c-6.424-15.94-21.762-26.985-39.68-26.985-1.051 0-2.093 0.038-3.125 0.113l0.138-0.008h-597.333c-0.012-0-0.027-0-0.041-0-17.878 0-33.189 10.996-39.536 26.595l-0.103 0.285-85.333 213.333c-0.098 1.213-0.154 2.627-0.154 4.053s0.056 2.84 0.166 4.238l-0.012-0.185c-1.343 2.21-2.377 4.781-2.958 7.518l-0.029 0.162c1.026 61.781 34.725 115.467 84.528 144.631l0.806 0.436v409.6c0 23.564 19.103 42.667 42.667 42.667v0h597.333c23.564 0 42.667-19.103 42.667-42.667v0-407.893c51.084-29.887 84.944-84.332 85.333-146.718l0-0.056c0.191-1.154 0.3-2.484 0.3-3.84s-0.109-2.686-0.319-3.982l0.019 0.142zM554.667 853.333h-85.333v-170.667h85.333zM768 853.333h-128v-213.333c0-23.564-19.103-42.667-42.667-42.667v0h-170.667c-23.564 0-42.667 19.103-42.667 42.667v0 213.333h-128v-341.333c51.047-0.297 96.741-22.959 127.824-58.674l0.176-0.206c31.425 35.509 77.111 57.781 128 57.781s96.575-22.272 127.843-57.601l0.157-0.18c31.259 35.921 76.953 58.583 127.948 58.88l0.052 0zM768 426.667c-47.128 0-85.333-38.205-85.333-85.333v0c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0c0 47.128-38.205 85.333-85.333 85.333s-85.333-38.205-85.333-85.333v0c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0c0.038 0.954 0.060 2.075 0.060 3.2 0 47.161-38.232 85.393-85.393 85.393-46.036 0-83.564-36.429-85.328-82.033l-0.005-0.16 71.68-177.067h539.307l71.68 177.067c-3.432 44.293-40.217 78.934-85.093 78.934-0.085 0-0.169-0-0.253-0l0.013 0z"],"attrs":[],"grid":0,"tags":["store"]},"attrs":[],"properties":{"order":5507,"id":177,"name":"store","prevSize":32,"code":60676},"setIdx":0,"setId":0,"iconIdx":1028},{"icon":{"paths":["M512 512c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM926.293 411.307c-48.017-186.975-215.064-322.942-413.867-322.942s-365.85 135.967-413.22 319.983l-0.646 2.959c-7.859 30.23-12.37 64.935-12.37 100.693s4.512 70.463 12.997 103.576l-0.627-2.883c38.484 154.439 157.335 273.858 308.512 312.532l2.955 0.641c30.101 7.858 64.657 12.369 100.267 12.369s70.166-4.511 103.129-12.994l-2.862 0.625c154.009-38.968 272.926-157.885 311.259-308.943l0.634-2.95c7.859-30.23 12.37-64.935 12.37-100.693s-4.512-70.463-12.997-103.576l0.627 2.883zM512 170.667c142.276 0.114 264.17 87.258 315.33 211.066l0.83 2.267h-632.32c51.99-126.075 173.884-213.22 316.146-213.333l0.014-0zM170.667 512c0.143-15.187 1.224-29.977 3.188-44.486l-0.201 1.819h82.347v85.333h-82.347c-1.762-12.69-2.843-27.479-2.985-42.493l-0.001-0.173zM384 828.16c-85.865-35.434-152.726-102.295-187.329-185.895l-0.831-2.265h102.827c47.128 0 85.333 38.205 85.333 85.333v0zM554.667 850.347c-12.69 1.762-27.479 2.843-42.493 2.985l-0.173 0.001c-15.187-0.143-29.977-1.224-44.486-3.188l1.819 0.201v-82.347h85.333zM560.64 682.667h-97.28c-15.993-59.846-62.181-106.033-120.833-121.754l-1.193-0.272v-91.307h341.333v91.307c-59.846 15.993-106.033 62.181-121.754 120.833l-0.272 1.193zM640 828.16v-102.827c0-47.128 38.205-85.333 85.333-85.333v0h102.827c-35.434 85.865-102.295 152.726-185.895 187.329l-2.265 0.831zM850.347 554.667h-82.347v-85.333h82.347c1.762 12.69 2.843 27.479 2.985 42.493l0.001 0.173c-0.143 15.187-1.224 29.977-3.188 44.486l0.201-1.819z"],"attrs":[],"grid":0,"tags":["streering"]},"attrs":[],"properties":{"order":5508,"id":176,"name":"streering","prevSize":32,"code":60677},"setIdx":0,"setId":0,"iconIdx":1029},{"icon":{"paths":["M849.493 661.76h-193.28c-23.564-0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667h102.4c-62.247 64.969-149.715 105.347-246.615 105.347-188.199 0-340.824-152.311-341.332-340.391l-0-0.049c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0c0.657 235.144 191.43 425.512 426.665 425.512 113.821 0 217.232-44.569 293.734-117.207l-0.186 0.175v75.52c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-192c-0.226-22.94-18.521-41.533-41.321-42.238l-0.065-0.002zM512 85.333c-113.97 0.335-217.373 45.304-293.704 118.336l0.158-0.15v-75.52c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 192c0 23.564 19.103 42.667 42.667 42.667v0h192c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-102.4c62.247-64.97 149.716-105.348 246.616-105.348 188.049 0 340.581 152.069 341.331 339.943l0 0.072c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0c0-235.641-191.025-426.667-426.667-426.667v0z"],"attrs":[],"grid":0,"tags":["sync"]},"attrs":[],"properties":{"order":5509,"id":175,"name":"sync","prevSize":32,"code":60678},"setIdx":0,"setId":0,"iconIdx":1030},{"icon":{"paths":["M848.213 661.333h-192c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h102.4c-62.065 65.457-149.534 106.297-246.545 106.666l-0.069 0c-48.070-0.049-93.82-9.928-135.365-27.736l2.245 0.856-63.573 63.573c56.805 30.637 124.324 48.64 196.049 48.64 0.227 0 0.453-0 0.68-0.001l-0.035 0c113.97-0.335 217.373-45.304 293.704-118.336l-0.158 0.15v75.52c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-192c0-23.564-19.103-42.667-42.667-42.667v0zM781.227 302.933v0l146.347-146.347c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l-85.333 85.333c-72.269-59.756-165.884-96.003-267.965-96.003-0.594 0-1.187 0.001-1.78 0.004l0.092-0c-113.97 0.335-217.373 45.304-293.704 118.336l0.158-0.15v-75.52c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 192c0 23.564 19.103 42.667 42.667 42.667v0h192c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-102.4c61.864-65.7 149.42-106.611 246.53-106.611 79.084 0 151.83 27.132 209.439 72.596l-0.716-0.545-477.867 477.867c-44.922-56.866-72.070-129.579-72.107-208.632l-0-0.008c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0c-0 0.195-0.001 0.426-0.001 0.657 0 102.551 36.582 196.557 97.409 269.682l-0.555-0.686-85.333 85.333c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 146.347-146.347zM826.453 378.88c16.952 39.3 26.831 85.050 26.88 133.102l0 0.018c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0c0-0.191 0-0.418 0-0.645 0-71.724-18.004-139.244-49.739-198.285l1.099 2.237z"],"attrs":[],"grid":0,"tags":["sync-slash"]},"attrs":[],"properties":{"order":5510,"id":174,"name":"sync-slash","prevSize":32,"code":60679},"setIdx":0,"setId":0,"iconIdx":1031},{"icon":{"paths":["M481.707 670.293c7.733 7.796 18.45 12.621 30.294 12.621 23.564 0 42.667-19.103 42.667-42.667 0-0.087-0-0.174-0.001-0.262l0 0.013c-0.169-11.771-4.851-22.416-12.39-30.311l0.016 0.017c-7.7-7.601-18.286-12.296-29.968-12.296-5.971 0-11.656 1.227-16.817 3.442l0.278-0.106c-5.464 2.152-10.143 5.187-14.095 8.974l0.015-0.014c-7.522 7.877-12.204 18.523-12.373 30.26l-0 0.033c-0 0.073-0.001 0.16-0.001 0.247 0 11.721 4.726 22.338 12.377 30.049l-0.003-0.003zM849.493 661.76h-193.28c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h102.4c-62.247 64.969-149.715 105.347-246.615 105.347-188.199 0-340.824-152.311-341.332-340.391l-0-0.049c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0c0.657 235.144 191.43 425.512 426.665 425.512 113.821 0 217.232-44.569 293.734-117.207l-0.186 0.175v75.52c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-192c-0.226-22.94-18.521-41.533-41.321-42.238l-0.065-0.002zM512 85.333c-113.97 0.335-217.373 45.304-293.704 118.336l0.158-0.15v-75.52c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 192c0 23.564 19.103 42.667 42.667 42.667v0h192c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-102.4c62.247-64.97 149.716-105.348 246.616-105.348 188.049 0 340.581 152.069 341.331 339.943l0 0.072c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0c0-235.641-191.025-426.667-426.667-426.667v0zM512 554.667c23.564 0 42.667-19.103 42.667-42.667v0-128c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 128c0 23.564 19.103 42.667 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["sync-exclamation"]},"attrs":[],"properties":{"order":5511,"id":173,"name":"sync-exclamation","prevSize":32,"code":60680},"setIdx":0,"setId":0,"iconIdx":1032},{"icon":{"paths":["M883.627 686.933l-69.973-69.973c-7.901-7.346-12.827-17.798-12.827-29.4 0-5.884 1.267-11.471 3.543-16.505l-0.102 0.252c14.25-29.88 22.71-64.899 23.039-101.859l0.001-0.115c0.095-0.641 0.149-1.381 0.149-2.133s-0.054-1.492-0.159-2.216l0.010 0.083c0.001-0.21 0.001-0.457 0.001-0.705 0-53.172-16.945-102.386-45.73-142.538l0.502 0.736c-57.268-79.383-131.282-143.157-217.165-187.001l-3.422-1.586c-38.331-19.186-83.513-30.418-131.317-30.418-81.893 0-156.088 32.96-210.043 86.337l0.027-0.026-28.587 28.587c-53.771 54.001-87.013 128.481-87.013 210.724 0 48.363 11.495 94.042 31.903 134.452l-0.783-1.709 4.267 7.253c-21.966 22.764-35.581 53.714-35.84 87.843l-0 0.050c0.543 70.279 57.641 127.042 127.996 127.042 24.612 0 47.602-6.946 67.115-18.986l-0.552 0.317c7.68 5.973 14.507 12.373 22.187 17.92 15.004 10.565 32.174 19.76 50.431 26.76l1.622 0.546h3.84c7.68 2.987 15.787 5.547 24.32 8.107h6.4c11.833 3.181 25.681 5.46 39.901 6.368l0.632 0.032h26.453c8.96 0 17.493 0 26.453-2.56h7.253c22.737-3.977 43.068-10.651 61.975-19.806l-1.388 0.606c4.717-1.954 10.195-3.089 15.938-3.089 11.558 0 22.042 4.595 29.725 12.059l-0.010-0.010 62.293 62.293c26.089 26.178 62.11 42.444 101.931 42.666l0.042 0c33.429-0.37 63.563-14.172 85.319-36.252l0.015-0.015 16.213-16.213c23.292-23.185 37.706-55.272 37.706-90.725 0-33.727-13.044-64.407-34.363-87.271l0.070 0.076zM230.827 700.587c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667c23.564 0 42.667 19.103 42.667 42.667v0c0 23.564-19.103 42.667-42.667 42.667v0zM363.093 706.56l-11.093-8.533c4.248-11.943 6.742-25.72 6.826-40.068l0-0.039c0-70.692-57.308-128-128-128v0c-5.547 0-10.667 0-16.213 0l-3.84-6.827c-14.068-27.686-22.31-60.37-22.31-94.98 0-58.664 23.679-111.798 62.001-150.365l-0.011 0.011 28.587-28.587c38.257-36.712 90.296-59.317 147.615-59.317 35.52 0 69.013 8.681 98.472 24.037l-1.18-0.56c73.084 37.065 133.928 88.492 180.808 150.994l0.952 1.326zM823.040 807.68l-15.787 16.213c-17.92 17.92-45.653 14.507-68.693-8.533l-62.293-61.867c-23.134-22.987-55.015-37.196-90.214-37.196-18.94 0-36.919 4.114-53.093 11.496l0.8-0.327c-12.374 6.213-26.737 10.842-41.868 13.128l-0.799 0.099c-6.833 1.368-14.688 2.15-22.726 2.15-0.71 0-1.42-0.006-2.127-0.018l0.106 0.001h-18.773l293.12-293.12c0.535 4.943 0.84 10.676 0.84 16.48 0 25.003-5.659 48.683-15.767 69.831l0.421-0.977c-7.055 15.373-11.169 33.353-11.169 52.293 0 35.199 14.208 67.080 37.202 90.221l-0.007-0.007 69.973 70.4c7.8 7.734 12.629 18.454 12.629 30.302 0 11.419-4.486 21.791-11.792 29.448l0.016-0.017z"],"attrs":[],"grid":0,"tags":["table-tennis"]},"attrs":[],"properties":{"order":5512,"id":172,"name":"table-tennis","prevSize":32,"code":60681},"setIdx":0,"setId":0,"iconIdx":1033},{"icon":{"paths":["M810.667 341.333c-0.095-0-0.207-0-0.32-0-70.516 0-127.681 57.165-127.681 127.681 0 55.34 35.207 102.457 84.444 120.175l0.89 0.28v71.865c0 106.039-85.961 192-192 192s-192-85.961-192-192v0-25.187c121.72-21.217 213.112-125.976 213.333-252.122l0-0.024v-256c0-23.564-19.103-42.667-42.667-42.667v0h-85.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h42.667v213.333c0 94.257-76.41 170.667-170.667 170.667s-170.667-76.41-170.667-170.667v0-213.333h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-85.333c-23.564 0-42.667 19.103-42.667 42.667v0 256c0.221 126.17 91.613 230.929 211.8 251.924l1.534 0.222v25.187c0 153.167 124.166 277.333 277.333 277.333s277.333-124.166 277.333-277.333v0-71.862c50.127-17.998 85.333-65.115 85.333-120.455 0-70.517-57.166-127.683-127.683-127.683-0.111 0-0.223 0-0.334 0l0.017-0zM810.667 512c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667c23.564 0 42.667 19.103 42.667 42.667v0c-0.032 23.551-19.115 42.635-42.664 42.667l-0.003 0z"],"attrs":[],"grid":0,"tags":["stethoscope"]},"attrs":[],"properties":{"order":5513,"id":171,"name":"stethoscope","prevSize":32,"code":60682},"setIdx":0,"setId":0,"iconIdx":1034},{"icon":{"paths":["M725.333 395.947c47.128 0 85.333-38.205 85.333-85.333s-38.205-85.333-85.333-85.333c-47.128 0-85.333 38.205-85.333 85.333v0c0 47.128 38.205 85.333 85.333 85.333v0zM115.627 593.92c9.336 3.018 17.381 6.632 24.938 10.996l-0.618-0.329c25.049 14.898 55.23 23.704 87.467 23.704s62.418-8.806 88.267-24.144l-0.801 0.44c15.724-8.964 34.552-14.249 54.613-14.249s38.889 5.285 55.166 14.538l-0.553-0.289 8.96 4.267c22.58 11.242 49.181 17.821 77.318 17.821 32.308 0 62.591-8.674 88.646-23.82l-0.844 0.453c15.724-8.964 34.552-14.249 54.613-14.249s38.889 5.285 55.166 14.538l-0.553-0.289c25.494 14.825 56.064 23.665 88.68 23.893l0.066 0c31.533-0.338 60.932-9.175 86.103-24.323l-0.77 0.43c6.939-4.035 14.984-7.648 23.415-10.41l0.905-0.257c22.269-1.58 39.736-20.033 39.736-42.566 0-23.564-19.103-42.667-42.667-42.667-7.024 0-13.652 1.697-19.496 4.705l0.239-0.112c-16.315 5.127-30.441 11.497-43.621 19.296l0.955-0.523c-12.851 7.547-28.305 12.004-44.8 12.004s-31.949-4.457-45.223-12.233l0.423 0.229c-27.862-15.999-61.255-25.435-96.853-25.435s-68.992 9.436-97.817 25.943l0.964-0.508c-3.325 1.684-7.413 3.414-11.62 4.89l-0.754 0.23 66.56-66.56c1.444-1.855 2.727-3.958 3.758-6.201l0.082-0.199c1.861-2.018 3.552-4.252 5.014-6.64l0.106-0.187c0.095-1.213 0.149-2.627 0.149-4.053s-0.054-2.84-0.161-4.239l0.011 0.186c0.116-1.215 0.182-2.626 0.182-4.053s-0.066-2.839-0.195-4.232l0.013 0.179c0.098-1.15 0.153-2.488 0.153-3.84s-0.056-2.69-0.165-4.014l0.012 0.174c0.116-1.215 0.182-2.626 0.182-4.053s-0.066-2.839-0.195-4.232l0.013 0.179c-1.432-2.829-2.85-5.203-4.408-7.472l0.142 0.218c-1.189-2.607-2.616-4.854-4.305-6.874l0.038 0.047-130.987-142.080s0 0 0 0c-3.397-3.695-7.337-6.819-11.709-9.265l-0.237-0.122c-1.346-0.188-2.9-0.295-4.48-0.295s-3.134 0.107-4.657 0.315l0.177-0.020c-1.090-0.186-2.346-0.293-3.627-0.293s-2.536 0.106-3.759 0.311l0.132-0.018c-4.196-1.737-9.068-2.745-14.175-2.745-1.319 0-2.622 0.067-3.906 0.198l0.161-0.013-151.040 56.32c-16.552 6.12-28.138 21.765-28.138 40.117 0 5.2 0.93 10.184 2.634 14.792l-0.096-0.296c6.12 16.552 21.765 28.138 40.117 28.138 5.2 0 10.184-0.93 14.792-2.634l-0.296 0.096 125.013-45.653 85.333 90.453-81.067 81.067c-21.178-8.477-45.725-13.394-71.421-13.394-35.53 0-68.865 9.4-97.653 25.849l0.967-0.509c-12.851 7.547-28.305 12.004-44.8 12.004s-31.949-4.457-45.223-12.233l0.423 0.229c-12.226-7.276-26.352-13.646-41.21-18.373l-1.456-0.4c-4.431-1.704-9.558-2.692-14.915-2.692-23.564 0-42.667 19.103-42.667 42.667 0 20.076 13.866 36.913 32.543 41.458l0.292 0.060zM883.627 725.76c-16.315 5.127-30.441 11.497-43.621 19.296l0.955-0.523c-12.851 7.547-28.305 12.004-44.8 12.004s-31.949-4.457-45.223-12.233l0.423 0.229c-27.862-15.999-61.255-25.435-96.853-25.435s-68.992 9.436-97.817 25.943l0.964-0.508c-12.963 7.659-28.567 12.185-45.227 12.185s-32.263-4.525-45.647-12.414l0.421 0.229c-27.862-15.999-61.255-25.435-96.853-25.435s-68.992 9.436-97.817 25.943l0.964-0.508c-12.851 7.547-28.305 12.004-44.8 12.004s-31.949-4.457-45.223-12.233l0.423 0.229c-12.226-7.276-26.352-13.646-41.21-18.373l-1.456-0.4c-4.431-1.704-9.558-2.692-14.915-2.692-23.564 0-42.667 19.103-42.667 42.667 0 20.076 13.866 36.913 32.543 41.458l0.292 0.060c9.336 3.018 17.381 6.632 24.938 10.996l-0.618-0.329c25.049 14.898 55.23 23.704 87.467 23.704s62.418-8.806 88.267-24.144l-0.801 0.44c15.724-8.964 34.552-14.249 54.613-14.249s38.889 5.285 55.166 14.538l-0.553-0.289c25.243 14.686 55.556 23.355 87.893 23.355s62.65-8.669 88.741-23.809l-0.848 0.454c15.724-8.964 34.552-14.249 54.613-14.249s38.889 5.285 55.166 14.538l-0.553-0.289c25.494 14.825 56.064 23.665 88.68 23.893l0.066 0c31.533-0.338 60.932-9.175 86.103-24.323l-0.77 0.43c6.939-4.035 14.984-7.648 23.415-10.41l0.905-0.257c17.745-5.484 30.415-21.742 30.415-40.96 0-23.631-19.157-42.788-42.788-42.788-4.413 0-8.671 0.668-12.676 1.909l0.303-0.081z"],"attrs":[],"grid":0,"tags":["swimmer"]},"attrs":[],"properties":{"order":5514,"id":170,"name":"swimmer","prevSize":32,"code":60683},"setIdx":0,"setId":0,"iconIdx":1035},{"icon":{"paths":["M210.347 753.493c-7.775 7.73-12.587 18.433-12.587 30.26 0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667c0-11.827-4.812-22.53-12.585-30.257l-0.002-0.002c-7.712-7.668-18.343-12.407-30.080-12.407s-22.368 4.74-30.082 12.409l0.002-0.002zM813.653 270.507c7.775-7.73 12.587-18.433 12.587-30.26 0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667c0 11.827 4.812 22.53 12.585 30.257l0.002 0.002c7.712 7.668 18.343 12.407 30.080 12.407s22.368-4.74 30.082-12.409l-0.002 0.002zM270.507 270.507c7.775-7.73 12.587-18.433 12.587-30.26 0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667c0 11.827 4.812 22.53 12.585 30.257l0.002 0.002c7.712 7.668 18.343 12.407 30.080 12.407s22.368-4.74 30.082-12.409l-0.002 0.002zM753.493 753.493c-7.775 7.73-12.587 18.433-12.587 30.26 0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667c0-11.827-4.812-22.53-12.585-30.257l-0.002-0.002c-7.712-7.668-18.343-12.407-30.080-12.407s-22.368 4.74-30.082 12.409l0.002-0.002zM896 469.333h-67.84l55.467-55.040c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l0-0-115.2 115.627h-93.013l98.133-97.707c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l-0 0-97.707 98.133v-93.013l115.627-115.2c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l-0 0-55.040 55.467v-67.84c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 67.84l-55.040-55.467c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l-0-0 115.627 115.2v93.013l-97.707-98.133c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293v0l98.133 97.707h-93.013l-115.2-115.627c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l-0-0 55.467 55.040h-67.84c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h67.84l-55.467 55.040c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 115.2-115.627h93.013l-98.133 97.707c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 97.707-98.133v93.013l-115.627 115.2c-7.753 7.753-12.548 18.463-12.548 30.293 0 23.661 19.181 42.841 42.841 42.841 11.83 0 22.541-4.795 30.293-12.548l-0 0 55.040-55.467v67.84c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-67.84l55.040 55.467c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003-115.627-115.2v-93.013l97.707 98.133c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003-98.133-97.707h93.013l115.2 115.627c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003-55.467-55.040h67.84c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["snowflake-alt"]},"attrs":[],"properties":{"order":5515,"id":169,"name":"snowflake-alt","prevSize":32,"code":60684},"setIdx":0,"setId":0,"iconIdx":1036},{"icon":{"paths":["M725.333 85.333h-426.667c-70.692 0-128 57.308-128 128v0 597.333c0 70.692 57.308 128 128 128v0h426.667c70.692 0 128-57.308 128-128v0-597.333c0-70.692-57.308-128-128-128v0zM768 810.667c0 23.564-19.103 42.667-42.667 42.667v0h-426.667c-23.564 0-42.667-19.103-42.667-42.667v0-597.333c0-23.564 19.103-42.667 42.667-42.667v0h426.667c23.564 0 42.667 19.103 42.667 42.667v0zM542.293 695.040c-7.778-8.102-18.699-13.136-30.796-13.136-2.841 0-5.616 0.278-8.302 0.807l0.271-0.045-7.68 2.56c-2.93 1.020-5.469 2.319-7.79 3.912l0.11-0.072-6.4 5.12c-3.773 3.937-6.808 8.616-8.859 13.791l-0.101 0.289c-2.109 4.883-3.336 10.568-3.336 16.539 0 11.682 4.695 22.267 12.3 29.972l-0.004-0.005c4.074 3.617 8.704 6.748 13.716 9.224l0.364 0.163c4.8 2.030 10.38 3.21 16.237 3.21 11.832 0 22.539-4.816 30.267-12.595l0.002-0.002c7.51-7.568 12.204-17.94 12.373-29.408l0-0.032c0.008-0.275 0.012-0.599 0.012-0.923 0-5.554-1.263-10.813-3.518-15.505l0.093 0.215c-2.298-5.422-5.314-10.079-8.995-14.119l0.035 0.039z"],"attrs":[],"grid":0,"tags":["tablet"]},"attrs":[],"properties":{"order":5516,"id":168,"name":"tablet","prevSize":32,"code":60685},"setIdx":0,"setId":0,"iconIdx":1037},{"icon":{"paths":["M926.293 97.707c-7.733-7.795-18.45-12.621-30.293-12.621s-22.56 4.826-30.291 12.618l-0.003 0.003-90.453 90.453-30.293-29.867c-7.712-7.668-18.343-12.407-30.080-12.407s-22.368 4.74-30.082 12.409l0.002-0.002-60.16 60.16-30.293-30.293c-7.733-7.795-18.45-12.621-30.293-12.621s-22.56 4.826-30.291 12.618l-0.003 0.003-331.52 331.947-31.573-29.867c-6.813-4.814-15.291-7.694-24.441-7.694-23.564 0-42.667 19.103-42.667 42.667 0 9.473 3.087 18.225 8.31 25.305l-0.082-0.117 150.613 151.040-73.813 74.24-30.293-30.72c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l120.747 120.747c7.709 7.648 18.326 12.374 30.047 12.374 0.087 0 0.173-0 0.26-0.001l-0.013 0c0.073 0 0.16 0.001 0.247 0.001 11.721 0 22.338-4.726 30.049-12.377l-0.003 0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003-30.293-29.867 74.24-74.24 150.613 150.613c7.709 7.861 18.426 12.749 30.284 12.8l0.010 0c23.487-0.102 42.488-19.165 42.488-42.666 0-11.844-4.826-22.56-12.618-30.291l-0.003-0.003-29.867-30.293 331.947-331.52c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003-30.293-30.293 60.16-58.027c7.668-7.712 12.407-18.343 12.407-30.080s-4.74-22.368-12.409-30.082l0.002 0.002-29.867-30.293 90.453-90.453c8.458-7.82 13.736-18.974 13.736-31.36s-5.278-23.54-13.707-31.334l-0.028-0.026zM322.987 640l-60.587-59.307 60.16-60.587 61.44 60.587zM443.307 760.747l-59.307-59.307 59.307-61.44 60.587 60.587zM564.053 640l-180.053-180.053 180.907-180.907 30.293 29.867 150.613 151.040zM744.96 341.333l-60.16-62.293 30.293-30.293 59.733 59.733z"],"attrs":[],"grid":0,"tags":["syringe"]},"attrs":[],"properties":{"order":5517,"id":167,"name":"syringe","prevSize":32,"code":60686},"setIdx":0,"setId":0,"iconIdx":1038},{"icon":{"paths":["M896 85.333h-768c-23.564 0-42.667 19.103-42.667 42.667v0 768c0 23.564 19.103 42.667 42.667 42.667v0h768c23.564 0 42.667-19.103 42.667-42.667v0-768c0-23.564-19.103-42.667-42.667-42.667v0zM341.333 853.333h-170.667v-170.667h170.667zM341.333 597.333h-170.667v-170.667h170.667zM341.333 341.333h-170.667v-170.667h170.667zM597.333 853.333h-170.667v-170.667h170.667zM597.333 597.333h-170.667v-170.667h170.667zM597.333 341.333h-170.667v-170.667h170.667zM853.333 853.333h-170.667v-170.667h170.667zM853.333 597.333h-170.667v-170.667h170.667zM853.333 341.333h-170.667v-170.667h170.667z"],"attrs":[],"grid":0,"tags":["table"]},"attrs":[],"properties":{"order":5518,"id":166,"name":"table","prevSize":32,"code":60687},"setIdx":0,"setId":0,"iconIdx":1039},{"icon":{"paths":["M320 256c-35.346 0-64 28.654-64 64s28.654 64 64 64c35.346 0 64-28.654 64-64v0c0-35.346-28.654-64-64-64v0zM901.12 456.96l-358.827-359.253c-7.709-7.648-18.326-12.374-30.047-12.374-0.087 0-0.173 0-0.26 0.001l0.013-0h-384c-23.564 0-42.667 19.103-42.667 42.667v0 384c-0 0.073-0.001 0.16-0.001 0.247 0 11.721 4.726 22.338 12.377 30.049l-0.003-0.003 359.253 358.827c23.158 23.13 55.135 37.434 90.453 37.434s67.296-14.304 90.455-37.435l-0.001 0.001 263.253-261.12c23.13-23.158 37.434-55.135 37.434-90.453s-14.304-67.296-37.435-90.455l0.001 0.001zM840.96 577.28v0l-263.68 263.253c-7.712 7.668-18.343 12.407-30.080 12.407s-22.368-4.74-30.082-12.409l0.002 0.002-346.453-346.027v-323.84h323.84l346.453 346.453c7.648 7.709 12.374 18.326 12.374 30.047 0 0.087-0 0.173-0.001 0.26l0-0.013c-0.051 11.656-4.767 22.2-12.376 29.869l0.003-0.003z"],"attrs":[],"grid":0,"tags":["tag-alt"]},"attrs":[],"properties":{"order":5519,"id":165,"name":"tag-alt","prevSize":32,"code":60688},"setIdx":0,"setId":0,"iconIdx":1040},{"icon":{"paths":["M371.209 170.667h410.562l70.896 177.253c-3.422 44.183-40.116 78.739-84.88 78.739-47.010 0-85.12-38.11-85.12-85.12 0-0.072 0-0.144 0-0.216l-0 0.011c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0c0.003 0.266 0.005 0.58 0.005 0.895 0 10.575-2.107 20.657-5.924 29.851l0.19-0.516c-2.041 4.81-3.227 10.404-3.227 16.275 0 17.692 10.772 32.868 26.115 39.328l0.281 0.105c2.141 0.67 4.665 1.194 7.263 1.472l0.177 0.015c30.117 50.049 84.077 83.056 145.761 83.242l0.027 0v55.458c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-79.2c50.685-29.583 84.386-83.406 85.165-145.162l0.001-0.111c0.016-0.399 0.112-0.768 0.117-1.169l0.049-0.482c-0.299-2.728-0.818-5.202-1.55-7.583l0.076 0.287c-0.238-3.144-0.794-6.059-1.643-8.848l0.075 0.288-85.333-213.333c-6.476-15.846-21.77-26.808-39.625-26.811l-439.458-0c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM968.832 908.501l-125.146-125.146c-1.952-2.451-4.104-4.602-6.474-6.492l-0.081-0.063-424.545-424.545c-2.512-3.386-5.416-6.29-8.691-8.723l-0.111-0.079-182.678-182.68c-1.666-2.005-3.454-3.792-5.392-5.404l-0.067-0.054-100.15-100.147c-7.692-7.558-18.247-12.223-29.892-12.223-23.562 0-42.662 19.1-42.662 42.662 0 11.645 4.666 22.2 12.229 29.898l-0.006-0.006 83.777 83.78-50.549 126.181c-0.71 2.339-1.234 5.076-1.472 7.896l-0.010 0.149c-0.725 2.261-1.282 4.918-1.566 7.655l-0.015 0.174 0.049 0.492 0.107 1.041c0.741 61.914 34.456 115.789 84.371 144.956l0.806 0.435v407.742c0 23.564 19.103 42.667 42.667 42.667v0h597.333c18.173-0.069 33.644-11.566 39.603-27.675l0.095-0.293 58.137 58.134c7.692 7.558 18.247 12.223 29.892 12.223 23.562 0 42.662-19.1 42.662-42.662 0-11.645-4.666-22.2-12.229-29.898l0.006 0.006zM171.331 347.893l33.203-83.026 122.72 122.719c-15.166 23.64-41.313 39.081-71.067 39.081-0.066 0-0.131-0-0.197-0l0.010 0c-44.68-0.132-81.255-34.655-84.651-78.482l-0.018-0.292zM384 640v213.333h-128v-341.333c0.128 0 0.279 0.001 0.431 0.001 53.207 0 100.675-24.571 131.676-62.985l0.252-0.323 148.641 148.64h-110.333c-23.564 0-42.667 19.103-42.667 42.667v0zM554.667 853.333h-85.333v-170.667h85.333zM768 853.333h-128v-153l128 128z"],"attrs":[],"grid":0,"tags":["store-slash"]},"attrs":[],"properties":{"order":5520,"id":164,"name":"store-slash","prevSize":32,"code":60689},"setIdx":0,"setId":0,"iconIdx":1041},{"icon":{"paths":["M618.667 298.667c-94.257 0-170.667 76.41-170.667 170.667s76.41 170.667 170.667 170.667c94.257 0 170.667-76.41 170.667-170.667v0c0-94.257-76.41-170.667-170.667-170.667v0zM618.667 554.667c-47.128 0-85.333-38.205-85.333-85.333s38.205-85.333 85.333-85.333c47.128 0 85.333 38.205 85.333 85.333v0c0 47.128-38.205 85.333-85.333 85.333v0zM661.333 128h-85.333c-164.949 0-298.667 133.718-298.667 298.667v0 128h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h42.667v85.333h-170.667c-23.564 0-42.667 19.103-42.667 42.667v0 85.333c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667h512c164.949 0 298.667-133.718 298.667-298.667v0-85.333c0-164.949-133.718-298.667-298.667-298.667v0zM874.667 512c0 117.821-95.513 213.333-213.333 213.333v0h-298.667v-298.667c0-117.821 95.513-213.333 213.333-213.333v0h85.333c117.821 0 213.333 95.513 213.333 213.333v0z"],"attrs":[],"grid":0,"tags":["tape"]},"attrs":[],"properties":{"order":5521,"id":163,"name":"tape","prevSize":32,"code":60690},"setIdx":0,"setId":0,"iconIdx":1042},{"icon":{"paths":["M652.373 439.040l-118.613 118.613c-6.5-1.8-13.981-2.883-21.699-2.986l-0.061-0.001c-47.128 0-85.333 38.205-85.333 85.333v0c0.104 7.779 1.187 15.26 3.132 22.385l-0.146-0.625-33.28 33.28c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 33.28-33.28c6.5 1.8 13.981 2.883 21.699 2.986l0.061 0.001c47.128 0 85.333-38.205 85.333-85.333v0c-0.104-7.779-1.187-15.26-3.132-22.385l0.146 0.625 118.613-118.613c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l0-0zM512 170.667c-235.641 0-426.667 191.025-426.667 426.667v0c-0.001 0.312-0.001 0.682-0.001 1.051 0 88.106 26.948 169.918 73.051 237.643l-0.943-1.468c7.785 11.424 20.735 18.827 35.413 18.827 23.594 0 42.72-19.126 42.72-42.72 0-8.915-2.731-17.192-7.402-24.041l0.095 0.148c-36.081-53.293-57.6-119.007-57.6-189.747 0-188.513 152.82-341.333 341.333-341.333s341.333 152.82 341.333 341.333c0 70.74-21.519 136.454-58.369 190.953l0.769-1.206c-4.588 6.702-7.327 14.985-7.327 23.908 0 14.679 7.413 27.627 18.699 35.304l0.148 0.095c6.679 4.543 14.922 7.253 23.798 7.253 0.034 0 0.067-0 0.101-0l-0.005 0c0.019 0 0.042 0 0.064 0 14.648 0 27.571-7.381 35.254-18.627l0.095-0.147c45.16-66.257 72.108-148.069 72.108-236.175 0-0.369-0-0.739-0.001-1.108l0 0.057c0-235.641-191.025-426.667-426.667-426.667v0z"],"attrs":[],"grid":0,"tags":["tachometer-fast"]},"attrs":[],"properties":{"order":5522,"id":162,"name":"tachometer-fast","prevSize":32,"code":60691},"setIdx":0,"setId":0,"iconIdx":1043},{"icon":{"paths":["M901.12 456.96l-358.827-359.253c-7.709-7.648-18.326-12.374-30.047-12.374-0.087 0-0.173 0-0.26 0.001l0.013-0h-384c-23.564 0-42.667 19.103-42.667 42.667v0 384c-0 0.073-0.001 0.16-0.001 0.247 0 11.721 4.726 22.338 12.377 30.049l-0.003-0.003 359.253 358.827c23.158 23.13 55.135 37.434 90.453 37.434s67.296-14.304 90.455-37.435l-0.001 0.001 263.253-261.12c23.13-23.158 37.434-55.135 37.434-90.453s-14.304-67.296-37.435-90.455l0.001 0.001zM840.96 577.28v0l-263.68 263.253c-7.712 7.668-18.343 12.407-30.080 12.407s-22.368-4.74-30.082-12.409l0.002 0.002-346.453-346.027v-323.84h323.84l346.453 346.453c7.648 7.709 12.374 18.326 12.374 30.047 0 0.087-0 0.173-0.001 0.26l0-0.013c-0.051 11.656-4.767 22.2-12.376 29.869l0.003-0.003z"],"attrs":[],"grid":0,"tags":["tag"]},"attrs":[],"properties":{"order":5523,"id":161,"name":"tag","prevSize":32,"code":60692},"setIdx":0,"setId":0,"iconIdx":1044},{"icon":{"paths":["M512 213.333c-235.637 0.006-426.656 191.029-426.656 426.667 0 78.547 21.225 152.137 58.253 215.347l-1.090-2.014c7.531 12.929 21.327 21.48 37.12 21.48 23.645 0 42.814-19.168 42.814-42.814 0-7.852-2.114-15.21-5.803-21.537l0.11 0.203c-28.963-48.799-46.080-107.576-46.080-170.351 0-0.111 0-0.222 0-0.333l-0 0.017c0.076-188.456 152.867-341.2 341.333-341.2 188.513 0 341.333 152.82 341.333 341.333 0 62.784-16.951 121.608-46.526 172.147l0.872-1.613c-3.613 6.133-5.748 13.511-5.748 21.388 0 15.791 8.578 29.578 21.329 36.956l0.205 0.11c6.055 3.499 13.32 5.563 21.067 5.563 15.716 0 29.448-8.497 36.851-21.148l0.109-0.202c35.937-61.196 57.162-134.786 57.162-213.333 0-235.638-191.019-426.66-426.655-426.667l-0.001-0zM633.173 459.093l-66.133 65.707c-16.017-8.073-34.909-12.8-54.906-12.8-0.047 0-0.094 0-0.141 0l0.007-0c-70.692 0-128 57.308-128 128s57.308 128 128 128c70.692 0 128-57.308 128-128v0c-0.032-19.898-4.756-38.685-13.124-55.325l0.324 0.711 66.133-65.707c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003c-7.712-7.668-18.343-12.407-30.080-12.407s-22.368 4.74-30.082 12.409l0.002-0.002zM512 682.667c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667v0c0.076-0 0.166-0.001 0.256-0.001 11.506 0 21.949 4.555 29.623 11.96l-0.013-0.012c7.902 7.75 12.801 18.538 12.801 30.471 0 0.088-0 0.175-0.001 0.263l0-0.013c0 23.564-19.103 42.667-42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["tachometer-fast-alt"]},"attrs":[],"properties":{"order":5524,"id":160,"name":"tachometer-fast-alt","prevSize":32,"code":60693},"setIdx":0,"setId":0,"iconIdx":1045},{"icon":{"paths":["M298.667 682.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM813.227 512l52.48-52.48c23.13-23.158 37.434-55.135 37.434-90.453s-14.304-67.296-37.435-90.455l0.001 0.001-120.747-120.32c-23.158-23.13-55.135-37.434-90.453-37.434s-67.296 14.304-90.455 37.435l0.001-0.001-52.053 52.48c-1.436-69.583-58.182-125.44-127.974-125.44-0.009 0-0.018 0-0.027 0l-170.665-0c-70.692 0-128 57.308-128 128v0 597.333c0 70.692 57.308 128 128 128v0h597.333c70.692 0 128-57.308 128-128v0-170.667c0-0.008 0-0.017 0-0.026 0-69.792-55.857-126.538-125.306-127.972l-0.134-0.002zM426.667 810.667c0 23.564-19.103 42.667-42.667 42.667v0h-170.667c-23.564 0-42.667-19.103-42.667-42.667v0-597.333c0-23.564 19.103-42.667 42.667-42.667v0h170.667c23.564 0 42.667 19.103 42.667 42.667v0zM512 331.093l112.64-112.64c7.712-7.668 18.343-12.407 30.080-12.407s22.368 4.74 30.082 12.409l-0.002-0.002 120.747 122.88c7.668 7.712 12.407 18.343 12.407 30.080s-4.74 22.368-12.409 30.082l0.002-0.002-122.88 122.88-170.667 168.533zM853.333 810.667c0 23.564-19.103 42.667-42.667 42.667v0h-306.347c4.164-11.631 6.783-25.061 7.248-39.036l0.006-0.218 216.747-216.747h82.347c23.564 0 42.667 19.103 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["swatchbook"]},"attrs":[],"properties":{"order":5525,"id":159,"name":"swatchbook","prevSize":32,"code":60694},"setIdx":0,"setId":0,"iconIdx":1046},{"icon":{"paths":["M549.461 252.945c0.246-0.017 0.534-0.027 0.824-0.027 6.999 0 12.672 5.673 12.672 12.672 0 0.581-0.039 1.153-0.115 1.713l0.007-0.065c0.085 3.922 0.148 7.844 0.154 11.765 0.026 25.276-0.102 50.555 0.089 75.828 0.14 18.497 3.391 22.059 21.307 24.281 17.386 1.697 37.583 2.664 58.006 2.664 26.895 0 53.398-1.678 79.41-4.934l-3.103 0.317c24.603-1.751 47.426-7.45 68.484-16.475l-1.375 0.524c8.928-2.802 15.292-11.003 15.292-20.689 0-1.779-0.215-3.508-0.62-5.162l0.031 0.148c-17.946-121.569-108.811-217.725-226.051-243.319l-1.926-0.353c-17.981-4.082-38.631-6.42-59.827-6.42-34.382 0-67.326 6.154-97.792 17.421l1.952-0.632c-45.365 16.081-83.911 41.687-114.782 74.582l-0.143 0.154c-47.131 46.886-76.889 111.198-78.792 182.454l-0.008 0.357c0.988 86.893 25.040 167.964 66.304 237.637l-1.213-2.213c9.524 19.178 28.976 32.128 51.453 32.128 1.862 0 3.704-0.089 5.52-0.263l-0.231 0.018c27.875-0.669 55.779-0.151 83.672-0.151v-0.148q44.453 0 88.904 0.020c10.636 0.023 19.052 2.565 18.969 15.883-0.195 30.943 0.029 61.885-0.143 92.826-0.055 9.393-2.698 18.432-13.914 18.521-11.26 0.088-13.927-8.914-14.068-18.326-0.218-14.812 0.008-29.633 0.026-44.448 0.021-19.245-3.133-23.756-22.323-27.264-15.886-2.721-34.183-4.276-52.843-4.276-16.702 0-33.113 1.246-49.145 3.65l1.807-0.223c-12.552 1.022-24.151 3.981-34.877 8.585l0.721-0.275c-9.039 4.255-12.633 10.456-8.242 19.938 4.568 9.867 8.828 19.937 14.217 29.349 48.224 80.634 96.476 149.668 149.035 215.095l-2.837-3.652c6.568 8.511 11.654 8.688 18.393 0.448 14.877-18.193 30.503-35.779 45.224-54.096 54.672-65.793 105.195-139.222 148.797-217.051l3.793-7.371c27.499-47.6 49.461-102.734 62.971-161.106l0.794-4.076c2.214-5.522 3.498-11.924 3.498-18.626 0-26.707-20.394-48.651-46.458-51.109l-0.205-0.016c-19.221-4.442-41.293-6.987-63.959-6.987-2.572 0-5.136 0.033-7.691 0.098l0.378-0.008c-38.784-0.289-77.573-0.148-116.359-0.114-10.445 0.010-18.214-2.99-18.222-15.245-0.020-43.143-0.078-86.289 0.079-129.43 0.035-9.21 4.475-14.867 14.481-14.526z"],"attrs":[],"grid":0,"tags":["swiggy"]},"attrs":[],"properties":{"order":5526,"id":158,"name":"swiggy","prevSize":32,"code":60695},"setIdx":0,"setId":0,"iconIdx":1047},{"icon":{"paths":["M512 85.333c-235.641 0-426.667 191.025-426.667 426.667s191.025 426.667 426.667 426.667c235.641 0 426.667-191.025 426.667-426.667v0c0-235.641-191.025-426.667-426.667-426.667v0zM512 853.333c-188.513 0-341.333-152.82-341.333-341.333s152.82-341.333 341.333-341.333c188.513 0 341.333 152.82 341.333 341.333v0c0 188.513-152.82 341.333-341.333 341.333v0zM426.667 384c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667c0 23.564 19.103 42.667 42.667 42.667v0c23.564 0 42.667-19.103 42.667-42.667v0zM640 341.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM512 469.333c-77.306 3.25-138.747 66.71-138.747 144.52 0 1.693 0.029 3.379 0.087 5.057l-0.007-0.244c-0.051 1.435-0.080 3.121-0.080 4.813 0 77.81 61.441 141.269 138.454 144.51l0.293 0.010c77.306-3.25 138.747-66.71 138.747-144.52 0-1.693-0.029-3.379-0.087-5.057l0.007 0.244c0.051-1.435 0.080-3.121 0.080-4.813 0-77.81-61.441-141.269-138.454-144.51l-0.293-0.010zM512 682.667c-30.179-3.034-53.542-28.302-53.542-59.026 0-1.751 0.076-3.484 0.225-5.197l-0.016 0.222c-0.133-1.49-0.209-3.223-0.209-4.974 0-30.724 23.363-55.992 53.293-59.006l0.249-0.020c30.179 3.034 53.542 28.302 53.542 59.026 0 1.751-0.076 3.484-0.225 5.197l0.016-0.222c0.133 1.49 0.209 3.223 0.209 4.974 0 30.724-23.363 55.992-53.293 59.006l-0.249 0.020z"],"attrs":[],"grid":0,"tags":["surprise"]},"attrs":[],"properties":{"order":5527,"id":157,"name":"surprise","prevSize":32,"code":60696},"setIdx":0,"setId":0,"iconIdx":1048},{"icon":{"paths":["M753.493 355.84c11.656-0.051 22.2-4.767 29.869-12.376l-0.003 0.003 30.293-30.293c9.153-7.872 14.914-19.467 14.914-32.407 0-23.564-19.103-42.667-42.667-42.667-12.94 0-24.535 5.761-32.36 14.858l-0.047 0.056-28.16 30.293c-7.668 7.712-12.407 18.343-12.407 30.080s4.74 22.368 12.409 30.082l-0.002-0.002c7.267 7.23 17.128 11.859 28.065 12.37l0.095 0.004zM512 256c23.564 0 42.667-19.103 42.667-42.667v0-42.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 42.667c0 23.564 19.103 42.667 42.667 42.667v0zM170.667 512h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM240.64 343.467c7.667 7.606 18.211 12.323 29.857 12.373l0.010 0c0.073 0 0.16 0.001 0.247 0.001 11.721 0 22.338-4.726 30.049-12.377l-0.003 0.003c7.668-7.712 12.407-18.343 12.407-30.080s-4.74-22.368-12.409-30.082l0.002 0.002-30.293-30.293c-7.412-6.377-17.129-10.259-27.753-10.259-23.564 0-42.667 19.103-42.667 42.667 0 10.624 3.883 20.341 10.307 27.809l-0.047-0.056zM896 512h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM469.333 810.667h-128c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h128c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM768 640h-37.547c10.259-25.124 16.214-54.277 16.214-84.821 0-0.18-0-0.36-0.001-0.54l0 0.028c0-129.603-105.064-234.667-234.667-234.667s-234.667 105.064-234.667 234.667v0c-0 0.152-0.001 0.332-0.001 0.512 0 30.544 5.955 59.697 16.766 86.362l-0.552-1.541h-37.547c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h512c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM633.6 640h-243.2c-17.234-23.658-27.614-53.272-27.733-85.305l-0-0.029c0-82.475 66.859-149.333 149.333-149.333s149.333 66.859 149.333 149.333v0c-0.119 32.061-10.499 61.675-28.025 85.754l0.292-0.421zM682.667 810.667h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["sunset"]},"attrs":[],"properties":{"order":5528,"id":156,"name":"sunset","prevSize":32,"code":60697},"setIdx":0,"setId":0,"iconIdx":1049},{"icon":{"paths":["M511.758 85.333c-235.641 0-426.667 191.025-426.667 426.667s191.025 426.667 426.667 426.667c235.641 0 426.667-191.025 426.667-426.667v0c0-0.010 0-0.023 0-0.035 0-235.622-191.009-426.631-426.631-426.631-0.012 0-0.025 0-0.037 0l0.001-0zM647.417 731.839c-4.567 11.169-15.35 18.896-27.937 18.896-5.446 0-10.554-1.446-14.962-3.976l0.147 0.078-115.826-90-74.339 68.583c-2.096 1.563-4.738 2.503-7.599 2.503-1.64 0-3.208-0.309-4.648-0.871l0.087 0.030 14.251-127.508 0.456 0.362 0.291-2.517s208.427-189.76 216.917-197.845c8.596-8.064 5.76-9.813 5.76-9.813 0.489-9.836-15.425 0-15.425 0l-276.161 177.666-115.008-39.168s-17.664-6.336-19.328-20.267c-1.749-13.824 19.904-21.333 19.904-21.333l457.259-181.654s37.589-16.748 37.589 10.987z"],"attrs":[],"grid":0,"tags":["telegram"]},"attrs":[],"properties":{"order":5529,"id":155,"name":"telegram","prevSize":32,"code":60698},"setIdx":0,"setId":0,"iconIdx":1050},{"icon":{"paths":["M949.958 103.583c-15.033-12.574-34.572-20.21-55.894-20.21-11.811 0-23.075 2.343-33.353 6.59l0.58-0.212-764.625 308.708c-31.961 13.402-54.001 44.433-54.001 80.612 0 37.856 24.132 70.076 57.851 82.115l0.609 0.19 154.667 53.792 86.208 285.083c1.28 4.101 2.997 7.671 5.15 10.928l-0.099-0.159c0.331 0.512 0.797 0.893 1.149 1.391 2.562 3.548 5.541 6.585 8.914 9.128l0.107 0.077c0.984 0.75 1.927 1.453 2.979 2.12 3.799 2.555 8.223 4.553 12.968 5.746l0.29 0.062 0.505 0.043 0.286 0.122c2.591 0.552 5.569 0.87 8.621 0.875l0.004 0c0.279 0 0.526-0.133 0.802-0.138 4.622-0.083 9.027-0.894 13.144-2.322l-0.297 0.090c0.963-0.328 1.789-0.877 2.724-1.273 3.329-1.396 6.198-3.034 8.834-4.971l-0.118 0.083c-13.517 11.112-11.402 9.323-9.286 7.534l15.781-13.003 115.292-127.291 171.958 133.208c14.457 11.34 32.906 18.191 52.954 18.208l0.004 0c41.992-0.056 77.060-29.635 85.563-69.091l0.104-0.577 139.208-683.373c1.123-5.231 1.766-11.24 1.766-17.399 0-26.76-12.138-50.686-31.209-66.571l-0.14-0.113zM399.792 628.75c-5.743 5.721-9.854 13.075-11.577 21.308l-0.048 0.276-13.206 64.171-33.453-110.638 173.451-90.323zM754 855.040l-203.209-157.417c-7.142-5.562-16.241-8.917-26.123-8.917-12.52 0-23.782 5.385-31.596 13.966l-0.031 0.034-36.924 40.755 13.049-63.422 302.208-302.208c7.731-7.721 12.514-18.393 12.514-30.183 0-23.558-19.098-42.656-42.656-42.656-7.213 0-14.007 1.79-19.964 4.951l0.231-0.112-433.719 225.819-158.906-58.151 767.082-306.876z"],"attrs":[],"grid":0,"tags":["telegram-alt"]},"attrs":[],"properties":{"order":5530,"id":154,"name":"telegram-alt","prevSize":32,"code":60699},"setIdx":0,"setId":0,"iconIdx":1051},{"icon":{"paths":["M535.893 92.587c-6.699-4.582-14.977-7.318-23.893-7.318s-17.194 2.735-24.040 7.412l0.147-0.095c-12.8 8.533-306.773 213.333-306.773 515.413-0 182.622 148.045 330.667 330.667 330.667s330.667-148.045 330.667-330.667v0c0-307.2-294.4-507.307-306.773-515.413zM512 853.333c-135.396-0.242-245.091-109.937-245.333-245.31l-0-0.023c0-213.333 179.627-374.187 245.333-426.667 66.133 51.627 245.333 213.333 245.333 426.667-0.242 135.396-109.937 245.091-245.31 245.333l-0.023 0z"],"attrs":[],"grid":0,"tags":["tear"]},"attrs":[],"properties":{"order":5531,"id":153,"name":"tear","prevSize":32,"code":60700},"setIdx":0,"setId":0,"iconIdx":1052},{"icon":{"paths":["M876.373 147.627c-38.587-38.492-91.843-62.293-150.659-62.293-117.821 0-213.333 95.513-213.333 213.333s95.513 213.333 213.333 213.333c58.816 0 112.072-23.801 150.663-62.298l-0.004 0.004c38.72-38.625 62.675-92.035 62.675-151.040s-23.955-112.415-62.67-151.036l-0.004-0.004zM634.88 208.213c23.143-23.171 55.12-37.515 90.447-37.547l0.006-0c19.902 0.191 38.661 4.895 55.363 13.134l-0.75-0.334-170.667 170.667c-7.814-16.073-12.382-34.964-12.382-54.922 0-35.59 14.525-67.787 37.971-90.987l0.011-0.011zM815.787 389.12c-23.127 22.947-54.98 37.128-90.146 37.128-19.958 0-38.849-4.568-55.684-12.714l0.763 0.333 170.667-170.667c7.814 16.073 12.382 34.964 12.382 54.922 0 35.59-14.525 67.787-37.971 90.987l-0.011 0.011zM341.333 426.667c-0.3-0.001-0.655-0.002-1.010-0.002-69.723 0-132.859 28.202-178.623 73.822l0.006-0.006c-47.028 46.44-76.156 110.912-76.156 182.187 0 141.308 114.491 255.876 255.771 256l0.012 0c68.556-0.035 130.805-27.013 176.737-70.918l-0.097 0.092 5.12-3.413c1.010-1.819 1.999-3.353 3.074-4.818l-0.088 0.125c44.013-45.9 71.113-108.319 71.113-177.067 0-141.335-114.535-255.92-255.852-256l-0.008-0zM220.587 803.413c-30.486-30.816-49.32-73.213-49.32-120.009 0-31.719 8.653-61.417 23.727-86.862l-0.434 0.791 232.107 232.107c-24.655 14.641-54.352 23.293-86.071 23.293-46.796 0-89.193-18.834-120.024-49.335l0.015 0.015zM488.107 768l-232.107-232.107c24.401-14.718 53.8-23.556 85.238-23.893l0.095-0.001c93.814 0.582 169.64 76.768 169.64 170.664 0 31.42-8.491 60.857-23.303 86.142l0.436-0.805z"],"attrs":[],"grid":0,"tags":["tablets"]},"attrs":[],"properties":{"order":5532,"id":152,"name":"tablets","prevSize":32,"code":60701},"setIdx":0,"setId":0,"iconIdx":1053},{"icon":{"paths":["M741.547 622.080c-4.892-2.118-10.589-3.35-16.573-3.35-2.892 0-5.716 0.288-8.447 0.836l0.273-0.046c-2.882 0.513-5.459 1.403-7.832 2.632l0.152-0.072c-2.93 1.020-5.469 2.319-7.79 3.912l0.11-0.072-6.4 5.12c-7.522 7.877-12.204 18.523-12.373 30.26l-0 0.033c-0 0.073-0.001 0.16-0.001 0.247 0 11.721 4.726 22.338 12.377 30.049l-0.003-0.003c4.005 3.779 8.657 6.928 13.762 9.257l0.318 0.13c4.8 2.030 10.38 3.21 16.237 3.21 11.832 0 22.539-4.816 30.267-12.595l0.002-0.002c3.646-4.001 6.662-8.658 8.838-13.76l0.122-0.32c2.162-4.477 3.425-9.736 3.425-15.29 0-0.325-0.004-0.648-0.013-0.971l0.001 0.048c-0.169-11.771-4.851-22.416-12.39-30.311l0.016 0.017c-3.895-3.844-8.588-6.891-13.807-8.869l-0.273-0.091zM853.333 455.68v-135.68c0-70.692-57.308-128-128-128v0h-33.28l-32.853-98.987c-5.871-17.012-21.745-29.013-40.423-29.013-0.039 0-0.077 0-0.116 0l0.006-0h-213.333c-0.033-0-0.071-0-0.11-0-18.678 0-34.552 12.002-40.333 28.714l-0.090 0.3-32.853 98.987h-33.28c-70.692 0-128 57.308-128 128v0 135.68c-50.028 18.062-85.173 65.066-85.333 120.3l-0 0.020v256c0 23.564 19.103 42.667 42.667 42.667v0h42.667v42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667h512v42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667h42.667c23.564 0 42.667-19.103 42.667-42.667v0-256c-0.16-55.254-35.305-102.258-84.442-120.038l-0.891-0.282zM436.053 149.333h151.893l14.080 42.667h-180.053zM256 320c0-23.564 19.103-42.667 42.667-42.667v0h426.667c23.564 0 42.667 19.103 42.667 42.667v0 128h-512zM853.333 789.333h-682.667v-213.333c0-23.564 19.103-42.667 42.667-42.667v0h597.333c23.564 0 42.667 19.103 42.667 42.667v0zM282.453 622.080c-5.464 2.152-10.143 5.187-14.095 8.974l0.015-0.014c-7.522 7.877-12.204 18.523-12.373 30.26l-0 0.033c-0 0.064-0.001 0.139-0.001 0.214 0 23.564 19.103 42.667 42.667 42.667 5.848 0 11.421-1.176 16.495-3.305l-0.281 0.105c5.423-2.458 10.075-5.608 14.105-9.41l-0.025 0.023c7.648-7.709 12.374-18.326 12.374-30.047 0-0.087-0-0.173-0.001-0.26l0 0.013c-0.169-11.771-4.851-22.416-12.39-30.311l0.016 0.017c-7.7-7.601-18.286-12.296-29.968-12.296-5.971 0-11.656 1.227-16.817 3.442l0.278-0.106zM554.667 618.667h-85.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h85.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["taxi"]},"attrs":[],"properties":{"order":5533,"id":151,"name":"taxi","prevSize":32,"code":60702},"setIdx":0,"setId":0,"iconIdx":1054},{"icon":{"paths":["M512 640c-47.128 0-85.333 38.205-85.333 85.333s38.205 85.333 85.333 85.333c47.128 0 85.333-38.205 85.333-85.333v0c0-47.128-38.205-85.333-85.333-85.333v0zM704 554.667v-320c0-106.039-85.961-192-192-192s-192 85.961-192 192v0 320c-39.768 44.9-64.053 104.308-64.053 169.388 0 121.9 85.201 223.9 199.301 249.699l1.713 0.326c16.223 3.875 35.111 6.477 54.472 7.236l0.568 0.018c0.354 0.002 0.773 0.003 1.191 0.003 141.385 0 256-114.615 256-256 0-65.683-24.737-125.588-65.402-170.909l0.211 0.239zM618.667 856.32c-30.047 26.736-69.863 43.069-113.493 43.069-94.479 0-171.069-76.59-171.069-171.069 0-50.848 22.185-96.515 57.403-127.849l0.173-0.151c7.861-7.709 12.749-18.426 12.8-30.284l0-0.010v-335.36c0-58.91 47.756-106.667 106.667-106.667s106.667 47.756 106.667 106.667v0 338.773c0.051 11.868 4.939 22.584 12.793 30.287l0.007 0.007c32.137 31.076 52.089 74.581 52.089 122.745 0 53.761-24.858 101.716-63.706 132.999l-0.329 0.256z"],"attrs":[],"grid":0,"tags":["temperature-empty"]},"attrs":[],"properties":{"order":5534,"id":150,"name":"temperature-empty","prevSize":32,"code":60703},"setIdx":0,"setId":0,"iconIdx":1055},{"icon":{"paths":["M597.333 234.667c0-106.039-85.961-192-192-192s-192 85.961-192 192v0 320c-39.768 44.9-64.053 104.308-64.053 169.388 0 121.9 85.201 223.9 199.301 249.699l1.713 0.326c16.081 3.847 34.818 6.447 54.023 7.234l0.591 0.019c0.481 0.003 1.050 0.005 1.62 0.005 141.385 0 256-114.615 256-256 0-65.684-24.738-125.59-65.404-170.911l0.211 0.239zM512 858.027c-30.047 26.736-69.863 43.069-113.493 43.069-94.479 0-171.069-76.59-171.069-171.069 0-50.848 22.185-96.515 57.403-127.849l0.173-0.151c7.861-7.709 12.749-18.426 12.8-30.284l0-0.010v-337.067c0-58.91 47.756-106.667 106.667-106.667s106.667 47.756 106.667 106.667v0 338.773c0.051 11.868 4.939 22.584 12.793 30.287l0.007 0.007c32.137 31.076 52.089 74.581 52.089 122.745 0 53.761-24.858 101.716-63.706 132.999l-0.329 0.256zM448 651.947v-417.28c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 417.28c-25.542 14.943-42.472 42.166-42.667 73.359l-0 0.028c0 47.128 38.205 85.333 85.333 85.333s85.333-38.205 85.333-85.333v0c-0.194-31.22-17.125-58.443-42.264-73.169l-0.403-0.218zM832 106.667h-128c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h128c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["temperature-minus"]},"attrs":[],"properties":{"order":5535,"id":149,"name":"temperature-minus","prevSize":32,"code":60704},"setIdx":0,"setId":0,"iconIdx":1056},{"icon":{"paths":["M554.667 651.947v-203.947c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 203.947c-25.542 14.943-42.472 42.166-42.667 73.359l-0 0.028c0 47.128 38.205 85.333 85.333 85.333s85.333-38.205 85.333-85.333v0c-0.194-31.22-17.125-58.443-42.264-73.169l-0.403-0.218zM704 554.667v-320c0-106.039-85.961-192-192-192s-192 85.961-192 192v0 320c-39.768 44.9-64.053 104.308-64.053 169.388 0 121.9 85.201 223.9 199.301 249.699l1.713 0.326c16.223 3.875 35.111 6.477 54.472 7.236l0.568 0.018c0.354 0.002 0.773 0.003 1.191 0.003 141.385 0 256-114.615 256-256 0-65.683-24.737-125.588-65.402-170.909l0.211 0.239zM618.667 856.32c-30.047 26.736-69.863 43.069-113.493 43.069-94.479 0-171.069-76.59-171.069-171.069 0-50.848 22.185-96.515 57.403-127.849l0.173-0.151c7.861-7.709 12.749-18.426 12.8-30.284l0-0.010v-335.36c0-58.91 47.756-106.667 106.667-106.667s106.667 47.756 106.667 106.667v0 338.773c0.051 11.868 4.939 22.584 12.793 30.287l0.007 0.007c32.137 31.076 52.089 74.581 52.089 122.745 0 53.761-24.858 101.716-63.706 132.999l-0.329 0.256z"],"attrs":[],"grid":0,"tags":["temperature-half"]},"attrs":[],"properties":{"order":5536,"id":148,"name":"temperature-half","prevSize":32,"code":60705},"setIdx":0,"setId":0,"iconIdx":1057},{"icon":{"paths":["M448 651.947v-417.28c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 417.28c-25.542 14.943-42.472 42.166-42.667 73.359l-0 0.028c0 47.128 38.205 85.333 85.333 85.333s85.333-38.205 85.333-85.333v0c-0.194-31.22-17.125-58.443-42.264-73.169l-0.403-0.218zM832 106.667h-21.333v-21.333c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 21.333h-21.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h21.333v21.333c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-21.333h21.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM597.333 234.667c0-106.039-85.961-192-192-192s-192 85.961-192 192v0 320c-39.768 44.9-64.053 104.308-64.053 169.388 0 121.9 85.201 223.9 199.301 249.699l1.713 0.326c16.081 3.847 34.818 6.447 54.023 7.234l0.591 0.019c0.481 0.003 1.050 0.005 1.62 0.005 141.385 0 256-114.615 256-256 0-65.684-24.738-125.59-65.404-170.911l0.211 0.239zM512 858.027c-29.11 23.814-66.702 38.246-107.665 38.246-80.583 0-148.122-55.849-166.021-130.951l-0.233-1.161c-2.786-11.546-4.383-24.803-4.383-38.432 0-47.786 19.639-90.985 51.287-121.965l0.030-0.029c7.861-7.709 12.749-18.426 12.8-30.284l0-0.010v-338.773c0-58.91 47.756-106.667 106.667-106.667s106.667 47.756 106.667 106.667v0 338.773c0.051 11.868 4.939 22.584 12.793 30.287l0.007 0.007c32.137 31.076 52.089 74.581 52.089 122.745 0 53.761-24.858 101.716-63.706 132.999l-0.329 0.256z"],"attrs":[],"grid":0,"tags":["temperature-plus"]},"attrs":[],"properties":{"order":5537,"id":147,"name":"temperature-plus","prevSize":32,"code":60706},"setIdx":0,"setId":0,"iconIdx":1058},{"icon":{"paths":["M704 554.667v-320c0-106.039-85.961-192-192-192s-192 85.961-192 192v0 320c-39.768 44.9-64.053 104.308-64.053 169.388 0 121.9 85.201 223.9 199.301 249.699l1.713 0.326c16.223 3.875 35.111 6.477 54.472 7.236l0.568 0.018c0.354 0.002 0.773 0.003 1.191 0.003 141.385 0 256-114.615 256-256 0-65.683-24.737-125.588-65.402-170.909l0.211 0.239zM618.667 856.32c-30.047 26.736-69.863 43.069-113.493 43.069-94.479 0-171.069-76.59-171.069-171.069 0-50.848 22.185-96.515 57.403-127.849l0.173-0.151c7.861-7.709 12.749-18.426 12.8-30.284l0-0.010v-335.36c0-58.91 47.756-106.667 106.667-106.667s106.667 47.756 106.667 106.667v0 338.773c0.051 11.868 4.939 22.584 12.793 30.287l0.007 0.007c32.137 31.076 52.089 74.581 52.089 122.745 0 53.761-24.858 101.716-63.706 132.999l-0.329 0.256zM554.667 651.947v-118.613c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 118.613c-25.542 14.943-42.472 42.166-42.667 73.359l-0 0.028c0 47.128 38.205 85.333 85.333 85.333s85.333-38.205 85.333-85.333v0c-0.194-31.22-17.125-58.443-42.264-73.169l-0.403-0.218z"],"attrs":[],"grid":0,"tags":["temperature-quarter"]},"attrs":[],"properties":{"order":5538,"id":146,"name":"temperature-quarter","prevSize":32,"code":60707},"setIdx":0,"setId":0,"iconIdx":1059},{"icon":{"paths":["M243.627 268.373c-3.937-3.773-8.616-6.808-13.791-8.859l-0.289-0.101c-4.793-2.024-10.366-3.201-16.213-3.201s-11.42 1.176-16.495 3.305l0.281-0.105c-5.464 2.152-10.143 5.187-14.095 8.974l0.015-0.014-85.333 85.333c-7.753 7.753-12.548 18.463-12.548 30.293 0 23.661 19.181 42.841 42.841 42.841 11.83 0 22.541-4.795 30.293-12.548l-0 0 12.373-12.8v323.84c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-323.84l12.373 12.8c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003zM469.333 341.333h426.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-426.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM896 682.667h-426.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h426.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM896 469.333h-426.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h426.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["sort-amount-up"]},"attrs":[],"properties":{"order":5539,"id":145,"name":"sort-amount-up","prevSize":32,"code":60708},"setIdx":0,"setId":0,"iconIdx":1060},{"icon":{"paths":["M934.4 323.84l-42.667-165.12c-14.996-55.246-64.695-95.209-123.728-95.209-12.306 0-24.206 1.737-35.469 4.978l0.904-0.223-82.347 22.187c-18.445 4.978-31.795 21.559-31.795 41.258 0 3.992 0.548 7.857 1.574 11.522l-0.072-0.3 11.093 42.667-453.12 119.893c-18.391 5.015-31.689 21.57-31.689 41.23 0 3.847 0.509 7.576 1.464 11.122l-0.068-0.298 11.093 42.667-42.667 11.093c-21.342 2.744-37.665 20.799-37.665 42.667 0 23.748 19.251 42.999 42.999 42.999 1.88 0 3.732-0.121 5.548-0.355l-0.215 0.023c1.665 0.211 3.592 0.332 5.547 0.332s3.882-0.121 5.773-0.355l-0.226 0.023 42.667-11.52 11.093 42.667c3.062 10.976 10.102 19.96 19.429 25.492l0.197 0.108c6.1 3.68 13.45 5.889 21.31 5.973l0.024 0c1.668 0.308 3.587 0.484 5.547 0.484s3.879-0.176 5.742-0.514l-0.195 0.029 139.52-43.947v17.92c0.032 19.898 4.756 38.685 13.124 55.325l-0.324-0.711-213.333 213.333c-7.789 7.736-12.611 18.452-12.611 30.293 0 23.577 19.113 42.691 42.691 42.691 11.736 0 22.365-4.735 30.082-12.4l-0.002 0.002 213.333-213.333 11.947 4.693v264.107c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-263.68c4.961-1.706 9.048-3.436 12.998-5.401l-0.625 0.281 213.333 213.333c7.715 7.662 18.344 12.397 30.080 12.397 23.577 0 42.691-19.113 42.691-42.691 0-11.842-4.821-22.557-12.608-30.291l-0.002-0.002-213.333-213.333c7.926-15.942 12.757-34.66 13.224-54.457l0.003-0.157v-85.333l57.6-15.36 10.667 42.667c5.046 18.345 21.578 31.598 41.206 31.598 0.514 0 1.025-0.009 1.534-0.027l-0.074 0.002h11.093l82.347-22.187c55.396-14.893 95.505-64.666 95.505-123.807 0-13.214-2.002-25.961-5.721-37.953l0.242 0.907zM554.667 533.333c-0.047 11.445-4.593 21.818-11.959 29.453l0.012-0.013c-7.622 7.354-17.995 11.9-29.431 11.947l-0.009 0c-11.656-0.051-22.2-4.767-29.869-12.376l0.003 0.003c-7.606-7.667-12.323-18.211-12.373-29.857l-0-0.010v-42.667l83.627-20.48zM264.107 459.093l-22.187-82.347 412.16-110.507 22.187 85.333zM847.787 378.027c-5.658 9.775-14.819 16.989-25.727 19.983l-0.299 0.070-42.667 11.093-33.28-123.733-20.48-82.347-11.093-42.667 42.667-11.093c3.365-0.954 7.229-1.502 11.222-1.502 19.699 0 36.28 13.35 41.19 31.497l0.069 0.299 42.667 165.12c1.029 3.491 1.622 7.502 1.622 11.651 0 7.975-2.188 15.439-5.996 21.824l0.108-0.195z"],"attrs":[],"grid":0,"tags":["telescope"]},"attrs":[],"properties":{"order":5540,"id":144,"name":"telescope","prevSize":32,"code":60709},"setIdx":0,"setId":0,"iconIdx":1061},{"icon":{"paths":["M554.667 651.947v-417.28c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 417.28c-25.542 14.943-42.472 42.166-42.667 73.359l-0 0.028c0 47.128 38.205 85.333 85.333 85.333s85.333-38.205 85.333-85.333v0c-0.194-31.22-17.125-58.443-42.264-73.169l-0.403-0.218zM704 554.667v-320c0-106.039-85.961-192-192-192s-192 85.961-192 192v0 320c-39.768 44.9-64.053 104.308-64.053 169.388 0 121.9 85.201 223.9 199.301 249.699l1.713 0.326c16.223 3.875 35.111 6.477 54.472 7.236l0.568 0.018c0.354 0.002 0.773 0.003 1.191 0.003 141.385 0 256-114.615 256-256 0-65.683-24.737-125.588-65.402-170.909l0.211 0.239zM618.667 856.32c-29.11 23.814-66.702 38.246-107.665 38.246-80.583 0-148.122-55.849-166.021-130.951l-0.233-1.161c-2.786-11.546-4.383-24.803-4.383-38.432 0-47.786 19.639-90.985 51.287-121.965l0.030-0.029c7.861-7.709 12.749-18.426 12.8-30.284l0-0.010v-337.067c0-58.91 47.756-106.667 106.667-106.667s106.667 47.756 106.667 106.667v0 338.773c0.051 11.868 4.939 22.584 12.793 30.287l0.007 0.007c32.137 31.076 52.089 74.581 52.089 122.745 0 53.761-24.858 101.716-63.706 132.999l-0.329 0.256z"],"attrs":[],"grid":0,"tags":["temperature"]},"attrs":[],"properties":{"order":5541,"id":143,"name":"temperature","prevSize":32,"code":60710},"setIdx":0,"setId":0,"iconIdx":1062},{"icon":{"paths":["M240.64 725.333l-30.293 30.293c-7.668 7.712-12.407 18.343-12.407 30.080s4.74 22.368 12.409 30.082l-0.002-0.002c7.712 7.668 18.343 12.407 30.080 12.407s22.368-4.74 30.082-12.409l-0.002 0.002 30.293-30.293c6.377-7.412 10.259-17.129 10.259-27.753 0-23.564-19.103-42.667-42.667-42.667-10.624 0-20.341 3.883-27.809 10.307l0.056-0.047zM213.333 512c0-23.564-19.103-42.667-42.667-42.667v0h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h42.667c23.564 0 42.667-19.103 42.667-42.667v0zM512 213.333c23.564 0 42.667-19.103 42.667-42.667v0-42.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 42.667c0 23.564 19.103 42.667 42.667 42.667v0zM240.64 300.8c7.667 7.606 18.211 12.323 29.857 12.373l0.010 0c0.073 0 0.16 0.001 0.247 0.001 11.721 0 22.338-4.726 30.049-12.377l-0.003 0.003c7.668-7.712 12.407-18.343 12.407-30.080s-4.74-22.368-12.409-30.082l0.002 0.002-30.293-30.293c-7.412-6.377-17.129-10.259-27.753-10.259-23.564 0-42.667 19.103-42.667 42.667 0 10.624 3.883 20.341 10.307 27.809l-0.047-0.056zM752.64 313.173c11.656-0.051 22.2-4.767 29.869-12.376l-0.003 0.003 30.293-30.293c9.153-7.872 14.914-19.467 14.914-32.407 0-23.564-19.103-42.667-42.667-42.667-12.94 0-24.535 5.761-32.36 14.858l-0.047 0.056-27.307 30.293c-7.668 7.712-12.407 18.343-12.407 30.080s4.74 22.368 12.409 30.082l-0.002-0.002c7.267 7.23 17.128 11.859 28.065 12.37l0.095 0.004zM896 469.333h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM512 810.667c-23.564 0-42.667 19.103-42.667 42.667v0 42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667c0-23.564-19.103-42.667-42.667-42.667v0zM783.36 725.333c-5.976-3.385-13.125-5.38-20.74-5.38-23.564 0-42.667 19.103-42.667 42.667 0 7.615 1.995 14.764 5.491 20.953l-0.111-0.213 30.293 30.293c7.712 7.668 18.343 12.407 30.080 12.407s22.368-4.74 30.082-12.409l-0.002 0.002c7.668-7.712 12.407-18.343 12.407-30.080s-4.74-22.368-12.409-30.082l0.002 0.002zM512 277.333c-129.603 0-234.667 105.064-234.667 234.667s105.064 234.667 234.667 234.667c129.603 0 234.667-105.064 234.667-234.667v0c-0.242-129.505-105.161-234.424-234.643-234.667l-0.023-0zM512 661.333c-82.475 0-149.333-66.859-149.333-149.333s66.859-149.333 149.333-149.333c82.475 0 149.333 66.859 149.333 149.333v0c0 82.475-66.859 149.333-149.333 149.333v0z"],"attrs":[],"grid":0,"tags":["sun"]},"attrs":[],"properties":{"order":5542,"id":142,"name":"sun","prevSize":32,"code":60711},"setIdx":0,"setId":0,"iconIdx":1063},{"icon":{"paths":["M810.667 277.333h-128v-42.667c0-70.692-57.308-128-128-128v0h-85.333c-70.692 0-128 57.308-128 128v0 42.667h-128c-70.692 0-128 57.308-128 128v0 384c0 70.692 57.308 128 128 128v0h597.333c70.692 0 128-57.308 128-128v0-384c0-70.692-57.308-128-128-128v0zM426.667 234.667c0-23.564 19.103-42.667 42.667-42.667v0h85.333c23.564 0 42.667 19.103 42.667 42.667v0 42.667h-170.667zM853.333 789.333c0 23.564-19.103 42.667-42.667 42.667v0h-597.333c-23.564 0-42.667-19.103-42.667-42.667v0-215.467h128v44.8c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-44.8h256v44.8c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-44.8h128zM853.333 490.667h-682.667v-85.333c0-23.564 19.103-42.667 42.667-42.667v0h597.333c23.564 0 42.667 19.103 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["suitcase"]},"attrs":[],"properties":{"order":5543,"id":141,"name":"suitcase","prevSize":32,"code":60712},"setIdx":0,"setId":0,"iconIdx":1064},{"icon":{"paths":["M554.667 651.947v-289.28c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 289.28c-25.542 14.943-42.472 42.166-42.667 73.359l-0 0.028c0 47.128 38.205 85.333 85.333 85.333s85.333-38.205 85.333-85.333v0c-0.194-31.22-17.125-58.443-42.264-73.169l-0.403-0.218zM704 554.667v-320c0-106.039-85.961-192-192-192s-192 85.961-192 192v0 320c-39.768 44.9-64.053 104.308-64.053 169.388 0 121.9 85.201 223.9 199.301 249.699l1.713 0.326c16.223 3.875 35.111 6.477 54.472 7.236l0.568 0.018c0.354 0.002 0.773 0.003 1.191 0.003 141.385 0 256-114.615 256-256 0-65.683-24.737-125.588-65.402-170.909l0.211 0.239zM618.667 856.32c-30.047 26.736-69.863 43.069-113.493 43.069-94.479 0-171.069-76.59-171.069-171.069 0-50.848 22.185-96.515 57.403-127.849l0.173-0.151c7.861-7.709 12.749-18.426 12.8-30.284l0-0.010v-335.36c0-58.91 47.756-106.667 106.667-106.667s106.667 47.756 106.667 106.667v0 338.773c0.051 11.868 4.939 22.584 12.793 30.287l0.007 0.007c32.137 31.076 52.089 74.581 52.089 122.745 0 53.761-24.858 101.716-63.706 132.999l-0.329 0.256z"],"attrs":[],"grid":0,"tags":["temperature-three-quarter"]},"attrs":[],"properties":{"order":5544,"id":140,"name":"temperature-three-quarter","prevSize":32,"code":60713},"setIdx":0,"setId":0,"iconIdx":1065},{"icon":{"paths":["M640 554.667h-256c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h85.333v85.333c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-85.333h85.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM725.333 256h-426.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h170.667v85.333c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-85.333h170.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["text-strike-through"]},"attrs":[],"properties":{"order":5545,"id":139,"name":"text-strike-through","prevSize":32,"code":60714},"setIdx":0,"setId":0,"iconIdx":1066},{"icon":{"paths":["M725.333 256h-426.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h170.667v384c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-384h170.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["text"]},"attrs":[],"properties":{"order":5546,"id":138,"name":"text","prevSize":32,"code":60715},"setIdx":0,"setId":0,"iconIdx":1067},{"icon":{"paths":["M810.667 341.333c-0.095-0-0.207-0-0.32-0-70.516 0-127.681 57.165-127.681 127.681 0 55.34 35.207 102.457 84.444 120.175l0.89 0.28v71.865c0 106.039-85.961 192-192 192s-192-85.961-192-192v0-43.5l133.291-106.604c48.961-39.233 80.043-99.024 80.043-166.075 0-0.178-0-0.357-0.001-0.535l0 0.027v-216.646c0-23.564-19.103-42.667-42.667-42.667v0h-85.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h42.667v173.979c0 0.091 0 0.199 0 0.307 0 40.231-18.647 76.108-47.77 99.457l-0.251 0.194-122.646 98.083-122.624-98.083c-29.386-23.535-48.043-59.412-48.043-99.646 0-0.11 0-0.219 0-0.329l-0 0.017v-173.979h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-85.333c-23.564 0-42.667 19.103-42.667 42.667v0 216.646c-0 0.152-0.001 0.333-0.001 0.513 0 67.054 31.091 126.845 79.644 165.745l0.419 0.325 133.271 106.602v43.503c0 153.167 124.166 277.333 277.333 277.333s277.333-124.166 277.333-277.333v0-71.862c50.127-17.998 85.333-65.115 85.333-120.455 0-70.517-57.166-127.683-127.683-127.683-0.111 0-0.223 0-0.334 0l0.017-0zM810.667 512c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667c23.564 0 42.667 19.103 42.667 42.667v0c-0.032 23.551-19.115 42.635-42.664 42.667l-0.003 0z"],"attrs":[],"grid":0,"tags":["stethoscope-alt"]},"attrs":[],"properties":{"order":5547,"id":137,"name":"stethoscope-alt","prevSize":32,"code":60716},"setIdx":0,"setId":0,"iconIdx":1068},{"icon":{"paths":["M384 469.333h-256c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h85.333v213.333c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-213.333h85.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM896 213.333h-512c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h213.333v469.333c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-469.333h213.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["text-size"]},"attrs":[],"properties":{"order":5548,"id":136,"name":"text-size","prevSize":32,"code":60717},"setIdx":0,"setId":0,"iconIdx":1069},{"icon":{"paths":["M968.96 908.373l-853.333-853.333c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293v0l30.293 29.867v750.507c0 23.564 19.103 42.667 42.667 42.667v0h750.507l29.867 30.293c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003zM170.667 230.827l110.507 110.507h-110.507zM341.333 853.333h-170.667v-170.667h170.667zM341.333 597.333h-170.667v-170.667h170.667zM426.667 486.827l110.507 110.507h-110.507zM597.333 853.333h-170.667v-170.667h170.667zM682.667 853.333v-110.507l110.507 110.507zM369.92 170.667h227.413v213.333c0 23.564 19.103 42.667 42.667 42.667v0h213.333v227.413c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-526.080c0-23.564-19.103-42.667-42.667-42.667v0h-526.080c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM682.667 170.667h170.667v170.667h-170.667z"],"attrs":[],"grid":0,"tags":["th-slash"]},"attrs":[],"properties":{"order":5549,"id":135,"name":"th-slash","prevSize":32,"code":60718},"setIdx":0,"setId":0,"iconIdx":1070},{"icon":{"paths":["M853.333 128h-682.667c-23.564 0-42.667 19.103-42.667 42.667v0 682.667c0 23.564 19.103 42.667 42.667 42.667v0h682.667c23.564 0 42.667-19.103 42.667-42.667v0-682.667c0-23.564-19.103-42.667-42.667-42.667v0zM469.333 810.667h-256v-256h256zM469.333 469.333h-256v-256h256zM810.667 810.667h-256v-256h256zM810.667 469.333h-256v-256h256z"],"attrs":[],"grid":0,"tags":["th-large"]},"attrs":[],"properties":{"order":5550,"id":134,"name":"th-large","prevSize":32,"code":60719},"setIdx":0,"setId":0,"iconIdx":1071},{"icon":{"paths":["M695.040 268.373l-298.667 298.667c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 298.667-298.667c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l-0 0zM876.373 147.627c-38.625-38.72-92.035-62.675-151.040-62.675s-112.415 23.955-151.036 62.67l-0.004 0.004-348.587 351.147c-7.606 7.667-12.323 18.211-12.373 29.857l-0 0.010v221.44l-115.627 115.627c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 115.627-115.627h221.44c11.656-0.051 22.2-4.767 29.869-12.376l-0.003 0.003 351.147-348.587c38.72-38.625 62.675-92.035 62.675-151.040s-23.955-112.415-62.67-151.036l-0.004-0.004zM815.787 389.12l-337.92 336.213h-179.2v-179.2l336.213-337.92c22.796-21.285 53.502-34.354 87.26-34.354 70.692 0 128 57.308 128 128 0 33.758-13.069 64.464-34.423 87.335l0.069-0.074z"],"attrs":[],"grid":0,"tags":["thermometer"]},"attrs":[],"properties":{"order":5551,"id":133,"name":"thermometer","prevSize":32,"code":60720},"setIdx":0,"setId":0,"iconIdx":1072},{"icon":{"paths":["M896 85.333h-768c-23.564 0-42.667 19.103-42.667 42.667v0 768c0 23.564 19.103 42.667 42.667 42.667v0h768c23.564 0 42.667-19.103 42.667-42.667v0-768c0-23.564-19.103-42.667-42.667-42.667v0zM469.333 853.333h-298.667v-298.667h298.667zM469.333 469.333h-298.667v-298.667h298.667zM853.333 853.333h-298.667v-298.667h298.667zM853.333 469.333h-298.667v-298.667h298.667z"],"attrs":[],"grid":0,"tags":["th"]},"attrs":[],"properties":{"order":5552,"id":132,"name":"th","prevSize":32,"code":60721},"setIdx":0,"setId":0,"iconIdx":1073},{"icon":{"paths":["M938.667 412.587c-5.546-15.728-19.622-27.083-36.531-28.575l-0.162-0.012-242.773-35.413-108.8-220.587c-7.071-14.361-21.602-24.069-38.4-24.069s-31.329 9.707-38.289 23.819l-0.111 0.25-108.8 220.16-242.773 35.84c-16.295 2.38-29.452 13.684-34.473 28.712l-0.087 0.301c-1.181 3.729-1.862 8.018-1.862 12.465 0 11.798 4.788 22.477 12.527 30.201l0.001 0.001 176.213 170.667-42.667 242.347c-0.602 2.687-0.947 5.773-0.947 8.939 0 23.564 19.103 42.667 42.667 42.667 7.72 0 14.961-2.050 21.208-5.636l-0.208 0.11 217.6-113.92 217.6 113.92c5.609 3.221 12.331 5.12 19.497 5.12 0.046 0 0.091-0 0.137-0l-0.007 0c0.045 0 0.099 0 0.152 0 9.401 0 18.091-3.040 25.142-8.191l-0.121 0.084c10.845-7.836 17.82-20.446 17.82-34.685 0-2.823-0.274-5.582-0.797-8.251l0.044 0.27-42.667-242.347 176.213-170.667c9.255-7.876 15.087-19.534 15.087-32.554 0-3.899-0.523-7.676-1.503-11.265l0.070 0.299zM469.333 725.333l-137.813 72.533 30.72-179.2c0.361-2.086 0.568-4.488 0.568-6.939 0-12.002-4.955-22.846-12.931-30.598l-0.010-0.010-128-128 179.627-26.027c14.318-2.046 26.186-10.949 32.315-23.22l0.112-0.247 35.413-73.813zM674.133 581.12c-7.986 7.762-12.941 18.606-12.941 30.608 0 2.451 0.207 4.853 0.603 7.19l-0.035-0.252 30.72 179.2-137.813-72.533v-395.52l37.547 76.373c6.241 12.517 18.109 21.421 32.198 23.44l0.228 0.027 179.627 26.027z"],"attrs":[],"grid":0,"tags":["star-half-alt"]},"attrs":[],"properties":{"order":5553,"id":131,"name":"star-half-alt","prevSize":32,"code":60722},"setIdx":0,"setId":0,"iconIdx":1074},{"icon":{"paths":["M494.080 704h-53.76l36.693-64c4.177-6.48 6.66-14.395 6.66-22.89 0-23.564-19.103-42.667-42.667-42.667-16.334 0-30.524 9.178-37.694 22.659l-0.112 0.23-73.813 128c-3.594 6.12-5.717 13.479-5.717 21.334 0 23.474 18.957 42.52 42.396 42.666l0.014 0h54.187l-36.267 64c-3.58 6.123-5.694 13.481-5.694 21.333 0 23.645 19.168 42.814 42.814 42.814 15.793 0 29.589-8.552 37.010-21.277l0.11-0.203 73.813-128c3.594-6.12 5.716-13.479 5.716-21.333s-2.123-15.214-5.825-21.535l0.109 0.201c-7.513-12.85-21.243-21.345-36.957-21.345-0.357 0-0.713 0.004-1.069 0.013l0.053-0.001zM925.867 322.987c-7.693-7.561-18.252-12.229-29.9-12.229-3.469 0-6.842 0.414-10.071 1.196l0.291-0.060c-8.398 2.007-18.090 3.242-28.041 3.412l-0.119 0.002c-70.692 0-128-57.308-128-128v0c0.134-9.902 1.37-19.447 3.593-28.608l-0.179 0.875c0.753-2.998 1.185-6.441 1.185-9.984 0-23.564-19.103-42.667-42.667-42.667-3.293 0-6.499 0.373-9.578 1.079l0.287-0.055c-86.575 19.6-152.111 90.609-163.305 178.584l-0.108 1.042c-21.306-6.325-45.807-10.053-71.151-10.239l-0.102-0.001c-0.043-0-0.094-0-0.145-0-128.287 0-234.535 94.364-253.119 217.467l-0.175 1.413c-63.668 17.852-109.578 75.374-109.578 143.619 0 62.872 38.965 116.643 94.064 138.482l1.007 0.352c5.358 2.606 11.657 4.129 18.311 4.129 23.564 0 42.667-19.103 42.667-42.667 0-19.137-12.599-35.332-29.955-40.741l-0.302-0.081c-23.624-9.768-39.944-32.632-39.944-59.307 0-35.289 28.561-63.907 63.828-64l0.009-0c23.564 0 42.667-19.103 42.667-42.667v0c0-94.257 76.41-170.667 170.667-170.667v0c0.040-0 0.086-0 0.133-0 34.622 0 66.787 10.52 93.473 28.537l-0.593-0.377c30.689 20.394 54.047 49.676 66.609 84.147l0.378 1.187c5.038 14.827 17.602 25.829 33.023 28.549l0.257 0.038c46.949 8.538 82.081 49.111 82.081 97.891 0 44.925-29.8 82.89-70.711 95.207l-0.704 0.182c-21.171 2.939-37.294 20.92-37.294 42.667 0 23.778 19.276 43.054 43.054 43.054 2.031 0 4.030-0.141 5.986-0.413l-0.226 0.026c1.732 0.296 3.726 0.466 5.76 0.466s4.028-0.169 5.97-0.495l-0.21 0.029c78.854-22.241 135.681-93.54 135.681-178.112 0-0.233-0-0.465-0.001-0.697l0 0.036c0.002-0.3 0.003-0.655 0.003-1.011 0-30.848-7.739-59.889-21.382-85.286l0.473 0.963c74.531-21.297 131.336-80.655 148.629-155.164l0.278-1.422c0.532-2.529 0.837-5.434 0.837-8.411 0-12.339-5.238-23.455-13.611-31.245l-0.026-0.024zM730.027 443.307c-2.683 0.23-5.806 0.361-8.96 0.361s-6.277-0.131-9.364-0.388l0.404 0.027c-8.447-5.873-18.104-11.423-28.23-16.135l-1.21-0.505c-18.153-39.183-44.511-71.829-77.048-96.833l-0.605-0.447c0-5.12 0-10.667 0-15.787-0-0.002-0-0.005-0-0.008 0-38.848 17.306-73.654 44.63-97.129l0.17-0.143c13.952 93.524 86.955 166.528 179.309 180.336l1.171 0.144c-23.649 28.5-59.077 46.516-98.714 46.516-0.546 0-1.091-0.003-1.636-0.010l0.083 0.001z"],"attrs":[],"grid":0,"tags":["thunderstorm-moon"]},"attrs":[],"properties":{"order":5554,"id":130,"name":"thunderstorm-moon","prevSize":32,"code":60723},"setIdx":0,"setId":0,"iconIdx":1075},{"icon":{"paths":["M576 640h-96.853l61.867-106.667c3.58-6.123 5.694-13.481 5.694-21.333 0-23.645-19.168-42.814-42.814-42.814-15.793 0-29.589 8.552-37.010 21.277l-0.11 0.203-98.56 170.667c-3.594 6.12-5.716 13.479-5.716 21.333s2.123 15.214 5.825 21.535l-0.109-0.201c7.514 12.844 21.241 21.334 36.951 21.334 0.060 0 0.119-0 0.179-0l-0.009 0h96.853l-61.867 106.667c-3.58 6.123-5.694 13.481-5.694 21.333 0 23.645 19.168 42.814 42.814 42.814 15.793 0 29.589-8.552 37.010-21.277l0.11-0.203 98.56-170.667c3.594-6.12 5.716-13.479 5.716-21.333s-2.123-15.214-5.825-21.535l0.109 0.201c-7.514-12.844-21.241-21.334-36.951-21.334-0.060 0-0.119 0-0.179 0l0.009-0zM785.92 307.627c-47.23-106.469-152.007-179.388-273.815-179.388-151.477 0-276.616 112.767-296.047 258.931l-0.166 1.524c-75.666 18.574-130.919 85.822-130.919 165.974 0 94.257 76.41 170.667 170.667 170.667 0.126 0 0.253-0 0.379-0l-0.020 0c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0c-47.128 0-85.333-38.205-85.333-85.333s38.205-85.333 85.333-85.333v0c23.564 0 42.667-19.103 42.667-42.667v0c0.262-117.622 95.674-212.873 213.333-212.873 93.059 0 172.202 59.585 201.357 142.684l0.457 1.495c5.163 14.65 17.694 25.478 33.026 28.124l0.254 0.036c60.007 11.37 104.774 63.394 104.774 125.875 0 70.177-56.475 127.163-126.455 127.991l-0.078 0.001c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0c117.568-0.334 212.745-95.718 212.745-213.333 0-96.006-63.418-177.2-150.648-203.975l-1.511-0.399z"],"attrs":[],"grid":0,"tags":["thunderstorm"]},"attrs":[],"properties":{"order":5555,"id":129,"name":"thunderstorm","prevSize":32,"code":60724},"setIdx":0,"setId":0,"iconIdx":1076},{"icon":{"paths":["M908.8 430.080c-23.598-28.19-58.777-46.011-98.121-46.080l-0.012-0h-194.56l23.893-61.013c7.003-18.257 11.059-39.376 11.059-61.442 0-97.32-78.893-176.213-176.213-176.213-0.288 0-0.576 0.001-0.863 0.002l0.045-0c-17.192 0.037-31.992 10.236-38.717 24.907l-0.109 0.266-121.6 273.493h-100.267c-70.692 0-128 57.308-128 128v0 298.667c0 70.692 57.308 128 128 128v0h543.147c62.53-0.022 114.576-44.877 125.742-104.165l0.125-0.795 54.187-298.667c1.31-6.875 2.059-14.784 2.059-22.867 0-31.335-11.259-60.039-29.953-82.289l0.161 0.196zM298.667 853.333h-85.333c-23.564 0-42.667-19.103-42.667-42.667v0-298.667c0-23.564 19.103-42.667 42.667-42.667v0h85.333zM853.333 519.68l-54.187 298.667c-3.762 20.035-21.12 34.992-41.971 34.992-0.245 0-0.489-0.002-0.733-0.006l0.037 0h-372.48v-417.707l116.053-261.12c37.767 11.267 64.83 45.687 64.83 86.429 0 11.572-2.183 22.634-6.161 32.797l0.211-0.612-22.613 61.013c-3.418 8.873-5.397 19.139-5.397 29.867 0 47.076 38.12 85.248 85.176 85.333l0.008 0h194.56c0.021-0 0.045-0 0.069-0 13.146 0 24.903 5.945 32.73 15.293l0.054 0.067c6.463 7.437 10.403 17.218 10.403 27.919 0 2.496-0.214 4.943-0.626 7.322l0.036-0.254z"],"attrs":[],"grid":0,"tags":["thumbs-up"]},"attrs":[],"properties":{"order":5556,"id":128,"name":"thumbs-up","prevSize":32,"code":60725},"setIdx":0,"setId":0,"iconIdx":1077},{"icon":{"paths":["M810.667 85.333h-543.147c-62.53 0.022-114.576 44.877-125.742 104.165l-0.125 0.795-54.187 298.667c-1.33 6.927-2.091 14.895-2.091 23.040 0 70.677 57.283 127.976 127.955 128l194.562 0-23.893 61.013c-7.003 18.257-11.059 39.376-11.059 61.442 0 97.32 78.893 176.213 176.213 176.213 0.288 0 0.576-0.001 0.863-0.002l-0.045 0c17.192-0.037 31.992-10.236 38.717-24.907l0.109-0.266 121.6-273.493h100.267c70.692 0 128-57.308 128-128v0-298.667c0-70.692-57.308-128-128-128v0zM640 588.373l-116.053 261.12c-37.67-11.659-64.561-46.182-64.561-86.986 0-11.358 2.084-22.229 5.889-32.252l-0.208 0.625 22.613-61.013c3.418-8.873 5.397-19.139 5.397-29.867 0-47.076-38.12-85.248-85.176-85.333l-0.008-0h-194.56c-0.021 0-0.045 0-0.069 0-13.146 0-24.903-5.945-32.73-15.293l-0.054-0.067c-6.463-7.437-10.403-17.218-10.403-27.919 0-2.496 0.214-4.943 0.626-7.322l-0.036 0.254 54.187-298.667c3.762-20.035 21.12-34.992 41.971-34.992 0.245 0 0.489 0.002 0.733 0.006l-0.037-0h372.48zM853.333 512c0 23.564-19.103 42.667-42.667 42.667v0h-85.333v-384h85.333c23.564 0 42.667 19.103 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["thumbs-down"]},"attrs":[],"properties":{"order":5557,"id":127,"name":"thumbs-down","prevSize":32,"code":60726},"setIdx":0,"setId":0,"iconIdx":1078},{"icon":{"paths":["M670.293 353.707c-7.733-7.795-18.45-12.621-30.293-12.621s-22.56 4.826-30.291 12.618l-0.003 0.003-97.707 98.133-97.707-98.133c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293v0l98.133 97.707-98.133 97.707c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 97.707-98.133 97.707 98.133c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003-98.133-97.707 98.133-97.707c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003zM813.653 210.347c-77.694-80.363-186.469-130.256-306.896-130.256-235.641 0-426.667 191.025-426.667 426.667 0 120.428 49.893 229.203 130.137 306.781l0.12 0.115c77.694 80.363 186.469 130.256 306.896 130.256 235.641 0 426.667-191.025 426.667-426.667 0-120.428-49.893-229.203-130.137-306.781l-0.12-0.115zM753.493 753.493c-61.783 61.849-147.17 100.108-241.493 100.108-188.513 0-341.333-152.82-341.333-341.333s152.82-341.333 341.333-341.333c188.419 0 341.181 152.667 341.333 341.051l0 0.014c0.001 0.342 0.002 0.747 0.002 1.151 0 93.912-38.165 178.911-99.831 240.331l-0.011 0.011z"],"attrs":[],"grid":0,"tags":["times-circle"]},"attrs":[],"properties":{"order":5558,"id":126,"name":"times-circle","prevSize":32,"code":60727},"setIdx":0,"setId":0,"iconIdx":1079},{"icon":{"paths":["M341.333 362.667c-82.475 0-149.333 66.859-149.333 149.333s66.859 149.333 149.333 149.333c82.475 0 149.333-66.859 149.333-149.333v0c0-82.475-66.859-149.333-149.333-149.333v0zM341.333 576c-35.346 0-64-28.654-64-64s28.654-64 64-64c35.346 0 64 28.654 64 64v0c0 35.346-28.654 64-64 64v0zM682.667 213.333h-341.333c-164.949 0-298.667 133.718-298.667 298.667s133.718 298.667 298.667 298.667v0h341.333c164.949 0 298.667-133.718 298.667-298.667s-133.718-298.667-298.667-298.667v0zM682.667 725.333h-341.333c-117.821 0-213.333-95.513-213.333-213.333s95.513-213.333 213.333-213.333v0h341.333c117.821 0 213.333 95.513 213.333 213.333s-95.513 213.333-213.333 213.333v0z"],"attrs":[],"grid":0,"tags":["toggle-off"]},"attrs":[],"properties":{"order":5559,"id":125,"name":"toggle-off","prevSize":32,"code":60728},"setIdx":0,"setId":0,"iconIdx":1080},{"icon":{"paths":["M494.080 704h-53.76l36.693-64c4.177-6.48 6.66-14.395 6.66-22.89 0-23.564-19.103-42.667-42.667-42.667-16.334 0-30.524 9.178-37.694 22.659l-0.112 0.23-73.813 128c-3.594 6.12-5.717 13.479-5.717 21.334 0 23.474 18.957 42.52 42.396 42.666l0.014 0h54.187l-36.267 64c-3.58 6.123-5.694 13.481-5.694 21.333 0 23.645 19.168 42.814 42.814 42.814 15.793 0 29.589-8.552 37.010-21.277l0.11-0.203 73.813-128c3.594-6.12 5.716-13.479 5.716-21.333s-2.123-15.214-5.825-21.535l0.109 0.201c-7.513-12.85-21.243-21.345-36.957-21.345-0.357 0-0.713 0.004-1.069 0.013l0.053-0.001zM896 320h-34.133c-4.812-20.513-12.457-38.604-22.633-54.956l0.446 0.769 23.893-23.893c6.377-7.412 10.259-17.129 10.259-27.753 0-23.564-19.103-42.667-42.667-42.667-10.624 0-20.341 3.883-27.809 10.307l0.056-0.047-23.893 23.893c-15.583-9.73-33.674-17.375-52.956-21.941l-1.231-0.246v-34.133c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 34.133c-20.513 4.812-38.604 12.457-54.956 22.633l0.769-0.446-23.893-23.893c-7.412-6.377-17.129-10.259-27.753-10.259-23.564 0-42.667 19.103-42.667 42.667 0 10.624 3.883 20.341 10.307 27.809l-0.047-0.056 23.893 24.32c-3.84 6.4-6.827 13.653-10.24 20.48-20.193-5.922-43.395-9.348-67.392-9.387l-0.022-0c-0.043-0-0.094-0-0.145-0-128.287 0-234.535 94.364-253.119 217.467l-0.175 1.413c-63.668 17.852-109.578 75.374-109.578 143.619 0 62.872 38.965 116.643 94.064 138.482l1.007 0.352c5.358 2.606 11.657 4.129 18.311 4.129 23.564 0 42.667-19.103 42.667-42.667 0-19.137-12.599-35.332-29.955-40.741l-0.302-0.081c-23.624-9.768-39.944-32.632-39.944-59.307 0-35.289 28.561-63.907 63.828-64l0.009-0c23.564 0 42.667-19.103 42.667-42.667v0c0.44-93.923 76.681-169.892 170.665-169.892 74.265 0 137.45 47.434 160.913 113.658l0.369 1.194c5.038 14.827 17.602 25.829 33.023 28.549l0.257 0.038c46.949 8.538 82.081 49.111 82.081 97.891 0 44.925-29.8 82.89-70.711 95.207l-0.704 0.182c-21.171 2.939-37.294 20.92-37.294 42.667 0 23.778 19.276 43.054 43.054 43.054 2.031 0 4.030-0.141 5.986-0.413l-0.226 0.026c1.732 0.296 3.726 0.466 5.76 0.466s4.028-0.169 5.97-0.495l-0.21 0.029c78.124-22.209 134.38-92.924 134.38-176.778 0-24.219-4.693-47.341-13.218-68.508l0.439 1.233 5.547 5.547c7.667 7.606 18.211 12.323 29.857 12.373l0.010 0c0.073 0 0.16 0.001 0.247 0.001 11.721 0 22.338-4.726 30.049-12.377l-0.003 0.003c7.668-7.712 12.407-18.343 12.407-30.080s-4.74-22.368-12.409-30.082l0.002 0.002-23.893-23.893c10.078-16.575 17.772-35.868 21.986-56.431l0.2-1.169h34.133c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM753.493 433.067v0c-7.312 6.954-15.758 12.808-25.015 17.241l-0.585 0.253c-13.007-9.589-27.961-17.664-43.989-23.5l-1.237-0.394c-20.261-43.562-50.674-79.451-88.321-105.678l-0.852-0.562c5.043-11.522 11.643-21.402 19.674-29.918l-0.048 0.051c18.429-17.084 43.191-27.566 70.4-27.566s51.971 10.481 70.467 27.627l-0.067-0.061c17.65 18.183 28.531 43.021 28.531 70.4s-10.881 52.217-28.556 70.425l0.024-0.025z"],"attrs":[],"grid":0,"tags":["thunderstorm-sun"]},"attrs":[],"properties":{"order":5560,"id":124,"name":"thunderstorm-sun","prevSize":32,"code":60729},"setIdx":0,"setId":0,"iconIdx":1081},{"icon":{"paths":["M290.313 640c-7.508-12.852-21.236-21.349-36.949-21.349-7.859 0-15.221 2.126-21.543 5.833l0.201-0.109-73.917 42.667c-12.837 7.518-21.321 21.242-21.321 36.947 0 23.568 19.106 42.673 42.673 42.673 7.847 0 15.199-2.118 21.516-5.813l-0.202 0.109 73.917-42.667c12.843-7.522 21.331-21.253 21.331-36.967 0-7.851-2.119-15.206-5.816-21.527l0.109 0.202zM158.104 356.958l73.917 42.667c6.124 3.6 13.49 5.726 21.352 5.726 23.568 0 42.673-19.106 42.673-42.673 0-15.721-8.501-29.456-21.157-36.86l-0.202-0.109-73.917-42.667c-6.115-3.586-13.468-5.704-21.314-5.704-23.568 0-42.673 19.106-42.673 42.673 0 15.706 8.485 29.43 21.12 36.838l0.201 0.109zM256 512c0-23.564-19.103-42.667-42.667-42.667v0h-85.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h85.333c23.564 0 42.667-19.103 42.667-42.667v0zM733.687 384c7.521 12.844 21.252 21.333 36.965 21.333 7.851 0 15.208-2.119 21.528-5.817l-0.202 0.109 73.917-42.667c12.858-7.513 21.359-21.248 21.359-36.969 0-23.568-19.106-42.673-42.673-42.673-7.862 0-15.228 2.126-21.553 5.835l0.201-0.109-73.917 42.667c-12.843 7.522-21.331 21.253-21.331 36.967 0 7.85 2.119 15.206 5.815 21.526l-0.109-0.202zM640 290.313c6.119 3.589 13.475 5.708 21.327 5.708 15.714 0 29.444-8.489 36.856-21.132l0.109-0.201 42.667-73.917c3.6-6.124 5.726-13.49 5.726-21.352 0-23.568-19.106-42.673-42.673-42.673-15.721 0-29.456 8.501-36.86 21.157l-0.109 0.202-42.667 73.917c-3.587 6.118-5.706 13.474-5.706 21.324 0 15.714 8.488 29.445 21.13 36.858l0.201 0.109zM865.896 667.042l-73.917-42.667c-6.124-3.6-13.49-5.726-21.352-5.726-23.568 0-42.673 19.106-42.673 42.673 0 15.721 8.501 29.456 21.157 36.86l0.202 0.109 73.917 42.667c6.115 3.586 13.468 5.704 21.314 5.704 23.568 0 42.673-19.106 42.673-42.673 0-15.706-8.485-29.43-21.12-36.838l-0.201-0.109zM698.292 749.312c-7.513-12.858-21.248-21.359-36.969-21.359-23.568 0-42.673 19.106-42.673 42.673 0 7.862 2.126 15.228 5.835 21.553l-0.109-0.201 42.667 73.917c7.513 12.858 21.248 21.359 36.969 21.359 23.568 0 42.673-19.106 42.673-42.673 0-7.862-2.126-15.228-5.835-21.553l0.109 0.201zM896 469.333h-85.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h85.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM512 768c-23.564 0-42.667 19.103-42.667 42.667v0 85.333c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-85.333c0-23.564-19.103-42.667-42.667-42.667v0zM384 733.687c-6.121-3.599-13.484-5.725-21.343-5.725-15.713 0-29.441 8.498-36.84 21.148l-0.109 0.202-42.667 73.917c-3.586 6.115-5.704 13.468-5.704 21.314 0 23.568 19.106 42.673 42.673 42.673 15.706 0 29.43-8.485 36.838-21.12l0.109-0.201 42.667-73.917c3.588-6.118 5.706-13.474 5.706-21.324 0-15.714-8.488-29.445-21.13-36.858l-0.201-0.109zM512 85.333c-23.564 0-42.667 19.103-42.667 42.667v0 85.333c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-85.333c0-23.564-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["spinner-alt"]},"attrs":[],"properties":{"order":5561,"id":123,"name":"spinner-alt","prevSize":32,"code":60730},"setIdx":0,"setId":0,"iconIdx":1082},{"icon":{"paths":["M572.16 512l183.467-183.040c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l-0 0-183.040 183.467-183.040-183.467c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l-0-0 183.467 183.040-183.467 183.040c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 183.040-183.467 183.040 183.467c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003z"],"attrs":[],"grid":0,"tags":["times"]},"attrs":[],"properties":{"order":5562,"id":122,"name":"times","prevSize":32,"code":60731},"setIdx":0,"setId":0,"iconIdx":1083},{"icon":{"paths":["M670.293 353.707c-7.733-7.795-18.45-12.621-30.293-12.621s-22.56 4.826-30.291 12.618l-0.003 0.003-97.707 98.133-97.707-98.133c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293v0l98.133 97.707-98.133 97.707c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 97.707-98.133 97.707 98.133c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003-98.133-97.707 98.133-97.707c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003zM810.667 85.333h-597.333c-70.692 0-128 57.308-128 128v0 597.333c0 70.692 57.308 128 128 128v0h597.333c70.692 0 128-57.308 128-128v0-597.333c0-70.692-57.308-128-128-128v0zM853.333 810.667c0 23.564-19.103 42.667-42.667 42.667v0h-597.333c-23.564 0-42.667-19.103-42.667-42.667v0-597.333c0-23.564 19.103-42.667 42.667-42.667v0h597.333c23.564 0 42.667 19.103 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["times-square"]},"attrs":[],"properties":{"order":5563,"id":121,"name":"times-square","prevSize":32,"code":60732},"setIdx":0,"setId":0,"iconIdx":1084},{"icon":{"paths":["M682.667 362.667c-82.475 0-149.333 66.859-149.333 149.333s66.859 149.333 149.333 149.333c82.475 0 149.333-66.859 149.333-149.333v0c0-82.475-66.859-149.333-149.333-149.333v0zM682.667 576c-35.346 0-64-28.654-64-64s28.654-64 64-64c35.346 0 64 28.654 64 64v0c0 35.346-28.654 64-64 64v0zM682.667 213.333h-341.333c-164.949 0-298.667 133.718-298.667 298.667s133.718 298.667 298.667 298.667v0h341.333c164.949 0 298.667-133.718 298.667-298.667s-133.718-298.667-298.667-298.667v0zM682.667 725.333h-341.333c-117.821 0-213.333-95.513-213.333-213.333s95.513-213.333 213.333-213.333v0h341.333c117.821 0 213.333 95.513 213.333 213.333s-95.513 213.333-213.333 213.333v0z"],"attrs":[],"grid":0,"tags":["toggle-on"]},"attrs":[],"properties":{"order":5564,"id":120,"name":"toggle-on","prevSize":32,"code":60733},"setIdx":0,"setId":0,"iconIdx":1085},{"icon":{"paths":["M810.667 256h-128v-42.667c0-47.128-38.205-85.333-85.333-85.333v0h-170.667c-47.128 0-85.333 38.205-85.333 85.333v0 42.667h-128c-70.692 0-128 57.308-128 128v0 384c0 70.692 57.308 128 128 128v0h597.333c70.692 0 128-57.308 128-128v0-384c0-70.692-57.308-128-128-128v0zM426.667 213.333h170.667v42.667h-170.667zM853.333 768c0 23.564-19.103 42.667-42.667 42.667v0h-597.333c-23.564 0-42.667-19.103-42.667-42.667v0-213.333h170.667v42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667h170.667v42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667h170.667zM853.333 469.333h-682.667v-85.333c0-23.564 19.103-42.667 42.667-42.667v0h597.333c23.564 0 42.667 19.103 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["suitcase-alt"]},"attrs":[],"properties":{"order":5565,"id":119,"name":"suitcase-alt","prevSize":32,"code":60734},"setIdx":0,"setId":0,"iconIdx":1086},{"icon":{"paths":["M512 85.333c-235.293 0.462-425.856 191.31-425.856 426.666 0 111.359 42.662 212.754 112.533 288.732l-0.277-0.305 3.84 4.267c77.928 82.143 187.875 133.25 309.76 133.25s231.832-51.107 309.582-133.061l0.178-0.189 3.84-4.267c69.594-75.674 112.256-177.069 112.256-288.427 0-235.356-190.563-426.204-425.811-426.666l-0.045-0zM239.36 716.373c-42.875-56.099-68.699-127.22-68.699-204.373s25.824-148.274 69.299-205.192l-0.6 0.819c62.129 47.217 101.833 121.159 101.833 204.373s-39.704 157.156-101.202 203.914l-0.63 0.46zM512 853.333c-0.167 0-0.364 0-0.561 0-80.942 0-155.229-28.495-213.377-76l0.605 0.479c77.849-63.079 127.203-158.683 127.203-265.813s-49.354-202.734-126.565-265.313l-0.638-0.501c57.746-47.010 132.215-75.485 213.333-75.485s155.587 28.475 213.954 75.975l-0.621-0.489c-77.849 63.079-127.203 158.683-127.203 265.813s49.354 202.734 126.565 265.313l0.638 0.501c-57.543 47.026-131.83 75.52-212.772 75.52-0.197 0-0.395-0-0.592-0.001l0.031 0zM784.64 716.373c-62.129-47.217-101.833-121.159-101.833-204.373s39.704-157.156 101.202-203.914l0.63-0.46c42.875 56.099 68.699 127.22 68.699 204.373s-25.824 148.274-69.299 205.192l0.6-0.819z"],"attrs":[],"grid":0,"tags":["tennis-ball"]},"attrs":[],"properties":{"order":5566,"id":118,"name":"tennis-ball","prevSize":32,"code":60735},"setIdx":0,"setId":0,"iconIdx":1087},{"icon":{"paths":["M682.667 256c0-23.564-19.103-42.667-42.667-42.667v0h-512c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h213.333v469.333c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-469.333h213.333c23.564 0 42.667-19.103 42.667-42.667v0zM896 469.333h-256c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h85.333v213.333c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-213.333h85.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["text-fields"]},"attrs":[],"properties":{"order":5567,"id":117,"name":"text-fields","prevSize":32,"code":60736},"setIdx":0,"setId":0,"iconIdx":1088},{"icon":{"paths":["M384 426.667c-23.564 0-42.667 19.103-42.667 42.667v0 85.333c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-85.333c0-23.564-19.103-42.667-42.667-42.667v0zM896 469.333c23.564 0 42.667-19.103 42.667-42.667v0-170.667c0-23.564-19.103-42.667-42.667-42.667v0h-768c-23.564 0-42.667 19.103-42.667 42.667v0 170.667c0 23.564 19.103 42.667 42.667 42.667v0c23.564 0 42.667 19.103 42.667 42.667s-19.103 42.667-42.667 42.667v0c-23.564 0-42.667 19.103-42.667 42.667v0 170.667c0 23.564 19.103 42.667 42.667 42.667v0h768c23.564 0 42.667-19.103 42.667-42.667v0-170.667c0-23.564-19.103-42.667-42.667-42.667v0c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667v0zM853.333 391.68c-49.611 18.382-84.33 65.296-84.33 120.32s34.719 101.938 83.444 120.032l0.886 0.288v93.013h-426.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0h-170.667v-93.013c49.611-18.382 84.33-65.296 84.33-120.32s-34.719-101.938-83.444-120.032l-0.886-0.288v-93.013h170.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0h426.667z"],"attrs":[],"grid":0,"tags":["ticket"]},"attrs":[],"properties":{"order":5568,"id":116,"name":"ticket","prevSize":32,"code":60737},"setIdx":0,"setId":0,"iconIdx":1089},{"icon":{"paths":["M949.75 868.562c-46.71-55.379-75.097-127.54-75.097-206.331 0-1.034 0.005-2.066 0.015-3.098l-0.001 0.158v-318.271c0-141.167-95.708-256-213.333-256h-384c-117.625 0-213.333 114.833-213.333 256s95.708 256 213.333 256h128v62.271c-0.007 0.862-0.010 1.882-0.010 2.902 0 100.045 36.143 191.648 96.085 262.464l-0.491-0.596c7.877 9.151 19.474 14.912 32.416 14.917l384.001 0c23.563-0.011 42.66-19.114 42.66-42.679 0-10.616-3.876-20.327-10.291-27.795l0.048 0.057zM277.333 511.688c-70.583 0-128-76.563-128-170.667s57.417-170.667 128-170.667 128 76.562 128 170.667-57.417 170.667-128 170.667zM553.771 853.646c-39.423-52.975-63.113-119.691-63.113-191.94 0-0.849 0.003-1.697 0.010-2.544l-0.001 0.13v-298.667c0-1.203-0.588-2.214-0.683-3.391 0.284-5.388 0.683-10.74 0.683-16.213 0.008-0.786 0.012-1.714 0.012-2.644 0-63.178-20.555-121.556-55.341-168.81l0.553 0.787h225.443c70.583 0 128 76.562 128 170.667v318.271c-0.001 0.407-0.002 0.888-0.002 1.369 0 70.582 17.65 137.042 48.776 195.207l-1.086-2.222zM277.333 287.695c-24.303 3.090-42.903 23.639-42.903 48.532 0 1.691 0.086 3.361 0.253 5.008l-0.017-0.207c-0.15 1.44-0.236 3.11-0.236 4.801 0 24.893 18.6 45.442 42.66 48.507l0.243 0.025c24.303-3.090 42.903-23.639 42.903-48.532 0-1.691-0.086-3.361-0.253-5.008l0.017 0.207c0.15-1.44 0.236-3.11 0.236-4.801 0-24.893-18.6-45.442-42.66-48.507l-0.243-0.025z"],"attrs":[],"grid":0,"tags":["toilet-paper"]},"attrs":[],"properties":{"order":5569,"id":115,"name":"toilet-paper","prevSize":32,"code":60738},"setIdx":0,"setId":0,"iconIdx":1090},{"icon":{"paths":["M810.667 853.333h-597.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h597.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM371.627 328.96l97.707-98.133v494.507c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-494.507l97.707 98.133c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003-170.667-170.667c-3.937-3.773-8.616-6.808-13.791-8.859l-0.289-0.101c-4.793-2.024-10.366-3.201-16.213-3.201s-11.42 1.176-16.495 3.305l0.281-0.105c-5.464 2.152-10.143 5.187-14.095 8.974l0.015-0.014-170.667 170.667c-7.753 7.753-12.548 18.463-12.548 30.293 0 23.661 19.181 42.841 42.841 42.841 11.83 0 22.541-4.795 30.293-12.548l0-0z"],"attrs":[],"grid":0,"tags":["top-arrow-from-top"]},"attrs":[],"properties":{"order":5570,"id":114,"name":"top-arrow-from-top","prevSize":32,"code":60739},"setIdx":0,"setId":0,"iconIdx":1091},{"icon":{"paths":["M542.293 268.373c-3.937-3.773-8.616-6.808-13.791-8.859l-0.289-0.101c-4.793-2.024-10.366-3.201-16.213-3.201s-11.42 1.176-16.495 3.305l0.281-0.105c-5.464 2.152-10.143 5.187-14.095 8.974l0.015-0.014-170.667 170.667c-7.753 7.753-12.548 18.463-12.548 30.293 0 23.661 19.181 42.841 42.841 42.841 11.83 0 22.541-4.795 30.293-12.548l0-0 97.707-98.133v494.507c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-494.507l97.707 98.133c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003zM810.667 85.333h-597.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h597.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["top-arrow-to-top"]},"attrs":[],"properties":{"order":5571,"id":113,"name":"top-arrow-to-top","prevSize":32,"code":60740},"setIdx":0,"setId":0,"iconIdx":1092},{"icon":{"paths":["M426.667 896h-85.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h85.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM469.333 725.333h-213.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h213.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM768 85.333c0-23.564-19.103-42.667-42.667-42.667v0h-597.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h597.333c23.564 0 42.667-19.103 42.667-42.667v0zM896 213.333h-640c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h640c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM810.667 384h-384c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h384c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM597.333 554.667h-256c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h256c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["tornado"]},"attrs":[],"properties":{"order":5572,"id":112,"name":"tornado","prevSize":32,"code":60741},"setIdx":0,"setId":0,"iconIdx":1093},{"icon":{"paths":["M426.667 384h-128c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h21.333v128c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-128h21.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM741.547 387.413c-4.883-2.109-10.568-3.336-16.539-3.336-11.682 0-22.267 4.695-29.972 12.3l0.005-0.004-55.040 55.467-55.040-55.467c-7.7-7.601-18.286-12.296-29.968-12.296-5.971 0-11.656 1.227-16.817 3.442l0.278-0.106c-15.59 6.527-26.363 21.621-26.453 39.242l-0 0.012v170.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-67.84l12.373 12.8c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 12.373-12.8v67.84c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-170.667c-0.091-17.632-10.863-32.726-26.172-39.149l-0.281-0.105zM512 85.333c-235.641 0-426.667 191.025-426.667 426.667s191.025 426.667 426.667 426.667c235.641 0 426.667-191.025 426.667-426.667v0c0-235.641-191.025-426.667-426.667-426.667v0zM512 853.333c-188.513 0-341.333-152.82-341.333-341.333s152.82-341.333 341.333-341.333c188.513 0 341.333 152.82 341.333 341.333v0c0 188.513-152.82 341.333-341.333 341.333v0z"],"attrs":[],"grid":0,"tags":["trademark-circle"]},"attrs":[],"properties":{"order":5573,"id":111,"name":"trademark-circle","prevSize":32,"code":60742},"setIdx":0,"setId":0,"iconIdx":1094},{"icon":{"paths":["M405.333 298.667h-256c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h85.333v298.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-298.667h85.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM913.92 325.12c-4.422-10.46-12.58-18.618-22.76-22.935l-0.28-0.105c-4.793-2.024-10.366-3.201-16.213-3.201s-11.42 1.176-16.495 3.305l0.281-0.105c-5.464 2.152-10.143 5.187-14.095 8.974l0.015-0.014-119.040 119.467-119.040-119.467c-3.937-3.773-8.616-6.808-13.791-8.859l-0.289-0.101c-4.793-2.024-10.366-3.201-16.213-3.201s-11.42 1.176-16.495 3.305l0.281-0.105c-10.46 4.422-18.618 12.58-22.935 22.76l-0.105 0.28c-2.092 4.778-3.34 10.34-3.413 16.186l-0 0.027v341.333c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-238.507l76.373 76.8c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 76.373-76.8v238.507c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-341.333c-0.073-5.873-1.322-11.435-3.52-16.489l0.107 0.275z"],"attrs":[],"grid":0,"tags":["trademark"]},"attrs":[],"properties":{"order":5574,"id":110,"name":"trademark","prevSize":32,"code":60743},"setIdx":0,"setId":0,"iconIdx":1095},{"icon":{"paths":["M896 213.333h-42.667v-42.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 42.667h-512v-42.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 42.667h-42.667c-23.564 0-42.667 19.103-42.667 42.667v0 256c0 23.564 19.103 42.667 42.667 42.667v0h42.667v298.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-298.667h512v298.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-298.667h42.667c23.564 0 42.667-19.103 42.667-42.667v0-256c0-23.564-19.103-42.667-42.667-42.667v0zM170.667 406.187v-107.52h107.52zM227.84 469.333l170.667-170.667h142.080l-170.667 170.667zM490.24 469.333l170.667-170.667h135.68l-170.667 170.667zM853.333 469.333h-107.093l107.093-107.093z"],"attrs":[],"grid":0,"tags":["traffic-barrier"]},"attrs":[],"properties":{"order":5575,"id":109,"name":"traffic-barrier","prevSize":32,"code":60744},"setIdx":0,"setId":0,"iconIdx":1096},{"icon":{"paths":["M512 234.667c-35.346 0-64 28.654-64 64s28.654 64 64 64c35.346 0 64-28.654 64-64v0c0-35.346-28.654-64-64-64v0zM938.667 362.667h-23.040c40.639-45.021 65.553-104.919 65.707-170.635l0-0.032c0-23.564-19.103-42.667-42.667-42.667v0h-178.347c-18.062-50.028-65.066-85.173-120.3-85.333l-0.020-0h-256c-55.254 0.16-102.258 35.305-120.038 84.442l-0.282 0.891h-178.347c-23.564 0-42.667 19.103-42.667 42.667v0c0.153 65.747 25.067 125.645 65.907 170.892l-0.2-0.225h-23.040c-23.564 0-42.667 19.103-42.667 42.667v0c0.153 65.747 25.067 125.645 65.907 170.892l-0.2-0.225h-23.040c-23.564 0-42.667 19.103-42.667 42.667v0c0.241 128.548 95.191 234.846 218.777 252.848l1.383 0.165c17.176 51.539 64.876 88.083 121.145 88.32l0.028 0h256c56.297-0.237 103.997-36.781 120.912-87.416l0.262-0.904c124.969-18.168 219.919-124.466 220.16-252.988l0-0.025c0-23.564-19.103-42.667-42.667-42.667v0h-23.040c40.639-45.021 65.553-104.919 65.707-170.635l0-0.032c0-23.564-19.103-42.667-42.667-42.667v0zM256 783.787c-60.119-15.933-106.52-62.334-122.184-121.262l-0.269-1.191h122.453zM256 570.453c-60.119-15.933-106.52-62.334-122.184-121.262l-0.269-1.191h122.453zM256 357.12c-30.524-7.704-56.88-22.57-78.158-42.74l0.078 0.074c-20.097-21.2-34.963-47.556-42.407-76.873l-0.26-1.207h120.747zM682.667 832c0 23.564-19.103 42.667-42.667 42.667v0h-256c-23.564 0-42.667-19.103-42.667-42.667v0-640c0-23.564 19.103-42.667 42.667-42.667v0h256c23.564 0 42.667 19.103 42.667 42.667v0zM846.080 739.413c-21.2 20.097-47.556 34.963-76.873 42.407l-1.207 0.26v-120.747h122.453c-8.207 30.652-23.639 57.006-44.396 78.103l0.023-0.023zM846.080 526.080c-21.2 20.097-47.556 34.963-76.873 42.407l-1.207 0.26v-120.747h122.453c-8.207 30.652-23.639 57.006-44.396 78.103l0.023-0.023zM846.080 312.747c-21.2 20.097-47.556 34.963-76.873 42.407l-1.207 0.26v-120.747h122.453c-8.207 30.652-23.639 57.006-44.396 78.103l0.023-0.023zM512 661.333c-35.346 0-64 28.654-64 64s28.654 64 64 64c35.346 0 64-28.654 64-64v0c0-35.346-28.654-64-64-64v0zM512 448c-35.346 0-64 28.654-64 64s28.654 64 64 64c35.346 0 64-28.654 64-64v0c0-35.346-28.654-64-64-64v0z"],"attrs":[],"grid":0,"tags":["traffic-light"]},"attrs":[],"properties":{"order":5576,"id":108,"name":"traffic-light","prevSize":32,"code":60745},"setIdx":0,"setId":0,"iconIdx":1097},{"icon":{"paths":["M853.333 85.333h-426.667c-70.692 0-128 57.308-128 128v0 298.667c0 70.692 57.308 128 128 128v0h426.667c70.692 0 128-57.308 128-128v0-298.667c0-70.692-57.308-128-128-128v0zM896 512c0 23.564-19.103 42.667-42.667 42.667v0h-426.667c-23.564 0-42.667-19.103-42.667-42.667v0-298.667c0-23.564 19.103-42.667 42.667-42.667v0h426.667c23.564 0 42.667 19.103 42.667 42.667v0zM746.667 341.333c-16.47 0.058-31.455 6.369-42.714 16.683l0.048-0.043c-11.322-10.32-26.446-16.64-43.047-16.64-35.346 0-64 28.654-64 64s28.654 64 64 64c16.6 0 31.725-6.32 43.098-16.686l-0.051 0.046c11.322 10.319 26.446 16.639 43.046 16.639 35.346 0 64-28.654 64-64s-28.654-64-64-64c-0.133 0-0.266 0-0.399 0.001l0.020-0zM682.667 725.333c-23.564 0-42.667 19.103-42.667 42.667v0 42.667c0 23.564-19.103 42.667-42.667 42.667v0h-426.667c-23.564 0-42.667-19.103-42.667-42.667v0-170.667h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-42.667v-42.667c0-23.564 19.103-42.667 42.667-42.667v0c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0c-70.692 0-128 57.308-128 128v0 298.667c0 70.692 57.308 128 128 128v0h426.667c70.692 0 128-57.308 128-128v0-42.667c0-23.564-19.103-42.667-42.667-42.667v0zM256 768h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["transaction"]},"attrs":[],"properties":{"order":5577,"id":107,"name":"transaction","prevSize":32,"code":60746},"setIdx":0,"setId":0,"iconIdx":1098},{"icon":{"paths":["M426.667 768c23.564 0 42.667-19.103 42.667-42.667v0-256c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 256c0 23.564 19.103 42.667 42.667 42.667v0zM853.333 256h-170.667v-42.667c0-70.692-57.308-128-128-128v0h-85.333c-70.692 0-128 57.308-128 128v0 42.667h-170.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h42.667v469.333c0 70.692 57.308 128 128 128v0h341.333c70.692 0 128-57.308 128-128v0-469.333h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM426.667 213.333c0-23.564 19.103-42.667 42.667-42.667v0h85.333c23.564 0 42.667 19.103 42.667 42.667v0 42.667h-170.667zM725.333 810.667c0 23.564-19.103 42.667-42.667 42.667v0h-341.333c-23.564 0-42.667-19.103-42.667-42.667v0-469.333h426.667zM597.333 768c23.564 0 42.667-19.103 42.667-42.667v0-256c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 256c0 23.564 19.103 42.667 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["trash-alt"]},"attrs":[],"properties":{"order":5578,"id":106,"name":"trash-alt","prevSize":32,"code":60747},"setIdx":0,"setId":0,"iconIdx":1099},{"icon":{"paths":["M853.333 256h-170.667v-42.667c0-70.692-57.308-128-128-128v0h-85.333c-70.692 0-128 57.308-128 128v0 42.667h-170.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h42.667v469.333c0 70.692 57.308 128 128 128v0h341.333c70.692 0 128-57.308 128-128v0-469.333h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM426.667 213.333c0-23.564 19.103-42.667 42.667-42.667v0h85.333c23.564 0 42.667 19.103 42.667 42.667v0 42.667h-170.667zM725.333 810.667c0 23.564-19.103 42.667-42.667 42.667v0h-341.333c-23.564 0-42.667-19.103-42.667-42.667v0-469.333h426.667z"],"attrs":[],"grid":0,"tags":["trash"]},"attrs":[],"properties":{"order":5579,"id":105,"name":"trash","prevSize":32,"code":60748},"setIdx":0,"setId":0,"iconIdx":1100},{"icon":{"paths":["M704 213.333c-0.049-0-0.107-0-0.165-0-39.325 0-76.093 10.947-107.423 29.959l0.921-0.519c-40.485-91.253-130.291-153.75-234.693-153.75-140.087 0-253.894 112.521-255.971 252.115l-0.002 0.195v170.667c0.132 126.205 91.568 231.016 211.804 251.94l1.529 0.22v131.84c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-131.84c45.592-8.097 85.766-27.065 119.093-54.137l-0.479 0.377c30.614 48.571 79.083 83.507 135.985 95.747l1.402 0.253v89.6c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-89.6c98.072-20.544 170.667-106.306 170.667-209.023 0-0.015-0-0.031-0-0.046l0 0.002v-170.667c0-117.821-95.513-213.333-213.333-213.333v0zM490.667 426.667v170.667c0.461 9.036 1.375 17.403 2.738 25.619l-0.178-1.299c-22.417 26.573-52.441 46.081-86.702 55.197l-1.192 0.27v-122.453c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 122.027c-74.016-19.577-127.736-85.825-128-164.663l-0-0.030v-170.667c-0.001-0.167-0.001-0.364-0.001-0.562 0-94.257 76.41-170.667 170.667-170.667 47.162 0 89.856 19.13 120.746 50.054l0.002 0.002c22.406 22.699 38.407 51.77 45.042 84.251l0.185 1.082c-23.704 33.834-37.904 75.838-37.973 121.156l-0 0.017zM832 597.333c-0.16 55.254-35.305 102.258-84.442 120.038l-0.891 0.282v-162.987c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 162.987c-50.028-18.062-85.173-65.066-85.333-120.3l-0-0.020v-170.667c0-70.692 57.308-128 128-128s128 57.308 128 128v0z"],"attrs":[],"grid":0,"tags":["trees"]},"attrs":[],"properties":{"order":5580,"id":104,"name":"trees","prevSize":32,"code":60749},"setIdx":0,"setId":0,"iconIdx":1101},{"icon":{"paths":["M933.12 823.040l-384-664.747c-7.474-13.010-21.29-21.63-37.12-21.63s-29.646 8.62-37.010 21.423l-0.11 0.207-384 664.747c-3.594 6.12-5.716 13.479-5.716 21.333s2.123 15.214 5.825 21.535l-0.109-0.201c7.514 12.844 21.241 21.334 36.951 21.334 0.060 0 0.119-0 0.179-0l-0.009 0h768c0.050 0 0.11 0 0.169 0 15.71 0 29.436-8.49 36.842-21.132l0.109-0.201c3.594-6.12 5.716-13.479 5.716-21.333s-2.123-15.214-5.825-21.535l0.109 0.201zM201.813 801.707l310.187-536.747 310.187 536.747z"],"attrs":[],"grid":0,"tags":["triangle"]},"attrs":[],"properties":{"order":5581,"id":103,"name":"triangle","prevSize":32,"code":60750},"setIdx":0,"setId":0,"iconIdx":1102},{"icon":{"paths":["M896 170.667h-128v-42.667c0-23.564-19.103-42.667-42.667-42.667v0h-426.667c-23.564 0-42.667 19.103-42.667 42.667v0 42.667h-128c-23.564 0-42.667 19.103-42.667 42.667v0 128c0 94.257 76.41 170.667 170.667 170.667v0h65.707c37.654 41.882 88.567 71.178 146.091 81.27l1.536 0.223v89.173h-42.667c-70.692 0-128 57.308-128 128v0 85.333c0 23.564 19.103 42.667 42.667 42.667v0h341.333c23.564 0 42.667-19.103 42.667-42.667v0-85.333c0-70.692-57.308-128-128-128v0h-42.667v-89.173c59.060-10.315 109.973-39.612 147.419-81.259l0.207-0.234h65.707c94.257 0 170.667-76.41 170.667-170.667v0-128c0-23.564-19.103-42.667-42.667-42.667v0zM256 426.667c-47.128 0-85.333-38.205-85.333-85.333v0-85.333h85.333v85.333c0.102 30.627 5.566 59.946 15.502 87.112l-0.569-1.778zM597.333 768c23.564 0 42.667 19.103 42.667 42.667v0 42.667h-256v-42.667c0-23.564 19.103-42.667 42.667-42.667v0zM682.667 341.333c0 94.257-76.41 170.667-170.667 170.667s-170.667-76.41-170.667-170.667v0-170.667h341.333zM853.333 341.333c0 47.128-38.205 85.333-85.333 85.333v0h-14.933c9.367-25.387 14.831-54.707 14.933-85.289l0-0.045v-85.333h85.333z"],"attrs":[],"grid":0,"tags":["trophy"]},"attrs":[],"properties":{"order":5582,"id":102,"name":"trophy","prevSize":32,"code":60751},"setIdx":0,"setId":0,"iconIdx":1103},{"icon":{"paths":["M901.12 122.88c-23.51-22.342-55.377-36.084-90.453-36.084s-66.943 13.743-90.51 36.137l0.056-0.053-103.253 102.827c-22.857 23.111-36.978 54.904-36.978 89.994 0 20.183 4.671 39.275 12.992 56.254l-0.334-0.755-91.733 91.733-85.333-85.333c-23.265-23.81-55.699-38.575-91.582-38.575-56.572 0-104.573 36.701-121.491 87.592l-0.26 0.904-113.493 341.333c-4.196 12.122-6.619 26.092-6.619 40.628 0 35.271 14.266 67.21 37.342 90.361l-0.003-0.003c23.288 23.97 55.828 38.843 91.842 38.843 0.712 0 1.422-0.006 2.132-0.017l-0.107 0.001c0.682 0.014 1.485 0.021 2.29 0.021 14.467 0 28.348-2.509 41.231-7.115l-0.855 0.267 341.333-113.493c51.795-17.179 88.495-65.179 88.495-121.751 0-35.883-14.765-68.317-38.551-91.558l-0.025-0.024-85.333-85.333 91.733-91.733c16.224 7.986 35.316 12.658 55.499 12.658 35.091 0 66.883-14.12 90.006-36.989l-0.012 0.012 102.827-103.253c21.875-22.923 35.336-54.041 35.336-88.303 0-34.695-13.804-66.166-36.219-89.22l0.029 0.030zM584.533 666.88c7.554 7.692 12.216 18.245 12.216 29.887 0 18.778-12.13 34.722-28.982 40.425l-0.301 0.088-340.48 116.053c-3.729 1.181-8.018 1.862-12.465 1.862-11.798 0-22.477-4.788-30.201-12.527l-0.001-0.001c-7.74-7.724-12.528-18.404-12.528-30.201 0-4.448 0.681-8.736 1.943-12.768l-0.082 0.302 113.92-341.333c3.411-15.433 14.822-27.554 29.565-31.923l0.302-0.077c1.472-0.168 3.178-0.264 4.907-0.264s3.435 0.096 5.113 0.283l-0.206-0.019c11.656 0.051 22.2 4.767 29.869 12.376l-0.003-0.003 85.333 85.333-37.12 36.693c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 36.693-37.12zM840.533 243.627l-102.827 102.827c-7.69 7.542-18.235 12.197-29.867 12.197-23.502 0-42.566-19.002-42.666-42.481l-0-0.010c0.051-11.656 4.767-22.2 12.376-29.869l-0.003 0.003 102.827-103.253c7.733-7.795 18.45-12.621 30.293-12.621s22.56 4.826 30.291 12.618l0.003 0.003c7.795 7.733 12.621 18.45 12.621 30.293s-4.826 22.56-12.618 30.291l-0.003 0.003z"],"attrs":[],"grid":0,"tags":["trowel"]},"attrs":[],"properties":{"order":5583,"id":101,"name":"trowel","prevSize":32,"code":60752},"setIdx":0,"setId":0,"iconIdx":1104},{"icon":{"paths":["M938.667 682.667h-93.013c4.75-12.677 7.555-27.325 7.68-42.612l0-0.055v-213.333c0-70.692-57.308-128-128-128v0h-256c-70.692 0-128 57.308-128 128v0 213.333c0.125 15.341 2.93 29.989 7.968 43.552l-0.288-0.885h-50.347c-23.564 0-42.667-19.103-42.667-42.667v0-426.667c0-70.692-57.308-128-128-128v0h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h42.667c23.564 0 42.667 19.103 42.667 42.667v0 426.667c0.339 58.563 39.954 107.78 93.821 122.668l0.899 0.212c-6.019 14.322-9.516 30.968-9.516 48.432 0 70.692 57.308 128 128 128s128-57.308 128-128c0-15.535-2.767-30.423-7.836-44.199l0.286 0.888h143.36c-4.865 12.99-7.68 28.001-7.68 43.67 0 70.692 57.308 128 128 128s128-57.308 128-128c0-15.669-2.815-30.68-7.968-44.556l0.288 0.886h50.347c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM384 853.333c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667c23.564 0 42.667 19.103 42.667 42.667v0c0 23.564-19.103 42.667-42.667 42.667v0zM469.333 682.667c-23.564 0-42.667-19.103-42.667-42.667v0-213.333c0-23.564 19.103-42.667 42.667-42.667v0h256c23.564 0 42.667 19.103 42.667 42.667v0 213.333c0 23.564-19.103 42.667-42.667 42.667v0zM768 853.333c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667c23.564 0 42.667 19.103 42.667 42.667v0c0 23.564-19.103 42.667-42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["truck-loading"]},"attrs":[],"properties":{"order":5584,"id":100,"name":"truck-loading","prevSize":32,"code":60753},"setIdx":0,"setId":0,"iconIdx":1105},{"icon":{"paths":["M42.667 533.333v213.333c0 23.564 19.103 42.667 42.667 42.667v0h42.667c0 70.692 57.308 128 128 128s128-57.308 128-128v0h256c0 70.692 57.308 128 128 128s128-57.308 128-128v0h42.667c23.564 0 42.667-19.103 42.667-42.667v0-512c0-70.692-57.308-128-128-128v0h-384c-70.692 0-128 57.308-128 128v0 85.333h-85.333c-41.732 0-78.8 19.971-102.167 50.878l-0.233 0.322-102.4 136.533c-1.173 1.72-2.183 3.694-2.93 5.791l-0.057 0.182-2.56 4.693c-1.799 4.416-2.887 9.534-2.986 14.893l-0.001 0.040zM725.333 789.333c0-23.564 19.103-42.667 42.667-42.667s42.667 19.103 42.667 42.667c0 23.564-19.103 42.667-42.667 42.667v0c-23.564 0-42.667-19.103-42.667-42.667v0zM426.667 234.667c0-23.564 19.103-42.667 42.667-42.667v0h384c23.564 0 42.667 19.103 42.667 42.667v0 469.333h-33.28c-23.501-25.787-57.228-41.906-94.72-41.906s-71.219 16.119-94.629 41.805l-0.091 0.102h-246.613zM341.333 490.667h-170.667l51.2-68.267c7.867-10.41 20.223-17.067 34.133-17.067v0h85.333zM213.333 789.333c0-23.564 19.103-42.667 42.667-42.667s42.667 19.103 42.667 42.667c0 23.564-19.103 42.667-42.667 42.667v0c-23.564 0-42.667-19.103-42.667-42.667v0zM128 576h213.333v118.613c-22.535-20.206-52.473-32.561-85.296-32.561-37.511 0-71.254 16.136-94.665 41.845l-0.092 0.103h-33.28z"],"attrs":[],"grid":0,"tags":["truck"]},"attrs":[],"properties":{"order":5585,"id":99,"name":"truck","prevSize":32,"code":60754},"setIdx":0,"setId":0,"iconIdx":1106},{"icon":{"paths":["M743.833 875.019l-41.041-121.75c-5.875-17.024-21.761-29.034-40.452-29.034-6.681 0-13.004 1.534-18.635 4.27l0.254-0.111c-15.229 6.051-32.853 9.885-51.276 10.614l-0.308 0.010c-1.508 0.202-3.251 0.317-5.021 0.317-8.662 0-16.68-2.756-23.225-7.439l0.121 0.082c-6.451-8.475-10.336-19.209-10.336-30.851 0-1.269 0.046-2.528 0.137-3.775l-0.010 0.167v-185.501h128.711c0.007 0 0.016 0 0.025 0 23.55 0 42.642-19.091 42.642-42.642 0-0.009-0-0.017-0-0.026l0 0.001v-166.625c0-0.007 0-0.016 0-0.025 0-23.55-19.091-42.642-42.642-42.642-0.009 0-0.017 0-0.026 0l-128.084-0v-174.708c0-0.007 0-0.016 0-0.025 0-23.55-19.091-42.642-42.642-42.642-0.009 0-0.017 0-0.026 0l-124.999-0c-25.335 0.12-46.116 19.455-48.526 44.173l-0.016 0.201c-3.662 88.758-60.027 163.477-138.477 193.953l-1.482 0.507c-16.588 6.089-28.208 21.747-28.208 40.119 0 0.002 0 0.004 0 0.006l-0-0v152.917c-0 0.007-0 0.016-0 0.024 0 23.551 19.092 42.642 42.642 42.642 0.009 0 0.017-0 0.026-0l43.707 0v193.5c0.771 74.736 31.394 142.172 80.491 191.074l0.009 0.009c52.55 49.367 123.486 79.696 201.506 79.696 3.779 0 7.541-0.071 11.286-0.212l-0.54 0.016c2.292 0 4.625 0 6.959-0.043 65.958-1.084 154.375-27.625 182.292-68.584 4.64-6.721 7.412-15.042 7.412-24.011 0-4.887-0.823-9.582-2.338-13.954l0.090 0.299zM554.959 895.936c-4.932 0.416-10.674 0.654-16.471 0.654-54.721 0-104.502-21.153-141.612-55.727l0.125 0.115c-33.521-33.323-54.44-79.29-54.999-130.144l-0.001-0.106v-236.167c0-0.007 0-0.016 0-0.025 0-23.55-19.091-42.642-42.642-42.642-0.009 0-0.017 0-0.026 0l-43.707-0v-81.792c86.119-42.84 147.656-123.929 162.702-220.413l0.214-1.67h50.792v174.708c-0 0.007-0 0.016-0 0.024 0 23.551 19.092 42.642 42.642 42.642 0.009 0 0.017-0 0.026-0l128.084 0v81.292h-128.708c-0.007-0-0.016-0-0.025-0-23.55 0-42.642 19.091-42.642 42.642 0 0.009 0 0.017 0 0.026l-0-0.001v228.875c-0.047 1.317-0.074 2.865-0.074 4.419 0 35.33 13.956 67.4 36.657 90.999l-0.041-0.042c20.95 19.301 49.038 31.135 79.89 31.135 3.353 0 6.673-0.14 9.956-0.414l-0.429 0.029c14.672-0.575 28.561-2.307 42.053-5.118l-1.637 0.285 18.125 53.708c-28.806 13.488-62.448 21.757-97.917 22.701l-0.335 0.007z"],"attrs":[],"grid":0,"tags":["tumblr-alt"]},"attrs":[],"properties":{"order":5586,"id":98,"name":"tumblr-alt","prevSize":32,"code":60755},"setIdx":0,"setId":0,"iconIdx":1107},{"icon":{"paths":["M85.333 85.333v853.333h853.333v-853.333zM578.987 761.6c-4.484 0.492-9.684 0.772-14.95 0.772-79.34 0-143.803-63.692-145.048-142.735l-0.001-0.117v-174.080h-53.76v-68.693c58.806-23.247 100.389-78.016 104.087-142.927l0.020-0.433c0-2.121 1.719-3.84 3.84-3.84v0h77.653v135.253h106.667v80.64h-106.24v165.973c-0.189 1.591-0.298 3.433-0.298 5.301 0 26.156 21.204 47.36 47.36 47.36 1.457 0 2.898-0.066 4.321-0.194l-0.183 0.013c15.544-0.721 30.106-4.103 43.512-9.7l-0.846 0.313 25.6 75.947c-24.146 19.422-55.178 31.174-88.956 31.174-0.977 0-1.951-0.010-2.923-0.029l0.145 0.002z"],"attrs":[],"grid":0,"tags":["tumblr-square"]},"attrs":[],"properties":{"order":5587,"id":97,"name":"tumblr-square","prevSize":32,"code":60756},"setIdx":0,"setId":0,"iconIdx":1108},{"icon":{"paths":["M716.373 768c-20.364 8.657-43.996 14.064-68.782 14.924l-0.338 0.009c-2.425 0.279-5.236 0.439-8.084 0.439-41.237 0-74.667-33.429-74.667-74.667 0-3.919 0.302-7.768 0.884-11.524l-0.053 0.418v-265.813h170.667v-128h-170.667v-218.453h-124.587c-3.346 0.23-5.973 3.001-5.973 6.386 0 0.005 0 0.010 0 0.015l-0-0.001c-5.773 105.194-73.091 193.312-166.326 229.368l-1.781 0.606v110.080h85.333v279.040c0 95.147 70.4 230.827 256 227.84 62.72 0 132.693-27.307 148.053-49.92z"],"attrs":[],"grid":0,"tags":["tumblr"]},"attrs":[],"properties":{"order":5588,"id":96,"name":"tumblr","prevSize":32,"code":60757},"setIdx":0,"setId":0,"iconIdx":1109},{"icon":{"paths":["M495.787 337.92c4.778 2.092 10.34 3.34 16.186 3.413l0.027 0h256c23.564 0 42.667 19.103 42.667 42.667v0 227.84c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-227.84c0-70.692-57.308-128-128-128v0h-153.173l98.133-97.707c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l-170.667 170.667c-3.773 3.937-6.808 8.616-8.859 13.791l-0.101 0.289c-2.024 4.793-3.201 10.366-3.201 16.213s1.176 11.42 3.305 16.495l-0.105-0.281c4.422 10.46 12.58 18.618 22.76 22.935l0.28 0.105zM926.293 865.707l-768-768c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293v0l108.373 107.947c-46.246 19.954-78.036 65.139-78.080 117.754l-0 0.006v341.333c0 70.692 57.308 128 128 128v0 42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667h341.333v42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667c8.134-0.215 15.918-1.137 23.463-2.708l-0.85 0.148 75.093 75.52c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003zM256 768c-23.564 0-42.667-19.103-42.667-42.667v0-341.333c0-23.564 19.103-42.667 42.667-42.667v0h25.173l426.667 426.667z"],"attrs":[],"grid":0,"tags":["tv-retro-slash"]},"attrs":[],"properties":{"order":5589,"id":95,"name":"tv-retro-slash","prevSize":32,"code":60758},"setIdx":0,"setId":0,"iconIdx":1110},{"icon":{"paths":["M768 256h-153.173l98.133-97.707c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l-0 0-140.373 138.667-49.92-85.333c-7.531-12.929-21.327-21.48-37.12-21.48-23.645 0-42.814 19.168-42.814 42.814 0 7.852 2.114 15.21 5.803 21.537l-0.11-0.203 38.827 62.293h-170.667c-70.692 0-128 57.308-128 128v0 341.333c0 70.692 57.308 128 128 128v0 42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667h341.333v42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667c70.692 0 128-57.308 128-128v0-341.333c0-70.692-57.308-128-128-128v0zM810.667 725.333c0 23.564-19.103 42.667-42.667 42.667v0h-512c-23.564 0-42.667-19.103-42.667-42.667v0-341.333c0-23.564 19.103-42.667 42.667-42.667v0h512c23.564 0 42.667 19.103 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["tv-retro"]},"attrs":[],"properties":{"order":5590,"id":94,"name":"tv-retro","prevSize":32,"code":60759},"setIdx":0,"setId":0,"iconIdx":1111},{"icon":{"paths":["M980.958 168.542c0-0.008 0-0.018 0-0.028 0-23.55-19.091-42.642-42.642-42.642-8.052 0-15.583 2.232-22.008 6.111l0.191-0.107c-22.992 13.938-49.551 25.497-77.672 33.303l-2.243 0.531c-38.215-32.94-88.343-53.002-143.157-53.002-0.282 0-0.563 0.001-0.844 0.002l0.044-0c-120.653 0.143-218.876 95.975-222.865 215.676l-0.010 0.366c-117.971-19.295-219.122-80.077-290.052-166.589l-0.659-0.829c-7.974-9.624-19.929-15.709-33.304-15.709-1.154 0-2.297 0.045-3.428 0.134l0.15-0.009c-14.371 1.218-26.596 9.404-33.391 21.129l-0.109 0.205c-18.733 32.132-29.792 70.73-29.792 111.91 0 33.149 7.166 64.624 20.032 92.961l-0.574-1.413-0.083 0.083c-12.76 7.954-21.125 21.911-21.125 37.822 0 0.033 0 0.067 0 0.1l-0-0.005c-0.006 0.482-0.010 1.051-0.010 1.622 0 6.040 0.413 11.983 1.211 17.804l-0.076-0.676c4.659 55.811 29.387 105.094 66.852 141.271l0.065 0.062c-3.074 5.739-4.879 12.555-4.879 19.793 0 4.66 0.748 9.145 2.131 13.341l-0.086-0.301c17.533 53.519 53.27 97.003 99.736 124.098l1.056 0.569c-34.070 13.568-73.551 21.436-114.87 21.436-13.498 0-26.8-0.84-39.856-2.47l1.558 0.159c-1.595-0.211-3.439-0.332-5.311-0.332-23.558 0-42.656 19.098-42.656 42.656 0 14.991 7.733 28.176 19.428 35.783l0.165 0.101c84.484 55.153 187.916 87.959 299.011 87.959 0.025 0 0.051-0 0.076-0l-0.004 0c1.824 0.022 3.979 0.035 6.137 0.035 249.34 0 459.616-167.253 524.757-395.689l0.938-3.847c14.41-46.553 22.749-100.077 22.835-155.537l0-0.044c0-2.792 0-5.667-0.043-8.541 40.69-43.786 65.661-102.667 65.661-167.38 0-4.175-0.104-8.326-0.309-12.449l0.023 0.58zM839.875 305.583c-6.24 7.344-10.035 16.934-10.035 27.41 0 0.896 0.028 1.786 0.083 2.669l-0.006-0.121c0.417 7.040 0.375 14.123 0.375 20.791-0.095 46.91-7.169 92.131-20.239 134.73l0.864-3.272c-53.65 196.405-230.482 338.39-440.476 338.39-3.333 0-6.659-0.036-9.975-0.107l0.495 0.008c-0.043 0-0.093 0-0.143 0-38.569 0-76.046-4.679-111.893-13.5l3.203 0.666c48.097-15.756 89.803-38.463 126.395-67.359l-0.854 0.65c9.951-7.886 16.278-19.971 16.278-33.534 0-23.313-18.692-42.261-41.907-42.674l-0.039-0.001c-36.922-0.592-70.2-15.713-94.463-39.879l0.004 0.004q9.563-1.812 19-4.5c18.037-5.255 30.994-21.638 30.994-41.047 0-20.645-14.659-37.866-34.137-41.823l-0.274-0.047c-42.453-8.596-77.163-35.946-95.643-72.837l-0.357-0.788c6.705 0.973 14.737 1.676 22.878 1.949l0.372 0.010c0.196 0.003 0.427 0.005 0.658 0.005 19.103 0 35.334-12.297 41.209-29.407l0.091-0.306c1.275-3.867 2.010-8.318 2.010-12.941 0-14.782-7.518-27.807-18.94-35.462l-0.154-0.097c-36.839-24.797-60.751-66.342-60.751-113.471 0-0.201 0-0.401 0.001-0.602l-0 0.031c0-2.833 0.083-5.667 0.25-8.458 92.132 86.099 214.132 141.267 348.871 148.4l1.38 0.058c0.511 0.022 1.111 0.034 1.714 0.034 13.254 0 25.125-5.923 33.111-15.266l0.050-0.060c6.163-7.349 9.906-16.907 9.906-27.341 0-3.441-0.407-6.787-1.176-9.992l0.059 0.291c-2.332-9.328-3.682-20.042-3.708-31.067l-0-0.017c0.083-75.998 61.67-137.584 137.66-137.667l0.008-0c0.108-0 0.236-0 0.364-0 39.347 0 74.787 16.726 99.599 43.456l0.079 0.086c7.758 8.329 18.789 13.523 31.032 13.523 2.922 0 5.776-0.296 8.532-0.859l-0.273 0.047c20.305-3.982 37.654-8.734 54.485-14.591l-2.776 0.841c-12.284 24.842-26.886 46.234-44.023 65.302l0.232-0.262z"],"attrs":[],"grid":0,"tags":["twitter-alt"]},"attrs":[],"properties":{"order":5591,"id":93,"name":"twitter-alt","prevSize":32,"code":60760},"setIdx":0,"setId":0,"iconIdx":1112},{"icon":{"paths":["M938.667 247.467c-29.311 13.085-63.315 22.69-98.923 27.127l-1.77 0.18c36.262-21.929 63.55-55.579 76.868-95.609l0.359-1.244c-32.050 19.412-69.358 34.215-109.11 42.285l-2.25 0.381c-32.065-34.694-77.805-56.345-128.602-56.345-96.613 0-174.933 78.32-174.933 174.933 0 14.546 1.775 28.676 5.121 42.188l-0.252-1.202c-145.755-7.594-273.931-76.933-359.826-182.146l-0.707-0.894c-14.756 25.327-23.467 55.748-23.467 88.203 0 0.041 0 0.083 0 0.124l-0-0.006c-0 0.098-0 0.215-0 0.331 0 60.277 30.561 113.416 77.034 144.768l0.62 0.394c-29.258-0.82-56.484-8.788-80.221-22.208l0.861 0.448v2.133c0.449 84.16 60.26 154.222 139.672 170.474l1.128 0.193c-14.004 4.421-30.125 7.058-46.833 7.252l-0.101 0.001c-11.708-0.141-23.059-1.222-34.111-3.17l1.258 0.184c23.19 69.874 87.293 119.662 163.237 121.171l0.177 0.003c-58.814 46.611-134.032 74.857-215.839 75.093l-0.054 0c-0.329 0.001-0.719 0.002-1.109 0.002-14.648 0-29.079-0.931-43.237-2.737l1.679 0.175c75.629 49.491 168.261 78.934 267.771 78.934 0.212 0 0.423-0 0.635-0l-0.033 0c1.526 0.017 3.33 0.027 5.135 0.027 273.108 0 494.507-221.398 494.507-494.507 0-1.359-0.005-2.718-0.016-4.075l0.001 0.208c0-7.253 0-14.933 0-22.613 33.535-25.185 61.842-55.121 84.508-89.137l0.825-1.316z"],"attrs":[],"grid":0,"tags":["twitter"]},"attrs":[],"properties":{"order":5592,"id":92,"name":"twitter","prevSize":32,"code":60761},"setIdx":0,"setId":0,"iconIdx":1113},{"icon":{"paths":["M896 479.573s0 0 0 0c-0.1-0.513-0.156-1.103-0.156-1.707s0.057-1.194 0.166-1.765l-0.009 0.059v-8.107c0-9.813-2.56-19.627-4.267-29.44-0.116-1.024-0.183-2.211-0.183-3.413s0.066-2.389 0.195-3.557l-0.013 0.144c-2.133-10.667-5.12-20.907-8.107-31.147v0c-37.926-119.803-130.311-212.328-247.334-249.711l-2.692-0.743h-3.413c-9.387-2.987-19.2-5.547-29.013-7.68h-7.68c-6.425-1.373-14.438-2.579-22.579-3.346l-0.888-0.068h-10.24v-11.093c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 2.56c-16.564 2.011-31.051 4.706-45.218 8.215l2.552-0.535c-10.363 1.95-19.247 4.313-27.869 7.245l1.415-0.418h-5.547c-10.667 3.413-20.48 7.253-30.72 11.093v0c-106.521 42.977-187.691 129.594-222.394 237.091l-0.752 2.696c-0.070 0.513-0.111 1.105-0.111 1.707s0.040 1.194 0.118 1.774l-0.007-0.068c-2.81 8.122-5.608 18.426-7.799 28.953l-0.307 1.767v6.827q-3.413 15.36-5.12 32s0 2.987 0 4.693 0 2.56 0 3.84 0 0 0 2.133c0 10.667 0 21.333 0 32.427-0 23.564 19.103 42.667 42.667 42.667v0h298.667v256c0 23.564-19.103 42.667-42.667 42.667s-42.667-19.103-42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0c0 70.692 57.308 128 128 128s128-57.308 128-128v0-256h298.667c23.564 0 42.667-19.103 42.667-42.667v0c-4.693-11.093-4.693-21.76-4.693-32.427zM341.333 469.333h-124.587s0-2.987 0-4.693 0-11.947 3.413-17.493 0-5.547 0-8.107 3.413-13.653 5.547-20.48v-3.413c28.361-78.783 86.579-140.892 160.655-173.752l1.905-0.754c-27.251 67.541-44.239 145.755-46.905 227.591l-0.028 1.102zM426.667 469.333c8.107-166.827 61.44-256 85.333-256s76.373 89.173 85.333 256zM682.667 469.333c-2.694-82.937-19.682-161.151-48.568-233.319l1.634 4.625c74.825 34.605 131.844 97.043 158.512 173.691l0.635 2.096c2.201 5.991 4.404 13.558 6.151 21.298l0.249 1.315c-0.092 0.959-0.145 2.073-0.145 3.2s0.053 2.241 0.156 3.341l-0.011-0.141c0 5.973 2.56 12.373 3.413 18.347s0 2.987 0 4.693z"],"attrs":[],"grid":0,"tags":["umbrella"]},"attrs":[],"properties":{"order":5593,"id":91,"name":"umbrella","prevSize":32,"code":60762},"setIdx":0,"setId":0,"iconIdx":1114},{"icon":{"paths":["M625.493 578.56l-178.773 64c-16.541 6.125-28.117 21.765-28.117 40.109 0 23.399 18.836 42.399 42.172 42.664l0.025 0c5.207-0.006 10.192-0.944 14.802-2.656l-0.295 0.096 179.2-64c17.159-5.787 29.295-21.735 29.295-40.517 0-23.564-19.103-42.667-42.667-42.667-5.631 0-11.007 1.091-15.928 3.072l0.287-0.102zM454.827 450.56c7.668-7.712 12.407-18.343 12.407-30.080s-4.74-22.368-12.409-30.082l0.002 0.002c-23.51-22.342-55.377-36.084-90.453-36.084s-66.943 13.743-90.51 36.137l0.056-0.053c-9.153 7.872-14.914 19.467-14.914 32.407 0 23.564 19.103 42.667 42.667 42.667 12.94 0 24.535-5.761 32.36-14.858l0.047-0.056c7.733-7.795 18.45-12.621 30.293-12.621s22.56 4.826 30.291 12.618l0.003 0.003c7.712 7.668 18.343 12.407 30.080 12.407s22.368-4.74 30.082-12.409l-0.002 0.002zM753.493 390.4c-23.51-22.342-55.377-36.084-90.453-36.084s-66.943 13.743-90.51 36.137l0.056-0.053c-6.377 7.412-10.259 17.129-10.259 27.753 0 23.564 19.103 42.667 42.667 42.667 10.624 0 20.341-3.883 27.809-10.307l-0.056 0.047c7.733-7.795 18.45-12.621 30.293-12.621s22.56 4.826 30.291 12.618l0.003 0.003c7.712 7.668 18.343 12.407 30.080 12.407s22.368-4.74 30.082-12.409l-0.002 0.002c7.429-7.668 12.008-18.136 12.008-29.673 0-12.376-5.269-23.521-13.687-31.315l-0.028-0.026zM512 85.333c-235.641 0-426.667 191.025-426.667 426.667s191.025 426.667 426.667 426.667c235.641 0 426.667-191.025 426.667-426.667v0c0-235.641-191.025-426.667-426.667-426.667v0zM512 853.333c-188.513 0-341.333-152.82-341.333-341.333s152.82-341.333 341.333-341.333c188.513 0 341.333 152.82 341.333 341.333v0c0 188.513-152.82 341.333-341.333 341.333v0z"],"attrs":[],"grid":0,"tags":["unamused"]},"attrs":[],"properties":{"order":5594,"id":90,"name":"unamused","prevSize":32,"code":60763},"setIdx":0,"setId":0,"iconIdx":1115},{"icon":{"paths":["M512 661.333c117.821 0 213.333-95.513 213.333-213.333v0-213.333c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 213.333c0 70.692-57.308 128-128 128s-128-57.308-128-128v0-213.333c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 213.333c0 117.821 95.513 213.333 213.333 213.333v0zM725.333 746.667h-426.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h426.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["underline"]},"attrs":[],"properties":{"order":5595,"id":89,"name":"underline","prevSize":32,"code":60764},"setIdx":0,"setId":0,"iconIdx":1116},{"icon":{"paths":["M896 426.667c0.003 0 0.007 0 0.011 0 23.558 0 42.656-19.098 42.656-42.656 0-0.004-0-0.008-0-0.012l0 0.001v-128c0-0.005 0-0.011 0-0.018 0-18.726-12.077-34.631-28.866-40.352l-0.3-0.089-384-128c-4.029-1.387-8.671-2.187-13.5-2.187s-9.471 0.801-13.801 2.277l0.301-0.089-384 128c-17.090 5.81-29.167 21.715-29.167 40.441 0 0.006 0 0.012 0 0.019l-0-0.001v128c-0 0.003-0 0.007-0 0.011 0 23.558 19.098 42.656 42.656 42.656 0.004 0 0.008-0 0.012-0l42.666 0v306.529c-50.009 17.989-85.158 64.936-85.333 120.117l-0 0.021v85.333c-0 0.003-0 0.007-0 0.011 0 23.558 19.098 42.656 42.656 42.656 0.004 0 0.008-0 0.012-0l767.999 0c0.003 0 0.007 0 0.011 0 23.558 0 42.656-19.098 42.656-42.656 0-0.004-0-0.008-0-0.012l0 0.001v-85.333c-0.175-55.202-35.325-102.149-84.443-119.857l-0.891-0.28v-306.529zM853.333 896h-682.667v-42.667c0.024-23.554 19.112-42.642 42.664-42.667l597.336-0c23.554 0.024 42.642 19.112 42.667 42.664l0 0.002zM256 725.333v-298.667h85.333v298.667zM426.667 725.333v-298.667h170.667v298.667zM682.667 725.333v-298.667h85.333v298.667zM170.667 341.333v-54.583l341.333-113.792 341.333 113.792v54.583z"],"attrs":[],"grid":0,"tags":["university"]},"attrs":[],"properties":{"order":5596,"id":88,"name":"university","prevSize":32,"code":60765},"setIdx":0,"setId":0,"iconIdx":1117},{"icon":{"paths":["M512 554.667c-23.564 0-42.667 19.103-42.667 42.667v0 128c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-128c0-23.564-19.103-42.667-42.667-42.667v0zM725.333 384h-341.333v-85.333c-0-0.093-0-0.204-0-0.314 0-70.692 57.308-128 128-128 35.318 0 67.296 14.304 90.455 37.436l-0.001-0.001c15.575 15.901 27.153 35.776 33.072 57.962l0.208 0.918c4.908 18.59 21.573 32.072 41.387 32.072 23.604 0 42.739-19.135 42.739-42.739 0-3.79-0.493-7.466-1.42-10.965l0.067 0.298c-10.321-38.402-29.763-71.391-55.906-97.719l0.013 0.013c-38.582-38.465-91.82-62.248-150.613-62.248-117.805 0-213.308 95.487-213.333 213.286l-0 0.002v85.333c-70.692 0-128 57.308-128 128v0 298.667c0 70.692 57.308 128 128 128v0h426.667c70.692 0 128-57.308 128-128v0-298.667c0-70.692-57.308-128-128-128v0zM768 810.667c0 23.564-19.103 42.667-42.667 42.667v0h-426.667c-23.564 0-42.667-19.103-42.667-42.667v0-298.667c0-23.564 19.103-42.667 42.667-42.667v0h426.667c23.564 0 42.667 19.103 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["unlock-alt"]},"attrs":[],"properties":{"order":5597,"id":87,"name":"unlock-alt","prevSize":32,"code":60766},"setIdx":0,"setId":0,"iconIdx":1118},{"icon":{"paths":["M725.333 384h-341.333v-85.333c-0-0.093-0-0.204-0-0.314 0-70.692 57.308-128 128-128 35.318 0 67.296 14.304 90.455 37.436l-0.001-0.001c15.575 15.901 27.153 35.776 33.072 57.962l0.208 0.918c4.908 18.59 21.573 32.072 41.387 32.072 23.604 0 42.739-19.135 42.739-42.739 0-3.79-0.493-7.466-1.42-10.965l0.067 0.298c-10.321-38.402-29.763-71.391-55.906-97.719l0.013 0.013c-38.582-38.465-91.82-62.248-150.613-62.248-117.805 0-213.308 95.487-213.333 213.286l-0 0.002v85.333c-70.692 0-128 57.308-128 128v0 298.667c0 70.692 57.308 128 128 128v0h426.667c70.692 0 128-57.308 128-128v0-298.667c0-70.692-57.308-128-128-128v0zM768 810.667c0 23.564-19.103 42.667-42.667 42.667v0h-426.667c-23.564 0-42.667-19.103-42.667-42.667v0-298.667c0-23.564 19.103-42.667 42.667-42.667v0h426.667c23.564 0 42.667 19.103 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["unlock"]},"attrs":[],"properties":{"order":5598,"id":86,"name":"unlock","prevSize":32,"code":60767},"setIdx":0,"setId":0,"iconIdx":1119},{"icon":{"paths":["M414.293 286.293l55.040-55.467v494.507c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-494.507l55.040 55.467c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003-128-128c-7.733-7.795-18.45-12.621-30.293-12.621s-22.56 4.826-30.291 12.618l-0.003 0.003-128 128c-7.753 7.753-12.548 18.463-12.548 30.293 0 23.661 19.181 42.841 42.841 42.841 11.83 0 22.541-4.795 30.293-12.548l-0 0zM768 384h-85.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h85.333c23.564 0 42.667 19.103 42.667 42.667v0 298.667c0 23.564-19.103 42.667-42.667 42.667v0h-512c-23.564 0-42.667-19.103-42.667-42.667v0-298.667c0-23.564 19.103-42.667 42.667-42.667v0h85.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-85.333c-70.692 0-128 57.308-128 128v0 298.667c0 70.692 57.308 128 128 128v0h512c70.692 0 128-57.308 128-128v0-298.667c0-70.692-57.308-128-128-128v0z"],"attrs":[],"grid":0,"tags":["upload-alt"]},"attrs":[],"properties":{"order":5599,"id":85,"name":"upload-alt","prevSize":32,"code":60768},"setIdx":0,"setId":0,"iconIdx":1120},{"icon":{"paths":["M371.627 328.96l97.707-98.133v409.173c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-409.173l97.707 98.133c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003-170.667-170.667c-3.937-3.773-8.616-6.808-13.791-8.859l-0.289-0.101c-4.793-2.024-10.366-3.201-16.213-3.201s-11.42 1.176-16.495 3.305l0.281-0.105c-5.464 2.152-10.143 5.187-14.095 8.974l0.015-0.014-170.667 170.667c-7.753 7.753-12.548 18.463-12.548 30.293 0 23.661 19.181 42.841 42.841 42.841 11.83 0 22.541-4.795 30.293-12.548l0-0zM896 512c-23.564 0-42.667 19.103-42.667 42.667v0 256c0 23.564-19.103 42.667-42.667 42.667v0h-597.333c-23.564 0-42.667-19.103-42.667-42.667v0-256c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 256c0 70.692 57.308 128 128 128v0h597.333c70.692 0 128-57.308 128-128v0-256c0-23.564-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["upload"]},"attrs":[],"properties":{"order":5600,"id":84,"name":"upload","prevSize":32,"code":60769},"setIdx":0,"setId":0,"iconIdx":1121},{"icon":{"paths":["M469.333 384h170.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-85.333v-42.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 42.667c-70.692 0-128 57.308-128 128s57.308 128 128 128v0h85.333c23.564 0 42.667 19.103 42.667 42.667s-19.103 42.667-42.667 42.667v0h-170.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h85.333v42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667c70.692 0 128-57.308 128-128s-57.308-128-128-128v0h-85.333c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667v0zM512 42.667c-259.206 0-469.333 210.128-469.333 469.333s210.128 469.333 469.333 469.333c259.206 0 469.333-210.128 469.333-469.333v0c0-259.206-210.128-469.333-469.333-469.333v0zM512 896c-212.077 0-384-171.923-384-384s171.923-384 384-384c212.077 0 384 171.923 384 384v0c0 212.077-171.923 384-384 384v0z"],"attrs":[],"grid":0,"tags":["usd-circle"]},"attrs":[],"properties":{"order":5601,"id":83,"name":"usd-circle","prevSize":32,"code":60770},"setIdx":0,"setId":0,"iconIdx":1122},{"icon":{"paths":["M469.333 384h170.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-85.333v-42.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 42.667c-70.692 0-128 57.308-128 128s57.308 128 128 128v0h85.333c23.564 0 42.667 19.103 42.667 42.667s-19.103 42.667-42.667 42.667v0h-170.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h85.333v42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667c70.692 0 128-57.308 128-128s-57.308-128-128-128v0h-85.333c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667v0zM810.667 85.333h-597.333c-70.692 0-128 57.308-128 128v0 597.333c0 70.692 57.308 128 128 128v0h597.333c70.692 0 128-57.308 128-128v0-597.333c0-70.692-57.308-128-128-128v0zM853.333 810.667c0 23.564-19.103 42.667-42.667 42.667v0h-597.333c-23.564 0-42.667-19.103-42.667-42.667v0-597.333c0-23.564 19.103-42.667 42.667-42.667v0h597.333c23.564 0 42.667 19.103 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["usd-square"]},"attrs":[],"properties":{"order":5602,"id":82,"name":"usd-square","prevSize":32,"code":60771},"setIdx":0,"setId":0,"iconIdx":1123},{"icon":{"paths":["M880.651 672.93c22.652-25.752 36.527-59.706 36.682-96.897l0-0.032c0-82.475-66.859-149.333-149.333-149.333s-149.333 66.859-149.333 149.333v0c0.155 37.224 14.030 71.177 36.824 97.095l-0.142-0.165c-60.7 38.083-100.505 104.575-100.682 180.377l-0 0.026c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0c0-70.692 57.308-128 128-128s128 57.308 128 128v0c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0c-0.177-75.828-39.982-142.321-99.796-179.884l-0.886-0.519zM768 640c-35.346 0-64-28.654-64-64s28.654-64 64-64c35.346 0 64 28.654 64 64v0c-0.040 35.33-28.67 63.96-63.996 64l-0.004 0zM289.846 328.847l85.322 85.319c7.692 7.558 18.247 12.223 29.892 12.223 23.562 0 42.662-19.1 42.662-42.662 0-11.645-4.666-22.2-12.229-29.898l0.006 0.006-12.499-12.501h178l-12.501 12.501c-7.834 7.739-12.685 18.48-12.685 30.355 0 23.562 19.1 42.662 42.662 42.662 11.875 0 22.618-4.852 30.352-12.682l0.004-0.004 85.321-85.32c7.691-7.739 12.444-18.404 12.444-30.18s-4.754-22.441-12.447-30.182l0.002 0.002-85.321-85.318c-7.692-7.558-18.247-12.223-29.892-12.223-23.562 0-42.662 19.1-42.662 42.662 0 11.645 4.666 22.2 12.229 29.898l-0.006-0.006 12.501 12.501h-178.003l12.501-12.501c7.607-7.701 12.306-18.289 12.306-29.975 0-23.562-19.1-42.662-42.662-42.662-11.687 0-22.276 4.699-29.981 12.311l0.004-0.004-85.322 85.319c-7.691 7.739-12.444 18.404-12.444 30.18s4.754 22.441 12.447 30.182l-0.002-0.002zM368.652 672.93c22.652-25.752 36.526-59.706 36.682-96.897l0-0.033c0-82.475-66.859-149.333-149.333-149.333s-149.333 66.859-149.333 149.333v0c0.155 37.224 14.030 71.177 36.824 97.095l-0.142-0.165c-60.7 38.083-100.505 104.575-100.682 180.377l-0 0.026c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0c0-70.692 57.308-128 128-128s128 57.308 128 128v0c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0c-0.177-75.828-39.982-142.321-99.796-179.884l-0.886-0.519zM256 640c-35.346 0-64-28.654-64-64s28.654-64 64-64c35.346 0 64 28.654 64 64v0c-0.040 35.33-28.67 63.96-63.996 64l-0.004 0z"],"attrs":[],"grid":0,"tags":["user-arrows"]},"attrs":[],"properties":{"order":5603,"id":81,"name":"user-arrows","prevSize":32,"code":60772},"setIdx":0,"setId":0,"iconIdx":1124},{"icon":{"paths":["M567.467 521.387c44.537-38.705 72.533-95.442 72.533-158.718 0-0.001-0-0.002-0-0.002l-0 0c0-117.821-95.513-213.333-213.333-213.333s-213.333 95.513-213.333 213.333v0c-0 0.001-0 0.002-0 0.002 0 63.276 27.996 120.012 72.277 158.5l0.257 0.218c-119.151 54.91-200.397 173.257-200.533 310.595l-0 0.018c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0c0-141.385 114.615-256 256-256s256 114.615 256 256v0c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0c-0.136-137.356-81.382-255.703-198.417-309.737l-2.116-0.876zM426.667 490.667c-70.692 0-128-57.308-128-128s57.308-128 128-128c70.692 0 128 57.308 128 128v0c0 70.692-57.308 128-128 128v0zM926.293 389.547c-7.733-7.795-18.45-12.621-30.293-12.621s-22.56 4.826-30.291 12.618l-0.003 0.003-85.333 85.333-26.453-26.88c-7.733-7.795-18.45-12.621-30.293-12.621s-22.56 4.826-30.291 12.618l-0.003 0.003c-7.668 7.712-12.407 18.343-12.407 30.080s4.74 22.368 12.409 30.082l-0.002-0.002 57.173 57.173c7.712 7.668 18.343 12.407 30.080 12.407s22.368-4.74 30.082-12.409l-0.002 0.002 113.92-113.92c8.707-7.843 14.157-19.157 14.157-31.743 0-11.759-4.757-22.407-12.451-30.124l0.001 0.001z"],"attrs":[],"grid":0,"tags":["user-check"]},"attrs":[],"properties":{"order":5604,"id":80,"name":"user-check","prevSize":32,"code":60773},"setIdx":0,"setId":0,"iconIdx":1125},{"icon":{"paths":["M512 85.333c-235.293 0.462-425.856 191.31-425.856 426.666 0 111.359 42.662 212.754 112.533 288.732l-0.277-0.305c78.204 84.579 189.738 137.358 313.6 137.358s235.396-52.779 313.34-137.074l0.26-0.284c69.594-75.674 112.256-177.069 112.256-288.427 0-235.356-190.563-426.204-425.811-426.666l-0.045-0zM512 853.333c-92.076-0.144-175.581-36.724-236.891-96.088l0.091 0.088c39.327-93.935 130.497-158.728 236.8-158.728s197.473 64.793 236.172 157.041l0.628 1.687c-61.219 59.276-144.724 95.856-236.772 96l-0.028 0zM426.667 426.667c0-47.128 38.205-85.333 85.333-85.333s85.333 38.205 85.333 85.333c0 47.128-38.205 85.333-85.333 85.333v0c-47.128 0-85.333-38.205-85.333-85.333v0zM806.827 682.667c-38.414-64.894-95.845-115.031-164.558-143.384l-2.269-0.829c26.491-29.927 42.667-69.517 42.667-112.885 0-94.257-76.41-170.667-170.667-170.667s-170.667 76.41-170.667 170.667c0 43.368 16.176 82.958 42.823 113.066l-0.157-0.18c-70.981 29.183-128.413 79.319-165.96 142.635l-0.867 1.579c-29.158-48.856-46.427-107.736-46.507-170.645l-0-0.022c0-188.513 152.82-341.333 341.333-341.333s341.333 152.82 341.333 341.333v0c-0.079 62.931-17.349 121.811-47.363 172.219l0.856-1.553z"],"attrs":[],"grid":0,"tags":["user-circle"]},"attrs":[],"properties":{"order":5605,"id":79,"name":"user-circle","prevSize":32,"code":60774},"setIdx":0,"setId":0,"iconIdx":1126},{"icon":{"paths":["M620.8 521.387c44.537-38.705 72.533-95.442 72.533-158.718 0-0.001-0-0.002-0-0.002l-0 0c0-117.821-95.513-213.333-213.333-213.333s-213.333 95.513-213.333 213.333v0c0.571 63.587 29.325 120.345 74.359 158.466l0.307 0.254c-119.151 54.91-200.397 173.257-200.533 310.595l-0 0.018c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0c0-141.385 114.615-256 256-256s256 114.615 256 256v0c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0c-0.535-137.8-82.644-256.293-200.522-309.743l-2.145-0.87zM480 490.667c-70.692 0-128-57.308-128-128s57.308-128 128-128c70.692 0 128 57.308 128 128v0c0 70.692-57.308 128-128 128v0zM842.667 277.333c-23.564 0-42.667 19.103-42.667 42.667v0 85.333c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-85.333c0-23.564-19.103-42.667-42.667-42.667v0zM810.667 503.040c-7.522 7.877-12.204 18.523-12.373 30.26l-0 0.033c-0 0.073-0.001 0.16-0.001 0.247 0 11.721 4.726 22.338 12.377 30.049l-0.003-0.003c4.001 3.646 8.658 6.662 13.76 8.838l0.32 0.122c4.771 2.163 10.345 3.423 16.213 3.423s11.443-1.26 16.466-3.525l-0.253 0.102c10.747-3.967 19.073-12.293 22.954-22.774l0.086-0.266c2.162-4.477 3.425-9.736 3.425-15.29 0-0.325-0.004-0.648-0.013-0.971l0.001 0.048c0-0.074 0.001-0.161 0.001-0.248 0-23.564-19.103-42.667-42.667-42.667-11.844 0-22.561 4.826-30.291 12.619l-0.003 0.003z"],"attrs":[],"grid":0,"tags":["user-exclamation"]},"attrs":[],"properties":{"order":5606,"id":78,"name":"user-exclamation","prevSize":32,"code":60775},"setIdx":0,"setId":0,"iconIdx":1127},{"icon":{"paths":["M618.24 463.36c15.731-21.447 25.173-48.364 25.173-77.486 0-72.813-59.027-131.84-131.84-131.84s-131.84 59.027-131.84 131.84c0 29.122 9.442 56.038 25.432 77.855l-0.258-0.369c-18.479 11.889-34.248 26.030-47.5 42.303l-0.287 0.363c-5.724 7.348-9.178 16.711-9.178 26.88 0 24.274 19.678 43.951 43.951 43.951 14.105 0 26.657-6.644 34.7-16.973l0.074-0.099c20.574-25.984 52.074-42.539 87.446-42.667l0.021-0c35.393 0.127 66.892 16.683 87.289 42.434l0.178 0.233c7.885 9.665 19.795 15.787 33.135 15.787 0.051 0 0.102-0 0.153-0l-0.008 0c23.48-0.111 42.471-19.171 42.471-42.666 0-10.032-3.462-19.256-9.258-26.541l0.067 0.087c-14.095-16.913-30.577-31.222-49.057-42.599l-0.863-0.494zM512 432.213v0c-25.671-0.018-46.475-20.833-46.475-46.507 0-25.685 20.822-46.507 46.507-46.507 25.085 0 45.531 19.86 46.473 44.714l0.003 0.086c0.020 0.509 0.031 1.106 0.031 1.707 0 25.685-20.822 46.507-46.507 46.507-0.011 0-0.022-0-0.033-0l0.002 0zM872.96 410.88c-18.283-184.806-172.924-327.976-361.004-327.976-74.689 0-144.105 22.578-201.795 61.281l1.306-0.825c-88.593 59.846-149.002 155.634-160.298 265.967l-0.129 1.553c-1.097 10.56-1.722 22.817-1.722 35.22 0 100.153 40.789 190.779 106.661 256.172l0.021 0.021 226.133 226.56c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 225.28-226.56c65.894-65.415 106.682-156.041 106.682-256.193 0-12.403-0.626-24.66-1.847-36.741l0.124 1.521zM708.267 642.133l-196.267 196.267-196.267-196.267c-50.107-50.11-81.099-119.334-81.099-195.797 0-9.481 0.476-18.85 1.407-28.086l-0.095 1.163c8.584-86.193 55.064-160.027 122.314-205.448l0.993-0.632c42.948-28.889 95.836-46.11 152.747-46.11s109.799 17.221 153.738 46.737l-0.991-0.627c68.043 45.881 114.465 119.364 123.206 204.027l0.1 1.199c0.884 8.306 1.389 17.944 1.389 27.699 0 76.501-31.023 145.757-81.174 195.872l-0.002 0.002z"],"attrs":[],"grid":0,"tags":["user-location"]},"attrs":[],"properties":{"order":5607,"id":77,"name":"user-location","prevSize":32,"code":60776},"setIdx":0,"setId":0,"iconIdx":1128},{"icon":{"paths":["M678.336 564.437l-0.182-0.078c-2.703-1.14-5.307-2.464-8.037-3.547 59.792-47.167 97.837-119.605 97.883-200.93l0-0.008c-0.108-9.594-0.798-18.916-2.035-28.065l0.129 1.164c0.568-1.408 1.122-3.144 1.557-4.927l0.057-0.276 12-102.292c0.54-4.419 0.848-9.534 0.848-14.722 0-62.636-44.906-114.785-104.279-126.007l-0.798-0.125-33.707-6.125c-39.015-7.474-83.888-11.75-129.76-11.75s-90.746 4.276-134.244 12.45l4.483-0.7-33.749 6.125c-60.162 11.356-105.058 63.5-105.058 126.13 0 5.188 0.308 10.305 0.907 15.332l-0.059-0.608 12 102.292c0.492 2.060 1.046 3.797 1.71 5.479l-0.095-0.274c-1.109 7.984-1.798 17.305-1.905 26.767l-0.001 0.132c0.046 81.332 38.091 153.769 97.342 200.524l0.541 0.412c-2.731 1.083-5.333 2.406-8.037 3.547l-0.182 0.080c-140.091 59.974-240.073 189.263-257.343 343.554l-0.175 1.925c-0.16 1.388-0.251 2.996-0.251 4.625 0 23.565 19.103 42.668 42.668 42.668 21.936 0 40.005-16.553 42.399-37.849l0.018-0.194c12.828-115.061 81.559-211.651 178.029-263.003l1.83-0.889 128.996 128.996c7.719 7.723 18.385 12.5 30.167 12.5s22.448-4.777 30.166-12.5l128.994-128.996c98.301 52.242 167.032 148.832 179.72 262.357l0.14 1.537c2.408 21.469 20.445 38.011 42.351 38.042l0.003 0c1.653-0.001 3.283-0.092 4.887-0.268l-0.2 0.018c21.49-2.412 38.043-20.482 38.043-42.418 0-1.629-0.091-3.236-0.269-4.818l0.018 0.194c-17.445-156.217-117.427-285.506-254.755-344.426l-2.763-1.054zM329.041 215.521c-0.179-1.471-0.282-3.173-0.282-4.899 0-20.873 14.962-38.252 34.746-41.996l0.266-0.042 33.729-6.125c34.426-6.6 74.022-10.375 114.5-10.375s80.073 3.775 118.454 10.993l-3.954-0.618 33.707 6.125c20.060 3.778 35.032 21.161 35.032 42.041 0 1.726-0.102 3.427-0.301 5.099l0.020-0.202-7.584 64.604h-350.749zM512 693.771l-70.412-70.411c21.163-4.758 45.469-7.485 70.412-7.485s49.248 2.726 72.635 7.897l-2.223-0.413zM512 530.542c-92.25-0.112-167.369-73.306-170.573-164.79l-0.008-0.293h341.167c-3.213 91.779-78.334 164.974-170.575 165.083l-0.011 0z"],"attrs":[],"grid":0,"tags":["user-md"]},"attrs":[],"properties":{"order":5608,"id":76,"name":"user-md","prevSize":32,"code":60777},"setIdx":0,"setId":0,"iconIdx":1129},{"icon":{"paths":["M896 448h-170.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h170.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM567.467 521.387c44.537-38.705 72.533-95.442 72.533-158.718 0-0.001-0-0.002-0-0.002l-0 0c0-117.821-95.513-213.333-213.333-213.333s-213.333 95.513-213.333 213.333v0c-0 0.001-0 0.002-0 0.002 0 63.276 27.996 120.012 72.277 158.5l0.257 0.218c-119.151 54.91-200.397 173.257-200.533 310.595l-0 0.018c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0c0-141.385 114.615-256 256-256s256 114.615 256 256v0c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0c-0.136-137.356-81.382-255.703-198.417-309.737l-2.116-0.876zM426.667 490.667c-70.692 0-128-57.308-128-128s57.308-128 128-128c70.692 0 128 57.308 128 128v0c0 70.692-57.308 128-128 128v0z"],"attrs":[],"grid":0,"tags":["user-minus"]},"attrs":[],"properties":{"order":5609,"id":75,"name":"user-minus","prevSize":32,"code":60778},"setIdx":0,"setId":0,"iconIdx":1130},{"icon":{"paths":["M690.112 551.094c-0.779-0.349-1.503-0.719-2.297-1.015-5.875-2.651-11.688-5.419-17.698-7.808 59.833-47.296 97.883-119.871 97.883-201.333 0-141.385-114.615-256-256-256s-256 114.615-256 256c0 81.462 38.050 154.038 97.346 200.923l0.537 0.41c-6.010 2.389-11.823 5.156-17.698 7.808-0.794 0.297-1.518 0.666-2.297 1.015-133.937 62.171-228.792 188.463-245.567 338.356l-0.175 1.925c-0.16 1.388-0.251 2.996-0.251 4.625 0 23.565 19.103 42.668 42.668 42.668 21.936 0 40.005-16.553 42.399-37.849l0.018-0.194c12.412-111.249 77.046-205.135 168.474-257.627l1.651-0.874 138.731 138.729c7.719 7.723 18.385 12.5 30.167 12.5s22.448-4.777 30.166-12.5l138.728-138.73c93.079 53.366 157.713 147.252 169.985 256.963l0.14 1.537c2.408 21.469 20.445 38.011 42.351 38.042l0.003 0c1.653-0.001 3.283-0.092 4.887-0.268l-0.2 0.018c21.49-2.412 38.043-20.482 38.043-42.418 0-1.629-0.091-3.236-0.269-4.818l0.018 0.194c-16.95-151.818-111.805-278.11-243.126-339.189l-2.616-1.092zM343.083 324.021c8.61-86.427 80.947-153.362 168.917-153.362s160.308 66.935 168.86 152.654l0.057 0.708zM512 690.354l-82.643-82.643c24.804-6.592 53.282-10.378 82.643-10.378s57.839 3.786 84.97 10.896l-2.327-0.518zM512 512c-69.572-0.115-129.378-41.81-155.904-101.557l-0.431-1.088h312.672c-26.958 60.836-86.764 102.531-156.321 102.646l-0.015 0z"],"attrs":[],"grid":0,"tags":["user-nurse"]},"attrs":[],"properties":{"order":5610,"id":74,"name":"user-nurse","prevSize":32,"code":60779},"setIdx":0,"setId":0,"iconIdx":1131},{"icon":{"paths":["M896 448h-42.667v-42.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 42.667h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h42.667v42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM567.467 521.387c44.537-38.705 72.533-95.442 72.533-158.718 0-0.001-0-0.002-0-0.002l-0 0c0-117.821-95.513-213.333-213.333-213.333s-213.333 95.513-213.333 213.333v0c-0 0.001-0 0.002-0 0.002 0 63.276 27.996 120.012 72.277 158.5l0.257 0.218c-119.151 54.91-200.397 173.257-200.533 310.595l-0 0.018c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0c0-141.385 114.615-256 256-256s256 114.615 256 256v0c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0c-0.136-137.356-81.382-255.703-198.417-309.737l-2.116-0.876zM426.667 490.667c-70.692 0-128-57.308-128-128s57.308-128 128-128c70.692 0 128 57.308 128 128v0c0 70.692-57.308 128-128 128v0z"],"attrs":[],"grid":0,"tags":["user-plus"]},"attrs":[],"properties":{"order":5611,"id":73,"name":"user-plus","prevSize":32,"code":60780},"setIdx":0,"setId":0,"iconIdx":1132},{"icon":{"paths":["M631.893 523.947c26.045-27.912 42.188-65.359 42.666-106.571l0.001-0.095c0-89.072-72.208-161.28-161.28-161.28s-161.28 72.208-161.28 161.28l-0-0c0.479 41.307 16.621 78.754 42.753 106.76l-0.086-0.093c-75.054 37.97-127.998 110.147-138.543 195.461l-0.124 1.232c-0.164 1.408-0.257 3.040-0.257 4.693 0 23.706 19.218 42.924 42.924 42.924 22.053 0 40.221-16.63 42.649-38.034l0.018-0.197c10.751-84.851 82.484-149.804 169.387-149.804s158.635 64.952 169.299 148.959l0.087 0.844c2.4 21.501 20.475 38.066 42.418 38.066 0.988 0 1.969-0.034 2.94-0.1l-0.131 0.007h4.693c21.372-2.53 37.79-20.541 37.79-42.387 0-1.601-0.088-3.182-0.26-4.738l0.017 0.192c-9.891-86.177-61.729-158.384-134.289-196.455l-1.391-0.665zM512 493.227c-41.944 0-75.947-34.002-75.947-75.947s34.002-75.947 75.947-75.947c41.944 0 75.947 34.002 75.947 75.947v0c0 41.944-34.002 75.947-75.947 75.947v0zM810.667 85.333h-597.333c-70.692 0-128 57.308-128 128v0 597.333c0 70.692 57.308 128 128 128v0h597.333c70.692 0 128-57.308 128-128v0-597.333c0-70.692-57.308-128-128-128v0zM853.333 810.667c0 23.564-19.103 42.667-42.667 42.667v0h-597.333c-23.564 0-42.667-19.103-42.667-42.667v0-597.333c0-23.564 19.103-42.667 42.667-42.667v0h597.333c23.564 0 42.667 19.103 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["user-square"]},"attrs":[],"properties":{"order":5612,"id":72,"name":"user-square","prevSize":32,"code":60781},"setIdx":0,"setId":0,"iconIdx":1133},{"icon":{"paths":["M567.467 521.387c44.537-38.705 72.533-95.442 72.533-158.718 0-0.001-0-0.002-0-0.002l-0 0c0-117.821-95.513-213.333-213.333-213.333s-213.333 95.513-213.333 213.333v0c-0 0.001-0 0.002-0 0.002 0 63.276 27.996 120.012 72.277 158.5l0.257 0.218c-119.151 54.91-200.397 173.257-200.533 310.595l-0 0.018c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0c0-141.385 114.615-256 256-256s256 114.615 256 256v0c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0c-0.136-137.356-81.382-255.703-198.417-309.737l-2.116-0.876zM426.667 490.667c-70.692 0-128-57.308-128-128s57.308-128 128-128c70.692 0 128 57.308 128 128v0c0 70.692-57.308 128-128 128v0zM892.16 512l34.133-33.707c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l0-0-33.707 34.133-33.707-34.133c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l-0-0 34.133 33.707-34.133 33.707c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 33.707-34.133 33.707 34.133c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003z"],"attrs":[],"grid":0,"tags":["user-times"]},"attrs":[],"properties":{"order":5613,"id":71,"name":"user-times","prevSize":32,"code":60782},"setIdx":0,"setId":0,"iconIdx":1134},{"icon":{"paths":["M670.293 542.293c59.731-47.297 97.707-119.811 97.707-201.194 0-141.385-114.615-256-256-256s-256 114.615-256 256c0 81.383 37.976 153.897 97.173 200.787l0.533 0.408c-143.955 58.789-247.237 189.957-265.204 347.048l-0.183 1.965c-0.164 1.408-0.257 3.040-0.257 4.693 0 23.706 19.218 42.924 42.924 42.924 22.053 0 40.221-16.63 42.649-38.034l0.018-0.197c19.813-171.401 164.111-303.231 339.2-303.231s319.387 131.829 339.051 301.645l0.149 1.586c2.444 21.458 20.497 37.974 42.408 37.974 0.091 0 0.182-0 0.273-0.001l-0.014 0h4.693c21.372-2.53 37.79-20.541 37.79-42.387 0-1.601-0.088-3.182-0.26-4.738l0.017 0.192c-18.234-159.493-122.072-290.938-263.808-348.415l-2.859-1.025zM512 512c-94.257 0-170.667-76.41-170.667-170.667s76.41-170.667 170.667-170.667c94.257 0 170.667 76.41 170.667 170.667v0c0 94.257-76.41 170.667-170.667 170.667v0z"],"attrs":[],"grid":0,"tags":["user"]},"attrs":[],"properties":{"order":5614,"id":70,"name":"user","prevSize":32,"code":60783},"setIdx":0,"setId":0,"iconIdx":1135},{"icon":{"paths":["M524.8 521.387c44.537-38.705 72.533-95.442 72.533-158.718 0-0.001-0-0.002-0-0.002l-0 0c0-117.821-95.513-213.333-213.333-213.333s-213.333 95.513-213.333 213.333v0c-0 0.001-0 0.002-0 0.002 0 63.276 27.996 120.012 72.277 158.5l0.257 0.218c-119.151 54.91-200.397 173.257-200.533 310.595l-0 0.018c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0c0-141.385 114.615-256 256-256s256 114.615 256 256v0c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0c-0.136-137.356-81.382-255.703-198.417-309.737l-2.116-0.876zM384 490.667c-70.692 0-128-57.308-128-128s57.308-128 128-128c70.692 0 128 57.308 128 128v0c0 70.692-57.308 128-128 128v0zM799.573 504.32c33.405-37.487 53.817-87.187 53.817-141.653 0-117.821-95.513-213.333-213.333-213.333-0.020 0-0.040 0-0.060 0l0.003-0c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0c70.692 0 128 57.308 128 128v0c-0.131 46.995-25.567 88.020-63.396 110.18l-0.604 0.327c-12.535 7.327-20.92 20.56-21.332 35.782l-0.001 0.058c-0.008 0.313-0.013 0.682-0.013 1.051 0 14.833 7.569 27.899 19.056 35.544l0.157 0.098 16.64 11.093 5.547 2.987c101.731 49.070 170.676 151.41 170.676 269.852 0 0.83-0.003 1.66-0.010 2.488l0.001-0.127c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0c0.003-0.608 0.005-1.326 0.005-2.046 0-136.661-71.39-256.649-178.911-324.704l-1.574-0.931z"],"attrs":[],"grid":0,"tags":["users-alt"]},"attrs":[],"properties":{"order":5615,"id":69,"name":"users-alt","prevSize":32,"code":60784},"setIdx":0,"setId":0,"iconIdx":1136},{"icon":{"paths":["M662.613 602.88c-7.733-7.795-18.45-12.621-30.293-12.621s-22.56 4.826-30.291 12.618l-0.003 0.003c-7.668 7.712-12.407 18.343-12.407 30.080s4.74 22.368 12.409 30.082l-0.002-0.002 263.68 263.68c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.668-7.712 12.407-18.343 12.407-30.080s-4.74-22.368-12.409-30.082l0.002 0.002zM715.093 496.64c35.333-0.032 67.31-14.375 90.452-37.545l0.001-0.001 120.747-120.747c7.668-7.712 12.407-18.343 12.407-30.080s-4.74-22.368-12.409-30.082l0.002 0.002c-7.733-7.795-18.45-12.621-30.293-12.621s-22.56 4.826-30.291 12.618l-0.003 0.003-120.747 120.747c-7.712 7.668-18.343 12.407-30.080 12.407s-22.368-4.74-30.082-12.409l0.002 0.002 151.040-151.040c7.668-7.712 12.407-18.343 12.407-30.080s-4.74-22.368-12.409-30.082l0.002 0.002c-7.733-7.795-18.45-12.621-30.293-12.621s-22.56 4.826-30.291 12.618l-0.003 0.003-150.613 150.613c-7.668-7.712-12.407-18.343-12.407-30.080s4.74-22.368 12.409-30.082l-0.002 0.002 120.32-120.747c9.153-7.872 14.914-19.467 14.914-32.407 0-23.564-19.103-42.667-42.667-42.667-12.94 0-24.535 5.761-32.36 14.858l-0.047 0.056-120.747 120.747c-23.13 23.158-37.434 55.135-37.434 90.453s14.304 67.296 37.435 90.455l-0.001-0.001-52.053 52.907-66.56-65.707c13.995-24.799 22.24-54.449 22.24-86.026 0-49.915-20.605-95.019-53.772-127.268l-0.041-0.040c-61.44-61.44-220.587-130.133-295.68-53.76s-7.253 233.813 52.48 295.68c32.23 32.342 76.28 52.887 125.12 54.604l0.32 0.009h5.973c30.279-0.444 58.481-8.949 82.671-23.458l-0.751 0.418 66.987 65.707-353.28 353.28c-7.662 7.715-12.397 18.344-12.397 30.080 0 23.577 19.113 42.691 42.691 42.691 11.842 0 22.557-4.821 30.291-12.608l0.002-0.002 465.92-465.92c23.126 22.944 54.977 37.122 90.14 37.122 0.26 0 0.52-0.001 0.78-0.002l-0.040 0zM359.68 360.107c-14.884 14.799-35.401 23.946-58.055 23.946-1.040 0-2.076-0.019-3.107-0.058l0.149 0.004c-25.933-1.151-49.040-12.376-65.67-29.828l-0.037-0.039c-46.080-46.080-78.507-150.613-54.187-174.933 7.060-5.371 16-8.605 25.695-8.605 0.867 0 1.728 0.026 2.583 0.077l-0.118-0.006c56.829 4.657 107.55 27.632 147.014 62.932l-0.241-0.212c17.875 16.573 29.026 40.183 29.026 66.396 0 23.218-8.748 44.392-23.127 60.408l0.074-0.084z"],"attrs":[],"grid":0,"tags":["utensils-alt"]},"attrs":[],"properties":{"order":5616,"id":68,"name":"utensils-alt","prevSize":32,"code":60785},"setIdx":0,"setId":0,"iconIdx":1137},{"icon":{"paths":["M810.667 85.333c-23.564 0-42.667 19.103-42.667 42.667v0 232.96l-42.667 28.587v-261.547c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 261.547l-42.667-28.587v-232.96c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 256c0.079 14.744 7.624 27.709 19.044 35.315l0.156 0.098 108.8 72.96v403.627c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-403.627l108.8-72.96c11.576-7.705 19.121-20.669 19.2-35.401l0-0.012v-256c0-23.564-19.103-42.667-42.667-42.667v0zM384 85.333v0c-117.821 0-213.333 95.513-213.333 213.333v0 256c0 23.564 19.103 42.667 42.667 42.667v0h128v298.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-768c0-23.564-19.103-42.667-42.667-42.667v0zM341.333 512h-85.333v-213.333c-0-0.020-0-0.044-0-0.067 0-55.398 35.193-102.577 84.442-120.398l0.891-0.282z"],"attrs":[],"grid":0,"tags":["utensils"]},"attrs":[],"properties":{"order":5617,"id":67,"name":"utensils","prevSize":32,"code":60786},"setIdx":0,"setId":0,"iconIdx":1138},{"icon":{"paths":["M682.667 298.667h-341.333c-23.564 0-42.667 19.103-42.667 42.667v0 341.333c0 23.564 19.103 42.667 42.667 42.667v0h341.333c23.564 0 42.667-19.103 42.667-42.667v0-341.333c0-23.564-19.103-42.667-42.667-42.667v0zM640 640h-256v-256h256zM896 779.947v-535.893c26.351-14.864 43.853-42.675 43.853-74.573 0-47.128-38.205-85.333-85.333-85.333-31.898 0-59.709 17.502-74.352 43.428l-0.221 0.426h-535.893c-14.864-26.351-42.675-43.853-74.573-43.853-47.128 0-85.333 38.205-85.333 85.333 0 31.898 17.502 59.709 43.428 74.352l0.426 0.221v535.893c-26.351 14.864-43.853 42.675-43.853 74.573 0 47.128 38.205 85.333 85.333 85.333 31.898 0 59.709-17.502 74.352-43.428l0.221-0.426h535.893c14.864 26.351 42.675 43.853 74.573 43.853 47.128 0 85.333-38.205 85.333-85.333 0-31.898-17.502-59.709-43.428-74.352l-0.426-0.221zM810.667 779.947c-12.901 7.403-23.317 17.819-30.51 30.324l-0.21 0.396h-535.893c-7.403-12.901-17.819-23.317-30.324-30.51l-0.396-0.21v-535.893c12.901-7.403 23.317-17.819 30.51-30.324l0.21-0.396h535.893c7.403 12.901 17.819 23.317 30.324 30.51l0.396 0.21z"],"attrs":[],"grid":0,"tags":["vector-square-alt"]},"attrs":[],"properties":{"order":5618,"id":66,"name":"vector-square-alt","prevSize":32,"code":60787},"setIdx":0,"setId":0,"iconIdx":1139},{"icon":{"paths":["M853.333 690.347v-356.693c50.431-17.946 85.887-65.269 85.887-120.874 0-70.692-57.308-128-128-128-55.605 0-102.928 35.456-120.596 84.993l-0.278 0.894h-356.693c-17.946-50.431-65.269-85.887-120.874-85.887-70.692 0-128 57.308-128 128 0 55.605 35.456 102.928 84.993 120.596l0.894 0.278v356.693c-50.431 17.946-85.887 65.269-85.887 120.874 0 70.692 57.308 128 128 128 55.605 0 102.928-35.456 120.596-84.993l0.278-0.894h356.693c17.946 50.431 65.269 85.887 120.874 85.887 70.692 0 128-57.308 128-128 0-55.605-35.456-102.928-84.993-120.596l-0.894-0.278zM810.667 170.667c23.564 0 42.667 19.103 42.667 42.667s-19.103 42.667-42.667 42.667c-23.564 0-42.667-19.103-42.667-42.667v0c0-23.564 19.103-42.667 42.667-42.667v0zM213.333 170.667c23.564 0 42.667 19.103 42.667 42.667s-19.103 42.667-42.667 42.667c-23.564 0-42.667-19.103-42.667-42.667v0c0-23.564 19.103-42.667 42.667-42.667v0zM213.333 853.333c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667c23.564 0 42.667 19.103 42.667 42.667v0c0 23.564-19.103 42.667-42.667 42.667v0zM690.347 768h-356.693c-13.196-36.33-41.323-64.457-76.764-77.37l-0.89-0.283v-356.693c36.33-13.196 64.457-41.323 77.37-76.764l0.283-0.89h356.693c13.196 36.33 41.323 64.457 76.764 77.37l0.89 0.283v356.693c-36.33 13.196-64.457 41.323-77.37 76.764l-0.283 0.89zM810.667 853.333c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667c23.564 0 42.667 19.103 42.667 42.667v0c0 23.564-19.103 42.667-42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["vector-square"]},"attrs":[],"properties":{"order":5619,"id":65,"name":"vector-square","prevSize":32,"code":60788},"setIdx":0,"setId":0,"iconIdx":1140},{"icon":{"paths":["M810.667 384c0-0.104 0-0.227 0-0.35 0-164.949-133.718-298.667-298.667-298.667s-298.667 133.718-298.667 298.667c0 149.896 110.426 274.001 254.366 295.404l1.634 0.2v88.747h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h42.667v42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-42.667v-88.747c145.456-21.585 255.819-145.504 256-295.234l0-0.019zM512 597.333c-117.821 0-213.333-95.513-213.333-213.333s95.513-213.333 213.333-213.333c117.821 0 213.333 95.513 213.333 213.333v0c0 117.821-95.513 213.333-213.333 213.333v0z"],"attrs":[],"grid":0,"tags":["venus"]},"attrs":[],"properties":{"order":5620,"id":64,"name":"venus","prevSize":32,"code":60789},"setIdx":0,"setId":0,"iconIdx":1141},{"icon":{"paths":["M896 853.333h-128v-469.333c0-23.564-19.103-42.667-42.667-42.667v0h-128v-213.333c0-23.564-19.103-42.667-42.667-42.667v0h-256c-23.564 0-42.667 19.103-42.667 42.667v0 725.333h-128c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h768c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM512 853.333h-170.667v-682.667h170.667zM682.667 853.333h-85.333v-426.667h85.333z"],"attrs":[],"grid":0,"tags":["vertical-align-bottom"]},"attrs":[],"properties":{"order":5621,"id":63,"name":"vertical-align-bottom","prevSize":32,"code":60790},"setIdx":0,"setId":0,"iconIdx":1142},{"icon":{"paths":["M896 469.333h-128v-213.333c0-23.564-19.103-42.667-42.667-42.667v0h-128v-85.333c0-23.564-19.103-42.667-42.667-42.667v0h-256c-23.564 0-42.667 19.103-42.667 42.667v0 341.333h-128c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h128v341.333c0 23.564 19.103 42.667 42.667 42.667v0h256c23.564 0 42.667-19.103 42.667-42.667v0-85.333h128c23.564 0 42.667-19.103 42.667-42.667v0-213.333h128c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM512 853.333h-170.667v-682.667h170.667zM682.667 725.333h-85.333v-426.667h85.333z"],"attrs":[],"grid":0,"tags":["vertical-align-center"]},"attrs":[],"properties":{"order":5622,"id":62,"name":"vertical-align-center","prevSize":32,"code":60791},"setIdx":0,"setId":0,"iconIdx":1143},{"icon":{"paths":["M896 85.333h-768c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h128v725.333c0 23.564 19.103 42.667 42.667 42.667v0h256c23.564 0 42.667-19.103 42.667-42.667v0-213.333h128c23.564 0 42.667-19.103 42.667-42.667v0-469.333h128c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM512 853.333h-170.667v-682.667h170.667zM682.667 597.333h-85.333v-426.667h85.333z"],"attrs":[],"grid":0,"tags":["vertical-align-top"]},"attrs":[],"properties":{"order":5623,"id":61,"name":"vertical-align-top","prevSize":32,"code":60792},"setIdx":0,"setId":0,"iconIdx":1144},{"icon":{"paths":["M896 768h-42.667v-213.333c0-23.564-19.103-42.667-42.667-42.667v0h-597.333c-23.564 0-42.667 19.103-42.667 42.667v0 213.333h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h768c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM768 768h-512v-170.667h512zM128 426.667h768c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-85.333v-128c0-23.564-19.103-42.667-42.667-42.667v0h-512c-23.564 0-42.667 19.103-42.667 42.667v0 128h-85.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM298.667 256h426.667v85.333h-426.667z"],"attrs":[],"grid":0,"tags":["vertical-distribute-bottom"]},"attrs":[],"properties":{"order":5624,"id":60,"name":"vertical-distribute-bottom","prevSize":32,"code":60793},"setIdx":0,"setId":0,"iconIdx":1145},{"icon":{"paths":["M896 640h-42.667v-85.333c0-23.564-19.103-42.667-42.667-42.667v0h-597.333c-23.564 0-42.667 19.103-42.667 42.667v0 85.333h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h42.667v85.333c0 23.564 19.103 42.667 42.667 42.667v0h597.333c23.564 0 42.667-19.103 42.667-42.667v0-85.333h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM768 768h-512v-170.667h512zM128 341.333h85.333v42.667c0 23.564 19.103 42.667 42.667 42.667v0h512c23.564 0 42.667-19.103 42.667-42.667v0-42.667h85.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-85.333v-42.667c0-23.564-19.103-42.667-42.667-42.667v0h-512c-23.564 0-42.667 19.103-42.667 42.667v0 42.667h-85.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM298.667 256h426.667v85.333h-426.667z"],"attrs":[],"grid":0,"tags":["vertical-distribution-center"]},"attrs":[],"properties":{"order":5625,"id":59,"name":"vertical-distribution-center","prevSize":32,"code":60794},"setIdx":0,"setId":0,"iconIdx":1146},{"icon":{"paths":["M128 256h42.667v213.333c0 23.564 19.103 42.667 42.667 42.667v0h597.333c23.564 0 42.667-19.103 42.667-42.667v0-213.333h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-768c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM256 256h512v170.667h-512zM896 597.333h-768c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h85.333v128c0 23.564 19.103 42.667 42.667 42.667v0h512c23.564 0 42.667-19.103 42.667-42.667v0-128h85.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM725.333 768h-426.667v-85.333h426.667z"],"attrs":[],"grid":0,"tags":["vertical-distribution-top"]},"attrs":[],"properties":{"order":5626,"id":58,"name":"vertical-distribution-top","prevSize":32,"code":60795},"setIdx":0,"setId":0,"iconIdx":1147},{"icon":{"paths":["M435.627 737.707c-7.934-7.341-18.587-11.844-30.292-11.844s-22.358 4.503-30.321 11.871l0.029-0.027c-3.747 3.945-6.777 8.614-8.855 13.768l-0.105 0.294c-2.159 4.773-3.417 10.349-3.417 16.219s1.258 11.445 3.519 16.473l-0.102-0.254c2.301 5.422 5.316 10.080 8.996 14.123l-0.036-0.040c7.733 7.793 18.448 12.618 30.291 12.618 23.564 0 42.667-19.103 42.667-42.667 0-0.085-0-0.17-0.001-0.254l0 0.013c-0.072-5.879-1.322-11.446-3.524-16.505l0.107 0.275c-2.3-5.415-5.314-10.067-8.992-14.103l0.035 0.039zM405.333 384c-47.095 0.089-88.23 25.519-110.506 63.378l-0.327 0.602c-3.603 6.124-5.731 13.491-5.731 21.355 0 23.554 19.094 42.648 42.648 42.648 15.69 0 29.401-8.473 36.808-21.093l0.109-0.201c7.511-12.871 21.255-21.382 36.987-21.382 23.572 0 42.68 19.109 42.68 42.68 0 23.567-19.101 42.673-42.666 42.68l-0.001 0c-0.003-0-0.007-0-0.011-0-23.558 0-42.656 19.098-42.656 42.656 0 0.004 0 0.008 0 0.012l-0-0.001v42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-7.862c50.127-17.998 85.333-65.115 85.333-120.455 0-70.517-57.166-127.683-127.683-127.683-0.111 0-0.223 0-0.334 0l0.017-0zM918.417 262.375c-6.375-4.004-14.125-6.379-22.43-6.379-6.952 0-13.515 1.664-19.312 4.616l0.242-0.112-152.067 76.032c-2.594-68.483-58.658-123.037-127.5-123.199l-0.016-0h-384c-70.66 0.080-127.92 57.339-128 127.992l-0 0.008v256c0.080 70.66 57.339 127.92 127.992 128l42.674 0c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-42.667c-23.554-0.024-42.642-19.112-42.667-42.664l-0-0.002v-256c0.024-23.554 19.112-42.642 42.664-42.667l384.002-0c23.554 0.024 42.642 19.112 42.667 42.664l0 0.002v256c-0.024 23.554-19.112 42.642-42.664 42.667l-21.336 0c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h21.333c68.859-0.162 124.923-54.717 127.509-122.965l0.007-0.236 152.067 76.032c5.556 2.835 12.118 4.496 19.067 4.496 23.565 0 42.67-19.097 42.683-42.659l0-0.001v-341.333c-0.002-15.262-8.019-28.651-20.071-36.187l-0.179-0.104zM853.333 570.959l-128-64v-75.25l128-64z"],"attrs":[],"grid":0,"tags":["video-question"]},"attrs":[],"properties":{"order":5627,"id":57,"name":"video-question","prevSize":32,"code":60796},"setIdx":0,"setId":0,"iconIdx":1148},{"icon":{"paths":["M328.96 268.373v0l-170.667-170.667c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l-0-0 99.413 97.707c-63.374 8.322-111.791 61.991-111.791 126.97 0 0.362 0.002 0.724 0.005 1.086l-0-0.055v256c0 70.692 57.308 128 128 128v0h384c30.926-0.151 59.233-11.246 81.273-29.607l-0.206 0.167 187.307 187.733c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003zM597.333 682.667h-384c-23.564 0-42.667-19.103-42.667-42.667v0-256c0-23.564 19.103-42.667 42.667-42.667v0h67.84l335.787 336.213c-5.675 3.124-12.419 5.007-19.592 5.12l-0.034 0zM918.613 305.067c-6.12-3.594-13.479-5.716-21.333-5.716s-15.214 2.123-21.535 5.825l0.201-0.109-150.613 74.24c-2.597-68.644-58.872-123.307-127.914-123.307-0.030 0-0.060 0-0.091 0l-57.169-0c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h57.173c23.564 0 42.667 19.103 42.667 42.667v0 64c-0.076 1.211-0.119 2.627-0.119 4.053s0.043 2.842 0.128 4.246l-0.009-0.193c0.277 3.142 1.035 6.037 2.203 8.712l-0.070-0.179s2.133 2.56 2.987 4.267c1.843 3.412 3.969 6.354 6.423 8.985l-0.023-0.025s4.267 2.56 6.4 4.267l7.253 4.693c1.474 0.212 3.176 0.333 4.907 0.333s3.433-0.121 5.099-0.356l-0.192 0.022c0.896 0.095 1.935 0.15 2.987 0.15s2.091-0.054 3.115-0.16l-0.128 0.011c1.211 0.076 2.627 0.119 4.053 0.119s2.842-0.043 4.246-0.128l-0.193 0.009c3.142-0.277 6.037-1.035 8.712-2.203l-0.179 0.070 155.733-74.24v244.053c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-313.173c0-0.025 0-0.055 0-0.085 0-15.184-7.932-28.516-19.878-36.078l-0.175-0.103z"],"attrs":[],"grid":0,"tags":["video-slash"]},"attrs":[],"properties":{"order":5628,"id":56,"name":"video-slash","prevSize":32,"code":60797},"setIdx":0,"setId":0,"iconIdx":1149},{"icon":{"paths":["M918.613 305.067c-6.12-3.594-13.479-5.716-21.333-5.716s-15.214 2.123-21.535 5.825l0.201-0.109-150.613 74.24c-2.597-68.644-58.872-123.307-127.914-123.307-0.030 0-0.060 0-0.091 0l-383.995-0c-70.692 0-128 57.308-128 128v0 256c0 70.692 57.308 128 128 128v0h384c0.026 0 0.056 0 0.086 0 69.042 0 125.317-54.663 127.907-123.071l0.007-0.236 151.893 75.947c5.456 2.856 11.901 4.578 18.737 4.693l0.036 0c0.041 0 0.089 0 0.137 0 8.323 0 16.090-2.383 22.654-6.504l-0.178 0.104c12.121-7.665 20.053-20.997 20.053-36.181 0-0.030-0-0.060-0-0.090l0 0.005v-341.333c0-0.025 0-0.055 0-0.085 0-15.184-7.932-28.516-19.878-36.078l-0.175-0.103zM640 640c0 23.564-19.103 42.667-42.667 42.667v0h-384c-23.564 0-42.667-19.103-42.667-42.667v0-256c0-23.564 19.103-42.667 42.667-42.667v0h384c23.564 0 42.667 19.103 42.667 42.667v0zM853.333 613.547l-128-64v-75.093l128-64z"],"attrs":[],"grid":0,"tags":["video"]},"attrs":[],"properties":{"order":5629,"id":55,"name":"video","prevSize":32,"code":60798},"setIdx":0,"setId":0,"iconIdx":1150},{"icon":{"paths":["M433.896 223.417c9.527-2.536 21.537-4.907 33.767-6.588l1.671-0.188v54.214c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-54.485c66.417 9.68 124.414 40.146 168.481 84.475l0.014 0.014 0.026 0.039 0.057 0.039c44.073 44.19 74.362 102.148 83.856 166.865l0.195 1.618h-39.296c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h39.339c-1.921 13.895-4.313 25.843-7.336 37.536l0.497-2.266c-0.858 3.196-1.35 6.865-1.35 10.649 0 19.778 13.46 36.413 31.72 41.243l0.298 0.067c3.173 0.86 6.815 1.354 10.573 1.354 0.033 0 0.066-0 0.099-0l-0.005 0c19.769-0.015 36.392-13.471 41.224-31.723l0.067-0.298c4.212-15.864 7.759-35.089 9.915-54.732l0.163-1.831h45.463c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-45.196c-8.527-75.446-37.912-142.77-82.176-197.579l0.566 0.725 32.013-32.003c7.72-7.72 12.495-18.386 12.495-30.167 0-23.562-19.1-42.662-42.662-42.662-11.781 0-22.446 4.775-30.167 12.495l-32.122 32.112c-54.048-43.671-121.349-73.011-195.021-81.298l-1.731-0.158v-45.635c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 45.469c-21.497 2.286-40.781 5.832-59.537 10.69l2.808-0.617c-18.483 4.95-31.87 21.549-31.87 41.275 0 23.562 19.101 42.662 42.662 42.662 3.729 0 7.347-0.479 10.795-1.378l-0.297 0.066zM597.333 384.085c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667c0-23.564-19.103-42.667-42.667-42.667v0c-23.564 0-42.667 19.103-42.667 42.667v0zM784.094 723.846l-0.323-0.49-0.503-0.336-667.77-667.77c-7.705-7.629-18.308-12.343-30.013-12.343-23.562 0-42.662 19.1-42.662 42.662 0 11.706 4.714 22.31 12.348 30.018l-0.003-0.003 156.966 156.966c-43.701 54.087-73.085 121.418-81.444 195.124l-0.161 1.744h-45.196c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h45.229c8.541 75.446 37.901 142.774 82.123 197.617l-0.57-0.731-31.99 31.989c-7.72 7.72-12.495 18.386-12.495 30.167 0 23.562 19.1 42.662 42.662 42.662 11.781 0 22.446-4.775 30.167-12.495l31.995-31.994c54.12 43.604 121.449 72.918 195.136 81.251l1.745 0.16v45.374c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-45.374c75.432-8.495 142.761-37.809 197.616-81.987l-0.736 0.573 156.954 156.954c7.705 7.629 18.308 12.343 30.013 12.343 23.562 0 42.662-19.1 42.662-42.662 0-11.706-4.714-22.31-12.348-30.018l0.003 0.003zM554.667 807.206v-81.787c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 81.792c-66.232-9.6-124.13-39.742-168.337-83.652l0.017 0.017-0.201-0.302-0.291-0.193c-43.931-44.19-74.119-102.084-83.592-166.71l-0.195-1.618h39.266c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-39.305c7.587-51.85 27.591-97.986 56.888-136.701l-0.539 0.743 79.086 79.086c-6.763 9.988-10.796 22.305-10.796 35.564 0 35.331 28.641 63.972 63.972 63.972 13.259 0 25.575-4.034 35.79-10.941l-0.226 0.144 249.724 249.724c-37.982 28.676-84.104 48.624-134.315 56l-1.612 0.195zM384 597.419c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["virus-slash"]},"attrs":[],"properties":{"order":5630,"id":54,"name":"virus-slash","prevSize":32,"code":60799},"setIdx":0,"setId":0,"iconIdx":1151},{"icon":{"paths":["M718.933 85.333l-331.093 331.52-209.067-164.693-91.307 46.507v426.667l91.733 46.507 210.347-164.267 330.24 331.093 218.88-88.32v-679.68zM186.453 610.133v-198.4l104.107 103.68zM712.533 665.173l-198.4-153.173 198.4-153.173z"],"attrs":[],"grid":0,"tags":["visual-studio"]},"attrs":[],"properties":{"order":5631,"id":53,"name":"visual-studio","prevSize":32,"code":60800},"setIdx":0,"setId":0,"iconIdx":1152},{"icon":{"paths":["M671.729 577.25c-12.325-13.299-25.992-25.052-40.877-35.146l-0.826-0.528c60.216-46.872 103.695-112.743 121.522-188.508l0.452-2.276c0.712-2.918 1.121-6.269 1.121-9.715 0-23.564-19.103-42.667-42.667-42.667-20.303 0-37.294 14.181-41.608 33.179l-0.055 0.286c-17.042 73.008-64.279 132.57-127.507 165.841l-1.368 0.656v-156.954c-0.292-3.4-0.952-6.538-1.948-9.523l0.083 0.289c-0.319-2.743-0.836-5.213-1.551-7.598l0.080 0.309c-1.934-4.071-4.314-7.571-7.145-10.651l0.028 0.030c-0.763-0.906-1.148-2.101-1.982-2.94-3.019-2.794-6.477-5.174-10.247-7.016l-0.253-0.111c-1.088-0.581-1.898-1.562-3.042-2.048-2.948-1.020-6.375-1.755-9.925-2.064l-0.164-0.011c-1.834-0.563-4.028-1.029-6.279-1.311l-0.197-0.020-28.042-0.087c-0.060-0-0.131-0-0.203-0-23.452 0-42.464 19.012-42.464 42.464 0 18.161 11.401 33.66 27.437 39.729l0.292 0.097v208.669c-65.494-67.914-111.308-155.217-128.010-252.469l-0.407-2.863c-3.533-20.299-21.018-35.536-42.063-35.536-23.561 0-42.662 19.1-42.662 42.662 0 2.517 0.218 4.983 0.636 7.381l-0.037-0.255c26.313 152.886 110.49 282.403 228.715 367.639l1.68 1.153c1.525 0.934 3.317 1.855 5.178 2.646l0.275 0.104c1.263 0.761 2.769 1.534 4.327 2.212l0.259 0.1c4.422 1.819 9.549 2.919 14.92 3.020l0.041 0.001c6.601-0.084 12.811-1.68 18.324-4.456l-0.241 0.11c0.425-0.201 0.912-0.107 1.334-0.32 3.928-2.070 7.301-4.561 10.248-7.482l-0.003 0.003c0.607-0.591 1.013-1.318 1.586-1.943 2.661-2.915 4.939-6.247 6.713-9.871l0.11-0.249c0.594-1.224 1.135-2.393 1.612-3.68 1.791-4.368 2.877-9.432 2.984-14.736l0.001-0.043 0.021-90.709c27.374 8.199 50.662 23.075 68.799 42.768l0.097 0.106 70.313 76.666c7.828 8.552 19.041 13.895 31.503 13.895 23.559 0 42.658-19.099 42.658-42.658 0-11.166-4.29-21.33-11.312-28.933l0.026 0.029zM643.104 42.667h-261.771c-262.708 0-338.667 75.875-338.667 338.208v261.792c0 262.708 75.854 338.667 338.229 338.667h261.771c262.708 0 338.667-75.875 338.667-338.208v-261.792c0-262.708-75.854-338.667-338.229-338.667zM896 643.125c0 215.042-37.875 252.875-253.333 252.875h-261.771c-215.084 0-252.896-37.875-252.896-253.333v-261.792c0-215.042 37.875-252.875 253.333-252.875h261.771c215.084 0 252.896 37.875 252.896 253.333z"],"attrs":[],"grid":0,"tags":["vk-alt"]},"attrs":[],"properties":{"order":5632,"id":52,"name":"vk-alt","prevSize":32,"code":60801},"setIdx":0,"setId":0,"iconIdx":1153},{"icon":{"paths":["M643.112 85.333h-261.779c-239.112 0-296 56.888-296 295.555v261.779c0 239.11 56.445 296 295.555 296h261.779c239.112 0 296-56.445 296-295.557v-261.776c0-239.112-56.445-296-295.555-296zM774.221 694.221h-62.221c-23.555 0-30.667-19.112-72.888-61.333-36.891-35.555-52.445-40-61.779-40-12.888 0-16.445 3.555-16.445 21.333v56c0 15.112-4.888 24-44.442 24-80.138-5.544-149.016-49.19-189.189-112.779l-0.589-0.999c-46.53-57.529-80.78-126.952-97.608-202.926l-0.613-3.296c0-9.333 3.555-17.778 21.333-17.778h62.221c16 0 21.779 7.112 28 23.557 30.221 88.888 81.779 166.221 102.667 166.221 8 0 11.555-3.555 11.555-23.555v-91.557c-2.667-41.776-24.888-45.333-24.888-60.443 0.604-7.987 7.233-14.239 15.322-14.239 0.238 0 0.476 0.005 0.711 0.016l-0.033-0.001h97.779c13.333 0 17.776 6.667 17.776 22.667v123.557c0 13.333 5.779 17.776 9.779 17.776 8 0 14.221-4.443 28.888-19.11 30.185-36.579 55.849-78.499 75.177-123.77l1.268-3.342c3.798-10.485 13.67-17.842 25.26-17.842 0.652 0 1.298 0.023 1.938 0.069l-0.086-0.005h62.221c18.667 0 22.667 9.333 18.667 22.667-24.749 54.854-52.659 102.007-85.036 145.647l1.482-2.090c-6.667 10.221-9.333 15.555 0 27.555 6.221 9.333 28 27.555 42.667 44.888 20.812 20.762 38.332 44.812 51.717 71.307l0.725 1.583c5.333 17.333-3.555 26.221-21.333 26.221z"],"attrs":[],"grid":0,"tags":["vk"]},"attrs":[],"properties":{"order":5633,"id":51,"name":"vk","prevSize":32,"code":60802},"setIdx":0,"setId":0,"iconIdx":1154},{"icon":{"paths":["M853.333 170.667h-682.667c-70.692 0-128 57.308-128 128v0 426.667c0 70.692 57.308 128 128 128v0h682.667c70.692 0 128-57.308 128-128v0-426.667c0-70.692-57.308-128-128-128v0zM896 725.333c0 23.564-19.103 42.667-42.667 42.667v0h-682.667c-23.564 0-42.667-19.103-42.667-42.667v0-426.667c0-23.564 19.103-42.667 42.667-42.667v0h682.667c23.564 0 42.667 19.103 42.667 42.667v0zM682.667 384c-70.538 0.204-127.641 57.433-127.641 127.999 0 15.294 2.682 29.962 7.602 43.559l-0.282-0.891h-100.693c4.638-12.705 7.32-27.372 7.32-42.666 0-70.692-57.308-128-128-128s-128 57.308-128 128c0 70.692 57.308 128 128 128 0.126 0 0.253-0 0.379-0.001l-0.020 0h341.333c70.692 0 128-57.308 128-128s-57.308-128-128-128v0zM341.333 554.667c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667c23.564 0 42.667 19.103 42.667 42.667v0c0 23.564-19.103 42.667-42.667 42.667v0zM682.667 554.667c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667c23.564 0 42.667 19.103 42.667 42.667v0c0 23.564-19.103 42.667-42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["voicemail-rectangle"]},"attrs":[],"properties":{"order":5634,"id":50,"name":"voicemail-rectangle","prevSize":32,"code":60803},"setIdx":0,"setId":0,"iconIdx":1155},{"icon":{"paths":["M768 341.333c-94.257 0-170.667 76.41-170.667 170.667v0c0.136 31.541 9.005 60.983 24.31 86.067l-0.416-0.734h-218.453c14.889-24.351 23.757-53.792 23.893-85.295l0-0.038c0-94.257-76.41-170.667-170.667-170.667s-170.667 76.41-170.667 170.667c0 94.257 76.41 170.667 170.667 170.667v0h512c94.257 0 170.667-76.41 170.667-170.667s-76.41-170.667-170.667-170.667v0zM256 597.333c-47.128 0-85.333-38.205-85.333-85.333s38.205-85.333 85.333-85.333c47.128 0 85.333 38.205 85.333 85.333v0c0 47.128-38.205 85.333-85.333 85.333v0zM768 597.333c-47.128 0-85.333-38.205-85.333-85.333s38.205-85.333 85.333-85.333c47.128 0 85.333 38.205 85.333 85.333v0c0 47.128-38.205 85.333-85.333 85.333v0z"],"attrs":[],"grid":0,"tags":["voicemail"]},"attrs":[],"properties":{"order":5635,"id":49,"name":"voicemail","prevSize":32,"code":60804},"setIdx":0,"setId":0,"iconIdx":1156},{"icon":{"paths":["M803.413 391.253c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l0 0c15.467 15.377 25.071 36.637 25.173 60.14l0 0.020c0 0.021 0 0.045 0 0.070 0 26.096-11.714 49.455-30.17 65.108l-0.123 0.102c-9.459 7.882-15.435 19.666-15.435 32.846 0 10.422 3.736 19.971 9.943 27.38l-0.054-0.067c7.878 9.312 19.572 15.184 32.637 15.184 10.518 0 20.147-3.806 27.585-10.115l-0.062 0.051c37.355-31.472 60.944-78.254 61.013-130.548l0-0.012c-0.259-47.093-19.27-89.697-49.938-120.765l0.018 0.018zM615.68 174.933c-4.992-2.217-10.816-3.508-16.941-3.508-9.709 0-18.66 3.243-25.83 8.704l0.104-0.076-203.947 161.28h-155.733c-23.564 0-42.667 19.103-42.667 42.667v0 256c0 23.564 19.103 42.667 42.667 42.667v0h155.733l201.813 161.28c7.178 5.797 16.398 9.326 26.44 9.387l0.013 0c0.191 0.003 0.416 0.005 0.641 0.005 6.464 0 12.559-1.58 17.92-4.374l-0.215 0.102c14.463-7.005 24.271-21.551 24.32-38.393l0-0.007v-597.333c-0.049-16.849-9.857-31.395-24.066-38.289l-0.254-0.111zM554.667 721.92l-144.213-115.2c-7.178-5.797-16.398-9.326-26.44-9.387l-0.013-0h-128v-170.667h128c10.055-0.060 19.275-3.59 26.535-9.45l-0.081 0.063 144.213-115.2z"],"attrs":[],"grid":0,"tags":["volume-down"]},"attrs":[],"properties":{"order":5636,"id":48,"name":"volume-down","prevSize":32,"code":60805},"setIdx":0,"setId":0,"iconIdx":1157},{"icon":{"paths":["M878.507 294.4c-0.978-1.623-1.964-3.016-3.039-4.333l0.052 0.066c-76.155-123.804-210.899-205.111-364.633-205.111-67.911 0-132.115 15.866-189.11 44.093l2.49-1.115h-2.987c-138.458 72.41-231.328 215.022-231.328 379.325 0 146.869 74.207 276.405 187.172 353.161l1.489 0.954 14.080 8.533 4.267 2.987c60.994 39.225 134.971 63.399 214.433 65.693l0.607 0.014h8.96c231.563-5.264 417.267-194.227 417.267-426.563 0-80.328-22.198-155.47-60.795-219.629l1.074 1.925zM810.667 343.893c10.49 17.79 19.88 38.388 27.069 59.992l0.664 2.302c-38.156-12.849-82.113-20.466-127.787-20.905l-0.213-0.002c-1.988-0.406-4.274-0.639-6.613-0.639s-4.625 0.232-6.834 0.676l0.221-0.037c-55.249 0.755-107.638 12.131-155.5 32.169l2.753-1.022c-30.238-19.133-56.116-41.753-78.098-67.77l-0.409-0.496c50.421-30.059 111.194-47.83 176.117-47.83 61.893 0 120.014 16.15 170.378 44.467l-1.749-0.904zM512 170.667c0.514-0.003 1.123-0.004 1.732-0.004 62.248 0 120.535 16.96 170.492 46.51l-1.557-0.852c-12.749-1.821-27.542-2.904-42.571-2.986l-0.096-0c-82.092 0.162-158.703 23.483-223.689 63.772l1.823-1.052c-11.734-23.855-21.182-51.565-26.947-80.601l-0.36-2.172c35.941-14.269 77.581-22.565 121.153-22.613l0.020-0zM256 286.293c16.936-18.772 35.521-35.462 55.715-50.063l1.032-0.71c29.982 111.925 101.786 203.48 197.224 258.755l2.030 1.085c-3.314 45.268-15.082 87.062-33.733 124.851l0.88-1.971c-131.18-49.415-222.862-173.751-223.147-319.538l-0-0.036c0-4.267 0-8.107 0-12.373zM170.667 512c0.083-36.116 5.693-70.892 16.028-103.568l-0.668 2.448c35.324 126.823 124.388 227.912 240.459 278.821l2.741 1.072c-33.527 39.121-75.351 70.135-122.834 90.476l-2.179 0.83c-81.358-62.867-133.307-160.382-133.547-270.041l-0-0.039zM506.027 853.333c-40.146-0.601-78.336-8.217-113.645-21.671l2.285 0.765c56.324-35.095 102.563-81.198 136.779-135.624l1.034-1.763c37.686-59.195 61.375-130.611 64.821-207.296l0.033-0.917c22.202-7.58 48.017-13.027 74.741-15.278l1.205-0.082c6.428 24.766 10.118 53.198 10.118 82.492 0 128.38-70.875 240.207-175.632 298.486l-1.74 0.889zM686.080 805.547c51.181-69.245 81.92-156.307 81.92-250.549 0-0.116-0-0.233-0-0.349l0 0.018c-0.206-28.493-2.991-56.199-8.135-83.068l0.455 2.855c34.775 6.259 65.827 16.631 94.681 30.795l-2.094-0.929c0 2.56 0 5.12 0 7.68-0.087 124.021-66.304 232.557-165.293 292.262l-1.533 0.858z"],"attrs":[],"grid":0,"tags":["volleyball"]},"attrs":[],"properties":{"order":5637,"id":47,"name":"volleyball","prevSize":32,"code":60806},"setIdx":0,"setId":0,"iconIdx":1158},{"icon":{"paths":["M530.347 174.933c-4.992-2.217-10.816-3.508-16.941-3.508-9.709 0-18.66 3.243-25.83 8.704l0.104-0.076-203.947 161.28h-155.733c-23.564 0-42.667 19.103-42.667 42.667v0 256c0 23.564 19.103 42.667 42.667 42.667v0h155.733l201.813 161.28c7.178 5.797 16.398 9.326 26.44 9.387l0.013 0c0.191 0.003 0.416 0.005 0.641 0.005 6.464 0 12.559-1.58 17.92-4.374l-0.215 0.102c14.463-7.005 24.271-21.551 24.32-38.393l0-0.007v-597.333c-0.049-16.849-9.857-31.395-24.066-38.289l-0.254-0.111zM469.333 721.92l-144.213-115.2c-7.178-5.797-16.398-9.326-26.44-9.387l-0.013-0h-128v-170.667h128c10.055-0.060 19.275-3.59 26.535-9.45l-0.081 0.063 144.213-115.2zM849.493 512l76.8-76.373c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l0-0-76.373 76.8-76.373-76.8c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l-0-0 76.8 76.373-76.8 76.373c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 76.373-76.8 76.373 76.8c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003z"],"attrs":[],"grid":0,"tags":["volume-mute"]},"attrs":[],"properties":{"order":5638,"id":46,"name":"volume-mute","prevSize":32,"code":60807},"setIdx":0,"setId":0,"iconIdx":1159},{"icon":{"paths":["M722.347 174.933c-4.992-2.217-10.816-3.508-16.941-3.508-9.709 0-18.66 3.243-25.83 8.704l0.104-0.076-203.947 161.28h-155.733c-23.564 0-42.667 19.103-42.667 42.667v0 256c0 23.564 19.103 42.667 42.667 42.667v0h155.733l201.813 161.28c7.178 5.797 16.398 9.326 26.44 9.387l0.013 0c0.191 0.003 0.416 0.005 0.641 0.005 6.464 0 12.559-1.58 17.92-4.374l-0.215 0.102c14.463-7.005 24.271-21.551 24.32-38.393l0-0.007v-597.333c-0.049-16.849-9.857-31.395-24.066-38.289l-0.254-0.111zM661.333 721.92l-144.213-115.2c-7.178-5.797-16.398-9.326-26.44-9.387l-0.013-0h-128v-170.667h128c10.055-0.060 19.275-3.59 26.535-9.45l-0.081 0.063 144.213-115.2z"],"attrs":[],"grid":0,"tags":["volume-off"]},"attrs":[],"properties":{"order":5639,"id":45,"name":"volume-off","prevSize":32,"code":60808},"setIdx":0,"setId":0,"iconIdx":1160},{"icon":{"paths":["M530.347 174.933c-4.992-2.217-10.816-3.508-16.941-3.508-9.709 0-18.66 3.243-25.83 8.704l0.104-0.076-203.947 161.28h-155.733c-23.564 0-42.667 19.103-42.667 42.667v0 256c0 23.564 19.103 42.667 42.667 42.667v0h155.733l201.813 161.28c7.178 5.797 16.398 9.326 26.44 9.387l0.013 0c0.191 0.003 0.416 0.005 0.641 0.005 6.464 0 12.559-1.58 17.92-4.374l-0.215 0.102c14.463-7.005 24.271-21.551 24.32-38.393l0-0.007v-597.333c-0.049-16.849-9.857-31.395-24.066-38.289l-0.254-0.111zM469.333 721.92l-144.213-115.2c-7.178-5.797-16.398-9.326-26.44-9.387l-0.013-0h-128v-170.667h128c10.055-0.060 19.275-3.59 26.535-9.45l-0.081 0.063 144.213-115.2zM645.973 174.507c-1.795-0.265-3.866-0.416-5.973-0.416-23.794 0-43.083 19.289-43.083 43.083 0 21.687 16.024 39.631 36.878 42.639l0.231 0.027c123.622 19.58 217.010 125.391 217.010 253.013s-93.388 233.433-215.555 252.823l-1.455 0.19c-22.301 1.608-39.784 20.096-39.784 42.667 0 23.622 19.149 42.771 42.771 42.771 1.051 0 2.093-0.038 3.125-0.112l-0.138 0.008h5.973c165.275-25.7 290.278-166.999 290.278-337.493s-125.002-311.793-288.358-337.247l-1.92-0.246zM626.347 591.787c-20.748 3.411-36.383 21.213-36.383 42.667 0 23.864 19.345 43.209 43.209 43.209 2.41 0 4.775-0.197 7.077-0.577l-0.251 0.034c4.891-0.056 9.58-0.832 13.995-2.226l-0.342 0.093c66.775-24.179 113.629-87.044 113.629-160.853s-46.854-136.675-112.441-160.477l-1.187-0.377c-4.073-1.418-8.767-2.238-13.653-2.238-23.622 0-42.771 19.149-42.771 42.771 0 18.736 12.047 34.658 28.817 40.443l0.301 0.090c32.465 12.564 55.070 43.536 55.070 79.787s-22.605 67.223-54.488 79.588l-0.582 0.199z"],"attrs":[],"grid":0,"tags":["volume-up"]},"attrs":[],"properties":{"order":5640,"id":44,"name":"volume-up","prevSize":32,"code":60809},"setIdx":0,"setId":0,"iconIdx":1161},{"icon":{"paths":["M530.347 174.933c-4.992-2.217-10.816-3.508-16.941-3.508-9.709 0-18.66 3.243-25.83 8.704l0.104-0.076-203.947 161.28h-155.733c-23.564 0-42.667 19.103-42.667 42.667v0 256c0 23.564 19.103 42.667 42.667 42.667v0h155.733l201.813 161.28c7.178 5.797 16.398 9.326 26.44 9.387l0.013 0c0.191 0.003 0.416 0.005 0.641 0.005 6.464 0 12.559-1.58 17.92-4.374l-0.215 0.102c14.463-7.005 24.271-21.551 24.32-38.393l0-0.007v-597.333c-0.049-16.849-9.857-31.395-24.066-38.289l-0.254-0.111zM469.333 721.92l-144.213-115.2c-7.178-5.797-16.398-9.326-26.44-9.387l-0.013-0h-128v-170.667h128c10.055-0.060 19.275-3.59 26.535-9.45l-0.081 0.063 144.213-115.2zM838.827 270.507c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l-0-0c46.411 46.341 75.121 110.397 75.121 181.16 0 78.496-35.329 148.74-90.953 195.7l-0.381 0.314c-9.168 7.873-14.939 19.477-14.939 32.429 0 23.416 18.863 42.427 42.223 42.664l0.023 0c0.025 0 0.054 0 0.083 0 10.38 0 19.895-3.707 27.292-9.869l-0.069 0.056c74.901-63.038 122.166-156.837 122.166-261.676 0-94.259-38.207-179.595-99.98-241.364l0 0zM718.080 391.253c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l0 0c15.467 15.377 25.071 36.637 25.173 60.14l0 0.020c0 0.021 0 0.045 0 0.070 0 26.096-11.714 49.455-30.17 65.108l-0.123 0.102c-9.459 7.882-15.435 19.666-15.435 32.846 0 10.422 3.736 19.971 9.943 27.38l-0.054-0.067c7.878 9.312 19.572 15.184 32.637 15.184 10.518 0 20.147-3.806 27.585-10.115l-0.062 0.051c37.355-31.472 60.944-78.254 61.013-130.548l0-0.012c-0.259-47.093-19.27-89.697-49.938-120.765l0.018 0.018z"],"attrs":[],"grid":0,"tags":["volume"]},"attrs":[],"properties":{"order":5641,"id":43,"name":"volume","prevSize":32,"code":60810},"setIdx":0,"setId":0,"iconIdx":1162},{"icon":{"paths":["M975.668 143.957c-7.491-12.885-21.229-21.41-36.958-21.417l-367.855-0.167c-14.365 0.015-27.069 7.116-34.807 17.994l-0.089 0.131-23.833 33.958-24.084-34.042c-7.81-10.972-20.482-18.042-34.806-18.042-0.002 0-0.004 0-0.007 0l-155.937-0.043-212.187 1.167c-23.47 0.121-42.449 19.175-42.449 42.661 0 7.959 2.179 15.408 5.974 21.785l-0.108-0.196 427.5 729.836c7.552 12.701 21.203 21.080 36.812 21.083l0.043 0c15.632-0.013 29.297-8.426 36.725-20.969l0.108-0.198 425.833-730.791c3.639-6.158 5.79-13.57 5.79-21.484 0-7.826-2.103-15.162-5.774-21.472l0.11 0.204zM431.127 207.708l46.293 65.417c7.812 10.972 20.486 18.042 34.811 18.042 0.008 0 0.016-0 0.023-0l0.061 0c14.348-0.036 27.032-7.131 34.766-17.994l0.089-0.131 45.875-65.333 58.141-0.043-138.411 232.692-139.732-232.691zM512.731 811.417l-353.187-603 113.917-0.625 202.813 337.835c7.598 12.487 21.13 20.701 36.582 20.708l0.084 0 0.043-0.005 0.043 0.005h0.085c15.485-0.037 29.027-8.317 36.476-20.683l0.107-0.192 200.875-337.749 113.898 0.125z"],"attrs":[],"grid":0,"tags":["vuejs-alt"]},"attrs":[],"properties":{"order":5642,"id":42,"name":"vuejs-alt","prevSize":32,"code":60811},"setIdx":0,"setId":0,"iconIdx":1163},{"icon":{"paths":["M769.314 104.228v-0.003l-155.448 0.034-101.302 168.787-101.7-168.787-375.351-0.039 477.725 815.578 475.251-815.564zM513.069 750.632l-328.663-561.097h120.476l208.453 358.703 206.797-358.703h119.867z"],"attrs":[],"grid":0,"tags":["vuejs"]},"attrs":[],"properties":{"order":5643,"id":41,"name":"vuejs","prevSize":32,"code":60812},"setIdx":0,"setId":0,"iconIdx":1164},{"icon":{"paths":["M896 384c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-42.667v-85.333h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-768c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h128v85.333h-128c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h42.667v85.333h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h128v85.333h-128c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h42.667v85.333h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h768c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-128v-85.333h128c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-42.667v-85.333h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-128v-85.333zM341.333 213.333h170.667v85.333h-170.667zM682.667 384v85.333h-170.667v-85.333zM256 384h170.667v85.333h-170.667zM512 554.667v85.333h-170.667v-85.333zM426.667 810.667h-170.667v-85.333h170.667zM682.667 810.667h-170.667v-85.333h170.667zM768 640h-170.667v-85.333h170.667zM597.333 298.667v-85.333h170.667v85.333z"],"attrs":[],"grid":0,"tags":["wall"]},"attrs":[],"properties":{"order":5644,"id":40,"name":"wall","prevSize":32,"code":60813},"setIdx":0,"setId":0,"iconIdx":1165},{"icon":{"paths":["M810.667 298.667h-42.667v-42.667c0-70.692-57.308-128-128-128v0h-426.667c-70.692 0-128 57.308-128 128v0 0 512c0 70.692 57.308 128 128 128v0h597.333c70.692 0 128-57.308 128-128v0-341.333c0-70.692-57.308-128-128-128v0zM213.333 213.333h426.667c23.564 0 42.667 19.103 42.667 42.667v0 42.667h-469.333c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667v0zM853.333 640h-42.667c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667v0h42.667zM853.333 469.333h-42.667c-70.692 0-128 57.308-128 128s57.308 128 128 128v0h42.667v42.667c0 23.564-19.103 42.667-42.667 42.667v0h-597.333c-23.564 0-42.667-19.103-42.667-42.667v0-391.253c12.651 4.596 27.253 7.253 42.477 7.253 0.067 0 0.134-0 0.2-0l-0.010 0h597.333c23.564 0 42.667 19.103 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["wallet"]},"attrs":[],"properties":{"order":5645,"id":39,"name":"wallet","prevSize":32,"code":60814},"setIdx":0,"setId":0,"iconIdx":1166},{"icon":{"paths":["M725.333 367.36l-42.667-246.187c-3.404-20.448-20.963-35.844-42.118-35.844-0.193 0-0.386 0.001-0.578 0.004l0.029-0h-256c-0.163-0.002-0.356-0.004-0.549-0.004-21.155 0-38.714 15.396-42.083 35.594l-0.034 0.249-42.667 246.187c-28.030 40.463-44.777 90.596-44.777 144.64s16.747 104.177 45.334 145.492l-0.557-0.852 42.667 246.187c3.404 20.448 20.963 35.844 42.118 35.844 0.193 0 0.386-0.001 0.578-0.004l-0.029 0h256c0.163 0.002 0.356 0.004 0.549 0.004 21.155 0 38.714-15.396 42.083-35.594l0.034-0.249 42.667-246.187c28.030-40.463 44.777-90.596 44.777-144.64s-16.747-104.177-45.334-145.492l0.557 0.852zM420.267 170.667h183.467l18.773 110.507c-32.319-15.825-70.332-25.080-110.507-25.080s-78.187 9.254-112.023 25.747l1.517-0.667zM603.733 853.333h-183.467l-18.773-110.507c32.319 15.825 70.332 25.080 110.507 25.080s78.187-9.254 112.023-25.747l-1.517 0.667zM512 682.667c-94.257 0-170.667-76.41-170.667-170.667s76.41-170.667 170.667-170.667c94.257 0 170.667 76.41 170.667 170.667v0c0 94.257-76.41 170.667-170.667 170.667v0z"],"attrs":[],"grid":0,"tags":["watch-alt"]},"attrs":[],"properties":{"order":5646,"id":38,"name":"watch-alt","prevSize":32,"code":60815},"setIdx":0,"setId":0,"iconIdx":1167},{"icon":{"paths":["M725.333 289.28v-161.28c0-23.564-19.103-42.667-42.667-42.667v0h-341.333c-23.564 0-42.667 19.103-42.667 42.667v0 161.28c-26.071 23.39-42.458 57.121-42.667 94.683l-0 0.037v256c0.208 37.599 16.596 71.33 42.547 94.615l0.12 0.105v161.28c0 23.564 19.103 42.667 42.667 42.667v0h341.333c23.564 0 42.667-19.103 42.667-42.667v0-161.28c26.071-23.39 42.458-57.121 42.667-94.683l0-0.037v-256c-0.208-37.599-16.596-71.33-42.547-94.615l-0.12-0.105zM384 170.667h256v85.333h-256zM640 853.333h-256v-85.333h256zM682.667 640c0 23.564-19.103 42.667-42.667 42.667v0h-256c-23.564 0-42.667-19.103-42.667-42.667v0-256c0-23.564 19.103-42.667 42.667-42.667v0h256c23.564 0 42.667 19.103 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["watch"]},"attrs":[],"properties":{"order":5647,"id":37,"name":"watch","prevSize":32,"code":60816},"setIdx":0,"setId":0,"iconIdx":1168},{"icon":{"paths":["M926.293 865.707l-768-768c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293v0l170.667 170.667c-51.989 79.211-83.578 175.905-85.327 279.863l-0.006 0.457c0.961 181.378 147.617 328.183 328.845 329.386l0.115 0.001c0.424 0.002 0.925 0.003 1.427 0.003 99.643 0 188.845-44.709 248.638-115.16l0.389-0.47 103.253 103.253c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003zM512 853.333c-135.396-0.242-245.091-109.937-245.333-245.31l-0-0.023c1.585-80.74 24.701-155.763 63.818-219.966l-1.098 1.939 372.907 372.48c-44.706 55.601-112.723 90.884-188.98 90.884-0.462 0-0.924-0.001-1.385-0.004l0.071 0zM462.933 223.573c19.2-17.92 36.267-32 49.067-42.667 61.013 47.787 218.88 189.013 242.347 378.88 2.643 21.258 20.598 37.548 42.358 37.548 0.108 0 0.217-0 0.325-0.001l-0.017 0h5.12c21.196-2.704 37.416-20.629 37.416-42.342 0-1.768-0.108-3.511-0.317-5.223l0.020 0.206c-33.28-274.347-292.267-450.133-302.933-457.387-6.699-4.582-14.977-7.318-23.893-7.318s-17.194 2.735-24.040 7.412l0.147-0.095c-31.070 22.302-58.346 44.84-84.019 69.060l0.392-0.367c-7.132 7.607-11.513 17.868-11.513 29.153 0 23.564 19.103 42.667 42.667 42.667 10.221 0 19.603-3.594 26.95-9.587l-0.077 0.061z"],"attrs":[],"grid":0,"tags":["water-drop-slash"]},"attrs":[],"properties":{"order":5648,"id":36,"name":"water-drop-slash","prevSize":32,"code":60817},"setIdx":0,"setId":0,"iconIdx":1169},{"icon":{"paths":["M771.413 298.667c-1.060-0.094-2.293-0.147-3.539-0.147-22.415 0-40.792 17.284-42.532 39.252l-0.009 0.149-14.933 194.133c-20.4-6.439-37.698-17.812-51.107-32.748l-0.093-0.106c-7.856-8.877-19.278-14.445-32-14.445s-24.144 5.568-31.961 14.4l-0.039 0.045c-20.73 22.475-50.327 36.504-83.2 36.504s-62.47-14.029-83.129-36.426l-0.071-0.078c-7.856-8.877-19.278-14.445-32-14.445s-24.144 5.568-31.961 14.4l-0.039 0.045c-13.539 14.992-30.823 26.353-50.384 32.627l-0.816 0.226-14.933-194.133c-1.749-22.116-20.127-39.4-42.541-39.4-1.246 0-2.479 0.053-3.697 0.158l0.159-0.011c-22.116 1.749-39.4 20.127-39.4 42.541 0 1.246 0.053 2.479 0.158 3.697l-0.011-0.159 36.693 475.733c5.254 66.342 60.384 118.187 127.623 118.187 0.132 0 0.265-0 0.397-0.001l-0.020 0h268.8c0.112 0 0.244 0.001 0.377 0.001 67.239 0 122.369-51.845 127.595-117.741l0.028-0.447 35.84-475.733c0.094-1.060 0.147-2.293 0.147-3.539 0-22.415-17.284-40.792-39.252-42.532l-0.149-0.009zM688.64 814.080c-1.823 22.049-20.167 39.254-42.53 39.254-0.048 0-0.096-0-0.144-0l0.007 0h-268.373c-0.041 0-0.089 0-0.137 0-22.363 0-40.707-17.204-42.52-39.099l-0.010-0.154-14.933-195.413c29.246-6.24 55.029-17.962 77.398-34.118l-0.598 0.411c32.015 22.996 71.998 36.774 115.2 36.774s83.185-13.778 115.796-37.181l-0.596 0.407c21.771 15.745 47.554 27.467 75.463 33.466l1.337 0.241zM512 426.667c76.486-0.242 138.425-62.181 138.667-138.643l0-0.023c0-117.333-110.080-192.427-114.773-195.413-6.699-4.582-14.977-7.318-23.893-7.318s-17.194 2.735-24.040 7.412l0.147-0.095c-4.693 3.413-114.773 78.080-114.773 195.413 0.242 76.486 62.181 138.425 138.643 138.667l0.023 0zM512 183.467c29.96 25.767 49.828 62.538 53.296 103.972l0.038 0.561c0 29.455-23.878 53.333-53.333 53.333s-53.333-23.878-53.333-53.333v0c3.743-41.936 23.551-78.634 53.144-104.372l0.19-0.162z"],"attrs":[],"grid":0,"tags":["water-glass"]},"attrs":[],"properties":{"order":5649,"id":35,"name":"water-glass","prevSize":32,"code":60818},"setIdx":0,"setId":0,"iconIdx":1170},{"icon":{"paths":["M116.053 326.4c9.116 2.713 17.038 6.196 24.408 10.519l-0.514-0.279c24.984 15.151 55.178 24.117 87.467 24.117s62.483-8.967 88.229-24.546l-0.762 0.428c15.706-9.041 34.537-14.375 54.613-14.375s38.908 5.333 55.153 14.66l-0.54-0.286c25.243 14.686 55.556 23.355 87.893 23.355s62.65-8.669 88.741-23.809l-0.848 0.454c15.706-9.041 34.537-14.375 54.613-14.375s38.908 5.333 55.153 14.66l-0.54-0.286c25.494 14.825 56.064 23.665 88.68 23.893l0.066 0c31.544-0.067 61.001-8.946 86.056-24.305l-0.722 0.412c6.856-4.044 14.777-7.527 23.12-10.040l0.773-0.2c17.896-5.341 30.72-21.653 30.72-40.96 0-23.564-19.103-42.667-42.667-42.667-4.257 0-8.369 0.624-12.249 1.784l0.302-0.078c-16.275 5.090-30.407 11.609-43.487 19.67l0.82-0.47c-12.831 7.629-28.289 12.138-44.8 12.138s-31.969-4.509-45.21-12.363l0.41 0.225c-27.88-15.922-61.27-25.309-96.853-25.309s-68.973 9.388-97.829 25.821l0.976-0.512c-12.963 7.659-28.567 12.185-45.227 12.185s-32.263-4.525-45.647-12.414l0.421 0.229c-27.88-15.922-61.27-25.309-96.853-25.309s-68.973 9.388-97.829 25.821l0.976-0.512c-12.831 7.629-28.289 12.138-44.8 12.138s-31.969-4.509-45.21-12.363l0.41 0.225c-12.26-7.591-26.392-14.11-41.322-18.833l-1.345-0.367c-3.578-1.083-7.689-1.707-11.947-1.707-23.564 0-42.667 19.103-42.667 42.667 0 19.307 12.824 35.619 30.418 40.882l0.302 0.078zM884.053 671.147c-16.275 5.090-30.407 11.609-43.487 19.67l0.82-0.47c-12.831 7.629-28.289 12.138-44.8 12.138s-31.969-4.509-45.21-12.363l0.41 0.225c-27.88-15.922-61.27-25.309-96.853-25.309s-68.973 9.388-97.829 25.821l0.976-0.512c-12.963 7.659-28.567 12.185-45.227 12.185s-32.263-4.525-45.647-12.414l0.421 0.229c-27.88-15.922-61.27-25.309-96.853-25.309s-68.973 9.388-97.829 25.821l0.976-0.512c-12.831 7.629-28.289 12.138-44.8 12.138s-31.969-4.509-45.21-12.363l0.41 0.225c-12.26-7.591-26.392-14.11-41.322-18.833l-1.345-0.367c-3.578-1.083-7.689-1.707-11.947-1.707-23.564 0-42.667 19.103-42.667 42.667 0 19.307 12.824 35.619 30.418 40.882l0.302 0.078c9.116 2.713 17.038 6.196 24.408 10.519l-0.514-0.279c24.984 15.151 55.178 24.117 87.467 24.117s62.483-8.967 88.229-24.546l-0.762 0.428c15.706-9.041 34.537-14.375 54.613-14.375s38.908 5.333 55.153 14.66l-0.54-0.286c25.243 14.686 55.556 23.355 87.893 23.355s62.65-8.669 88.741-23.809l-0.848 0.454c15.706-9.041 34.537-14.375 54.613-14.375s38.908 5.333 55.153 14.66l-0.54-0.286c25.494 14.825 56.064 23.665 88.68 23.893l0.066 0c31.544-0.067 61.001-8.946 86.056-24.305l-0.722 0.412c6.856-4.044 14.777-7.527 23.12-10.040l0.773-0.2c17.896-5.341 30.72-21.653 30.72-40.96 0-23.564-19.103-42.667-42.667-42.667-4.257 0-8.369 0.624-12.249 1.784l0.302-0.078zM884.053 457.813c-16.275 5.090-30.407 11.609-43.487 19.67l0.82-0.47c-12.831 7.629-28.289 12.138-44.8 12.138s-31.969-4.509-45.21-12.363l0.41 0.225c-27.88-15.922-61.27-25.309-96.853-25.309s-68.973 9.388-97.829 25.821l0.976-0.512c-12.963 7.659-28.567 12.185-45.227 12.185s-32.263-4.525-45.647-12.414l0.421 0.229c-27.88-15.922-61.27-25.309-96.853-25.309s-68.973 9.388-97.829 25.821l0.976-0.512c-12.831 7.629-28.289 12.138-44.8 12.138s-31.969-4.509-45.21-12.363l0.41 0.225c-12.26-7.591-26.392-14.11-41.322-18.833l-1.345-0.367c-4.475-1.741-9.655-2.75-15.070-2.75-19.688 0-36.261 13.334-41.181 31.464l-0.069 0.299c-1.083 3.578-1.707 7.689-1.707 11.947 0 19.307 12.824 35.619 30.418 40.882l0.302 0.078c9.116 2.713 17.038 6.196 24.408 10.519l-0.514-0.279c24.984 15.151 55.178 24.117 87.467 24.117s62.483-8.967 88.229-24.546l-0.762 0.428c15.706-9.041 34.537-14.375 54.613-14.375s38.908 5.333 55.153 14.66l-0.54-0.286c25.243 14.686 55.556 23.355 87.893 23.355s62.65-8.669 88.741-23.809l-0.848 0.454c15.706-9.041 34.537-14.375 54.613-14.375s38.908 5.333 55.153 14.66l-0.54-0.286c25.494 14.825 56.064 23.665 88.68 23.893l0.066 0c31.544-0.067 61.001-8.946 86.056-24.305l-0.722 0.412c6.856-4.044 14.777-7.527 23.12-10.040l0.773-0.2c17.896-5.341 30.72-21.653 30.72-40.96 0-23.564-19.103-42.667-42.667-42.667-4.257 0-8.369 0.624-12.249 1.784l0.302-0.078z"],"attrs":[],"grid":0,"tags":["water"]},"attrs":[],"properties":{"order":5650,"id":34,"name":"water","prevSize":32,"code":60819},"setIdx":0,"setId":0,"iconIdx":1171},{"icon":{"paths":["M896 85.333h-768c-23.564 0-42.667 19.103-42.667 42.667v0 768c0 23.564 19.103 42.667 42.667 42.667v0h768c23.564 0 42.667-19.103 42.667-42.667v0-768c0-23.564-19.103-42.667-42.667-42.667v0zM469.333 853.333h-298.667v-426.667h298.667zM853.333 853.333h-298.667v-426.667h298.667zM853.333 341.333h-682.667v-170.667h682.667z"],"attrs":[],"grid":0,"tags":["web-grid-alt"]},"attrs":[],"properties":{"order":5651,"id":33,"name":"web-grid-alt","prevSize":32,"code":60820},"setIdx":0,"setId":0,"iconIdx":1172},{"icon":{"paths":["M896 85.333h-768c-23.564 0-42.667 19.103-42.667 42.667v0 768c0 23.564 19.103 42.667 42.667 42.667v0h768c23.564 0 42.667-19.103 42.667-42.667v0-768c0-23.564-19.103-42.667-42.667-42.667v0zM597.333 853.333h-426.667v-298.667h426.667zM597.333 469.333h-426.667v-298.667h426.667zM853.333 853.333h-170.667v-682.667h170.667z"],"attrs":[],"grid":0,"tags":["web-grid"]},"attrs":[],"properties":{"order":5652,"id":32,"name":"web-grid","prevSize":32,"code":60821},"setIdx":0,"setId":0,"iconIdx":1173},{"icon":{"paths":["M896 85.333h-768c-23.564 0-42.667 19.103-42.667 42.667v0 768c0 23.564 19.103 42.667 42.667 42.667v0h768c23.564 0 42.667-19.103 42.667-42.667v0-768c0-23.564-19.103-42.667-42.667-42.667v0zM597.333 853.333h-426.667v-682.667h426.667zM853.333 853.333h-170.667v-682.667h170.667z"],"attrs":[],"grid":0,"tags":["web-section"]},"attrs":[],"properties":{"order":5653,"id":31,"name":"web-section","prevSize":32,"code":60822},"setIdx":0,"setId":0,"iconIdx":1174},{"icon":{"paths":["M512 554.667c70.692 0 128-57.308 128-128s-57.308-128-128-128c-70.692 0-128 57.308-128 128v0c0 70.692 57.308 128 128 128v0zM512 384c23.564 0 42.667 19.103 42.667 42.667s-19.103 42.667-42.667 42.667c-23.564 0-42.667-19.103-42.667-42.667v0c0-23.564 19.103-42.667 42.667-42.667v0zM921.173 774.827c-22.057-71.762-60.216-133.075-110.423-182.105l-0.084-0.081c26.849-47.644 42.667-104.598 42.667-165.247 0-188.513-152.82-341.333-341.333-341.333s-341.333 152.82-341.333 341.333c0 60.649 15.818 117.603 43.553 166.963l-0.886-1.716c-50.605 48.98-88.938 110.332-110.14 179.194l-0.793 2.993c-3.269 10.764-5.151 23.134-5.151 35.944 0 28.727 9.464 55.244 25.443 76.603l-0.239-0.334c23.586 31.478 60.8 51.63 102.721 51.63 0.337 0 0.674-0.001 1.010-0.004l-0.052 0h571.733c0.159 0.001 0.346 0.001 0.534 0.001 41.92 0 79.133-20.151 102.481-51.296l0.238-0.332c15.74-21.025 25.204-47.542 25.204-76.269 0-12.81-1.882-25.181-5.384-36.851l0.234 0.906zM512 170.667c141.385 0 256 114.615 256 256s-114.615 256-256 256c-141.385 0-256-114.615-256-256v0c0-141.385 114.615-256 256-256v0zM832.853 835.84c-7.851 10.658-20.353 17.497-34.452 17.497-0.188 0-0.376-0.001-0.563-0.004l0.028 0h-571.733c-0.159 0.002-0.347 0.003-0.535 0.003-14.099 0-26.6-6.838-34.369-17.379l-0.083-0.117c-5.086-6.939-8.138-15.645-8.138-25.065 0-4.297 0.635-8.446 1.817-12.357l-0.078 0.302c16.263-53.732 43.914-99.858 80.303-137.48l-0.089 0.093c62.281 65.234 149.924 105.792 247.040 105.792s184.758-40.558 246.914-105.659l0.126-0.133c36.299 37.529 63.95 83.655 79.592 135.014l0.621 2.372c1.103 3.609 1.738 7.758 1.738 12.055 0 9.42-3.052 18.126-8.222 25.185l0.084-0.12z"],"attrs":[],"grid":0,"tags":["webcam"]},"attrs":[],"properties":{"order":5654,"id":30,"name":"webcam","prevSize":32,"code":60823},"setIdx":0,"setId":0,"iconIdx":1175},{"icon":{"paths":["M896 85.333h-768c-23.564 0-42.667 19.103-42.667 42.667v0 768c0 23.564 19.103 42.667 42.667 42.667v0h768c23.564 0 42.667-19.103 42.667-42.667v0-768c0-23.564-19.103-42.667-42.667-42.667v0zM341.333 853.333h-170.667v-682.667h170.667zM853.333 853.333h-426.667v-682.667h426.667z"],"attrs":[],"grid":0,"tags":["web-section-alt"]},"attrs":[],"properties":{"order":5655,"id":29,"name":"web-section-alt","prevSize":32,"code":60824},"setIdx":0,"setId":0,"iconIdx":1176},{"icon":{"paths":["M938.667 279.467c-0.534-20.015-2.068-39.055-4.566-57.79l0.3 2.75c-3.521-17.376-8.978-32.792-16.267-47.12l0.48 1.040c-8.037-16.465-18.174-30.556-30.292-42.666l-0.001-0.001c-12.202-11.955-26.268-22.070-41.71-29.856l-0.956-0.437c-13.296-6.675-28.727-11.994-44.924-15.171l-1.156-0.189c-16.051-2.543-34.922-4.233-54.099-4.684l-0.515-0.010h-465.493c-20.015 0.534-39.055 2.068-57.79 4.566l2.75-0.3c-17.376 3.521-32.792 8.978-47.12 16.267l1.040-0.48c-16.465 8.037-30.556 18.174-42.666 30.292l-0.001 0.001c-11.955 12.202-22.070 26.268-29.856 41.71l-0.437 0.956c-6.675 13.296-11.994 28.727-15.171 44.924l-0.189 1.156c-2.543 16.051-4.233 34.922-4.684 54.099l-0.010 0.515c0 8.107 0 19.627 0 23.040v419.84c0 4.693 0 14.933 0 22.613 0.534 20.015 2.068 39.055 4.566 57.79l-0.3-2.75c3.521 17.376 8.978 32.792 16.267 47.12l-0.48-1.040c8.037 16.465 18.174 30.556 30.292 42.666l0.001 0.001c12.202 11.955 26.268 22.070 41.71 29.856l0.956 0.437c13.296 6.675 28.727 11.994 44.924 15.171l1.156 0.189c16.051 2.543 34.922 4.233 54.099 4.684l0.515 0.010h465.493c20.015-0.534 39.055-2.068 57.79-4.566l-2.75 0.3c17.376-3.521 32.792-8.978 47.12-16.267l-1.040 0.48c16.465-8.037 30.556-18.174 42.666-30.292l0.001-0.001c11.955-12.202 22.070-26.268 29.856-41.71l0.437-0.956c6.675-13.296 11.994-28.727 15.171-44.924l0.189-1.156c2.543-16.051 4.233-34.922 4.684-54.099l0.010-0.515c0-8.107 0-18.347 0-23.040v-419.84c0-3.413 0-14.933 0-22.613zM521.813 810.667v0c-53.779-0.274-104.182-14.479-147.859-39.187l1.512 0.787-162.133 42.667 42.667-158.72c-26.405-43.659-42.206-96.31-42.666-152.617l-0.001-0.129c0.49-168.82 137.458-305.486 306.345-305.486 169.191 0 306.347 137.156 306.347 306.347 0 168.44-135.942 305.129-304.097 306.339l-0.115 0.001zM521.813 250.453c-140.119 1.654-253.071 115.628-253.071 255.983 0 49.404 13.994 95.539 38.236 134.658l-0.632-1.094 5.973 9.813-25.6 93.44 97.28-26.453 9.387 5.547c36.634 21.935 80.747 35.047 127.896 35.413l0.104 0.001c141.385 0 256-114.615 256-256v0c0-141.385-114.615-256-256-256v0zM671.147 613.973c-11.25 18.536-29.571 31.824-51.129 36.183l-0.498 0.084c-5.374 1.031-11.556 1.62-17.875 1.62-10.682 0-20.971-1.685-30.616-4.803l0.703 0.197c-17.202-5.395-31.335-10.895-45.030-17.186l2.363 0.973c-53.522-27.239-97.525-66.322-129.793-113.997l-0.767-1.203c-17.174-21.714-28.475-48.793-31.106-78.366l-0.041-0.568c-0.012-0.54-0.019-1.175-0.019-1.813 0-24.497 10.323-46.584 26.856-62.147l0.043-0.041c5.038-5.692 12.329-9.29 20.463-9.387l0.017-0h11.947c4.693 0 11.093 0 17.067 13.227s21.76 52.907 23.893 56.747c1.005 1.922 1.595 4.199 1.595 6.613s-0.59 4.691-1.633 6.694l0.038-0.080c-2.022 4.902-4.605 9.129-7.742 12.876l0.062-0.076c-3.84 4.693-8.107 10.24-11.52 13.653s-7.68 7.68-3.413 15.36c12.11 20.232 26.251 37.632 42.522 52.773l0.145 0.133c17.479 15.503 37.808 28.3 60.022 37.456l1.418 0.518c7.68 3.84 12.373 3.413 16.64 0s19.2-22.187 24.32-29.867 10.24-6.4 17.067-3.84 44.8 20.907 52.48 24.747 12.373 5.547 14.507 8.96c0.57 3.271 0.895 7.038 0.895 10.881 0 8.032-1.423 15.732-4.030 22.861l0.148-0.462z"],"attrs":[],"grid":0,"tags":["whatsapp-alt"]},"attrs":[],"properties":{"order":5656,"id":28,"name":"whatsapp-alt","prevSize":32,"code":60825},"setIdx":0,"setId":0,"iconIdx":1177},{"icon":{"paths":["M708.267 597.333c-8.533-4.267-64-29.867-72.533-34.133s-17.067-4.267-25.6 4.267c-8.533 8.533-25.6 34.133-34.133 42.667-4.267 8.533-12.8 8.533-21.333 4.267-29.867-12.8-59.733-29.867-85.333-51.2-21.333-21.333-42.667-46.933-59.733-72.533-4.267-8.533 0-17.067 4.267-21.333s8.533-12.8 17.067-17.067c4.267-4.267 8.533-12.8 8.533-17.067 4.267-4.267 4.267-12.8 0-17.067s-25.6-55.467-34.133-76.8c-4.267-29.867-12.8-29.867-21.333-29.867-4.267 0-12.8 0-21.333 0s-21.333 8.533-25.6 12.8c-25.6 25.6-38.4 55.467-38.4 89.6 4.267 38.4 17.067 76.8 42.667 110.933 46.933 68.267 106.667 123.733 179.2 157.867 21.333 8.533 38.4 17.067 59.733 21.333 21.333 8.533 42.667 8.533 68.267 4.267 29.867-4.267 55.467-25.6 72.533-51.2 8.533-17.067 8.533-34.133 4.267-51.2 0-0-8.533-4.267-17.067-8.533zM814.933 209.067c-166.4-166.4-435.2-166.4-601.6 0-136.533 136.533-162.133 345.6-68.267 512l-59.733 217.6 226.133-59.733c64 34.133 132.267 51.2 200.533 51.2v0c234.667 0 422.4-187.733 422.4-422.4 4.267-110.933-42.667-217.6-119.467-298.667zM699.733 806.4c-55.467 34.133-119.467 55.467-187.733 55.467v0c-64 0-123.733-17.067-179.2-46.933l-12.8-8.533-132.267 34.133 34.133-128-8.533-12.8c-102.4-170.667-51.2-384 115.2-490.667s379.733-51.2 482.133 110.933c102.4 166.4 55.467 384-110.933 486.4z"],"attrs":[],"grid":0,"tags":["whatsapp"]},"attrs":[],"properties":{"order":5657,"id":27,"name":"whatsapp","prevSize":32,"code":60826},"setIdx":0,"setId":0,"iconIdx":1178},{"icon":{"paths":["M810.667 170.667h-61.867c-5.461-16.399-13.452-30.586-23.643-42.885l0.176 0.219c-23.54-26.238-57.555-42.668-95.407-42.668-0.209 0-0.417 0-0.625 0.001l0.032-0h-233.813c-0.428-0.005-0.934-0.008-1.441-0.008-37.855 0-71.873 16.433-95.307 42.555l-0.106 0.12c-10.328 12.054-18.597 26.235-24.039 41.746l-0.281 0.921h-61.013c-70.692 0-128 57.308-128 128v0 512c0 70.692 57.308 128 128 128v0h597.333c70.692 0 128-57.308 128-128v0-512c0-70.692-57.308-128-128-128v0zM363.52 185.173c7.847-8.9 19.269-14.49 31.997-14.507l0.003-0h232.96c12.731 0.017 24.153 5.606 31.96 14.46l0.040 0.047c6.783 7.524 10.933 17.538 10.933 28.52 0 1.677-0.097 3.331-0.285 4.958l0.019-0.198-21.333 170.667c-2.643 21.258-20.598 37.548-42.358 37.548-0.108 0-0.217-0-0.325-0.001l0.017 0h-69.973l48.64-102.4c1.869-4.622 2.953-9.983 2.953-15.597 0-23.564-19.103-42.667-42.667-42.667-15.806 0-29.604 8.594-36.977 21.365l-0.11 0.206-66.56 139.093h-25.6c-0.092 0.001-0.2 0.001-0.308 0.001-21.76 0-39.715-16.289-42.337-37.339l-0.021-0.208-21.333-170.667c-0.17-1.428-0.266-3.083-0.266-4.76 0-10.983 4.15-20.996 10.967-28.558l-0.034 0.038zM853.333 810.667c0 23.564-19.103 42.667-42.667 42.667v0h-597.333c-23.564 0-42.667-19.103-42.667-42.667v0-512c0-23.564 19.103-42.667 42.667-42.667v0h58.453l17.92 143.787c8.126 63.575 61.894 112.217 127.023 112.217 0.343 0 0.687-0.001 1.029-0.004l-0.052 0h190.293c0.29 0.002 0.633 0.004 0.977 0.004 65.129 0 118.897-48.643 126.957-111.58l0.067-0.637 16.213-143.787h58.453c23.564 0 42.667 19.103 42.667 42.667v0zM597.333 682.667h-170.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h170.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["weight"]},"attrs":[],"properties":{"order":5658,"id":26,"name":"weight","prevSize":32,"code":60827},"setIdx":0,"setId":0,"iconIdx":1179},{"icon":{"paths":["M896 85.333h-98.133l-6.827 2.987-7.253 4.693c-2.074 1.653-3.894 3.473-5.494 5.478l-0.053 0.069c-1.58 1.985-3.001 4.225-4.171 6.61l-0.096 0.216c-1.4 2.209-2.564 4.759-3.359 7.466l-0.054 0.214v3.84l-29.013 139.093h-48.64l-133.12-132.693c-23.426-22.533-55.319-36.411-90.453-36.411s-67.027 13.878-90.496 36.451l0.042-0.041-133.12 132.693h-117.76c-0.050-0-0.11-0-0.169-0-15.71 0-29.436 8.49-36.842 21.132l-0.109 0.201c-3.594 6.12-5.716 13.479-5.716 21.333s2.123 15.214 5.825 21.535l-0.109-0.201 170.667 298.667-32.853 64c-2.3-0.2-4.977-0.315-7.68-0.315s-5.38 0.114-8.025 0.338l0.345-0.024c-70.692 0-128 57.308-128 128s57.308 128 128 128c70.692 0 128-57.308 128-128v0c-0.146-34.544-13.953-65.835-36.294-88.775l0.027 0.028 42.667-85.333 58.88-5.973 168.107 252.16c22.717 33.919 60.888 55.949 104.204 55.949 1.316 0 2.627-0.020 3.934-0.061l-0.191 0.005c17.344-0.036 33.909-3.321 49.136-9.278l-0.923 0.318c48.166-19.106 81.606-65.296 81.606-119.296 0-7.597-0.662-15.039-1.931-22.272l0.112 0.768-42.667-234.24 76.373-384h51.627c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM213.333 853.333c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667c23.564 0 42.667 19.103 42.667 42.667v0c0 23.564-19.103 42.667-42.667 42.667v0zM439.467 183.040c7.69-7.542 18.235-12.197 29.867-12.197s22.177 4.655 29.874 12.203l-0.007-0.007 72.96 72.96h-205.653zM322.133 552.107l-120.747-210.773h523.947l-34.987 174.080zM698.027 850.773c-4.62 1.867-9.979 2.95-15.59 2.95-14.813 0-27.862-7.548-35.512-19.008l-0.098-0.156-142.507-213.333 186.453-18.347 34.56 200.107c0.402 2.2 0.632 4.731 0.632 7.316 0 18.277-11.492 33.87-27.645 39.947l-0.294 0.097z"],"attrs":[],"grid":0,"tags":["wheel-barrow"]},"attrs":[],"properties":{"order":5659,"id":25,"name":"wheel-barrow","prevSize":32,"code":60828},"setIdx":0,"setId":0,"iconIdx":1180},{"icon":{"paths":["M853.333 690.347v-7.68c-0.16-55.254-35.305-102.258-84.442-120.038l-0.891-0.282v-263.68h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-512c0-70.692-57.308-128-128-128v0h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h42.667c23.564 0 42.667 19.103 42.667 42.667v0 316.587c-75.977 33.766-128 108.569-128 195.523 0 117.821 95.513 213.333 213.333 213.333s213.333-95.513 213.333-213.333c0-0.039-0-0.077-0-0.116l0 0.006c0-0.085 0-0.185 0-0.286 0-30.78-6.598-60.018-18.456-86.379l0.536 1.332h231.253c23.564 0 42.667 19.103 42.667 42.667v0 7.68c-50.14 18.103-85.333 65.281-85.333 120.68 0 70.692 57.308 128 128 128s128-57.308 128-128c0-55.398-35.193-102.577-84.442-120.398l-0.891-0.282zM298.667 853.333c-70.692 0-128-57.308-128-128s57.308-128 128-128c70.692 0 128 57.308 128 128v0c0 70.692-57.308 128-128 128v0zM682.667 554.667h-256c-34.866-26.63-79.062-42.669-127.004-42.669-0.35 0-0.7 0.001-1.050 0.003l0.054-0v-42.667h384zM682.667 384h-384v-85.333h384zM810.667 853.333c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667c23.564 0 42.667 19.103 42.667 42.667v0c0 23.564-19.103 42.667-42.667 42.667v0zM298.667 682.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["wheelchair-alt"]},"attrs":[],"properties":{"order":5660,"id":24,"name":"wheelchair-alt","prevSize":32,"code":60829},"setIdx":0,"setId":0,"iconIdx":1181},{"icon":{"paths":["M512 277.333c47.128 0 85.333-38.205 85.333-85.333s-38.205-85.333-85.333-85.333c-47.128 0-85.333 38.205-85.333 85.333v0c0 47.128 38.205 85.333 85.333 85.333v0zM832 874.667h-42.667v-213.333c0-23.564-19.103-42.667-42.667-42.667v0h-213.333v-85.333h213.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-213.333v-85.333c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 298.667c0 23.564 19.103 42.667 42.667 42.667v0h213.333v213.333c0 23.564 19.103 42.667 42.667 42.667v0h85.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM541.867 806.4c-31.467 41.638-80.89 68.267-136.533 68.267-94.257 0-170.667-76.41-170.667-170.667h-0c0.109-69.461 41.696-129.182 101.314-155.728l1.086-0.432c15.273-6.763 25.736-21.786 25.736-39.253 0-23.639-19.164-42.803-42.803-42.803-6.172 0-12.039 1.306-17.34 3.658l0.273-0.108c-91.149 40.528-153.557 130.281-153.557 234.609 0 141.385 114.615 256 256 256 83.439 0 157.554-39.918 204.291-101.699l0.466-0.643c5.327-7.042 8.533-15.947 8.533-25.6 0-23.564-19.103-42.667-42.667-42.667-13.911 0-26.267 6.657-34.056 16.959l-0.078 0.107z"],"attrs":[],"grid":0,"tags":["wheelchair"]},"attrs":[],"properties":{"order":5661,"id":23,"name":"wheelchair","prevSize":32,"code":60830},"setIdx":0,"setId":0,"iconIdx":1182},{"icon":{"paths":["M379.733 725.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM251.733 725.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM507.733 725.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM640 362.667c7.524-12.801 21.228-21.258 36.907-21.258s29.382 8.457 36.798 21.058l0.109 0.2c7.512 12.853 21.244 21.35 36.96 21.35 7.747 0 15.011-2.064 21.273-5.673l-0.207 0.11c13.682-7.291 22.837-21.466 22.837-37.779 0-7.589-1.981-14.715-5.454-20.889l0.111 0.214c-22.525-38.61-63.747-64.142-110.933-64.142s-88.409 25.532-110.606 63.535l-0.328 0.607c-1.78 4.521-2.813 9.757-2.813 15.235 0 23.564 19.103 42.667 42.667 42.667 13.088 0 24.8-5.893 32.627-15.171l0.052-0.064zM938.667 234.667c-52.623-89.813-148.659-149.173-258.56-149.173s-205.937 59.359-257.797 147.766l-0.763 1.407c-3.613 6.133-5.748 13.511-5.748 21.388 0 15.791 8.578 29.578 21.329 36.956l0.205 0.11c5.523 3.201 12.094 5.219 19.106 5.543l0.094 0.003c0.050 0 0.11 0 0.169 0 15.71 0 29.436-8.49 36.842-21.132l0.109-0.201c37.574-64.211 106.203-106.657 184.747-106.657s147.173 42.446 184.202 105.651l0.545 1.007c7.488 12.956 21.275 21.534 37.066 21.534 7.877 0 15.255-2.134 21.588-5.856l-0.2 0.109c13.499-7.344 22.508-21.422 22.508-37.604 0-7.659-2.018-14.847-5.551-21.060l0.11 0.211zM763.733 597.333h-42.667v-128c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 128h-426.667c-70.692 0-128 57.308-128 128v0 85.333c0 70.692 57.308 128 128 128v0h554.667c70.692 0 128-57.308 128-128v0-85.333c0-70.692-57.308-128-128-128v0zM806.4 810.667c0 23.564-19.103 42.667-42.667 42.667v0h-554.667c-23.564 0-42.667-19.103-42.667-42.667v0-85.333c0-23.564 19.103-42.667 42.667-42.667v0h554.667c23.564 0 42.667 19.103 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["wifi-router"]},"attrs":[],"properties":{"order":5662,"id":22,"name":"wifi-router","prevSize":32,"code":60831},"setIdx":0,"setId":0,"iconIdx":1183},{"icon":{"paths":["M512 810.667h-213.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h213.333c23.435 0.32 42.347 19.232 42.666 42.636l0 0.030c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0c-0.080-70.66-57.339-127.92-127.992-128l-0.008-0zM597.333 384c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667c-23.564 0-42.667 19.103-42.667 42.667v0c0 23.564 19.103 42.667 42.667 42.667v0zM768 384h85.333c70.66-0.080 127.92-57.339 128-127.992l0-0.008c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0c-0.32 23.435-19.232 42.347-42.636 42.666l-0.030 0h-85.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM853.333 640h-92.216c23.351-36.004 40.456-78.346 48.615-123.792l0.31-2.083c0.392-2.171 0.615-4.67 0.615-7.222 0-23.573-19.11-42.683-42.683-42.683-4.882 0-9.572 0.82-13.941 2.328l0.3-0.090c-24.428 8.58-52.593 13.539-81.915 13.542l-0.002 0c-142.621-0.054-258.251-115.537-258.542-258.097l-0-0.028c0.316-16.048 1.819-31.498 4.427-46.569l-0.26 1.819c0.316-1.949 0.496-4.197 0.496-6.486 0-23.546-19.088-42.635-42.635-42.635-4.887 0-9.581 0.822-13.953 2.335l0.3-0.090c-137.274 46.795-234.25 174.615-234.25 325.085 0 68.569 20.138 132.435 54.823 186.005l-0.813-1.34h-54.010c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h213.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-49.898c-48.195-46.799-78.102-112.204-78.102-184.594 0-89.37 45.583-168.094 114.767-214.19l0.942-0.59c10.569 181.444 160.237 324.597 343.364 324.708l0.011 0c0.070 0 0.152 0 0.235 0 11.774 0 23.406-0.605 34.868-1.787l-1.436 0.12c-13.949 29.627-32.162 54.903-54.188 76.271l-0.065 0.063h-139.831c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h341.333c23.564 0 42.667 19.103 42.667 42.667s-19.103 42.667-42.667 42.667v0c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0c70.692 0 128-57.308 128-128s-57.308-128-128-128v0zM111.792 814.083c-5.424 2.295-10.082 5.311-14.122 8.995l0.039-0.035c-7.601 7.829-12.308 18.503-12.375 30.277l-0 0.013c-0.001 0.13-0.002 0.284-0.002 0.438 0 23.324 18.907 42.231 42.231 42.231 6.016 0 11.738-1.258 16.918-3.525l-0.272 0.106c5.421-2.305 10.079-5.319 14.126-8.993l-0.041 0.037c7.647-7.667 12.375-18.248 12.375-29.933 0-0.127-0.001-0.253-0.002-0.38l0 0.019c-0.179-11.769-4.859-22.411-12.39-30.311l0.017 0.018c-7.709-7.592-18.296-12.28-29.979-12.28-5.965 0-11.644 1.222-16.801 3.429l0.279-0.106z"],"attrs":[],"grid":0,"tags":["wind-moon"]},"attrs":[],"properties":{"order":5663,"id":21,"name":"wind-moon","prevSize":32,"code":60832},"setIdx":0,"setId":0,"iconIdx":1184},{"icon":{"paths":["M512 640c-70.692 0-128 57.308-128 128s57.308 128 128 128c70.692 0 128-57.308 128-128v0c0-70.692-57.308-128-128-128v0zM512 810.667c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667c23.564 0 42.667 19.103 42.667 42.667v0c0 23.564-19.103 42.667-42.667 42.667v0zM512 469.333c-82.426 0.293-157.006 33.647-211.217 87.484l0.017-0.017c-7.668 7.712-12.407 18.343-12.407 30.080s4.74 22.368 12.409 30.082l-0.002-0.002c7.712 7.668 18.343 12.407 30.080 12.407s22.368-4.74 30.082-12.409l-0.002 0.002c38.625-38.72 92.035-62.675 151.040-62.675s112.415 23.955 151.036 62.67l0.004 0.004c7.612 7.763 18.155 12.628 29.835 12.8l0.032 0c0.733 0.045 1.589 0.071 2.452 0.071 23.564 0 42.667-19.103 42.667-42.667 0-11.879-4.854-22.624-12.688-30.36l-0.004-0.004c-54.434-54.058-129.434-87.469-212.238-87.469-0.385 0-0.77 0.001-1.155 0.002l0.059-0zM512 298.667c-129.553 0.355-246.796 52.767-331.971 137.411l0.024-0.024c-7.753 7.753-12.548 18.463-12.548 30.293 0 23.661 19.181 42.841 42.841 42.841 11.83 0 22.541-4.795 30.293-12.548l-0 0c69.474-69.39 165.405-112.302 271.36-112.302s201.887 42.913 271.364 112.306l-0.004-0.004c7.709 7.648 18.326 12.374 30.047 12.374 0.087 0 0.173-0 0.26-0.001l-0.013 0c0.073 0 0.16 0.001 0.247 0.001 11.721 0 22.338-4.726 30.049-12.377l-0.003 0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003c-85.151-84.619-202.393-137.031-331.878-137.387l-0.069-0zM964.693 315.307c-115.831-115.904-275.89-187.597-452.693-187.597s-336.861 71.693-452.69 187.593l-0.004 0.004c-7.753 7.753-12.548 18.463-12.548 30.293 0 23.661 19.181 42.841 42.841 42.841 11.83 0 22.541-4.795 30.293-12.548l-0 0c100.365-100.314 238.99-162.356 392.107-162.356s291.742 62.042 392.109 162.358l-0.002-0.002c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003z"],"attrs":[],"grid":0,"tags":["wifi"]},"attrs":[],"properties":{"order":5664,"id":20,"name":"wifi","prevSize":32,"code":60833},"setIdx":0,"setId":0,"iconIdx":1185},{"icon":{"paths":["M295.253 235.093v0l-136.96-137.387c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293l-0-0 96.853 97.707c-51.304 29.461-95.567 63.262-134.902 102.047l0.075-0.074c-7.668 7.712-12.407 18.343-12.407 30.080s4.74 22.368 12.409 30.082l-0.002-0.002c7.709 7.861 18.426 12.749 30.284 12.8l0.010 0c11.656-0.051 22.2-4.767 29.869-12.376l-0.003 0.003c39.626-39.307 85.169-72.732 135.157-98.803l3.083-1.464 63.573 65.707c-54.988 24.383-101.944 56.991-141.639 96.839l-0.015 0.015c-9.012 7.865-14.674 19.371-14.674 32.2 0 23.564 19.103 42.667 42.667 42.667 13.042 0 24.717-5.851 32.543-15.072l0.051-0.061c40.242-40.067 89.54-71.073 144.554-89.677l2.646-0.777 69.12 68.693c-61.52 12.116-114.807 41.475-156.164 82.777l0.004-0.004c-9.012 7.865-14.674 19.371-14.674 32.2 0 23.564 19.103 42.667 42.667 42.667 13.042 0 24.717-5.851 32.543-15.072l0.051-0.061c38.352-39.108 91.586-63.502 150.519-63.999l0.094-0.001c9.509 0.026 18.817 0.8 27.892 2.268l-1.012-0.135 326.827 326.827c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003zM512 682.667c-70.692 0-128 57.308-128 128s57.308 128 128 128c70.692 0 128-57.308 128-128v0c0-70.692-57.308-128-128-128v0zM512 853.333c-23.564 0-42.667-19.103-42.667-42.667s19.103-42.667 42.667-42.667c23.564 0 42.667 19.103 42.667 42.667v0c0 23.564-19.103 42.667-42.667 42.667v0zM964.693 357.973c-115.797-115.698-275.717-187.252-452.349-187.252-25.83 0-51.303 1.53-76.333 4.505l3.028-0.293c-21.6 2.445-38.231 20.614-38.231 42.667 0 23.706 19.218 42.924 42.924 42.924 1.653 0 3.285-0.093 4.89-0.275l-0.197 0.018c18.978-2.29 40.953-3.597 63.234-3.597 153.273 0 292.104 61.836 392.905 161.923l-0.033-0.032c7.715 7.662 18.344 12.397 30.080 12.397 23.577 0 42.691-19.113 42.691-42.691 0-11.842-4.821-22.557-12.608-30.291l-0.002-0.002zM783.36 538.88c7.448 6.502 17.257 10.466 27.992 10.466 23.564 0 42.667-19.103 42.667-42.667 0-10.522-3.809-20.155-10.123-27.594l0.051 0.061c-55.441-56.064-125.171-97.885-203.283-119.557l-3.224-0.763c-4.56-1.814-9.844-2.866-15.373-2.866-23.564 0-42.667 19.103-42.667 42.667 0 21.158 15.401 38.719 35.604 42.085l0.249 0.034c66.109 18.694 122.793 52.731 168.101 98.127l0.006 0.006z"],"attrs":[],"grid":0,"tags":["wifi-slash"]},"attrs":[],"properties":{"order":5665,"id":19,"name":"wifi-slash","prevSize":32,"code":60834},"setIdx":0,"setId":0,"iconIdx":1186},{"icon":{"paths":["M469.333 192c0.007 0 0.016 0 0.024 0 23.551 0 42.642-19.092 42.642-42.642 0-0.009-0-0.017-0-0.026l0 0.001v-42.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 42.667c-0 0.007-0 0.016-0 0.024 0 23.551 19.092 42.642 42.642 42.642 0.009 0 0.017-0 0.026-0l-0.001 0zM170.667 490.667c0-0.007 0-0.016 0-0.024 0-23.551-19.092-42.642-42.642-42.642-0.009 0-0.017 0-0.026 0l-42.665-0c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h42.667c0.007 0 0.016 0 0.024 0 23.551 0 42.642-19.092 42.642-42.642 0-0.009-0-0.017-0-0.026l0 0.001zM197.792 701.875l-30.165 30.165c-7.72 7.72-12.495 18.386-12.495 30.167 0 23.562 19.1 42.662 42.662 42.662 11.781 0 22.446-4.775 30.167-12.495l30.165-30.165c7.72-7.72 12.495-18.386 12.495-30.167 0-23.562-19.1-42.662-42.662-42.662-11.781 0-22.446 4.775-30.167 12.495l-0 0zM197.792 279.458c7.72 7.72 18.386 12.495 30.167 12.495 23.562 0 42.662-19.1 42.662-42.662 0-11.781-4.775-22.446-12.495-30.167l-30.165-30.165c-7.72-7.721-18.386-12.496-30.167-12.496-23.562 0-42.662 19.1-42.662 42.662 0 11.78 4.775 22.446 12.495 30.166l-0-0zM710.708 291.959c0.015 0 0.032 0 0.049 0 11.766 0 22.416-4.778 30.115-12.5l0.001-0.001 30.165-30.165c7.72-7.72 12.495-18.386 12.495-30.167 0-23.562-19.1-42.662-42.662-42.662-11.781 0-22.446 4.775-30.167 12.495l-30.165 30.165c-7.718 7.721-12.492 18.386-12.492 30.165 0 23.561 19.097 42.661 42.657 42.667l0.001 0zM554.667 512c-0 0.007-0 0.016-0 0.024 0 23.551 19.092 42.642 42.642 42.642 0.009 0 0.017-0 0.026-0l213.332 0c70.66-0.080 127.92-57.339 128-127.992l0-0.008c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0c-0.32 23.435-19.232 42.347-42.636 42.666l-0.030 0h-213.333c-0.007-0-0.016-0-0.024-0-23.551 0-42.642 19.092-42.642 42.642 0 0.009 0 0.017 0 0.026l-0-0.001zM853.333 640h-213.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h213.333c23.564 0 42.667 19.103 42.667 42.667s-19.103 42.667-42.667 42.667v0c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0c70.692 0 128-57.308 128-128s-57.308-128-128-128v0zM384 810.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM640 810.667h-85.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h85.333c23.435 0.32 42.347 19.232 42.666 42.636l0 0.030c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0c-0.080-70.66-57.339-127.92-127.992-128l-0.008-0zM469.333 640c-82.475 0-149.333-66.859-149.333-149.333s66.859-149.333 149.333-149.333v0c0.276-0.002 0.602-0.003 0.928-0.003 35.192 0 67.47 12.475 92.654 33.243l-0.249-0.199c7.296 6.008 16.736 9.651 27.027 9.651 23.566 0 42.67-19.104 42.67-42.67 0-13.3-6.085-25.178-15.622-33.004l-0.075-0.060c-39.399-32.551-90.424-52.295-146.060-52.295-0.448 0-0.895 0.001-1.342 0.004l0.069-0c-129.603 0-234.667 105.064-234.667 234.667s105.064 234.667 234.667 234.667v0c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["wind-sun"]},"attrs":[],"properties":{"order":5666,"id":18,"name":"wind-sun","prevSize":32,"code":60835},"setIdx":0,"setId":0,"iconIdx":1187},{"icon":{"paths":["M149.333 384c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667c-23.564 0-42.667 19.103-42.667 42.667v0c0 23.564 19.103 42.667 42.667 42.667v0zM320 384h298.667c70.692 0 128-57.308 128-128s-57.308-128-128-128v0c-23.551 0.101-45.605 6.421-64.631 17.402l0.631-0.336c-12.956 7.488-21.534 21.275-21.534 37.066 0 7.877 2.134 15.255 5.856 21.588l-0.109-0.2c7.53 12.777 21.22 21.215 36.882 21.215 7.952 0 15.395-2.175 21.768-5.963l-0.197 0.108c6.171-3.385 13.501-5.425 21.296-5.546l0.037-0c23.564 0 42.667 19.103 42.667 42.667s-19.103 42.667-42.667 42.667v0h-298.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM149.333 554.667h298.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-298.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM874.667 384c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667c-23.564 0-42.667 19.103-42.667 42.667v0c0 23.564 19.103 42.667 42.667 42.667v0zM789.333 469.333h-170.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h170.667c23.564 0 42.667 19.103 42.667 42.667s-19.103 42.667-42.667 42.667v0c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0c70.692 0 128-57.308 128-128s-57.308-128-128-128v0zM533.333 640h-170.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h170.667c23.564 0 42.667 19.103 42.667 42.667s-19.103 42.667-42.667 42.667v0c-7.833-0.122-15.163-2.162-21.576-5.668l0.243 0.122c-6.48-4.177-14.395-6.66-22.89-6.66-23.564 0-42.667 19.103-42.667 42.667 0 16.334 9.178 30.524 22.659 37.694l0.23 0.112c18.395 10.645 40.449 16.966 63.971 17.067l0.029 0c70.692 0 128-57.308 128-128s-57.308-128-128-128v0zM192 640h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["wind"]},"attrs":[],"properties":{"order":5667,"id":17,"name":"wind","prevSize":32,"code":60836},"setIdx":0,"setId":0,"iconIdx":1188},{"icon":{"paths":["M896 85.333h-768c-23.564 0-42.667 19.103-42.667 42.667v0 768c0 23.564 19.103 42.667 42.667 42.667v0h768c23.564 0 42.667-19.103 42.667-42.667v0-768c0-23.564-19.103-42.667-42.667-42.667v0zM341.333 853.333h-170.667v-682.667h170.667zM853.333 853.333h-426.667v-298.667h426.667zM853.333 469.333h-426.667v-298.667h426.667z"],"attrs":[],"grid":0,"tags":["window-grid"]},"attrs":[],"properties":{"order":5668,"id":16,"name":"window-grid","prevSize":32,"code":60837},"setIdx":0,"setId":0,"iconIdx":1189},{"icon":{"paths":["M896 85.333h-768c-23.564 0-42.667 19.103-42.667 42.667v0 768c0 23.564 19.103 42.667 42.667 42.667v0h768c23.564 0 42.667-19.103 42.667-42.667v0-768c0-23.564-19.103-42.667-42.667-42.667v0zM853.333 853.333h-682.667v-426.667h682.667zM853.333 341.333h-682.667v-170.667h682.667z"],"attrs":[],"grid":0,"tags":["window-maximize"]},"attrs":[],"properties":{"order":5669,"id":15,"name":"window-maximize","prevSize":32,"code":60838},"setIdx":0,"setId":0,"iconIdx":1190},{"icon":{"paths":["M896 85.333h-768c-23.564 0-42.667 19.103-42.667 42.667v0 768c0 23.564 19.103 42.667 42.667 42.667v0h768c23.564 0 42.667-19.103 42.667-42.667v0-768c0-23.564-19.103-42.667-42.667-42.667v0zM341.333 853.333h-170.667v-426.667h170.667zM597.333 853.333h-170.667v-426.667h170.667zM853.333 853.333h-170.667v-426.667h170.667zM853.333 341.333h-682.667v-170.667h682.667z"],"attrs":[],"grid":0,"tags":["window-section"]},"attrs":[],"properties":{"order":5670,"id":14,"name":"window-section","prevSize":32,"code":60839},"setIdx":0,"setId":0,"iconIdx":1191},{"icon":{"paths":["M426.667 213.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM256 213.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM597.333 213.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM853.333 42.667h-682.667c-70.692 0-128 57.308-128 128v0 682.667c0 70.692 57.308 128 128 128v0h682.667c70.692 0 128-57.308 128-128v0-682.667c0-70.692-57.308-128-128-128v0zM896 853.333c0 23.564-19.103 42.667-42.667 42.667v0h-682.667c-23.564 0-42.667-19.103-42.667-42.667v0-384h768zM896 384h-768v-213.333c0-23.564 19.103-42.667 42.667-42.667v0h682.667c23.564 0 42.667 19.103 42.667 42.667v0z"],"attrs":[],"grid":0,"tags":["window"]},"attrs":[],"properties":{"order":5671,"id":13,"name":"window","prevSize":32,"code":60840},"setIdx":0,"setId":0,"iconIdx":1192},{"icon":{"paths":["M938.667 85.333l-460.8 68.267v341.333l460.8-4.267v-405.333zM435.2 533.333l-349.867-4.267v290.133l345.6 46.933 4.267-332.8zM85.333 204.8v290.133h345.6v-337.067l-345.6 46.933zM473.6 533.333v337.067l465.067 68.267v-401.067l-465.067-4.267z"],"attrs":[],"grid":0,"tags":["windows"]},"attrs":[],"properties":{"order":5672,"id":12,"name":"windows","prevSize":32,"code":60841},"setIdx":0,"setId":0,"iconIdx":1193},{"icon":{"paths":["M771.413 213.333l-472.747-39.253v-46.080c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 768c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-302.080l472.747-39.253c22.049-1.823 39.254-20.167 39.254-42.53 0-0.048-0-0.096-0-0.144l0 0.007v-256c0-0.041 0-0.089 0-0.137 0-22.363-17.204-40.707-39.099-42.52l-0.154-0.010zM384 501.333l-85.333 6.827v-248.32l85.333 6.827zM554.667 486.827l-85.333 7.253v-220.16l85.333 7.253zM725.333 472.747l-85.333 7.253v-192l85.333 7.253z"],"attrs":[],"grid":0,"tags":["windsock"]},"attrs":[],"properties":{"order":5673,"id":11,"name":"windsock","prevSize":32,"code":60842},"setIdx":0,"setId":0,"iconIdx":1194},{"icon":{"paths":["M725.333 640c-13.507-0.015-26.161-3.657-37.044-10.002l0.351 0.189c-19.831-12.439-43.934-19.817-69.76-19.817s-49.929 7.378-70.316 20.142l0.556-0.325c-10.587 6.217-23.318 9.889-36.907 9.889s-26.32-3.672-37.255-10.078l0.348 0.189c-19.831-12.439-43.934-19.817-69.76-19.817s-49.929 7.378-70.316 20.142l0.556-0.325c-10.593 6.171-23.316 9.814-36.889 9.814-0.081 0-0.162-0-0.243-0l0.013 0c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0c0.039 0 0.084 0 0.13 0 29.862 0 57.797-8.247 81.654-22.587l-0.717 0.4c7.263-4.617 16.111-7.358 25.6-7.358s18.337 2.741 25.797 7.474l-0.197-0.117c23.202 13.862 51.177 22.057 81.067 22.057s57.864-8.196 81.8-22.462l-0.734 0.405c7.263-4.617 16.111-7.358 25.6-7.358s18.337 2.741 25.797 7.474l-0.197-0.117c23.139 13.94 51.075 22.187 80.936 22.187 0.046 0 0.092-0 0.137-0l-0.007 0c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM725.333 810.667c-13.507-0.015-26.161-3.657-37.044-10.002l0.351 0.189c-19.831-12.439-43.934-19.817-69.76-19.817s-49.929 7.378-70.316 20.142l0.556-0.325c-10.587 6.217-23.318 9.889-36.907 9.889s-26.32-3.672-37.255-10.078l0.348 0.189c-19.831-12.439-43.934-19.817-69.76-19.817s-49.929 7.378-70.316 20.142l0.556-0.325c-10.593 6.171-23.316 9.814-36.889 9.814-0.081 0-0.162-0-0.243-0l0.013 0c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0c0.039 0 0.084 0 0.13 0 29.862 0 57.797-8.247 81.654-22.587l-0.717 0.4c7.263-4.617 16.111-7.358 25.6-7.358s18.337 2.741 25.797 7.474l-0.197-0.117c23.202 13.862 51.177 22.057 81.067 22.057s57.864-8.196 81.8-22.462l-0.734 0.405c7.263-4.617 16.111-7.358 25.6-7.358s18.337 2.741 25.797 7.474l-0.197-0.117c23.139 13.94 51.075 22.187 80.936 22.187 0.046 0 0.092-0 0.137-0l-0.007 0c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM785.92 307.627c-47.23-106.469-152.007-179.388-273.815-179.388-151.477 0-276.616 112.767-296.047 258.931l-0.166 1.524c-75.486 18.706-130.56 85.865-130.56 165.887 0 0.030 0 0.061 0 0.091l-0-0.005c-0.001 0.16-0.001 0.349-0.001 0.538 0 50.603 22.023 96.063 57.008 127.316l0.166 0.146c7.467 6.609 17.34 10.651 28.157 10.667l0.003 0c12.792-0.132 24.218-5.873 31.952-14.877l0.048-0.057c6.588-7.472 10.609-17.345 10.609-28.156 0-12.724-5.57-24.147-14.404-31.964l-0.045-0.039c-17.307-15.174-28.175-37.327-28.175-62.019 0-0.547 0.005-1.092 0.016-1.636l-0.001 0.081c0-47.128 38.205-85.333 85.333-85.333v0c23.564 0 42.667-19.103 42.667-42.667v0c0.262-117.622 95.674-212.873 213.333-212.873 93.059 0 172.202 59.585 201.357 142.684l0.457 1.495c5.163 14.65 17.694 25.478 33.026 28.124l0.254 0.036c60.629 10.744 106.103 62.975 106.24 125.852l0 0.015c0.013 0.673 0.020 1.466 0.020 2.26 0 31.948-11.984 61.096-31.702 83.196l0.108-0.123c-8.597 7.834-13.97 19.077-13.97 31.575 0 23.564 19.103 42.667 42.667 42.667 14.098 0 26.599-6.837 34.368-17.377l0.083-0.117c33.359-36.956 53.769-86.161 53.769-140.134 0-0.684-0.003-1.368-0.010-2.051l0.001 0.104c-0.082-96.15-63.759-177.405-151.236-203.979l-1.511-0.395z"],"attrs":[],"grid":0,"tags":["windy"]},"attrs":[],"properties":{"order":5674,"id":10,"name":"windy","prevSize":32,"code":60843},"setIdx":0,"setId":0,"iconIdx":1195},{"icon":{"paths":["M512 85.333c-0.001-0-0.003-0-0.004-0-235.644 0-426.671 191.027-426.671 426.671s191.027 426.671 426.671 426.671c235.644 0 426.671-191.027 426.671-426.671 0-0.005-0-0.010-0-0.015l0 0.001c-0.277-235.528-191.138-426.385-426.641-426.656l-0.026-0zM128.396 511.99c-0-0.089-0-0.195-0-0.301 0-56.429 12.232-110.001 34.189-158.209l-0.976 2.393 182.99 501.357c-129.013-63.617-216.203-194.208-216.203-345.164 0-0.026 0-0.053 0-0.079l-0 0.004zM512 895.625c-0.003 0-0.006 0-0.010 0-38.626 0-75.919-5.711-111.079-16.335l2.715 0.705 115.11-334.451 117.901 323.044c0.865 2.049 1.786 3.786 2.837 5.432l-0.087-0.145c-37.879 13.781-81.605 21.75-127.192 21.75-0.069 0-0.138-0-0.206-0l0.011 0zM564.864 332.133c23.094-1.213 43.907-3.643 43.907-3.643 8.107-0.771 14.399-7.546 14.399-15.79 0-8.758-7.099-15.857-15.857-15.857-0.348 0-0.694 0.011-1.036 0.033l0.047-0.002s-62.135 4.878-102.25 4.878c-37.687 0-101.026-4.878-101.026-4.878-0.282-0.018-0.611-0.028-0.943-0.028-8.758 0-15.857 7.099-15.857 15.857 0 8.233 6.275 15.001 14.303 15.782l0.065 0.005s19.563 2.43 40.235 3.643l59.765 163.755-83.968 251.77-139.683-415.525c23.111-1.213 43.901-3.642 43.901-3.642 8.099-0.78 14.381-7.551 14.381-15.789 0-8.758-7.1-15.857-15.857-15.857-0.343 0-0.684 0.011-1.022 0.032l0.046-0.002s-62.12 4.878-102.234 4.878c-7.198 0-15.688-0.177-24.687-0.466 69.582-104.776 187.084-172.903 320.499-172.903 99.998 0 191.057 38.274 259.327 100.972l-0.279-0.253c-1.651-0.102-3.266-0.307-4.964-0.307-35.821 1.101-64.441 30.403-64.441 66.389 0 0.595 0.008 1.187 0.023 1.778l-0.002-0.087c4.323 34.468 17.827 65.164 37.958 90.328l-0.276-0.357c19.356 29.963 31.069 66.456 31.624 105.647l0.002 0.147c-4.388 45.715-14.718 87.755-30.283 127.156l1.095-3.146-38.272 127.844zM704.853 843.563l117.167-338.761c17.789-40.477 28.45-87.599 29.17-137.129l0.003-0.27c0-0.159 0-0.348 0-0.537 0-13.721-0.937-27.223-2.751-40.446l0.172 1.535c29.574 53.117 46.985 116.511 46.985 183.972 0 140.821-75.867 263.922-188.957 330.66l-1.789 0.977z"],"attrs":[],"grid":0,"tags":["wordpress-simple"]},"attrs":[],"properties":{"order":5675,"id":9,"name":"wordpress-simple","prevSize":32,"code":60844},"setIdx":0,"setId":0,"iconIdx":1196},{"icon":{"paths":["M156.448 511.99c-0.023 136.247 77.81 260.526 200.396 319.987l-169.615-464.682c-20.333 45.526-30.82 94.833-30.781 144.695zM518.25 543.091l-106.698 309.982c71.633 21.094 148.086 19.11 218.526-5.672-0.989-1.557-1.841-3.195-2.547-4.901l-109.281-299.409zM752.031 494.060c-0.477-34.773-10.625-68.727-29.312-98.055-19.11-24.044-31.198-52.906-34.927-83.393-0.862-33.883 25.828-62.091 59.708-63.101 1.578 0 3.073 0.19 4.604 0.286-144.768-132.609-369.625-122.75-502.232 22.016-12.831 14.005-24.515 29.015-34.945 44.888 8.344 0.265 16.209 0.432 22.88 0.432 37.182 0 94.766-4.524 94.766-4.524 8.104-0.468 15.055 5.722 15.523 13.826 0.456 7.88-5.396 14.714-13.253 15.476 0 0-19.271 2.255-40.687 3.377l129.469 385.13 77.823-233.357-55.396-151.771c-19.156-1.123-37.292-3.377-37.292-3.377-8.078-0.781-13.995-7.964-13.216-16.042 0.76-7.862 7.596-13.716 15.479-13.26 0 0 58.703 4.524 93.635 4.524 37.182 0 94.776-4.524 94.776-4.524 8.102-0.474 15.057 5.711 15.531 13.812 0.461 7.891-5.399 14.735-13.265 15.49 0 0-19.287 2.255-40.687 3.377l128.489 382.198 36.677-116.227c14.323-37.585 23.034-77.078 25.852-117.203zM826.401 377.979c-0.617 43.807-9.805 87.073-27.047 127.349l-108.594 313.979c166.555-96.885 225.641-308.797 133.248-477.885 1.617 12.117 2.417 24.331 2.393 36.557zM512 85.338c-235.641 0-426.667 191.026-426.667 426.667s191.026 426.667 426.667 426.667 426.667-191.026 426.667-426.667-191.026-426.667-426.667-426.667zM668.104 881.562c-124.862 52.841-267.982 38.929-380.328-36.972-64.489-43.539-114.971-104.841-145.338-176.482-52.854-124.862-38.938-267.987 36.979-380.328 43.531-64.495 104.833-114.982 176.479-145.336 124.862-52.841 267.982-38.929 380.328 36.972 64.489 43.539 114.971 104.841 145.338 176.482 52.854 124.862 38.938 267.987-36.979 380.328-43.531 64.495-104.833 114.982-176.479 145.336z"],"attrs":[],"grid":0,"tags":["wordpress"]},"attrs":[],"properties":{"order":5676,"id":8,"name":"wordpress","prevSize":32,"code":60845},"setIdx":0,"setId":0,"iconIdx":1197},{"icon":{"paths":["M128 298.667h768c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-768c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0zM384 640h-256c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h256c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM789.333 426.667h-661.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h661.333c35.346 0 64 28.654 64 64s-28.654 64-64 64v0h-131.84l12.8-12.373c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l-85.333 85.333c-3.773 3.937-6.808 8.616-8.859 13.791l-0.101 0.289c-2.024 4.793-3.201 10.366-3.201 16.213s1.176 11.42 3.305 16.495l-0.105-0.281c2.152 5.464 5.187 10.143 8.974 14.095l-0.014-0.015 85.333 85.333c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003-12.8-12.373h131.84c82.475 0 149.333-66.859 149.333-149.333s-66.859-149.333-149.333-149.333v0z"],"attrs":[],"grid":0,"tags":["wrap-text"]},"attrs":[],"properties":{"order":5677,"id":7,"name":"wrap-text","prevSize":32,"code":60846},"setIdx":0,"setId":0,"iconIdx":1198},{"icon":{"paths":["M926.293 664.747l-192.853-192.427c3.799-17.675 5.975-37.981 5.975-58.795 0-0.33-0.001-0.66-0.002-0.99l0 0.051c-0.050-180.699-146.547-327.165-327.253-327.165-50.18 0-97.723 11.294-140.224 31.479l1.984-0.848c-12.662 5.884-21.824 17.442-24.282 31.316l-0.038 0.257c-0.4 2.194-0.629 4.72-0.629 7.298 0 11.821 4.807 22.52 12.574 30.247l0.002 0.002 185.6 185.173-76.8 76.8-185.173-185.6c-7.692-7.552-18.243-12.214-29.884-12.214-2.709 0-5.359 0.252-7.927 0.735l0.265-0.041c-14.053 2.406-25.588 11.405-31.462 23.637l-0.111 0.256c-19.339 40.519-30.635 88.064-30.635 138.246 0 180.737 146.516 327.253 327.253 327.253 0.72 0 1.44-0.002 2.159-0.007l-0.111 0.001c0.279 0.001 0.609 0.002 0.939 0.002 20.814 0 41.12-2.176 60.703-6.312l-1.908 0.337 192.427 192.853c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003-209.067-209.067c-7.711-7.661-18.337-12.396-30.069-12.396-3.717 0-7.323 0.475-10.761 1.368l0.297-0.065c-18.899 5.267-40.626 8.371-63.052 8.533l-0.094 0.001c-0.634 0.006-1.384 0.009-2.134 0.009-133.462 0-241.682-108.074-241.92-241.48l-0-0.023c-0.001-0.294-0.002-0.642-0.002-0.99 0-14.719 1.242-29.147 3.627-43.187l-0.212 1.51 167.253 167.68c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l135.683-136.963c7.418-7.666 11.989-18.126 11.989-29.653s-4.571-21.987-12-29.665l0.011 0.012-165.973-167.253c12.652-2.172 27.224-3.414 42.086-3.414 0.204 0 0.408 0 0.612 0.001l-0.031-0c133.425 0.243 241.493 108.461 241.493 241.92 0 0-0 0-0 0l0-0c-0.162 22.521-3.266 44.248-8.946 64.908l0.413-1.761c-0.828 3.141-1.303 6.747-1.303 10.464 0 11.732 4.735 22.358 12.399 30.071l-0.002-0.002 209.067 209.067c7.753 7.753 18.463 12.548 30.293 12.548 23.661 0 42.841-19.181 42.841-42.841 0-11.83-4.795-22.541-12.548-30.293l0 0z"],"attrs":[],"grid":0,"tags":["wrench"]},"attrs":[],"properties":{"order":5678,"id":6,"name":"wrench","prevSize":32,"code":60847},"setIdx":0,"setId":0,"iconIdx":1199},{"icon":{"paths":["M627.627 311.040c-7.733-7.795-18.45-12.621-30.293-12.621s-22.56 4.826-30.291 12.618l-0.003 0.003-97.707 98.133-97.707-98.133c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293v0l98.133 97.707-98.133 97.707c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 97.707-98.133 97.707 98.133c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003-98.133-97.707 98.133-97.707c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003zM298.667 768c-70.692 0-128-57.308-128-128v0-341.333c0-70.692 57.308-128 128-128v0c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0c-117.821 0-213.333 95.513-213.333 213.333v0 341.333c0 117.821 95.513 213.333 213.333 213.333v0c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM768 298.667v256c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-256c0-117.821-95.513-213.333-213.333-213.333v0c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0c70.692 0 128 57.308 128 128v0zM896 768h-42.667v-42.667c0-23.564-19.103-42.667-42.667-42.667s-42.667 19.103-42.667 42.667v0 42.667h-42.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h42.667v42.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-42.667h42.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["x-add"]},"attrs":[],"properties":{"order":5679,"id":5,"name":"x-add","prevSize":32,"code":60848},"setIdx":0,"setId":0,"iconIdx":1200},{"icon":{"paths":["M341.333 810.667c-70.692 0-128-57.308-128-128v0-341.333c0-70.692 57.308-128 128-128v0c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0c-117.821 0-213.333 95.513-213.333 213.333v0 341.333c0 117.821 95.513 213.333 213.333 213.333v0c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0zM670.293 670.293c7.795-7.733 12.621-18.45 12.621-30.293s-4.826-22.56-12.618-30.291l-0.003-0.003-98.133-97.707 98.133-97.707c7.753-7.753 12.548-18.463 12.548-30.293 0-23.661-19.181-42.841-42.841-42.841-11.83 0-22.541 4.795-30.293 12.548l0-0-97.707 98.133-97.707-98.133c-7.753-7.753-18.463-12.548-30.293-12.548-23.661 0-42.841 19.181-42.841 42.841 0 11.83 4.795 22.541 12.548 30.293v0l98.133 97.707-98.133 97.707c-7.795 7.733-12.621 18.45-12.621 30.293s4.826 22.56 12.618 30.291l0.003 0.003c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003 97.707-98.133 97.707 98.133c7.733 7.795 18.45 12.621 30.293 12.621s22.56-4.826 30.291-12.618l0.003-0.003zM682.667 128c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0c70.692 0 128 57.308 128 128v0 341.333c0 70.692-57.308 128-128 128v0c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0c117.821 0 213.333-95.513 213.333-213.333v0-341.333c0-117.821-95.513-213.333-213.333-213.333v0z"],"attrs":[],"grid":0,"tags":["x"]},"attrs":[],"properties":{"order":5680,"id":4,"name":"x","prevSize":32,"code":60849},"setIdx":0,"setId":0,"iconIdx":1201},{"icon":{"paths":["M512 42.667c-259.206 0-469.333 210.128-469.333 469.333s210.128 469.333 469.333 469.333c259.206 0 469.333-210.128 469.333-469.333v0c0-259.206-210.128-469.333-469.333-469.333v0zM512 896c-212.077 0-384-171.923-384-384s171.923-384 384-384c212.077 0 384 171.923 384 384v0c0 212.077-171.923 384-384 384v0zM632.747 275.2l-120.747 181.333-120.747-181.333c-7.749-11.603-20.792-19.142-35.595-19.142-8.839 0-17.051 2.688-23.862 7.291l0.151-0.096c-11.491 7.765-18.946 20.744-18.946 35.465 0 8.715 2.613 16.819 7.097 23.573l-0.098-0.157 90.027 135.253h-26.027c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h85.333l2.133 3.413v39.253h-87.467c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h85.333v97.28c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-97.28h85.333c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-85.333v-39.253l2.133-3.413h83.2c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-26.027l90.027-135.253c4.386-6.596 6.999-14.701 6.999-23.415 0-14.721-7.455-27.7-18.795-35.369l-0.151-0.096c-6.66-4.507-14.872-7.195-23.711-7.195-14.803 0-27.846 7.539-35.498 18.987l-0.098 0.155z"],"attrs":[],"grid":0,"tags":["yen-circle"]},"attrs":[],"properties":{"order":5681,"id":3,"name":"yen-circle","prevSize":32,"code":60850},"setIdx":0,"setId":0,"iconIdx":1202},{"icon":{"paths":["M791.467 92.587c-6.596-4.386-14.701-6.999-23.415-6.999-14.721 0-27.7 7.455-35.369 18.795l-0.096 0.151-220.587 330.667-220.587-330.667c-7.885-9.732-19.836-15.902-33.228-15.902-23.564 0-42.667 19.103-42.667 42.667 0 7.386 1.877 14.333 5.179 20.392l-0.112-0.224 213.333 317.867h-135.253c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h170.667v85.333h-170.667c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667v0h170.667v170.667c0 23.564 19.103 42.667 42.667 42.667s42.667-19.103 42.667-42.667v0-170.667h170.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-170.667v-85.333h170.667c23.564 0 42.667-19.103 42.667-42.667s-19.103-42.667-42.667-42.667v0h-133.547l213.333-317.867c4.079-6.423 6.5-14.247 6.5-22.637 0-15.226-7.975-28.589-19.976-36.14l-0.177-0.104z"],"attrs":[],"grid":0,"tags":["yen"]},"attrs":[],"properties":{"order":5682,"id":2,"name":"yen","prevSize":32,"code":60851},"setIdx":0,"setId":0,"iconIdx":1203},{"icon":{"paths":["M512 661.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0zM512 85.333c-0.002-0-0.005-0-0.007-0-8.438 0-16.772 0.442-24.981 1.303l1.025-0.087c-225.070 12.91-402.697 198.576-402.697 425.729 0 235.488 190.9 426.388 426.388 426.388 0.096 0 0.192-0 0.288-0l-0.016 0c0.002 0 0.005 0 0.007 0 8.438 0 16.772-0.442 24.981-1.303l-1.025 0.087c225.070-12.91 402.697-198.576 402.697-425.729 0-235.488-190.9-426.388-426.388-426.388-0.096 0-0.192 0-0.288 0l0.016-0zM512 853.333c-0.141 0-0.308 0-0.474 0-188.251 0-340.859-152.608-340.859-340.859 0-101.728 44.564-193.047 115.234-255.502l0.365-0.317c-5.671 19.187-8.933 41.23-8.933 64.036 0 129.221 104.755 233.976 233.976 233.976 0.243 0 0.486-0 0.729-0.001l-0.038 0c82.475 0 149.333 66.859 149.333 149.333s-66.859 149.333-149.333 149.333v0zM737.734 767.344c5.671-19.187 8.933-41.23 8.933-64.036 0-129.221-104.755-233.976-233.976-233.976-0.243 0-0.486 0-0.729 0.001l0.038-0c-82.475 0-149.333-66.859-149.333-149.333s66.859-149.333 149.333-149.333v0c0.141-0 0.308-0 0.474-0 188.251 0 340.859 152.608 340.859 340.859 0 101.728-44.564 193.047-115.234 255.502l-0.365 0.317zM512 277.333c-23.564 0-42.667 19.103-42.667 42.667s19.103 42.667 42.667 42.667c23.564 0 42.667-19.103 42.667-42.667v0c0-23.564-19.103-42.667-42.667-42.667v0z"],"attrs":[],"grid":0,"tags":["yin-yang"]},"attrs":[],"properties":{"order":5683,"id":1,"name":"yin-yang","prevSize":32,"code":60852},"setIdx":0,"setId":0,"iconIdx":1204},{"icon":{"paths":["M981.333 414.293c0.138-3.733 0.216-8.119 0.216-12.522 0-59.712-14.431-116.053-39.995-165.726l0.952 2.035c-18.331-21.812-43.721-37.167-72.617-42.548l-0.77-0.119c-90.543-8.711-195.754-13.679-302.126-13.679-19.335 0-38.631 0.164-57.888 0.491l2.894-0.039c-17.187-0.318-37.455-0.498-57.765-0.498-104.941 0-208.755 4.829-311.23 14.278l13.155-0.979c-24.376 4.54-45.604 15.741-62.348 31.624l0.054-0.051c-38.4 35.413-42.667 96-46.933 147.2-2.957 41.352-4.643 89.599-4.643 138.24 0 48.642 1.686 96.89 5.002 144.69l-0.359-6.45c1.359 30.931 5.947 60.152 13.449 88.181l-0.649-2.848c5.493 22.534 16.040 42.088 30.407 58.156l-0.114-0.129c16.849 16.696 38.554 28.517 62.81 33.158l0.764 0.122c70.907 9.244 152.914 14.52 236.154 14.52 14.48 0 28.923-0.16 43.327-0.477l-2.147 0.037c149.333 2.133 280.32 0 435.2-11.947 25.646-4.475 47.973-16.345 65.302-33.302l-0.022 0.022c11.622-11.627 20.562-25.934 25.813-41.916l0.214-0.751c14.087-41.768 22.217-89.87 22.217-139.872 0-1.826-0.011-3.65-0.032-5.471l0.003 0.276c1.707-23.893 1.707-168.107 1.707-193.707zM415.573 633.6v-264.107l252.587 132.693c-70.827 39.253-164.267 83.627-252.587 131.413z"],"attrs":[],"grid":0,"tags":["youtube"]},"attrs":[],"properties":{"order":5684,"id":0,"name":"youtube","prevSize":32,"code":60853},"setIdx":0,"setId":0,"iconIdx":1205}],"height":1024,"metadata":{"name":"Unicons"},"preferences":{"showGlyphs":true,"showQuickUse":true,"showQuickUse2":true,"showSVGs":true,"fontPref":{"prefix":"uil-","metadata":{"fontFamily":"Unicons","majorVersion":1,"minorVersion":0},"metrics":{"emSize":1024,"baseline":6.25,"whitespace":50},"embed":false,"showVersion":true,"showMetadata":false,"showMetrics":true,"showSelector":true},"imagePref":{"prefix":"icon-","png":true,"useClassSelector":true,"color":0,"bgColor":16777215,"classSelector":".icon","name":"icomoon"},"historySize":50,"showCodes":false,"gridSize":16,"showLiga":false}} \ No newline at end of file diff --git a/sandbox310/src/assets/fonts/urbanist/Urbanist-Bold.woff b/sandbox310/src/assets/fonts/urbanist/Urbanist-Bold.woff new file mode 100644 index 0000000..dae17df Binary files /dev/null and b/sandbox310/src/assets/fonts/urbanist/Urbanist-Bold.woff differ diff --git a/sandbox310/src/assets/fonts/urbanist/Urbanist-Bold.woff2 b/sandbox310/src/assets/fonts/urbanist/Urbanist-Bold.woff2 new file mode 100644 index 0000000..79ef804 Binary files /dev/null and b/sandbox310/src/assets/fonts/urbanist/Urbanist-Bold.woff2 differ diff --git a/sandbox310/src/assets/fonts/urbanist/Urbanist-BoldItalic.woff b/sandbox310/src/assets/fonts/urbanist/Urbanist-BoldItalic.woff new file mode 100644 index 0000000..9a42549 Binary files /dev/null and b/sandbox310/src/assets/fonts/urbanist/Urbanist-BoldItalic.woff differ diff --git a/sandbox310/src/assets/fonts/urbanist/Urbanist-BoldItalic.woff2 b/sandbox310/src/assets/fonts/urbanist/Urbanist-BoldItalic.woff2 new file mode 100644 index 0000000..b39562b Binary files /dev/null and b/sandbox310/src/assets/fonts/urbanist/Urbanist-BoldItalic.woff2 differ diff --git a/sandbox310/src/assets/fonts/urbanist/Urbanist-Italic.woff b/sandbox310/src/assets/fonts/urbanist/Urbanist-Italic.woff new file mode 100644 index 0000000..4aa878c Binary files /dev/null and b/sandbox310/src/assets/fonts/urbanist/Urbanist-Italic.woff differ diff --git a/sandbox310/src/assets/fonts/urbanist/Urbanist-Italic.woff2 b/sandbox310/src/assets/fonts/urbanist/Urbanist-Italic.woff2 new file mode 100644 index 0000000..5abf102 Binary files /dev/null and b/sandbox310/src/assets/fonts/urbanist/Urbanist-Italic.woff2 differ diff --git a/sandbox310/src/assets/fonts/urbanist/Urbanist-Light.woff b/sandbox310/src/assets/fonts/urbanist/Urbanist-Light.woff new file mode 100644 index 0000000..fed06fa Binary files /dev/null and b/sandbox310/src/assets/fonts/urbanist/Urbanist-Light.woff differ diff --git a/sandbox310/src/assets/fonts/urbanist/Urbanist-Light.woff2 b/sandbox310/src/assets/fonts/urbanist/Urbanist-Light.woff2 new file mode 100644 index 0000000..69d5f3e Binary files /dev/null and b/sandbox310/src/assets/fonts/urbanist/Urbanist-Light.woff2 differ diff --git a/sandbox310/src/assets/fonts/urbanist/Urbanist-LightItalic.woff b/sandbox310/src/assets/fonts/urbanist/Urbanist-LightItalic.woff new file mode 100644 index 0000000..4495c02 Binary files /dev/null and b/sandbox310/src/assets/fonts/urbanist/Urbanist-LightItalic.woff differ diff --git a/sandbox310/src/assets/fonts/urbanist/Urbanist-LightItalic.woff2 b/sandbox310/src/assets/fonts/urbanist/Urbanist-LightItalic.woff2 new file mode 100644 index 0000000..ce91413 Binary files /dev/null and b/sandbox310/src/assets/fonts/urbanist/Urbanist-LightItalic.woff2 differ diff --git a/sandbox310/src/assets/fonts/urbanist/Urbanist-Medium.woff b/sandbox310/src/assets/fonts/urbanist/Urbanist-Medium.woff new file mode 100644 index 0000000..44ca88e Binary files /dev/null and b/sandbox310/src/assets/fonts/urbanist/Urbanist-Medium.woff differ diff --git a/sandbox310/src/assets/fonts/urbanist/Urbanist-Medium.woff2 b/sandbox310/src/assets/fonts/urbanist/Urbanist-Medium.woff2 new file mode 100644 index 0000000..dcdbfeb Binary files /dev/null and b/sandbox310/src/assets/fonts/urbanist/Urbanist-Medium.woff2 differ diff --git a/sandbox310/src/assets/fonts/urbanist/Urbanist-MediumItalic.woff b/sandbox310/src/assets/fonts/urbanist/Urbanist-MediumItalic.woff new file mode 100644 index 0000000..a03738a Binary files /dev/null and b/sandbox310/src/assets/fonts/urbanist/Urbanist-MediumItalic.woff differ diff --git a/sandbox310/src/assets/fonts/urbanist/Urbanist-MediumItalic.woff2 b/sandbox310/src/assets/fonts/urbanist/Urbanist-MediumItalic.woff2 new file mode 100644 index 0000000..2f89b67 Binary files /dev/null and b/sandbox310/src/assets/fonts/urbanist/Urbanist-MediumItalic.woff2 differ diff --git a/sandbox310/src/assets/fonts/urbanist/Urbanist-Regular.woff b/sandbox310/src/assets/fonts/urbanist/Urbanist-Regular.woff new file mode 100644 index 0000000..4e8aa1b Binary files /dev/null and b/sandbox310/src/assets/fonts/urbanist/Urbanist-Regular.woff differ diff --git a/sandbox310/src/assets/fonts/urbanist/Urbanist-Regular.woff2 b/sandbox310/src/assets/fonts/urbanist/Urbanist-Regular.woff2 new file mode 100644 index 0000000..0a3cdf0 Binary files /dev/null and b/sandbox310/src/assets/fonts/urbanist/Urbanist-Regular.woff2 differ diff --git a/sandbox310/src/assets/fonts/urbanist/Urbanist-SemiBold.woff b/sandbox310/src/assets/fonts/urbanist/Urbanist-SemiBold.woff new file mode 100644 index 0000000..f3432a1 Binary files /dev/null and b/sandbox310/src/assets/fonts/urbanist/Urbanist-SemiBold.woff differ diff --git a/sandbox310/src/assets/fonts/urbanist/Urbanist-SemiBold.woff2 b/sandbox310/src/assets/fonts/urbanist/Urbanist-SemiBold.woff2 new file mode 100644 index 0000000..7a1ceb6 Binary files /dev/null and b/sandbox310/src/assets/fonts/urbanist/Urbanist-SemiBold.woff2 differ diff --git a/sandbox310/src/assets/fonts/urbanist/Urbanist-SemiBoldItalic.woff b/sandbox310/src/assets/fonts/urbanist/Urbanist-SemiBoldItalic.woff new file mode 100644 index 0000000..f880466 Binary files /dev/null and b/sandbox310/src/assets/fonts/urbanist/Urbanist-SemiBoldItalic.woff differ diff --git a/sandbox310/src/assets/fonts/urbanist/Urbanist-SemiBoldItalic.woff2 b/sandbox310/src/assets/fonts/urbanist/Urbanist-SemiBoldItalic.woff2 new file mode 100644 index 0000000..17e34f7 Binary files /dev/null and b/sandbox310/src/assets/fonts/urbanist/Urbanist-SemiBoldItalic.woff2 differ diff --git a/sandbox310/src/assets/fonts/urbanist/urbanist.css b/sandbox310/src/assets/fonts/urbanist/urbanist.css new file mode 100644 index 0000000..4707804 --- /dev/null +++ b/sandbox310/src/assets/fonts/urbanist/urbanist.css @@ -0,0 +1,80 @@ +@font-face { + font-family: 'Urbanist'; + src: url('Urbanist-BoldItalic.woff2') format('woff2'), + url('Urbanist-BoldItalic.woff') format('woff'); + font-weight: bold; + font-style: italic; + font-display: block; +} +@font-face { + font-family: 'Urbanist'; + src: url('Urbanist-SemiBoldItalic.woff2') format('woff2'), + url('Urbanist-SemiBoldItalic.woff') format('woff'); + font-weight: 600; + font-style: italic; + font-display: block; +} +@font-face { + font-family: 'Urbanist'; + src: url('Urbanist-Medium.woff2') format('woff2'), + url('Urbanist-Medium.woff') format('woff'); + font-weight: 500; + font-style: normal; + font-display: block; +} +@font-face { + font-family: 'Urbanist'; + src: url('Urbanist-MediumItalic.woff2') format('woff2'), + url('Urbanist-MediumItalic.woff') format('woff'); + font-weight: 500; + font-style: italic; + font-display: block; +} +@font-face { + font-family: 'Urbanist'; + src: url('Urbanist-SemiBold.woff2') format('woff2'), + url('Urbanist-SemiBold.woff') format('woff'); + font-weight: 600; + font-style: normal; + font-display: block; +} +@font-face { + font-family: 'Urbanist'; + src: url('Urbanist-Italic.woff2') format('woff2'), + url('Urbanist-Italic.woff') format('woff'); + font-weight: normal; + font-style: italic; + font-display: block; +} +@font-face { + font-family: 'Urbanist'; + src: url('Urbanist-Regular.woff2') format('woff2'), + url('Urbanist-Regular.woff') format('woff'); + font-weight: normal; + font-style: normal; + font-display: block; +} +@font-face { + font-family: 'Urbanist'; + src: url('Urbanist-LightItalic.woff2') format('woff2'), + url('Urbanist-LightItalic.woff') format('woff'); + font-weight: 300; + font-style: italic; + font-display: block; +} +@font-face { + font-family: 'Urbanist'; + src: url('Urbanist-Light.woff2') format('woff2'), + url('Urbanist-Light.woff') format('woff'); + font-weight: 300; + font-style: normal; + font-display: block; +} +@font-face { + font-family: 'Urbanist'; + src: url('Urbanist-Bold.woff2') format('woff2'), + url('Urbanist-Bold.woff') format('woff'); + font-weight: bold; + font-style: normal; + font-display: block; +} \ No newline at end of file diff --git a/sandbox310/src/assets/img/avatars/t1.jpg b/sandbox310/src/assets/img/avatars/t1.jpg new file mode 100644 index 0000000..1944b98 Binary files /dev/null and b/sandbox310/src/assets/img/avatars/t1.jpg differ diff --git a/sandbox310/src/assets/img/avatars/t1@2x.jpg b/sandbox310/src/assets/img/avatars/t1@2x.jpg new file mode 100644 index 0000000..4eea520 Binary files /dev/null and b/sandbox310/src/assets/img/avatars/t1@2x.jpg differ diff --git a/sandbox310/src/assets/img/avatars/t2.jpg b/sandbox310/src/assets/img/avatars/t2.jpg new file mode 100644 index 0000000..2d09e46 Binary files /dev/null and b/sandbox310/src/assets/img/avatars/t2.jpg differ diff --git a/sandbox310/src/assets/img/avatars/t2@2x.jpg b/sandbox310/src/assets/img/avatars/t2@2x.jpg new file mode 100644 index 0000000..b458caf Binary files /dev/null and b/sandbox310/src/assets/img/avatars/t2@2x.jpg differ diff --git a/sandbox310/src/assets/img/avatars/t3.jpg b/sandbox310/src/assets/img/avatars/t3.jpg new file mode 100644 index 0000000..f80980a Binary files /dev/null and b/sandbox310/src/assets/img/avatars/t3.jpg differ diff --git a/sandbox310/src/assets/img/avatars/t3@2x.jpg b/sandbox310/src/assets/img/avatars/t3@2x.jpg new file mode 100644 index 0000000..011b640 Binary files /dev/null and b/sandbox310/src/assets/img/avatars/t3@2x.jpg differ diff --git a/sandbox310/src/assets/img/avatars/t4.jpg b/sandbox310/src/assets/img/avatars/t4.jpg new file mode 100644 index 0000000..3dc7817 Binary files /dev/null and b/sandbox310/src/assets/img/avatars/t4.jpg differ diff --git a/sandbox310/src/assets/img/avatars/t4@2x.jpg b/sandbox310/src/assets/img/avatars/t4@2x.jpg new file mode 100644 index 0000000..316024c Binary files /dev/null and b/sandbox310/src/assets/img/avatars/t4@2x.jpg differ diff --git a/sandbox310/src/assets/img/avatars/t5.jpg b/sandbox310/src/assets/img/avatars/t5.jpg new file mode 100644 index 0000000..267a161 Binary files /dev/null and b/sandbox310/src/assets/img/avatars/t5.jpg differ diff --git a/sandbox310/src/assets/img/avatars/t5@2x.jpg b/sandbox310/src/assets/img/avatars/t5@2x.jpg new file mode 100644 index 0000000..5b2c5f0 Binary files /dev/null and b/sandbox310/src/assets/img/avatars/t5@2x.jpg differ diff --git a/sandbox310/src/assets/img/avatars/t6.jpg b/sandbox310/src/assets/img/avatars/t6.jpg new file mode 100644 index 0000000..a9adbb2 Binary files /dev/null and b/sandbox310/src/assets/img/avatars/t6.jpg differ diff --git a/sandbox310/src/assets/img/avatars/t6@2x.jpg b/sandbox310/src/assets/img/avatars/t6@2x.jpg new file mode 100644 index 0000000..a00df27 Binary files /dev/null and b/sandbox310/src/assets/img/avatars/t6@2x.jpg differ diff --git a/sandbox310/src/assets/img/avatars/t7.jpg b/sandbox310/src/assets/img/avatars/t7.jpg new file mode 100644 index 0000000..8530100 Binary files /dev/null and b/sandbox310/src/assets/img/avatars/t7.jpg differ diff --git a/sandbox310/src/assets/img/avatars/te1.jpg b/sandbox310/src/assets/img/avatars/te1.jpg new file mode 100644 index 0000000..1b86c75 Binary files /dev/null and b/sandbox310/src/assets/img/avatars/te1.jpg differ diff --git a/sandbox310/src/assets/img/avatars/te10.jpg b/sandbox310/src/assets/img/avatars/te10.jpg new file mode 100644 index 0000000..b212dcc Binary files /dev/null and b/sandbox310/src/assets/img/avatars/te10.jpg differ diff --git a/sandbox310/src/assets/img/avatars/te10@2x.jpg b/sandbox310/src/assets/img/avatars/te10@2x.jpg new file mode 100644 index 0000000..2ed7484 Binary files /dev/null and b/sandbox310/src/assets/img/avatars/te10@2x.jpg differ diff --git a/sandbox310/src/assets/img/avatars/te11.jpg b/sandbox310/src/assets/img/avatars/te11.jpg new file mode 100644 index 0000000..0c3f487 Binary files /dev/null and b/sandbox310/src/assets/img/avatars/te11.jpg differ diff --git a/sandbox310/src/assets/img/avatars/te11@2x.jpg b/sandbox310/src/assets/img/avatars/te11@2x.jpg new file mode 100644 index 0000000..4bb51b2 Binary files /dev/null and b/sandbox310/src/assets/img/avatars/te11@2x.jpg differ diff --git a/sandbox310/src/assets/img/avatars/te12.jpg b/sandbox310/src/assets/img/avatars/te12.jpg new file mode 100644 index 0000000..fa8e98a Binary files /dev/null and b/sandbox310/src/assets/img/avatars/te12.jpg differ diff --git a/sandbox310/src/assets/img/avatars/te12@2x.jpg b/sandbox310/src/assets/img/avatars/te12@2x.jpg new file mode 100644 index 0000000..870ff46 Binary files /dev/null and b/sandbox310/src/assets/img/avatars/te12@2x.jpg differ diff --git a/sandbox310/src/assets/img/avatars/te1@2x.jpg b/sandbox310/src/assets/img/avatars/te1@2x.jpg new file mode 100644 index 0000000..99cd582 Binary files /dev/null and b/sandbox310/src/assets/img/avatars/te1@2x.jpg differ diff --git a/sandbox310/src/assets/img/avatars/te2.jpg b/sandbox310/src/assets/img/avatars/te2.jpg new file mode 100644 index 0000000..da830de Binary files /dev/null and b/sandbox310/src/assets/img/avatars/te2.jpg differ diff --git a/sandbox310/src/assets/img/avatars/te2@2x.jpg b/sandbox310/src/assets/img/avatars/te2@2x.jpg new file mode 100644 index 0000000..a92daeb Binary files /dev/null and b/sandbox310/src/assets/img/avatars/te2@2x.jpg differ diff --git a/sandbox310/src/assets/img/avatars/te3.jpg b/sandbox310/src/assets/img/avatars/te3.jpg new file mode 100644 index 0000000..4a61c37 Binary files /dev/null and b/sandbox310/src/assets/img/avatars/te3.jpg differ diff --git a/sandbox310/src/assets/img/avatars/te3@2x.jpg b/sandbox310/src/assets/img/avatars/te3@2x.jpg new file mode 100644 index 0000000..c9cba9c Binary files /dev/null and b/sandbox310/src/assets/img/avatars/te3@2x.jpg differ diff --git a/sandbox310/src/assets/img/avatars/te4.jpg b/sandbox310/src/assets/img/avatars/te4.jpg new file mode 100644 index 0000000..992d183 Binary files /dev/null and b/sandbox310/src/assets/img/avatars/te4.jpg differ diff --git a/sandbox310/src/assets/img/avatars/te4@2x.jpg b/sandbox310/src/assets/img/avatars/te4@2x.jpg new file mode 100644 index 0000000..2625cec Binary files /dev/null and b/sandbox310/src/assets/img/avatars/te4@2x.jpg differ diff --git a/sandbox310/src/assets/img/avatars/te5.jpg b/sandbox310/src/assets/img/avatars/te5.jpg new file mode 100644 index 0000000..94969c3 Binary files /dev/null and b/sandbox310/src/assets/img/avatars/te5.jpg differ diff --git a/sandbox310/src/assets/img/avatars/te5@2x.jpg b/sandbox310/src/assets/img/avatars/te5@2x.jpg new file mode 100644 index 0000000..4ceb321 Binary files /dev/null and b/sandbox310/src/assets/img/avatars/te5@2x.jpg differ diff --git a/sandbox310/src/assets/img/avatars/te6.jpg b/sandbox310/src/assets/img/avatars/te6.jpg new file mode 100644 index 0000000..9c1a74a Binary files /dev/null and b/sandbox310/src/assets/img/avatars/te6.jpg differ diff --git a/sandbox310/src/assets/img/avatars/te6@2x.jpg b/sandbox310/src/assets/img/avatars/te6@2x.jpg new file mode 100644 index 0000000..60a6df6 Binary files /dev/null and b/sandbox310/src/assets/img/avatars/te6@2x.jpg differ diff --git a/sandbox310/src/assets/img/avatars/te7.jpg b/sandbox310/src/assets/img/avatars/te7.jpg new file mode 100644 index 0000000..665f501 Binary files /dev/null and b/sandbox310/src/assets/img/avatars/te7.jpg differ diff --git a/sandbox310/src/assets/img/avatars/te7@2x.jpg b/sandbox310/src/assets/img/avatars/te7@2x.jpg new file mode 100644 index 0000000..d95eaa2 Binary files /dev/null and b/sandbox310/src/assets/img/avatars/te7@2x.jpg differ diff --git a/sandbox310/src/assets/img/avatars/te8.jpg b/sandbox310/src/assets/img/avatars/te8.jpg new file mode 100644 index 0000000..b9dc6db Binary files /dev/null and b/sandbox310/src/assets/img/avatars/te8.jpg differ diff --git a/sandbox310/src/assets/img/avatars/te8@2x.jpg b/sandbox310/src/assets/img/avatars/te8@2x.jpg new file mode 100644 index 0000000..e11b1f0 Binary files /dev/null and b/sandbox310/src/assets/img/avatars/te8@2x.jpg differ diff --git a/sandbox310/src/assets/img/avatars/te9.jpg b/sandbox310/src/assets/img/avatars/te9.jpg new file mode 100644 index 0000000..0a7771b Binary files /dev/null and b/sandbox310/src/assets/img/avatars/te9.jpg differ diff --git a/sandbox310/src/assets/img/avatars/te9@2x.jpg b/sandbox310/src/assets/img/avatars/te9@2x.jpg new file mode 100644 index 0000000..10ec7bb Binary files /dev/null and b/sandbox310/src/assets/img/avatars/te9@2x.jpg differ diff --git a/sandbox310/src/assets/img/avatars/u1.jpg b/sandbox310/src/assets/img/avatars/u1.jpg new file mode 100644 index 0000000..6de684b Binary files /dev/null and b/sandbox310/src/assets/img/avatars/u1.jpg differ diff --git a/sandbox310/src/assets/img/avatars/u2.jpg b/sandbox310/src/assets/img/avatars/u2.jpg new file mode 100644 index 0000000..1910648 Binary files /dev/null and b/sandbox310/src/assets/img/avatars/u2.jpg differ diff --git a/sandbox310/src/assets/img/avatars/u3.jpg b/sandbox310/src/assets/img/avatars/u3.jpg new file mode 100644 index 0000000..a911f47 Binary files /dev/null and b/sandbox310/src/assets/img/avatars/u3.jpg differ diff --git a/sandbox310/src/assets/img/avatars/u4.jpg b/sandbox310/src/assets/img/avatars/u4.jpg new file mode 100644 index 0000000..49f26a1 Binary files /dev/null and b/sandbox310/src/assets/img/avatars/u4.jpg differ diff --git a/sandbox310/src/assets/img/avatars/u5.jpg b/sandbox310/src/assets/img/avatars/u5.jpg new file mode 100644 index 0000000..1910648 Binary files /dev/null and b/sandbox310/src/assets/img/avatars/u5.jpg differ diff --git a/sandbox310/src/assets/img/brands/c1.png b/sandbox310/src/assets/img/brands/c1.png new file mode 100644 index 0000000..0b3ee01 Binary files /dev/null and b/sandbox310/src/assets/img/brands/c1.png differ diff --git a/sandbox310/src/assets/img/brands/c10.png b/sandbox310/src/assets/img/brands/c10.png new file mode 100644 index 0000000..49a0637 Binary files /dev/null and b/sandbox310/src/assets/img/brands/c10.png differ diff --git a/sandbox310/src/assets/img/brands/c11.png b/sandbox310/src/assets/img/brands/c11.png new file mode 100644 index 0000000..c8c07e9 Binary files /dev/null and b/sandbox310/src/assets/img/brands/c11.png differ diff --git a/sandbox310/src/assets/img/brands/c2.png b/sandbox310/src/assets/img/brands/c2.png new file mode 100644 index 0000000..cd8dae8 Binary files /dev/null and b/sandbox310/src/assets/img/brands/c2.png differ diff --git a/sandbox310/src/assets/img/brands/c3.png b/sandbox310/src/assets/img/brands/c3.png new file mode 100644 index 0000000..6f65e99 Binary files /dev/null and b/sandbox310/src/assets/img/brands/c3.png differ diff --git a/sandbox310/src/assets/img/brands/c4.png b/sandbox310/src/assets/img/brands/c4.png new file mode 100644 index 0000000..82e9a93 Binary files /dev/null and b/sandbox310/src/assets/img/brands/c4.png differ diff --git a/sandbox310/src/assets/img/brands/c5.png b/sandbox310/src/assets/img/brands/c5.png new file mode 100644 index 0000000..2ac19f8 Binary files /dev/null and b/sandbox310/src/assets/img/brands/c5.png differ diff --git a/sandbox310/src/assets/img/brands/c6.png b/sandbox310/src/assets/img/brands/c6.png new file mode 100644 index 0000000..46261e3 Binary files /dev/null and b/sandbox310/src/assets/img/brands/c6.png differ diff --git a/sandbox310/src/assets/img/brands/c7.png b/sandbox310/src/assets/img/brands/c7.png new file mode 100644 index 0000000..73b5338 Binary files /dev/null and b/sandbox310/src/assets/img/brands/c7.png differ diff --git a/sandbox310/src/assets/img/brands/c8.png b/sandbox310/src/assets/img/brands/c8.png new file mode 100644 index 0000000..69ea826 Binary files /dev/null and b/sandbox310/src/assets/img/brands/c8.png differ diff --git a/sandbox310/src/assets/img/brands/c9.png b/sandbox310/src/assets/img/brands/c9.png new file mode 100644 index 0000000..e77e40b Binary files /dev/null and b/sandbox310/src/assets/img/brands/c9.png differ diff --git a/sandbox310/src/assets/img/brands/z1.png b/sandbox310/src/assets/img/brands/z1.png new file mode 100644 index 0000000..6cab4f5 Binary files /dev/null and b/sandbox310/src/assets/img/brands/z1.png differ diff --git a/sandbox310/src/assets/img/brands/z2.png b/sandbox310/src/assets/img/brands/z2.png new file mode 100644 index 0000000..6e1569e Binary files /dev/null and b/sandbox310/src/assets/img/brands/z2.png differ diff --git a/sandbox310/src/assets/img/brands/z3.png b/sandbox310/src/assets/img/brands/z3.png new file mode 100644 index 0000000..1dc538b Binary files /dev/null and b/sandbox310/src/assets/img/brands/z3.png differ diff --git a/sandbox310/src/assets/img/brands/z4.png b/sandbox310/src/assets/img/brands/z4.png new file mode 100644 index 0000000..28bb1dc Binary files /dev/null and b/sandbox310/src/assets/img/brands/z4.png differ diff --git a/sandbox310/src/assets/img/brands/z5.png b/sandbox310/src/assets/img/brands/z5.png new file mode 100644 index 0000000..60e8d74 Binary files /dev/null and b/sandbox310/src/assets/img/brands/z5.png differ diff --git a/sandbox310/src/assets/img/brands/z6.png b/sandbox310/src/assets/img/brands/z6.png new file mode 100644 index 0000000..0535492 Binary files /dev/null and b/sandbox310/src/assets/img/brands/z6.png differ diff --git a/sandbox310/src/assets/img/brands/z7.png b/sandbox310/src/assets/img/brands/z7.png new file mode 100644 index 0000000..931482d Binary files /dev/null and b/sandbox310/src/assets/img/brands/z7.png differ diff --git a/sandbox310/src/assets/img/brands/z8.png b/sandbox310/src/assets/img/brands/z8.png new file mode 100644 index 0000000..20f0a70 Binary files /dev/null and b/sandbox310/src/assets/img/brands/z8.png differ diff --git a/sandbox310/src/assets/img/demos/block1.svg b/sandbox310/src/assets/img/demos/block1.svg new file mode 100644 index 0000000..e9d2ddb --- /dev/null +++ b/sandbox310/src/assets/img/demos/block1.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/sandbox310/src/assets/img/demos/block10.svg b/sandbox310/src/assets/img/demos/block10.svg new file mode 100644 index 0000000..6d4efb0 --- /dev/null +++ b/sandbox310/src/assets/img/demos/block10.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + diff --git a/sandbox310/src/assets/img/demos/block11.svg b/sandbox310/src/assets/img/demos/block11.svg new file mode 100644 index 0000000..cdfc8a1 --- /dev/null +++ b/sandbox310/src/assets/img/demos/block11.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + diff --git a/sandbox310/src/assets/img/demos/block12.svg b/sandbox310/src/assets/img/demos/block12.svg new file mode 100644 index 0000000..c3d0a19 --- /dev/null +++ b/sandbox310/src/assets/img/demos/block12.svg @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sandbox310/src/assets/img/demos/block13.svg b/sandbox310/src/assets/img/demos/block13.svg new file mode 100644 index 0000000..e060a3e --- /dev/null +++ b/sandbox310/src/assets/img/demos/block13.svg @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sandbox310/src/assets/img/demos/block14.svg b/sandbox310/src/assets/img/demos/block14.svg new file mode 100644 index 0000000..b251de2 --- /dev/null +++ b/sandbox310/src/assets/img/demos/block14.svg @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sandbox310/src/assets/img/demos/block15.svg b/sandbox310/src/assets/img/demos/block15.svg new file mode 100644 index 0000000..8c79fdf --- /dev/null +++ b/sandbox310/src/assets/img/demos/block15.svg @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sandbox310/src/assets/img/demos/block16.svg b/sandbox310/src/assets/img/demos/block16.svg new file mode 100644 index 0000000..23d49a9 --- /dev/null +++ b/sandbox310/src/assets/img/demos/block16.svg @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sandbox310/src/assets/img/demos/block17.svg b/sandbox310/src/assets/img/demos/block17.svg new file mode 100644 index 0000000..950842b --- /dev/null +++ b/sandbox310/src/assets/img/demos/block17.svg @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sandbox310/src/assets/img/demos/block2.svg b/sandbox310/src/assets/img/demos/block2.svg new file mode 100644 index 0000000..36d2eaa --- /dev/null +++ b/sandbox310/src/assets/img/demos/block2.svg @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sandbox310/src/assets/img/demos/block3.svg b/sandbox310/src/assets/img/demos/block3.svg new file mode 100644 index 0000000..8d98a7a --- /dev/null +++ b/sandbox310/src/assets/img/demos/block3.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + diff --git a/sandbox310/src/assets/img/demos/block4.svg b/sandbox310/src/assets/img/demos/block4.svg new file mode 100644 index 0000000..a91359e --- /dev/null +++ b/sandbox310/src/assets/img/demos/block4.svg @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sandbox310/src/assets/img/demos/block5.svg b/sandbox310/src/assets/img/demos/block5.svg new file mode 100644 index 0000000..c1e85df --- /dev/null +++ b/sandbox310/src/assets/img/demos/block5.svg @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + diff --git a/sandbox310/src/assets/img/demos/block6.svg b/sandbox310/src/assets/img/demos/block6.svg new file mode 100644 index 0000000..b27083c --- /dev/null +++ b/sandbox310/src/assets/img/demos/block6.svg @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + diff --git a/sandbox310/src/assets/img/demos/block7.svg b/sandbox310/src/assets/img/demos/block7.svg new file mode 100644 index 0000000..dfab4da --- /dev/null +++ b/sandbox310/src/assets/img/demos/block7.svg @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sandbox310/src/assets/img/demos/block8.svg b/sandbox310/src/assets/img/demos/block8.svg new file mode 100644 index 0000000..e1874f6 --- /dev/null +++ b/sandbox310/src/assets/img/demos/block8.svg @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sandbox310/src/assets/img/demos/block9.svg b/sandbox310/src/assets/img/demos/block9.svg new file mode 100644 index 0000000..1414d71 --- /dev/null +++ b/sandbox310/src/assets/img/demos/block9.svg @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sandbox310/src/assets/img/demos/d1-1.jpg b/sandbox310/src/assets/img/demos/d1-1.jpg new file mode 100644 index 0000000..715dadd Binary files /dev/null and b/sandbox310/src/assets/img/demos/d1-1.jpg differ diff --git a/sandbox310/src/assets/img/demos/d1-1@2x.jpg b/sandbox310/src/assets/img/demos/d1-1@2x.jpg new file mode 100644 index 0000000..08fc158 Binary files /dev/null and b/sandbox310/src/assets/img/demos/d1-1@2x.jpg differ diff --git a/sandbox310/src/assets/img/demos/d1-2.jpg b/sandbox310/src/assets/img/demos/d1-2.jpg new file mode 100644 index 0000000..8137471 Binary files /dev/null and b/sandbox310/src/assets/img/demos/d1-2.jpg differ diff --git a/sandbox310/src/assets/img/demos/d1-2@2x.jpg b/sandbox310/src/assets/img/demos/d1-2@2x.jpg new file mode 100644 index 0000000..a2229db Binary files /dev/null and b/sandbox310/src/assets/img/demos/d1-2@2x.jpg differ diff --git a/sandbox310/src/assets/img/demos/d10-1.jpg b/sandbox310/src/assets/img/demos/d10-1.jpg new file mode 100644 index 0000000..bcf28f0 Binary files /dev/null and b/sandbox310/src/assets/img/demos/d10-1.jpg differ diff --git a/sandbox310/src/assets/img/demos/d10-1@2x.jpg b/sandbox310/src/assets/img/demos/d10-1@2x.jpg new file mode 100644 index 0000000..734a5d7 Binary files /dev/null and b/sandbox310/src/assets/img/demos/d10-1@2x.jpg differ diff --git a/sandbox310/src/assets/img/demos/d10-2.jpg b/sandbox310/src/assets/img/demos/d10-2.jpg new file mode 100644 index 0000000..02c0515 Binary files /dev/null and b/sandbox310/src/assets/img/demos/d10-2.jpg differ diff --git a/sandbox310/src/assets/img/demos/d10-2@2x.jpg b/sandbox310/src/assets/img/demos/d10-2@2x.jpg new file mode 100644 index 0000000..36de007 Binary files /dev/null and b/sandbox310/src/assets/img/demos/d10-2@2x.jpg differ diff --git a/sandbox310/src/assets/img/demos/d11-1.jpg b/sandbox310/src/assets/img/demos/d11-1.jpg new file mode 100644 index 0000000..9ed2440 Binary files /dev/null and b/sandbox310/src/assets/img/demos/d11-1.jpg differ diff --git a/sandbox310/src/assets/img/demos/d11-1@2x.jpg b/sandbox310/src/assets/img/demos/d11-1@2x.jpg new file mode 100644 index 0000000..5694ec0 Binary files /dev/null and b/sandbox310/src/assets/img/demos/d11-1@2x.jpg differ diff --git a/sandbox310/src/assets/img/demos/d11-2.jpg b/sandbox310/src/assets/img/demos/d11-2.jpg new file mode 100644 index 0000000..80fa8fa Binary files /dev/null and b/sandbox310/src/assets/img/demos/d11-2.jpg differ diff --git a/sandbox310/src/assets/img/demos/d11-2@2x.jpg b/sandbox310/src/assets/img/demos/d11-2@2x.jpg new file mode 100644 index 0000000..77ad914 Binary files /dev/null and b/sandbox310/src/assets/img/demos/d11-2@2x.jpg differ diff --git a/sandbox310/src/assets/img/demos/d12-1.jpg b/sandbox310/src/assets/img/demos/d12-1.jpg new file mode 100644 index 0000000..eb68b4e Binary files /dev/null and b/sandbox310/src/assets/img/demos/d12-1.jpg differ diff --git a/sandbox310/src/assets/img/demos/d12-1@2x.jpg b/sandbox310/src/assets/img/demos/d12-1@2x.jpg new file mode 100644 index 0000000..aeb1016 Binary files /dev/null and b/sandbox310/src/assets/img/demos/d12-1@2x.jpg differ diff --git a/sandbox310/src/assets/img/demos/d12-2.jpg b/sandbox310/src/assets/img/demos/d12-2.jpg new file mode 100644 index 0000000..4d5abcb Binary files /dev/null and b/sandbox310/src/assets/img/demos/d12-2.jpg differ diff --git a/sandbox310/src/assets/img/demos/d12-2@2x.jpg b/sandbox310/src/assets/img/demos/d12-2@2x.jpg new file mode 100644 index 0000000..bd45173 Binary files /dev/null and b/sandbox310/src/assets/img/demos/d12-2@2x.jpg differ diff --git a/sandbox310/src/assets/img/demos/d13-1.jpg b/sandbox310/src/assets/img/demos/d13-1.jpg new file mode 100644 index 0000000..08f94f0 Binary files /dev/null and b/sandbox310/src/assets/img/demos/d13-1.jpg differ diff --git a/sandbox310/src/assets/img/demos/d13-1@2x.jpg b/sandbox310/src/assets/img/demos/d13-1@2x.jpg new file mode 100644 index 0000000..0eec002 Binary files /dev/null and b/sandbox310/src/assets/img/demos/d13-1@2x.jpg differ diff --git a/sandbox310/src/assets/img/demos/d13-2.jpg b/sandbox310/src/assets/img/demos/d13-2.jpg new file mode 100644 index 0000000..aa3e49a Binary files /dev/null and b/sandbox310/src/assets/img/demos/d13-2.jpg differ diff --git a/sandbox310/src/assets/img/demos/d13-2@2x.jpg b/sandbox310/src/assets/img/demos/d13-2@2x.jpg new file mode 100644 index 0000000..14d5119 Binary files /dev/null and b/sandbox310/src/assets/img/demos/d13-2@2x.jpg differ diff --git a/sandbox310/src/assets/img/demos/d14-1.jpg b/sandbox310/src/assets/img/demos/d14-1.jpg new file mode 100644 index 0000000..022c14b Binary files /dev/null and b/sandbox310/src/assets/img/demos/d14-1.jpg differ diff --git a/sandbox310/src/assets/img/demos/d14-1@2x.jpg b/sandbox310/src/assets/img/demos/d14-1@2x.jpg new file mode 100644 index 0000000..8d5f65f Binary files /dev/null and b/sandbox310/src/assets/img/demos/d14-1@2x.jpg differ diff --git a/sandbox310/src/assets/img/demos/d14-2.jpg b/sandbox310/src/assets/img/demos/d14-2.jpg new file mode 100644 index 0000000..2f45c0d Binary files /dev/null and b/sandbox310/src/assets/img/demos/d14-2.jpg differ diff --git a/sandbox310/src/assets/img/demos/d14-2@2x.jpg b/sandbox310/src/assets/img/demos/d14-2@2x.jpg new file mode 100644 index 0000000..a13dbc4 Binary files /dev/null and b/sandbox310/src/assets/img/demos/d14-2@2x.jpg differ diff --git a/sandbox310/src/assets/img/demos/d15-1.jpg b/sandbox310/src/assets/img/demos/d15-1.jpg new file mode 100644 index 0000000..244d3fb Binary files /dev/null and b/sandbox310/src/assets/img/demos/d15-1.jpg differ diff --git a/sandbox310/src/assets/img/demos/d15-1@2x.jpg b/sandbox310/src/assets/img/demos/d15-1@2x.jpg new file mode 100644 index 0000000..1753aa8 Binary files /dev/null and b/sandbox310/src/assets/img/demos/d15-1@2x.jpg differ diff --git a/sandbox310/src/assets/img/demos/d15-2.jpg b/sandbox310/src/assets/img/demos/d15-2.jpg new file mode 100644 index 0000000..3e1d814 Binary files /dev/null and b/sandbox310/src/assets/img/demos/d15-2.jpg differ diff --git a/sandbox310/src/assets/img/demos/d15-2@2x.jpg b/sandbox310/src/assets/img/demos/d15-2@2x.jpg new file mode 100644 index 0000000..4e8d156 Binary files /dev/null and b/sandbox310/src/assets/img/demos/d15-2@2x.jpg differ diff --git a/sandbox310/src/assets/img/demos/d16-1.jpg b/sandbox310/src/assets/img/demos/d16-1.jpg new file mode 100644 index 0000000..2e75642 Binary files /dev/null and b/sandbox310/src/assets/img/demos/d16-1.jpg differ diff --git a/sandbox310/src/assets/img/demos/d16-1@2x.jpg b/sandbox310/src/assets/img/demos/d16-1@2x.jpg new file mode 100644 index 0000000..f7b6b93 Binary files /dev/null and b/sandbox310/src/assets/img/demos/d16-1@2x.jpg differ diff --git a/sandbox310/src/assets/img/demos/d16-2.jpg b/sandbox310/src/assets/img/demos/d16-2.jpg new file mode 100644 index 0000000..e3c4bfb Binary files /dev/null and b/sandbox310/src/assets/img/demos/d16-2.jpg differ diff --git a/sandbox310/src/assets/img/demos/d16-2@2x.jpg b/sandbox310/src/assets/img/demos/d16-2@2x.jpg new file mode 100644 index 0000000..718598e Binary files /dev/null and b/sandbox310/src/assets/img/demos/d16-2@2x.jpg differ diff --git a/sandbox310/src/assets/img/demos/d17-1.jpg b/sandbox310/src/assets/img/demos/d17-1.jpg new file mode 100644 index 0000000..20f5567 Binary files /dev/null and b/sandbox310/src/assets/img/demos/d17-1.jpg differ diff --git a/sandbox310/src/assets/img/demos/d17-1@2x.jpg b/sandbox310/src/assets/img/demos/d17-1@2x.jpg new file mode 100644 index 0000000..82a122a Binary files /dev/null and b/sandbox310/src/assets/img/demos/d17-1@2x.jpg differ diff --git a/sandbox310/src/assets/img/demos/d17-2.jpg b/sandbox310/src/assets/img/demos/d17-2.jpg new file mode 100644 index 0000000..26f6759 Binary files /dev/null and b/sandbox310/src/assets/img/demos/d17-2.jpg differ diff --git a/sandbox310/src/assets/img/demos/d17-2@2x.jpg b/sandbox310/src/assets/img/demos/d17-2@2x.jpg new file mode 100644 index 0000000..031ea7d Binary files /dev/null and b/sandbox310/src/assets/img/demos/d17-2@2x.jpg differ diff --git a/sandbox310/src/assets/img/demos/d18-1.jpg b/sandbox310/src/assets/img/demos/d18-1.jpg new file mode 100644 index 0000000..fa30237 Binary files /dev/null and b/sandbox310/src/assets/img/demos/d18-1.jpg differ diff --git a/sandbox310/src/assets/img/demos/d18-1@2x.jpg b/sandbox310/src/assets/img/demos/d18-1@2x.jpg new file mode 100644 index 0000000..5e95823 Binary files /dev/null and b/sandbox310/src/assets/img/demos/d18-1@2x.jpg differ diff --git a/sandbox310/src/assets/img/demos/d18-2.jpg b/sandbox310/src/assets/img/demos/d18-2.jpg new file mode 100644 index 0000000..b9680e2 Binary files /dev/null and b/sandbox310/src/assets/img/demos/d18-2.jpg differ diff --git a/sandbox310/src/assets/img/demos/d18-2@2x.jpg b/sandbox310/src/assets/img/demos/d18-2@2x.jpg new file mode 100644 index 0000000..a24db45 Binary files /dev/null and b/sandbox310/src/assets/img/demos/d18-2@2x.jpg differ diff --git a/sandbox310/src/assets/img/demos/d19-1.jpg b/sandbox310/src/assets/img/demos/d19-1.jpg new file mode 100644 index 0000000..4d204ec Binary files /dev/null and b/sandbox310/src/assets/img/demos/d19-1.jpg differ diff --git a/sandbox310/src/assets/img/demos/d19-1@2x.jpg b/sandbox310/src/assets/img/demos/d19-1@2x.jpg new file mode 100644 index 0000000..8427a33 Binary files /dev/null and b/sandbox310/src/assets/img/demos/d19-1@2x.jpg differ diff --git a/sandbox310/src/assets/img/demos/d19-2.jpg b/sandbox310/src/assets/img/demos/d19-2.jpg new file mode 100644 index 0000000..850a910 Binary files /dev/null and b/sandbox310/src/assets/img/demos/d19-2.jpg differ diff --git a/sandbox310/src/assets/img/demos/d19-2@2x.jpg b/sandbox310/src/assets/img/demos/d19-2@2x.jpg new file mode 100644 index 0000000..c703c6b Binary files /dev/null and b/sandbox310/src/assets/img/demos/d19-2@2x.jpg differ diff --git a/sandbox310/src/assets/img/demos/d2-1.jpg b/sandbox310/src/assets/img/demos/d2-1.jpg new file mode 100644 index 0000000..5509628 Binary files /dev/null and b/sandbox310/src/assets/img/demos/d2-1.jpg differ diff --git a/sandbox310/src/assets/img/demos/d2-1@2x.jpg b/sandbox310/src/assets/img/demos/d2-1@2x.jpg new file mode 100644 index 0000000..736a8da Binary files /dev/null and b/sandbox310/src/assets/img/demos/d2-1@2x.jpg differ diff --git a/sandbox310/src/assets/img/demos/d2-2.jpg b/sandbox310/src/assets/img/demos/d2-2.jpg new file mode 100644 index 0000000..252c037 Binary files /dev/null and b/sandbox310/src/assets/img/demos/d2-2.jpg differ diff --git a/sandbox310/src/assets/img/demos/d2-2@2x.jpg b/sandbox310/src/assets/img/demos/d2-2@2x.jpg new file mode 100644 index 0000000..412487f Binary files /dev/null and b/sandbox310/src/assets/img/demos/d2-2@2x.jpg differ diff --git a/sandbox310/src/assets/img/demos/d20-1.jpg b/sandbox310/src/assets/img/demos/d20-1.jpg new file mode 100644 index 0000000..a52da18 Binary files /dev/null and b/sandbox310/src/assets/img/demos/d20-1.jpg differ diff --git a/sandbox310/src/assets/img/demos/d20-1@2x.jpg b/sandbox310/src/assets/img/demos/d20-1@2x.jpg new file mode 100644 index 0000000..235fe2f Binary files /dev/null and b/sandbox310/src/assets/img/demos/d20-1@2x.jpg differ diff --git a/sandbox310/src/assets/img/demos/d20-2.jpg b/sandbox310/src/assets/img/demos/d20-2.jpg new file mode 100644 index 0000000..05d24cc Binary files /dev/null and b/sandbox310/src/assets/img/demos/d20-2.jpg differ diff --git a/sandbox310/src/assets/img/demos/d20-2@2x.jpg b/sandbox310/src/assets/img/demos/d20-2@2x.jpg new file mode 100644 index 0000000..840d7c7 Binary files /dev/null and b/sandbox310/src/assets/img/demos/d20-2@2x.jpg differ diff --git a/sandbox310/src/assets/img/demos/d21-1.jpg b/sandbox310/src/assets/img/demos/d21-1.jpg new file mode 100644 index 0000000..e1c4d53 Binary files /dev/null and b/sandbox310/src/assets/img/demos/d21-1.jpg differ diff --git a/sandbox310/src/assets/img/demos/d21-1@2x.jpg b/sandbox310/src/assets/img/demos/d21-1@2x.jpg new file mode 100644 index 0000000..97fca6b Binary files /dev/null and b/sandbox310/src/assets/img/demos/d21-1@2x.jpg differ diff --git a/sandbox310/src/assets/img/demos/d21-2.jpg b/sandbox310/src/assets/img/demos/d21-2.jpg new file mode 100644 index 0000000..28814af Binary files /dev/null and b/sandbox310/src/assets/img/demos/d21-2.jpg differ diff --git a/sandbox310/src/assets/img/demos/d21-2@2x.jpg b/sandbox310/src/assets/img/demos/d21-2@2x.jpg new file mode 100644 index 0000000..9a2c831 Binary files /dev/null and b/sandbox310/src/assets/img/demos/d21-2@2x.jpg differ diff --git a/sandbox310/src/assets/img/demos/d3-1.jpg b/sandbox310/src/assets/img/demos/d3-1.jpg new file mode 100644 index 0000000..faa730e Binary files /dev/null and b/sandbox310/src/assets/img/demos/d3-1.jpg differ diff --git a/sandbox310/src/assets/img/demos/d3-1@2x.jpg b/sandbox310/src/assets/img/demos/d3-1@2x.jpg new file mode 100644 index 0000000..d0131ba Binary files /dev/null and b/sandbox310/src/assets/img/demos/d3-1@2x.jpg differ diff --git a/sandbox310/src/assets/img/demos/d3-2.jpg b/sandbox310/src/assets/img/demos/d3-2.jpg new file mode 100644 index 0000000..c230319 Binary files /dev/null and b/sandbox310/src/assets/img/demos/d3-2.jpg differ diff --git a/sandbox310/src/assets/img/demos/d3-2@2x.jpg b/sandbox310/src/assets/img/demos/d3-2@2x.jpg new file mode 100644 index 0000000..8ea91cf Binary files /dev/null and b/sandbox310/src/assets/img/demos/d3-2@2x.jpg differ diff --git a/sandbox310/src/assets/img/demos/d4-1.jpg b/sandbox310/src/assets/img/demos/d4-1.jpg new file mode 100644 index 0000000..a17b829 Binary files /dev/null and b/sandbox310/src/assets/img/demos/d4-1.jpg differ diff --git a/sandbox310/src/assets/img/demos/d4-1@2x.jpg b/sandbox310/src/assets/img/demos/d4-1@2x.jpg new file mode 100644 index 0000000..a2907b2 Binary files /dev/null and b/sandbox310/src/assets/img/demos/d4-1@2x.jpg differ diff --git a/sandbox310/src/assets/img/demos/d4-2.jpg b/sandbox310/src/assets/img/demos/d4-2.jpg new file mode 100644 index 0000000..791b16d Binary files /dev/null and b/sandbox310/src/assets/img/demos/d4-2.jpg differ diff --git a/sandbox310/src/assets/img/demos/d4-2@2x.jpg b/sandbox310/src/assets/img/demos/d4-2@2x.jpg new file mode 100644 index 0000000..dd27adf Binary files /dev/null and b/sandbox310/src/assets/img/demos/d4-2@2x.jpg differ diff --git a/sandbox310/src/assets/img/demos/d5-1.jpg b/sandbox310/src/assets/img/demos/d5-1.jpg new file mode 100644 index 0000000..8719a2b Binary files /dev/null and b/sandbox310/src/assets/img/demos/d5-1.jpg differ diff --git a/sandbox310/src/assets/img/demos/d5-1@2x.jpg b/sandbox310/src/assets/img/demos/d5-1@2x.jpg new file mode 100644 index 0000000..db8484d Binary files /dev/null and b/sandbox310/src/assets/img/demos/d5-1@2x.jpg differ diff --git a/sandbox310/src/assets/img/demos/d5-2.jpg b/sandbox310/src/assets/img/demos/d5-2.jpg new file mode 100644 index 0000000..b0f8bfb Binary files /dev/null and b/sandbox310/src/assets/img/demos/d5-2.jpg differ diff --git a/sandbox310/src/assets/img/demos/d5-2@2x.jpg b/sandbox310/src/assets/img/demos/d5-2@2x.jpg new file mode 100644 index 0000000..b393b0c Binary files /dev/null and b/sandbox310/src/assets/img/demos/d5-2@2x.jpg differ diff --git a/sandbox310/src/assets/img/demos/d6-1.jpg b/sandbox310/src/assets/img/demos/d6-1.jpg new file mode 100644 index 0000000..08c843d Binary files /dev/null and b/sandbox310/src/assets/img/demos/d6-1.jpg differ diff --git a/sandbox310/src/assets/img/demos/d6-1@2x.jpg b/sandbox310/src/assets/img/demos/d6-1@2x.jpg new file mode 100644 index 0000000..ee1d37c Binary files /dev/null and b/sandbox310/src/assets/img/demos/d6-1@2x.jpg differ diff --git a/sandbox310/src/assets/img/demos/d6-2.jpg b/sandbox310/src/assets/img/demos/d6-2.jpg new file mode 100644 index 0000000..8cf3fad Binary files /dev/null and b/sandbox310/src/assets/img/demos/d6-2.jpg differ diff --git a/sandbox310/src/assets/img/demos/d6-2@2x.jpg b/sandbox310/src/assets/img/demos/d6-2@2x.jpg new file mode 100644 index 0000000..2332318 Binary files /dev/null and b/sandbox310/src/assets/img/demos/d6-2@2x.jpg differ diff --git a/sandbox310/src/assets/img/demos/d7-1.jpg b/sandbox310/src/assets/img/demos/d7-1.jpg new file mode 100644 index 0000000..03908a8 Binary files /dev/null and b/sandbox310/src/assets/img/demos/d7-1.jpg differ diff --git a/sandbox310/src/assets/img/demos/d7-1@2x.jpg b/sandbox310/src/assets/img/demos/d7-1@2x.jpg new file mode 100644 index 0000000..7a0d189 Binary files /dev/null and b/sandbox310/src/assets/img/demos/d7-1@2x.jpg differ diff --git a/sandbox310/src/assets/img/demos/d7-2.jpg b/sandbox310/src/assets/img/demos/d7-2.jpg new file mode 100644 index 0000000..988fa26 Binary files /dev/null and b/sandbox310/src/assets/img/demos/d7-2.jpg differ diff --git a/sandbox310/src/assets/img/demos/d7-2@2x.jpg b/sandbox310/src/assets/img/demos/d7-2@2x.jpg new file mode 100644 index 0000000..59bb186 Binary files /dev/null and b/sandbox310/src/assets/img/demos/d7-2@2x.jpg differ diff --git a/sandbox310/src/assets/img/demos/d8-1.jpg b/sandbox310/src/assets/img/demos/d8-1.jpg new file mode 100644 index 0000000..3ba8694 Binary files /dev/null and b/sandbox310/src/assets/img/demos/d8-1.jpg differ diff --git a/sandbox310/src/assets/img/demos/d8-1@2x.jpg b/sandbox310/src/assets/img/demos/d8-1@2x.jpg new file mode 100644 index 0000000..4e4a3cf Binary files /dev/null and b/sandbox310/src/assets/img/demos/d8-1@2x.jpg differ diff --git a/sandbox310/src/assets/img/demos/d8-2.jpg b/sandbox310/src/assets/img/demos/d8-2.jpg new file mode 100644 index 0000000..0e42e5f Binary files /dev/null and b/sandbox310/src/assets/img/demos/d8-2.jpg differ diff --git a/sandbox310/src/assets/img/demos/d8-2@2x.jpg b/sandbox310/src/assets/img/demos/d8-2@2x.jpg new file mode 100644 index 0000000..2a3dd6e Binary files /dev/null and b/sandbox310/src/assets/img/demos/d8-2@2x.jpg differ diff --git a/sandbox310/src/assets/img/demos/d9-1.jpg b/sandbox310/src/assets/img/demos/d9-1.jpg new file mode 100644 index 0000000..835313a Binary files /dev/null and b/sandbox310/src/assets/img/demos/d9-1.jpg differ diff --git a/sandbox310/src/assets/img/demos/d9-1@2x.jpg b/sandbox310/src/assets/img/demos/d9-1@2x.jpg new file mode 100644 index 0000000..73e625b Binary files /dev/null and b/sandbox310/src/assets/img/demos/d9-1@2x.jpg differ diff --git a/sandbox310/src/assets/img/demos/d9-2.jpg b/sandbox310/src/assets/img/demos/d9-2.jpg new file mode 100644 index 0000000..d751221 Binary files /dev/null and b/sandbox310/src/assets/img/demos/d9-2.jpg differ diff --git a/sandbox310/src/assets/img/demos/d9-2@2x.jpg b/sandbox310/src/assets/img/demos/d9-2@2x.jpg new file mode 100644 index 0000000..d2270da Binary files /dev/null and b/sandbox310/src/assets/img/demos/d9-2@2x.jpg differ diff --git a/sandbox310/src/assets/img/demos/dc1.jpg b/sandbox310/src/assets/img/demos/dc1.jpg new file mode 100644 index 0000000..b168c85 Binary files /dev/null and b/sandbox310/src/assets/img/demos/dc1.jpg differ diff --git a/sandbox310/src/assets/img/demos/dc10.jpg b/sandbox310/src/assets/img/demos/dc10.jpg new file mode 100644 index 0000000..6fc9bf6 Binary files /dev/null and b/sandbox310/src/assets/img/demos/dc10.jpg differ diff --git a/sandbox310/src/assets/img/demos/dc10@2x.jpg b/sandbox310/src/assets/img/demos/dc10@2x.jpg new file mode 100644 index 0000000..01bfcdc Binary files /dev/null and b/sandbox310/src/assets/img/demos/dc10@2x.jpg differ diff --git a/sandbox310/src/assets/img/demos/dc11.jpg b/sandbox310/src/assets/img/demos/dc11.jpg new file mode 100644 index 0000000..d7e5ccf Binary files /dev/null and b/sandbox310/src/assets/img/demos/dc11.jpg differ diff --git a/sandbox310/src/assets/img/demos/dc11@2x.jpg b/sandbox310/src/assets/img/demos/dc11@2x.jpg new file mode 100644 index 0000000..c66dc47 Binary files /dev/null and b/sandbox310/src/assets/img/demos/dc11@2x.jpg differ diff --git a/sandbox310/src/assets/img/demos/dc12.jpg b/sandbox310/src/assets/img/demos/dc12.jpg new file mode 100644 index 0000000..088b1a6 Binary files /dev/null and b/sandbox310/src/assets/img/demos/dc12.jpg differ diff --git a/sandbox310/src/assets/img/demos/dc12@2x.jpg b/sandbox310/src/assets/img/demos/dc12@2x.jpg new file mode 100644 index 0000000..af0506d Binary files /dev/null and b/sandbox310/src/assets/img/demos/dc12@2x.jpg differ diff --git a/sandbox310/src/assets/img/demos/dc1@2x.jpg b/sandbox310/src/assets/img/demos/dc1@2x.jpg new file mode 100644 index 0000000..53587ce Binary files /dev/null and b/sandbox310/src/assets/img/demos/dc1@2x.jpg differ diff --git a/sandbox310/src/assets/img/demos/dc2.jpg b/sandbox310/src/assets/img/demos/dc2.jpg new file mode 100644 index 0000000..c91b655 Binary files /dev/null and b/sandbox310/src/assets/img/demos/dc2.jpg differ diff --git a/sandbox310/src/assets/img/demos/dc2@2x.jpg b/sandbox310/src/assets/img/demos/dc2@2x.jpg new file mode 100644 index 0000000..3edb443 Binary files /dev/null and b/sandbox310/src/assets/img/demos/dc2@2x.jpg differ diff --git a/sandbox310/src/assets/img/demos/dc3.jpg b/sandbox310/src/assets/img/demos/dc3.jpg new file mode 100644 index 0000000..6787b67 Binary files /dev/null and b/sandbox310/src/assets/img/demos/dc3.jpg differ diff --git a/sandbox310/src/assets/img/demos/dc3@2x.jpg b/sandbox310/src/assets/img/demos/dc3@2x.jpg new file mode 100644 index 0000000..fc98344 Binary files /dev/null and b/sandbox310/src/assets/img/demos/dc3@2x.jpg differ diff --git a/sandbox310/src/assets/img/demos/dc4.jpg b/sandbox310/src/assets/img/demos/dc4.jpg new file mode 100644 index 0000000..9f6b1b4 Binary files /dev/null and b/sandbox310/src/assets/img/demos/dc4.jpg differ diff --git a/sandbox310/src/assets/img/demos/dc4@2x.jpg b/sandbox310/src/assets/img/demos/dc4@2x.jpg new file mode 100644 index 0000000..5b3227a Binary files /dev/null and b/sandbox310/src/assets/img/demos/dc4@2x.jpg differ diff --git a/sandbox310/src/assets/img/demos/dc5.jpg b/sandbox310/src/assets/img/demos/dc5.jpg new file mode 100644 index 0000000..8e5a852 Binary files /dev/null and b/sandbox310/src/assets/img/demos/dc5.jpg differ diff --git a/sandbox310/src/assets/img/demos/dc5@2x.jpg b/sandbox310/src/assets/img/demos/dc5@2x.jpg new file mode 100644 index 0000000..e3f4b44 Binary files /dev/null and b/sandbox310/src/assets/img/demos/dc5@2x.jpg differ diff --git a/sandbox310/src/assets/img/demos/dc6.jpg b/sandbox310/src/assets/img/demos/dc6.jpg new file mode 100644 index 0000000..1bd5581 Binary files /dev/null and b/sandbox310/src/assets/img/demos/dc6.jpg differ diff --git a/sandbox310/src/assets/img/demos/dc6@2x.jpg b/sandbox310/src/assets/img/demos/dc6@2x.jpg new file mode 100644 index 0000000..0986b48 Binary files /dev/null and b/sandbox310/src/assets/img/demos/dc6@2x.jpg differ diff --git a/sandbox310/src/assets/img/demos/dc7.jpg b/sandbox310/src/assets/img/demos/dc7.jpg new file mode 100644 index 0000000..6a8ce84 Binary files /dev/null and b/sandbox310/src/assets/img/demos/dc7.jpg differ diff --git a/sandbox310/src/assets/img/demos/dc7@2x.jpg b/sandbox310/src/assets/img/demos/dc7@2x.jpg new file mode 100644 index 0000000..25e13ec Binary files /dev/null and b/sandbox310/src/assets/img/demos/dc7@2x.jpg differ diff --git a/sandbox310/src/assets/img/demos/dc8.jpg b/sandbox310/src/assets/img/demos/dc8.jpg new file mode 100644 index 0000000..e001327 Binary files /dev/null and b/sandbox310/src/assets/img/demos/dc8.jpg differ diff --git a/sandbox310/src/assets/img/demos/dc8@2x.jpg b/sandbox310/src/assets/img/demos/dc8@2x.jpg new file mode 100644 index 0000000..9577043 Binary files /dev/null and b/sandbox310/src/assets/img/demos/dc8@2x.jpg differ diff --git a/sandbox310/src/assets/img/demos/dc9.jpg b/sandbox310/src/assets/img/demos/dc9.jpg new file mode 100644 index 0000000..391c2e9 Binary files /dev/null and b/sandbox310/src/assets/img/demos/dc9.jpg differ diff --git a/sandbox310/src/assets/img/demos/dc9@2x.jpg b/sandbox310/src/assets/img/demos/dc9@2x.jpg new file mode 100644 index 0000000..ef2da47 Binary files /dev/null and b/sandbox310/src/assets/img/demos/dc9@2x.jpg differ diff --git a/sandbox310/src/assets/img/demos/de1.jpg b/sandbox310/src/assets/img/demos/de1.jpg new file mode 100644 index 0000000..44633c1 Binary files /dev/null and b/sandbox310/src/assets/img/demos/de1.jpg differ diff --git a/sandbox310/src/assets/img/demos/de1@2x.jpg b/sandbox310/src/assets/img/demos/de1@2x.jpg new file mode 100644 index 0000000..d007cfe Binary files /dev/null and b/sandbox310/src/assets/img/demos/de1@2x.jpg differ diff --git a/sandbox310/src/assets/img/demos/de2.jpg b/sandbox310/src/assets/img/demos/de2.jpg new file mode 100644 index 0000000..af48841 Binary files /dev/null and b/sandbox310/src/assets/img/demos/de2.jpg differ diff --git a/sandbox310/src/assets/img/demos/de2@2x.jpg b/sandbox310/src/assets/img/demos/de2@2x.jpg new file mode 100644 index 0000000..7cfcb1e Binary files /dev/null and b/sandbox310/src/assets/img/demos/de2@2x.jpg differ diff --git a/sandbox310/src/assets/img/demos/de3.jpg b/sandbox310/src/assets/img/demos/de3.jpg new file mode 100644 index 0000000..9ee8c86 Binary files /dev/null and b/sandbox310/src/assets/img/demos/de3.jpg differ diff --git a/sandbox310/src/assets/img/demos/de3@2x.jpg b/sandbox310/src/assets/img/demos/de3@2x.jpg new file mode 100644 index 0000000..c67dd49 Binary files /dev/null and b/sandbox310/src/assets/img/demos/de3@2x.jpg differ diff --git a/sandbox310/src/assets/img/demos/de4.jpg b/sandbox310/src/assets/img/demos/de4.jpg new file mode 100644 index 0000000..987e0ab Binary files /dev/null and b/sandbox310/src/assets/img/demos/de4.jpg differ diff --git a/sandbox310/src/assets/img/demos/de4@2x.jpg b/sandbox310/src/assets/img/demos/de4@2x.jpg new file mode 100644 index 0000000..282bc91 Binary files /dev/null and b/sandbox310/src/assets/img/demos/de4@2x.jpg differ diff --git a/sandbox310/src/assets/img/demos/devices.png b/sandbox310/src/assets/img/demos/devices.png new file mode 100644 index 0000000..1adeb4e Binary files /dev/null and b/sandbox310/src/assets/img/demos/devices.png differ diff --git a/sandbox310/src/assets/img/demos/devices@2x.png b/sandbox310/src/assets/img/demos/devices@2x.png new file mode 100644 index 0000000..6aad22b Binary files /dev/null and b/sandbox310/src/assets/img/demos/devices@2x.png differ diff --git a/sandbox310/src/assets/img/demos/f1.png b/sandbox310/src/assets/img/demos/f1.png new file mode 100644 index 0000000..30541ef Binary files /dev/null and b/sandbox310/src/assets/img/demos/f1.png differ diff --git a/sandbox310/src/assets/img/demos/f1@2x.png b/sandbox310/src/assets/img/demos/f1@2x.png new file mode 100644 index 0000000..72e2de3 Binary files /dev/null and b/sandbox310/src/assets/img/demos/f1@2x.png differ diff --git a/sandbox310/src/assets/img/demos/fe1.jpg b/sandbox310/src/assets/img/demos/fe1.jpg new file mode 100644 index 0000000..c6685a5 Binary files /dev/null and b/sandbox310/src/assets/img/demos/fe1.jpg differ diff --git a/sandbox310/src/assets/img/demos/fe1@2x.jpg b/sandbox310/src/assets/img/demos/fe1@2x.jpg new file mode 100644 index 0000000..d9490d5 Binary files /dev/null and b/sandbox310/src/assets/img/demos/fe1@2x.jpg differ diff --git a/sandbox310/src/assets/img/demos/fe2.jpg b/sandbox310/src/assets/img/demos/fe2.jpg new file mode 100644 index 0000000..c1b4e50 Binary files /dev/null and b/sandbox310/src/assets/img/demos/fe2.jpg differ diff --git a/sandbox310/src/assets/img/demos/fe2@2x.jpg b/sandbox310/src/assets/img/demos/fe2@2x.jpg new file mode 100644 index 0000000..b001530 Binary files /dev/null and b/sandbox310/src/assets/img/demos/fe2@2x.jpg differ diff --git a/sandbox310/src/assets/img/demos/fe3.jpg b/sandbox310/src/assets/img/demos/fe3.jpg new file mode 100644 index 0000000..ec6d512 Binary files /dev/null and b/sandbox310/src/assets/img/demos/fe3.jpg differ diff --git a/sandbox310/src/assets/img/demos/fe3@2x.jpg b/sandbox310/src/assets/img/demos/fe3@2x.jpg new file mode 100644 index 0000000..1caf352 Binary files /dev/null and b/sandbox310/src/assets/img/demos/fe3@2x.jpg differ diff --git a/sandbox310/src/assets/img/demos/fe4.jpg b/sandbox310/src/assets/img/demos/fe4.jpg new file mode 100644 index 0000000..295141d Binary files /dev/null and b/sandbox310/src/assets/img/demos/fe4.jpg differ diff --git a/sandbox310/src/assets/img/demos/fe4@2x.jpg b/sandbox310/src/assets/img/demos/fe4@2x.jpg new file mode 100644 index 0000000..567210e Binary files /dev/null and b/sandbox310/src/assets/img/demos/fe4@2x.jpg differ diff --git a/sandbox310/src/assets/img/demos/fe5.jpg b/sandbox310/src/assets/img/demos/fe5.jpg new file mode 100644 index 0000000..3c724c8 Binary files /dev/null and b/sandbox310/src/assets/img/demos/fe5.jpg differ diff --git a/sandbox310/src/assets/img/demos/fe5@2x.jpg b/sandbox310/src/assets/img/demos/fe5@2x.jpg new file mode 100644 index 0000000..e17a81f Binary files /dev/null and b/sandbox310/src/assets/img/demos/fe5@2x.jpg differ diff --git a/sandbox310/src/assets/img/demos/fe6.jpg b/sandbox310/src/assets/img/demos/fe6.jpg new file mode 100644 index 0000000..79bf100 Binary files /dev/null and b/sandbox310/src/assets/img/demos/fe6.jpg differ diff --git a/sandbox310/src/assets/img/demos/fe6@2x.jpg b/sandbox310/src/assets/img/demos/fe6@2x.jpg new file mode 100644 index 0000000..7c5266f Binary files /dev/null and b/sandbox310/src/assets/img/demos/fe6@2x.jpg differ diff --git a/sandbox310/src/assets/img/demos/fe7.jpg b/sandbox310/src/assets/img/demos/fe7.jpg new file mode 100644 index 0000000..b3b58be Binary files /dev/null and b/sandbox310/src/assets/img/demos/fe7.jpg differ diff --git a/sandbox310/src/assets/img/demos/fe7@2x.jpg b/sandbox310/src/assets/img/demos/fe7@2x.jpg new file mode 100644 index 0000000..21ce8af Binary files /dev/null and b/sandbox310/src/assets/img/demos/fe7@2x.jpg differ diff --git a/sandbox310/src/assets/img/demos/fe8.jpg b/sandbox310/src/assets/img/demos/fe8.jpg new file mode 100644 index 0000000..630dd6b Binary files /dev/null and b/sandbox310/src/assets/img/demos/fe8.jpg differ diff --git a/sandbox310/src/assets/img/demos/fe8@2x.jpg b/sandbox310/src/assets/img/demos/fe8@2x.jpg new file mode 100644 index 0000000..f72f26c Binary files /dev/null and b/sandbox310/src/assets/img/demos/fe8@2x.jpg differ diff --git a/sandbox310/src/assets/img/demos/fi1.png b/sandbox310/src/assets/img/demos/fi1.png new file mode 100644 index 0000000..fdefa47 Binary files /dev/null and b/sandbox310/src/assets/img/demos/fi1.png differ diff --git a/sandbox310/src/assets/img/demos/fi10.png b/sandbox310/src/assets/img/demos/fi10.png new file mode 100644 index 0000000..c2cacdd Binary files /dev/null and b/sandbox310/src/assets/img/demos/fi10.png differ diff --git a/sandbox310/src/assets/img/demos/fi10@2x.png b/sandbox310/src/assets/img/demos/fi10@2x.png new file mode 100644 index 0000000..48fe945 Binary files /dev/null and b/sandbox310/src/assets/img/demos/fi10@2x.png differ diff --git a/sandbox310/src/assets/img/demos/fi1@2x.png b/sandbox310/src/assets/img/demos/fi1@2x.png new file mode 100644 index 0000000..0a709ff Binary files /dev/null and b/sandbox310/src/assets/img/demos/fi1@2x.png differ diff --git a/sandbox310/src/assets/img/demos/fi2.png b/sandbox310/src/assets/img/demos/fi2.png new file mode 100644 index 0000000..764c722 Binary files /dev/null and b/sandbox310/src/assets/img/demos/fi2.png differ diff --git a/sandbox310/src/assets/img/demos/fi2@2x.png b/sandbox310/src/assets/img/demos/fi2@2x.png new file mode 100644 index 0000000..4f4dcf9 Binary files /dev/null and b/sandbox310/src/assets/img/demos/fi2@2x.png differ diff --git a/sandbox310/src/assets/img/demos/fi3.png b/sandbox310/src/assets/img/demos/fi3.png new file mode 100644 index 0000000..94512b5 Binary files /dev/null and b/sandbox310/src/assets/img/demos/fi3.png differ diff --git a/sandbox310/src/assets/img/demos/fi3@2x.png b/sandbox310/src/assets/img/demos/fi3@2x.png new file mode 100644 index 0000000..7ffb7cc Binary files /dev/null and b/sandbox310/src/assets/img/demos/fi3@2x.png differ diff --git a/sandbox310/src/assets/img/demos/fi4.png b/sandbox310/src/assets/img/demos/fi4.png new file mode 100644 index 0000000..385fdb2 Binary files /dev/null and b/sandbox310/src/assets/img/demos/fi4.png differ diff --git a/sandbox310/src/assets/img/demos/fi4@2x.png b/sandbox310/src/assets/img/demos/fi4@2x.png new file mode 100644 index 0000000..56659d2 Binary files /dev/null and b/sandbox310/src/assets/img/demos/fi4@2x.png differ diff --git a/sandbox310/src/assets/img/demos/fi5.png b/sandbox310/src/assets/img/demos/fi5.png new file mode 100644 index 0000000..711ed79 Binary files /dev/null and b/sandbox310/src/assets/img/demos/fi5.png differ diff --git a/sandbox310/src/assets/img/demos/fi5@2x.png b/sandbox310/src/assets/img/demos/fi5@2x.png new file mode 100644 index 0000000..ccdb530 Binary files /dev/null and b/sandbox310/src/assets/img/demos/fi5@2x.png differ diff --git a/sandbox310/src/assets/img/demos/fi6.png b/sandbox310/src/assets/img/demos/fi6.png new file mode 100644 index 0000000..319e7ef Binary files /dev/null and b/sandbox310/src/assets/img/demos/fi6.png differ diff --git a/sandbox310/src/assets/img/demos/fi6@2x.png b/sandbox310/src/assets/img/demos/fi6@2x.png new file mode 100644 index 0000000..3e3d7a6 Binary files /dev/null and b/sandbox310/src/assets/img/demos/fi6@2x.png differ diff --git a/sandbox310/src/assets/img/demos/fi7.png b/sandbox310/src/assets/img/demos/fi7.png new file mode 100644 index 0000000..d7db449 Binary files /dev/null and b/sandbox310/src/assets/img/demos/fi7.png differ diff --git a/sandbox310/src/assets/img/demos/fi7@2x.png b/sandbox310/src/assets/img/demos/fi7@2x.png new file mode 100644 index 0000000..edb3297 Binary files /dev/null and b/sandbox310/src/assets/img/demos/fi7@2x.png differ diff --git a/sandbox310/src/assets/img/demos/fi8.png b/sandbox310/src/assets/img/demos/fi8.png new file mode 100644 index 0000000..6ae0007 Binary files /dev/null and b/sandbox310/src/assets/img/demos/fi8.png differ diff --git a/sandbox310/src/assets/img/demos/fi8@2x.png b/sandbox310/src/assets/img/demos/fi8@2x.png new file mode 100644 index 0000000..d60ad4a Binary files /dev/null and b/sandbox310/src/assets/img/demos/fi8@2x.png differ diff --git a/sandbox310/src/assets/img/demos/fi9.png b/sandbox310/src/assets/img/demos/fi9.png new file mode 100644 index 0000000..c42b17b Binary files /dev/null and b/sandbox310/src/assets/img/demos/fi9.png differ diff --git a/sandbox310/src/assets/img/demos/fi9@2x.png b/sandbox310/src/assets/img/demos/fi9@2x.png new file mode 100644 index 0000000..44275b4 Binary files /dev/null and b/sandbox310/src/assets/img/demos/fi9@2x.png differ diff --git a/sandbox310/src/assets/img/demos/icon.png b/sandbox310/src/assets/img/demos/icon.png new file mode 100644 index 0000000..fe44581 Binary files /dev/null and b/sandbox310/src/assets/img/demos/icon.png differ diff --git a/sandbox310/src/assets/img/demos/icon@2x.png b/sandbox310/src/assets/img/demos/icon@2x.png new file mode 100644 index 0000000..784f8c5 Binary files /dev/null and b/sandbox310/src/assets/img/demos/icon@2x.png differ diff --git a/sandbox310/src/assets/img/demos/mi1.jpg b/sandbox310/src/assets/img/demos/mi1.jpg new file mode 100644 index 0000000..afa4125 Binary files /dev/null and b/sandbox310/src/assets/img/demos/mi1.jpg differ diff --git a/sandbox310/src/assets/img/demos/mi10.jpg b/sandbox310/src/assets/img/demos/mi10.jpg new file mode 100644 index 0000000..642af32 Binary files /dev/null and b/sandbox310/src/assets/img/demos/mi10.jpg differ diff --git a/sandbox310/src/assets/img/demos/mi10@2x.jpg b/sandbox310/src/assets/img/demos/mi10@2x.jpg new file mode 100644 index 0000000..b05a401 Binary files /dev/null and b/sandbox310/src/assets/img/demos/mi10@2x.jpg differ diff --git a/sandbox310/src/assets/img/demos/mi11.jpg b/sandbox310/src/assets/img/demos/mi11.jpg new file mode 100644 index 0000000..545ea1d Binary files /dev/null and b/sandbox310/src/assets/img/demos/mi11.jpg differ diff --git a/sandbox310/src/assets/img/demos/mi11@2x.jpg b/sandbox310/src/assets/img/demos/mi11@2x.jpg new file mode 100644 index 0000000..443fb2f Binary files /dev/null and b/sandbox310/src/assets/img/demos/mi11@2x.jpg differ diff --git a/sandbox310/src/assets/img/demos/mi12.jpg b/sandbox310/src/assets/img/demos/mi12.jpg new file mode 100644 index 0000000..051ad1e Binary files /dev/null and b/sandbox310/src/assets/img/demos/mi12.jpg differ diff --git a/sandbox310/src/assets/img/demos/mi12@2x.jpg b/sandbox310/src/assets/img/demos/mi12@2x.jpg new file mode 100644 index 0000000..5e14b5c Binary files /dev/null and b/sandbox310/src/assets/img/demos/mi12@2x.jpg differ diff --git a/sandbox310/src/assets/img/demos/mi13.jpg b/sandbox310/src/assets/img/demos/mi13.jpg new file mode 100644 index 0000000..627bb00 Binary files /dev/null and b/sandbox310/src/assets/img/demos/mi13.jpg differ diff --git a/sandbox310/src/assets/img/demos/mi13@2x.jpg b/sandbox310/src/assets/img/demos/mi13@2x.jpg new file mode 100644 index 0000000..e2c30b8 Binary files /dev/null and b/sandbox310/src/assets/img/demos/mi13@2x.jpg differ diff --git a/sandbox310/src/assets/img/demos/mi14.jpg b/sandbox310/src/assets/img/demos/mi14.jpg new file mode 100644 index 0000000..862739c Binary files /dev/null and b/sandbox310/src/assets/img/demos/mi14.jpg differ diff --git a/sandbox310/src/assets/img/demos/mi14@2x.jpg b/sandbox310/src/assets/img/demos/mi14@2x.jpg new file mode 100644 index 0000000..bdaf304 Binary files /dev/null and b/sandbox310/src/assets/img/demos/mi14@2x.jpg differ diff --git a/sandbox310/src/assets/img/demos/mi15.jpg b/sandbox310/src/assets/img/demos/mi15.jpg new file mode 100644 index 0000000..804859e Binary files /dev/null and b/sandbox310/src/assets/img/demos/mi15.jpg differ diff --git a/sandbox310/src/assets/img/demos/mi15@2x.jpg b/sandbox310/src/assets/img/demos/mi15@2x.jpg new file mode 100644 index 0000000..eea8492 Binary files /dev/null and b/sandbox310/src/assets/img/demos/mi15@2x.jpg differ diff --git a/sandbox310/src/assets/img/demos/mi16.jpg b/sandbox310/src/assets/img/demos/mi16.jpg new file mode 100644 index 0000000..307cb82 Binary files /dev/null and b/sandbox310/src/assets/img/demos/mi16.jpg differ diff --git a/sandbox310/src/assets/img/demos/mi16@2x.jpg b/sandbox310/src/assets/img/demos/mi16@2x.jpg new file mode 100644 index 0000000..e836bef Binary files /dev/null and b/sandbox310/src/assets/img/demos/mi16@2x.jpg differ diff --git a/sandbox310/src/assets/img/demos/mi17.jpg b/sandbox310/src/assets/img/demos/mi17.jpg new file mode 100644 index 0000000..6b1b682 Binary files /dev/null and b/sandbox310/src/assets/img/demos/mi17.jpg differ diff --git a/sandbox310/src/assets/img/demos/mi17@2x.jpg b/sandbox310/src/assets/img/demos/mi17@2x.jpg new file mode 100644 index 0000000..01fbad6 Binary files /dev/null and b/sandbox310/src/assets/img/demos/mi17@2x.jpg differ diff --git a/sandbox310/src/assets/img/demos/mi18.jpg b/sandbox310/src/assets/img/demos/mi18.jpg new file mode 100644 index 0000000..af96db9 Binary files /dev/null and b/sandbox310/src/assets/img/demos/mi18.jpg differ diff --git a/sandbox310/src/assets/img/demos/mi18@2x.jpg b/sandbox310/src/assets/img/demos/mi18@2x.jpg new file mode 100644 index 0000000..9a45e48 Binary files /dev/null and b/sandbox310/src/assets/img/demos/mi18@2x.jpg differ diff --git a/sandbox310/src/assets/img/demos/mi19.jpg b/sandbox310/src/assets/img/demos/mi19.jpg new file mode 100644 index 0000000..168929b Binary files /dev/null and b/sandbox310/src/assets/img/demos/mi19.jpg differ diff --git a/sandbox310/src/assets/img/demos/mi19@2x.jpg b/sandbox310/src/assets/img/demos/mi19@2x.jpg new file mode 100644 index 0000000..44902b2 Binary files /dev/null and b/sandbox310/src/assets/img/demos/mi19@2x.jpg differ diff --git a/sandbox310/src/assets/img/demos/mi1@2x.jpg b/sandbox310/src/assets/img/demos/mi1@2x.jpg new file mode 100644 index 0000000..7f9043e Binary files /dev/null and b/sandbox310/src/assets/img/demos/mi1@2x.jpg differ diff --git a/sandbox310/src/assets/img/demos/mi2.jpg b/sandbox310/src/assets/img/demos/mi2.jpg new file mode 100644 index 0000000..97ab7aa Binary files /dev/null and b/sandbox310/src/assets/img/demos/mi2.jpg differ diff --git a/sandbox310/src/assets/img/demos/mi20.jpg b/sandbox310/src/assets/img/demos/mi20.jpg new file mode 100644 index 0000000..15262d1 Binary files /dev/null and b/sandbox310/src/assets/img/demos/mi20.jpg differ diff --git a/sandbox310/src/assets/img/demos/mi20@2x.jpg b/sandbox310/src/assets/img/demos/mi20@2x.jpg new file mode 100644 index 0000000..e0f6570 Binary files /dev/null and b/sandbox310/src/assets/img/demos/mi20@2x.jpg differ diff --git a/sandbox310/src/assets/img/demos/mi21.jpg b/sandbox310/src/assets/img/demos/mi21.jpg new file mode 100644 index 0000000..62cfd39 Binary files /dev/null and b/sandbox310/src/assets/img/demos/mi21.jpg differ diff --git a/sandbox310/src/assets/img/demos/mi21@2x.jpg b/sandbox310/src/assets/img/demos/mi21@2x.jpg new file mode 100644 index 0000000..c479ff7 Binary files /dev/null and b/sandbox310/src/assets/img/demos/mi21@2x.jpg differ diff --git a/sandbox310/src/assets/img/demos/mi2@2x.jpg b/sandbox310/src/assets/img/demos/mi2@2x.jpg new file mode 100644 index 0000000..9380ada Binary files /dev/null and b/sandbox310/src/assets/img/demos/mi2@2x.jpg differ diff --git a/sandbox310/src/assets/img/demos/mi3.jpg b/sandbox310/src/assets/img/demos/mi3.jpg new file mode 100644 index 0000000..0aaa77b Binary files /dev/null and b/sandbox310/src/assets/img/demos/mi3.jpg differ diff --git a/sandbox310/src/assets/img/demos/mi3@2x.jpg b/sandbox310/src/assets/img/demos/mi3@2x.jpg new file mode 100644 index 0000000..7651eed Binary files /dev/null and b/sandbox310/src/assets/img/demos/mi3@2x.jpg differ diff --git a/sandbox310/src/assets/img/demos/mi4.jpg b/sandbox310/src/assets/img/demos/mi4.jpg new file mode 100644 index 0000000..1e61f1b Binary files /dev/null and b/sandbox310/src/assets/img/demos/mi4.jpg differ diff --git a/sandbox310/src/assets/img/demos/mi4@2x.jpg b/sandbox310/src/assets/img/demos/mi4@2x.jpg new file mode 100644 index 0000000..358075d Binary files /dev/null and b/sandbox310/src/assets/img/demos/mi4@2x.jpg differ diff --git a/sandbox310/src/assets/img/demos/mi5.jpg b/sandbox310/src/assets/img/demos/mi5.jpg new file mode 100644 index 0000000..b345d66 Binary files /dev/null and b/sandbox310/src/assets/img/demos/mi5.jpg differ diff --git a/sandbox310/src/assets/img/demos/mi5@2x.jpg b/sandbox310/src/assets/img/demos/mi5@2x.jpg new file mode 100644 index 0000000..0f194a3 Binary files /dev/null and b/sandbox310/src/assets/img/demos/mi5@2x.jpg differ diff --git a/sandbox310/src/assets/img/demos/mi6.jpg b/sandbox310/src/assets/img/demos/mi6.jpg new file mode 100644 index 0000000..d9e83d5 Binary files /dev/null and b/sandbox310/src/assets/img/demos/mi6.jpg differ diff --git a/sandbox310/src/assets/img/demos/mi6@2x.jpg b/sandbox310/src/assets/img/demos/mi6@2x.jpg new file mode 100644 index 0000000..b5df6bd Binary files /dev/null and b/sandbox310/src/assets/img/demos/mi6@2x.jpg differ diff --git a/sandbox310/src/assets/img/demos/mi7.jpg b/sandbox310/src/assets/img/demos/mi7.jpg new file mode 100644 index 0000000..3f220ca Binary files /dev/null and b/sandbox310/src/assets/img/demos/mi7.jpg differ diff --git a/sandbox310/src/assets/img/demos/mi7@2x.jpg b/sandbox310/src/assets/img/demos/mi7@2x.jpg new file mode 100644 index 0000000..ec9d5aa Binary files /dev/null and b/sandbox310/src/assets/img/demos/mi7@2x.jpg differ diff --git a/sandbox310/src/assets/img/demos/mi8.jpg b/sandbox310/src/assets/img/demos/mi8.jpg new file mode 100644 index 0000000..b655846 Binary files /dev/null and b/sandbox310/src/assets/img/demos/mi8.jpg differ diff --git a/sandbox310/src/assets/img/demos/mi8@2x.jpg b/sandbox310/src/assets/img/demos/mi8@2x.jpg new file mode 100644 index 0000000..d6e013c Binary files /dev/null and b/sandbox310/src/assets/img/demos/mi8@2x.jpg differ diff --git a/sandbox310/src/assets/img/demos/mi9.jpg b/sandbox310/src/assets/img/demos/mi9.jpg new file mode 100644 index 0000000..9dbb824 Binary files /dev/null and b/sandbox310/src/assets/img/demos/mi9.jpg differ diff --git a/sandbox310/src/assets/img/demos/mi9@2x.jpg b/sandbox310/src/assets/img/demos/mi9@2x.jpg new file mode 100644 index 0000000..bd712e1 Binary files /dev/null and b/sandbox310/src/assets/img/demos/mi9@2x.jpg differ diff --git a/sandbox310/src/assets/img/demos/qrcode.jpg b/sandbox310/src/assets/img/demos/qrcode.jpg new file mode 100644 index 0000000..ee0632a Binary files /dev/null and b/sandbox310/src/assets/img/demos/qrcode.jpg differ diff --git a/sandbox310/src/assets/img/demos/qrcode@2x.jpg b/sandbox310/src/assets/img/demos/qrcode@2x.jpg new file mode 100644 index 0000000..049c810 Binary files /dev/null and b/sandbox310/src/assets/img/demos/qrcode@2x.jpg differ diff --git a/sandbox310/src/assets/img/demos/vc1.jpg b/sandbox310/src/assets/img/demos/vc1.jpg new file mode 100644 index 0000000..49058d6 Binary files /dev/null and b/sandbox310/src/assets/img/demos/vc1.jpg differ diff --git a/sandbox310/src/assets/img/demos/vc1@2x.jpg b/sandbox310/src/assets/img/demos/vc1@2x.jpg new file mode 100644 index 0000000..398096c Binary files /dev/null and b/sandbox310/src/assets/img/demos/vc1@2x.jpg differ diff --git a/sandbox310/src/assets/img/demos/vc2.jpg b/sandbox310/src/assets/img/demos/vc2.jpg new file mode 100644 index 0000000..730c90c Binary files /dev/null and b/sandbox310/src/assets/img/demos/vc2.jpg differ diff --git a/sandbox310/src/assets/img/demos/vc2@2x.jpg b/sandbox310/src/assets/img/demos/vc2@2x.jpg new file mode 100644 index 0000000..6afd5bf Binary files /dev/null and b/sandbox310/src/assets/img/demos/vc2@2x.jpg differ diff --git a/sandbox310/src/assets/img/demos/vc3.jpg b/sandbox310/src/assets/img/demos/vc3.jpg new file mode 100644 index 0000000..6bc89de Binary files /dev/null and b/sandbox310/src/assets/img/demos/vc3.jpg differ diff --git a/sandbox310/src/assets/img/demos/vc3@2x.jpg b/sandbox310/src/assets/img/demos/vc3@2x.jpg new file mode 100644 index 0000000..47e92cc Binary files /dev/null and b/sandbox310/src/assets/img/demos/vc3@2x.jpg differ diff --git a/sandbox310/src/assets/img/demos/vc4.jpg b/sandbox310/src/assets/img/demos/vc4.jpg new file mode 100644 index 0000000..ce508e4 Binary files /dev/null and b/sandbox310/src/assets/img/demos/vc4.jpg differ diff --git a/sandbox310/src/assets/img/demos/vc4@2x.jpg b/sandbox310/src/assets/img/demos/vc4@2x.jpg new file mode 100644 index 0000000..e340e82 Binary files /dev/null and b/sandbox310/src/assets/img/demos/vc4@2x.jpg differ diff --git a/sandbox310/src/assets/img/demos/vc5.jpg b/sandbox310/src/assets/img/demos/vc5.jpg new file mode 100644 index 0000000..bfe44da Binary files /dev/null and b/sandbox310/src/assets/img/demos/vc5.jpg differ diff --git a/sandbox310/src/assets/img/demos/vc5@2x.jpg b/sandbox310/src/assets/img/demos/vc5@2x.jpg new file mode 100644 index 0000000..7cfeb3d Binary files /dev/null and b/sandbox310/src/assets/img/demos/vc5@2x.jpg differ diff --git a/sandbox310/src/assets/img/demos/vc6.jpg b/sandbox310/src/assets/img/demos/vc6.jpg new file mode 100644 index 0000000..72ea379 Binary files /dev/null and b/sandbox310/src/assets/img/demos/vc6.jpg differ diff --git a/sandbox310/src/assets/img/demos/vc6@2x.jpg b/sandbox310/src/assets/img/demos/vc6@2x.jpg new file mode 100644 index 0000000..e2dda0c Binary files /dev/null and b/sandbox310/src/assets/img/demos/vc6@2x.jpg differ diff --git a/sandbox310/src/assets/img/demos/vc7.jpg b/sandbox310/src/assets/img/demos/vc7.jpg new file mode 100644 index 0000000..859966b Binary files /dev/null and b/sandbox310/src/assets/img/demos/vc7.jpg differ diff --git a/sandbox310/src/assets/img/demos/vc7@2x.jpg b/sandbox310/src/assets/img/demos/vc7@2x.jpg new file mode 100644 index 0000000..d5c600c Binary files /dev/null and b/sandbox310/src/assets/img/demos/vc7@2x.jpg differ diff --git a/sandbox310/src/assets/img/demos/vc8.jpg b/sandbox310/src/assets/img/demos/vc8.jpg new file mode 100644 index 0000000..76b1a9d Binary files /dev/null and b/sandbox310/src/assets/img/demos/vc8.jpg differ diff --git a/sandbox310/src/assets/img/demos/vc8@2x.jpg b/sandbox310/src/assets/img/demos/vc8@2x.jpg new file mode 100644 index 0000000..d290cdb Binary files /dev/null and b/sandbox310/src/assets/img/demos/vc8@2x.jpg differ diff --git a/sandbox310/src/assets/img/docs/angle-lower-end.jpg b/sandbox310/src/assets/img/docs/angle-lower-end.jpg new file mode 100644 index 0000000..cf0a63d Binary files /dev/null and b/sandbox310/src/assets/img/docs/angle-lower-end.jpg differ diff --git a/sandbox310/src/assets/img/docs/angle-lower-start.jpg b/sandbox310/src/assets/img/docs/angle-lower-start.jpg new file mode 100644 index 0000000..dcd0ffd Binary files /dev/null and b/sandbox310/src/assets/img/docs/angle-lower-start.jpg differ diff --git a/sandbox310/src/assets/img/docs/angle-upper-end-lower-end.jpg b/sandbox310/src/assets/img/docs/angle-upper-end-lower-end.jpg new file mode 100644 index 0000000..4490309 Binary files /dev/null and b/sandbox310/src/assets/img/docs/angle-upper-end-lower-end.jpg differ diff --git a/sandbox310/src/assets/img/docs/angle-upper-end-lower-start.jpg b/sandbox310/src/assets/img/docs/angle-upper-end-lower-start.jpg new file mode 100644 index 0000000..de5c117 Binary files /dev/null and b/sandbox310/src/assets/img/docs/angle-upper-end-lower-start.jpg differ diff --git a/sandbox310/src/assets/img/docs/angle-upper-end.jpg b/sandbox310/src/assets/img/docs/angle-upper-end.jpg new file mode 100644 index 0000000..7a96807 Binary files /dev/null and b/sandbox310/src/assets/img/docs/angle-upper-end.jpg differ diff --git a/sandbox310/src/assets/img/docs/angle-upper-start-lower-end.jpg b/sandbox310/src/assets/img/docs/angle-upper-start-lower-end.jpg new file mode 100644 index 0000000..2ded837 Binary files /dev/null and b/sandbox310/src/assets/img/docs/angle-upper-start-lower-end.jpg differ diff --git a/sandbox310/src/assets/img/docs/angle-upper-start-lower-start.jpg b/sandbox310/src/assets/img/docs/angle-upper-start-lower-start.jpg new file mode 100644 index 0000000..48bdb99 Binary files /dev/null and b/sandbox310/src/assets/img/docs/angle-upper-start-lower-start.jpg differ diff --git a/sandbox310/src/assets/img/docs/angle-upper-start.jpg b/sandbox310/src/assets/img/docs/angle-upper-start.jpg new file mode 100644 index 0000000..78bdb28 Binary files /dev/null and b/sandbox310/src/assets/img/docs/angle-upper-start.jpg differ diff --git a/sandbox310/src/assets/img/docs/hero1.jpg b/sandbox310/src/assets/img/docs/hero1.jpg new file mode 100644 index 0000000..12dd8c8 Binary files /dev/null and b/sandbox310/src/assets/img/docs/hero1.jpg differ diff --git a/sandbox310/src/assets/img/docs/hero10.jpg b/sandbox310/src/assets/img/docs/hero10.jpg new file mode 100644 index 0000000..80facb4 Binary files /dev/null and b/sandbox310/src/assets/img/docs/hero10.jpg differ diff --git a/sandbox310/src/assets/img/docs/hero11.jpg b/sandbox310/src/assets/img/docs/hero11.jpg new file mode 100644 index 0000000..48dffca Binary files /dev/null and b/sandbox310/src/assets/img/docs/hero11.jpg differ diff --git a/sandbox310/src/assets/img/docs/hero12.jpg b/sandbox310/src/assets/img/docs/hero12.jpg new file mode 100644 index 0000000..3ec8fd8 Binary files /dev/null and b/sandbox310/src/assets/img/docs/hero12.jpg differ diff --git a/sandbox310/src/assets/img/docs/hero13.jpg b/sandbox310/src/assets/img/docs/hero13.jpg new file mode 100644 index 0000000..c46dc4c Binary files /dev/null and b/sandbox310/src/assets/img/docs/hero13.jpg differ diff --git a/sandbox310/src/assets/img/docs/hero14.jpg b/sandbox310/src/assets/img/docs/hero14.jpg new file mode 100644 index 0000000..6826ce2 Binary files /dev/null and b/sandbox310/src/assets/img/docs/hero14.jpg differ diff --git a/sandbox310/src/assets/img/docs/hero15.jpg b/sandbox310/src/assets/img/docs/hero15.jpg new file mode 100644 index 0000000..6823b2f Binary files /dev/null and b/sandbox310/src/assets/img/docs/hero15.jpg differ diff --git a/sandbox310/src/assets/img/docs/hero16.jpg b/sandbox310/src/assets/img/docs/hero16.jpg new file mode 100644 index 0000000..4296361 Binary files /dev/null and b/sandbox310/src/assets/img/docs/hero16.jpg differ diff --git a/sandbox310/src/assets/img/docs/hero17.jpg b/sandbox310/src/assets/img/docs/hero17.jpg new file mode 100644 index 0000000..2281a46 Binary files /dev/null and b/sandbox310/src/assets/img/docs/hero17.jpg differ diff --git a/sandbox310/src/assets/img/docs/hero18.jpg b/sandbox310/src/assets/img/docs/hero18.jpg new file mode 100644 index 0000000..427a6fc Binary files /dev/null and b/sandbox310/src/assets/img/docs/hero18.jpg differ diff --git a/sandbox310/src/assets/img/docs/hero19.jpg b/sandbox310/src/assets/img/docs/hero19.jpg new file mode 100644 index 0000000..93d399f Binary files /dev/null and b/sandbox310/src/assets/img/docs/hero19.jpg differ diff --git a/sandbox310/src/assets/img/docs/hero2.jpg b/sandbox310/src/assets/img/docs/hero2.jpg new file mode 100644 index 0000000..9ecc419 Binary files /dev/null and b/sandbox310/src/assets/img/docs/hero2.jpg differ diff --git a/sandbox310/src/assets/img/docs/hero20.jpg b/sandbox310/src/assets/img/docs/hero20.jpg new file mode 100644 index 0000000..bfe5b36 Binary files /dev/null and b/sandbox310/src/assets/img/docs/hero20.jpg differ diff --git a/sandbox310/src/assets/img/docs/hero21.jpg b/sandbox310/src/assets/img/docs/hero21.jpg new file mode 100644 index 0000000..0222c92 Binary files /dev/null and b/sandbox310/src/assets/img/docs/hero21.jpg differ diff --git a/sandbox310/src/assets/img/docs/hero3.jpg b/sandbox310/src/assets/img/docs/hero3.jpg new file mode 100644 index 0000000..f68b513 Binary files /dev/null and b/sandbox310/src/assets/img/docs/hero3.jpg differ diff --git a/sandbox310/src/assets/img/docs/hero4.jpg b/sandbox310/src/assets/img/docs/hero4.jpg new file mode 100644 index 0000000..138a1e0 Binary files /dev/null and b/sandbox310/src/assets/img/docs/hero4.jpg differ diff --git a/sandbox310/src/assets/img/docs/hero5.jpg b/sandbox310/src/assets/img/docs/hero5.jpg new file mode 100644 index 0000000..3eef0df Binary files /dev/null and b/sandbox310/src/assets/img/docs/hero5.jpg differ diff --git a/sandbox310/src/assets/img/docs/hero6.jpg b/sandbox310/src/assets/img/docs/hero6.jpg new file mode 100644 index 0000000..b6b30d1 Binary files /dev/null and b/sandbox310/src/assets/img/docs/hero6.jpg differ diff --git a/sandbox310/src/assets/img/docs/hero7.jpg b/sandbox310/src/assets/img/docs/hero7.jpg new file mode 100644 index 0000000..89f1655 Binary files /dev/null and b/sandbox310/src/assets/img/docs/hero7.jpg differ diff --git a/sandbox310/src/assets/img/docs/hero8.jpg b/sandbox310/src/assets/img/docs/hero8.jpg new file mode 100644 index 0000000..0c065ff Binary files /dev/null and b/sandbox310/src/assets/img/docs/hero8.jpg differ diff --git a/sandbox310/src/assets/img/docs/hero9.jpg b/sandbox310/src/assets/img/docs/hero9.jpg new file mode 100644 index 0000000..a3c4550 Binary files /dev/null and b/sandbox310/src/assets/img/docs/hero9.jpg differ diff --git a/sandbox310/src/assets/img/docs/ico1.jpg b/sandbox310/src/assets/img/docs/ico1.jpg new file mode 100644 index 0000000..9357d83 Binary files /dev/null and b/sandbox310/src/assets/img/docs/ico1.jpg differ diff --git a/sandbox310/src/assets/img/docs/ico1@2x.jpg b/sandbox310/src/assets/img/docs/ico1@2x.jpg new file mode 100644 index 0000000..a4e689c Binary files /dev/null and b/sandbox310/src/assets/img/docs/ico1@2x.jpg differ diff --git a/sandbox310/src/assets/img/docs/ico2.jpg b/sandbox310/src/assets/img/docs/ico2.jpg new file mode 100644 index 0000000..f0f491a Binary files /dev/null and b/sandbox310/src/assets/img/docs/ico2.jpg differ diff --git a/sandbox310/src/assets/img/docs/ico2@2x.jpg b/sandbox310/src/assets/img/docs/ico2@2x.jpg new file mode 100644 index 0000000..7f283b0 Binary files /dev/null and b/sandbox310/src/assets/img/docs/ico2@2x.jpg differ diff --git a/sandbox310/src/assets/img/docs/ico3.jpg b/sandbox310/src/assets/img/docs/ico3.jpg new file mode 100644 index 0000000..7e0a15d Binary files /dev/null and b/sandbox310/src/assets/img/docs/ico3.jpg differ diff --git a/sandbox310/src/assets/img/docs/ico3@2x.jpg b/sandbox310/src/assets/img/docs/ico3@2x.jpg new file mode 100644 index 0000000..8d1fbab Binary files /dev/null and b/sandbox310/src/assets/img/docs/ico3@2x.jpg differ diff --git a/sandbox310/src/assets/img/docs/mo1.jpg b/sandbox310/src/assets/img/docs/mo1.jpg new file mode 100644 index 0000000..2dfac56 Binary files /dev/null and b/sandbox310/src/assets/img/docs/mo1.jpg differ diff --git a/sandbox310/src/assets/img/docs/mo1@2x.jpg b/sandbox310/src/assets/img/docs/mo1@2x.jpg new file mode 100644 index 0000000..c9c7c24 Binary files /dev/null and b/sandbox310/src/assets/img/docs/mo1@2x.jpg differ diff --git a/sandbox310/src/assets/img/docs/mo2.jpg b/sandbox310/src/assets/img/docs/mo2.jpg new file mode 100644 index 0000000..c86808f Binary files /dev/null and b/sandbox310/src/assets/img/docs/mo2.jpg differ diff --git a/sandbox310/src/assets/img/docs/mo2@2x.jpg b/sandbox310/src/assets/img/docs/mo2@2x.jpg new file mode 100644 index 0000000..c22c778 Binary files /dev/null and b/sandbox310/src/assets/img/docs/mo2@2x.jpg differ diff --git a/sandbox310/src/assets/img/docs/mo3.jpg b/sandbox310/src/assets/img/docs/mo3.jpg new file mode 100644 index 0000000..5586e6a Binary files /dev/null and b/sandbox310/src/assets/img/docs/mo3.jpg differ diff --git a/sandbox310/src/assets/img/docs/mo3@2x.jpg b/sandbox310/src/assets/img/docs/mo3@2x.jpg new file mode 100644 index 0000000..3a27089 Binary files /dev/null and b/sandbox310/src/assets/img/docs/mo3@2x.jpg differ diff --git a/sandbox310/src/assets/img/docs/mo4.jpg b/sandbox310/src/assets/img/docs/mo4.jpg new file mode 100644 index 0000000..9bfdb3d Binary files /dev/null and b/sandbox310/src/assets/img/docs/mo4.jpg differ diff --git a/sandbox310/src/assets/img/docs/mo4@2x.jpg b/sandbox310/src/assets/img/docs/mo4@2x.jpg new file mode 100644 index 0000000..d3c8b44 Binary files /dev/null and b/sandbox310/src/assets/img/docs/mo4@2x.jpg differ diff --git a/sandbox310/src/assets/img/docs/mo5.jpg b/sandbox310/src/assets/img/docs/mo5.jpg new file mode 100644 index 0000000..e6e7721 Binary files /dev/null and b/sandbox310/src/assets/img/docs/mo5.jpg differ diff --git a/sandbox310/src/assets/img/docs/mo5@2x.jpg b/sandbox310/src/assets/img/docs/mo5@2x.jpg new file mode 100644 index 0000000..d7291d6 Binary files /dev/null and b/sandbox310/src/assets/img/docs/mo5@2x.jpg differ diff --git a/sandbox310/src/assets/img/docs/mo6.jpg b/sandbox310/src/assets/img/docs/mo6.jpg new file mode 100644 index 0000000..1eb66c5 Binary files /dev/null and b/sandbox310/src/assets/img/docs/mo6.jpg differ diff --git a/sandbox310/src/assets/img/docs/mo6@2x.jpg b/sandbox310/src/assets/img/docs/mo6@2x.jpg new file mode 100644 index 0000000..101fc4e Binary files /dev/null and b/sandbox310/src/assets/img/docs/mo6@2x.jpg differ diff --git a/sandbox310/src/assets/img/docs/mo7.jpg b/sandbox310/src/assets/img/docs/mo7.jpg new file mode 100644 index 0000000..83a6f39 Binary files /dev/null and b/sandbox310/src/assets/img/docs/mo7.jpg differ diff --git a/sandbox310/src/assets/img/docs/mo7@2x.jpg b/sandbox310/src/assets/img/docs/mo7@2x.jpg new file mode 100644 index 0000000..2b7a2b2 Binary files /dev/null and b/sandbox310/src/assets/img/docs/mo7@2x.jpg differ diff --git a/sandbox310/src/assets/img/docs/oth.jpg b/sandbox310/src/assets/img/docs/oth.jpg new file mode 100644 index 0000000..7b7d9f0 Binary files /dev/null and b/sandbox310/src/assets/img/docs/oth.jpg differ diff --git a/sandbox310/src/assets/img/docs/oth2.jpg b/sandbox310/src/assets/img/docs/oth2.jpg new file mode 100644 index 0000000..70556fb Binary files /dev/null and b/sandbox310/src/assets/img/docs/oth2.jpg differ diff --git a/sandbox310/src/assets/img/docs/oth2@2x.jpg b/sandbox310/src/assets/img/docs/oth2@2x.jpg new file mode 100644 index 0000000..ffe65ad Binary files /dev/null and b/sandbox310/src/assets/img/docs/oth2@2x.jpg differ diff --git a/sandbox310/src/assets/img/docs/oth@2x.jpg b/sandbox310/src/assets/img/docs/oth@2x.jpg new file mode 100644 index 0000000..c6cf76e Binary files /dev/null and b/sandbox310/src/assets/img/docs/oth@2x.jpg differ diff --git a/sandbox310/src/assets/img/docs/pex1.jpg b/sandbox310/src/assets/img/docs/pex1.jpg new file mode 100644 index 0000000..78dc383 Binary files /dev/null and b/sandbox310/src/assets/img/docs/pex1.jpg differ diff --git a/sandbox310/src/assets/img/docs/pex1@2x.jpg b/sandbox310/src/assets/img/docs/pex1@2x.jpg new file mode 100644 index 0000000..aa6dc3f Binary files /dev/null and b/sandbox310/src/assets/img/docs/pex1@2x.jpg differ diff --git a/sandbox310/src/assets/img/docs/pex2.jpg b/sandbox310/src/assets/img/docs/pex2.jpg new file mode 100644 index 0000000..fe97876 Binary files /dev/null and b/sandbox310/src/assets/img/docs/pex2.jpg differ diff --git a/sandbox310/src/assets/img/docs/pex2@2x.jpg b/sandbox310/src/assets/img/docs/pex2@2x.jpg new file mode 100644 index 0000000..ccf83e6 Binary files /dev/null and b/sandbox310/src/assets/img/docs/pex2@2x.jpg differ diff --git a/sandbox310/src/assets/img/docs/pex3.jpg b/sandbox310/src/assets/img/docs/pex3.jpg new file mode 100644 index 0000000..65bffed Binary files /dev/null and b/sandbox310/src/assets/img/docs/pex3.jpg differ diff --git a/sandbox310/src/assets/img/docs/pex3@2x.jpg b/sandbox310/src/assets/img/docs/pex3@2x.jpg new file mode 100644 index 0000000..be582ff Binary files /dev/null and b/sandbox310/src/assets/img/docs/pex3@2x.jpg differ diff --git a/sandbox310/src/assets/img/docs/pix1.jpg b/sandbox310/src/assets/img/docs/pix1.jpg new file mode 100644 index 0000000..9f66b6d Binary files /dev/null and b/sandbox310/src/assets/img/docs/pix1.jpg differ diff --git a/sandbox310/src/assets/img/docs/pix1@2x.jpg b/sandbox310/src/assets/img/docs/pix1@2x.jpg new file mode 100644 index 0000000..d29b6a2 Binary files /dev/null and b/sandbox310/src/assets/img/docs/pix1@2x.jpg differ diff --git a/sandbox310/src/assets/img/docs/pix2.jpg b/sandbox310/src/assets/img/docs/pix2.jpg new file mode 100644 index 0000000..3ac6521 Binary files /dev/null and b/sandbox310/src/assets/img/docs/pix2.jpg differ diff --git a/sandbox310/src/assets/img/docs/pix2@2x.jpg b/sandbox310/src/assets/img/docs/pix2@2x.jpg new file mode 100644 index 0000000..2cef575 Binary files /dev/null and b/sandbox310/src/assets/img/docs/pix2@2x.jpg differ diff --git a/sandbox310/src/assets/img/docs/pix3.jpg b/sandbox310/src/assets/img/docs/pix3.jpg new file mode 100644 index 0000000..1632d32 Binary files /dev/null and b/sandbox310/src/assets/img/docs/pix3.jpg differ diff --git a/sandbox310/src/assets/img/docs/pix3@2x.jpg b/sandbox310/src/assets/img/docs/pix3@2x.jpg new file mode 100644 index 0000000..e8ec89d Binary files /dev/null and b/sandbox310/src/assets/img/docs/pix3@2x.jpg differ diff --git a/sandbox310/src/assets/img/docs/raw1.jpg b/sandbox310/src/assets/img/docs/raw1.jpg new file mode 100644 index 0000000..8e3f85b Binary files /dev/null and b/sandbox310/src/assets/img/docs/raw1.jpg differ diff --git a/sandbox310/src/assets/img/docs/raw1@2x.jpg b/sandbox310/src/assets/img/docs/raw1@2x.jpg new file mode 100644 index 0000000..c4f27a9 Binary files /dev/null and b/sandbox310/src/assets/img/docs/raw1@2x.jpg differ diff --git a/sandbox310/src/assets/img/docs/raw2.jpg b/sandbox310/src/assets/img/docs/raw2.jpg new file mode 100644 index 0000000..5236703 Binary files /dev/null and b/sandbox310/src/assets/img/docs/raw2.jpg differ diff --git a/sandbox310/src/assets/img/docs/raw2@2x.jpg b/sandbox310/src/assets/img/docs/raw2@2x.jpg new file mode 100644 index 0000000..7121457 Binary files /dev/null and b/sandbox310/src/assets/img/docs/raw2@2x.jpg differ diff --git a/sandbox310/src/assets/img/docs/raw3.jpg b/sandbox310/src/assets/img/docs/raw3.jpg new file mode 100644 index 0000000..ae6038c Binary files /dev/null and b/sandbox310/src/assets/img/docs/raw3.jpg differ diff --git a/sandbox310/src/assets/img/docs/raw3@2x.jpg b/sandbox310/src/assets/img/docs/raw3@2x.jpg new file mode 100644 index 0000000..21b5897 Binary files /dev/null and b/sandbox310/src/assets/img/docs/raw3@2x.jpg differ diff --git a/sandbox310/src/assets/img/docs/un1.jpg b/sandbox310/src/assets/img/docs/un1.jpg new file mode 100644 index 0000000..213b2d3 Binary files /dev/null and b/sandbox310/src/assets/img/docs/un1.jpg differ diff --git a/sandbox310/src/assets/img/docs/un1@2x.jpg b/sandbox310/src/assets/img/docs/un1@2x.jpg new file mode 100644 index 0000000..b9c756e Binary files /dev/null and b/sandbox310/src/assets/img/docs/un1@2x.jpg differ diff --git a/sandbox310/src/assets/img/docs/un2.jpg b/sandbox310/src/assets/img/docs/un2.jpg new file mode 100644 index 0000000..3388f51 Binary files /dev/null and b/sandbox310/src/assets/img/docs/un2.jpg differ diff --git a/sandbox310/src/assets/img/docs/un2@2x.jpg b/sandbox310/src/assets/img/docs/un2@2x.jpg new file mode 100644 index 0000000..8e4d609 Binary files /dev/null and b/sandbox310/src/assets/img/docs/un2@2x.jpg differ diff --git a/sandbox310/src/assets/img/docs/un3.jpg b/sandbox310/src/assets/img/docs/un3.jpg new file mode 100644 index 0000000..2d884e6 Binary files /dev/null and b/sandbox310/src/assets/img/docs/un3.jpg differ diff --git a/sandbox310/src/assets/img/docs/un3@2x.jpg b/sandbox310/src/assets/img/docs/un3@2x.jpg new file mode 100644 index 0000000..636f270 Binary files /dev/null and b/sandbox310/src/assets/img/docs/un3@2x.jpg differ diff --git a/sandbox310/src/assets/img/favicon.png b/sandbox310/src/assets/img/favicon.png new file mode 100644 index 0000000..841a7ee Binary files /dev/null and b/sandbox310/src/assets/img/favicon.png differ diff --git a/sandbox310/src/assets/img/icons/lineal/adjust.svg b/sandbox310/src/assets/img/icons/lineal/adjust.svg new file mode 100644 index 0000000..23d2c90 --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/adjust.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/agenda.svg b/sandbox310/src/assets/img/icons/lineal/agenda.svg new file mode 100644 index 0000000..a4eaf26 --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/agenda.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/analytics.svg b/sandbox310/src/assets/img/icons/lineal/analytics.svg new file mode 100644 index 0000000..aead926 --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/analytics.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/award-2.svg b/sandbox310/src/assets/img/icons/lineal/award-2.svg new file mode 100644 index 0000000..9c9d897 --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/award-2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/award.svg b/sandbox310/src/assets/img/icons/lineal/award.svg new file mode 100644 index 0000000..2c564e4 --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/award.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/badge.svg b/sandbox310/src/assets/img/icons/lineal/badge.svg new file mode 100644 index 0000000..d4079d2 --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/badge.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/balance.svg b/sandbox310/src/assets/img/icons/lineal/balance.svg new file mode 100644 index 0000000..2df6161 --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/balance.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/bar-chart.svg b/sandbox310/src/assets/img/icons/lineal/bar-chart.svg new file mode 100644 index 0000000..1a80b03 --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/bar-chart.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/barcode.svg b/sandbox310/src/assets/img/icons/lineal/barcode.svg new file mode 100644 index 0000000..d67da31 --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/barcode.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/bell.svg b/sandbox310/src/assets/img/icons/lineal/bell.svg new file mode 100644 index 0000000..0804de7 --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/bell.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/box.svg b/sandbox310/src/assets/img/icons/lineal/box.svg new file mode 100644 index 0000000..41352b9 --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/box.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/briefcase-2.svg b/sandbox310/src/assets/img/icons/lineal/briefcase-2.svg new file mode 100644 index 0000000..b37023e --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/briefcase-2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/briefcase.svg b/sandbox310/src/assets/img/icons/lineal/briefcase.svg new file mode 100644 index 0000000..29d34cd --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/briefcase.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/browser-2.svg b/sandbox310/src/assets/img/icons/lineal/browser-2.svg new file mode 100644 index 0000000..4fb2b30 --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/browser-2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/browser.svg b/sandbox310/src/assets/img/icons/lineal/browser.svg new file mode 100644 index 0000000..c35d7ef --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/browser.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/brush.svg b/sandbox310/src/assets/img/icons/lineal/brush.svg new file mode 100644 index 0000000..bd38e0a --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/brush.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/bucket.svg b/sandbox310/src/assets/img/icons/lineal/bucket.svg new file mode 100644 index 0000000..321b7bb --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/bucket.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/cake.svg b/sandbox310/src/assets/img/icons/lineal/cake.svg new file mode 100644 index 0000000..fc93524 --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/cake.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/calculator.svg b/sandbox310/src/assets/img/icons/lineal/calculator.svg new file mode 100644 index 0000000..1e1a7d8 --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/calculator.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/calendar.svg b/sandbox310/src/assets/img/icons/lineal/calendar.svg new file mode 100644 index 0000000..c6104ab --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/calendar.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/certificate.svg b/sandbox310/src/assets/img/icons/lineal/certificate.svg new file mode 100644 index 0000000..1f81aa7 --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/certificate.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/chat-2.svg b/sandbox310/src/assets/img/icons/lineal/chat-2.svg new file mode 100644 index 0000000..d3fd8c4 --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/chat-2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/chat.svg b/sandbox310/src/assets/img/icons/lineal/chat.svg new file mode 100644 index 0000000..9cd18e9 --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/chat.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/check-2.svg b/sandbox310/src/assets/img/icons/lineal/check-2.svg new file mode 100644 index 0000000..3c990a0 --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/check-2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/check-list.svg b/sandbox310/src/assets/img/icons/lineal/check-list.svg new file mode 100644 index 0000000..f3c17ab --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/check-list.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/check.svg b/sandbox310/src/assets/img/icons/lineal/check.svg new file mode 100644 index 0000000..ee272cc --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/check.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/clipboard.svg b/sandbox310/src/assets/img/icons/lineal/clipboard.svg new file mode 100644 index 0000000..8dd84f7 --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/clipboard.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/clock-2.svg b/sandbox310/src/assets/img/icons/lineal/clock-2.svg new file mode 100644 index 0000000..552014d --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/clock-2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/clock-3.svg b/sandbox310/src/assets/img/icons/lineal/clock-3.svg new file mode 100644 index 0000000..e06f77a --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/clock-3.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/clock.svg b/sandbox310/src/assets/img/icons/lineal/clock.svg new file mode 100644 index 0000000..b043f3d --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/clock.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/cloud-computing-2.svg b/sandbox310/src/assets/img/icons/lineal/cloud-computing-2.svg new file mode 100644 index 0000000..007adb6 --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/cloud-computing-2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/cloud-computing-3.svg b/sandbox310/src/assets/img/icons/lineal/cloud-computing-3.svg new file mode 100644 index 0000000..6326efd --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/cloud-computing-3.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/cloud-computing.svg b/sandbox310/src/assets/img/icons/lineal/cloud-computing.svg new file mode 100644 index 0000000..817461b --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/cloud-computing.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/coffee-cup.svg b/sandbox310/src/assets/img/icons/lineal/coffee-cup.svg new file mode 100644 index 0000000..dfa3df1 --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/coffee-cup.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/coin.svg b/sandbox310/src/assets/img/icons/lineal/coin.svg new file mode 100644 index 0000000..bae2eed --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/coin.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/compass.svg b/sandbox310/src/assets/img/icons/lineal/compass.svg new file mode 100644 index 0000000..93386fd --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/compass.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/computer.svg b/sandbox310/src/assets/img/icons/lineal/computer.svg new file mode 100644 index 0000000..a640b95 --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/computer.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/controller-2.svg b/sandbox310/src/assets/img/icons/lineal/controller-2.svg new file mode 100644 index 0000000..01f244f --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/controller-2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/controller.svg b/sandbox310/src/assets/img/icons/lineal/controller.svg new file mode 100644 index 0000000..36ffdf2 --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/controller.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/crayons.svg b/sandbox310/src/assets/img/icons/lineal/crayons.svg new file mode 100644 index 0000000..2eb5ee2 --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/crayons.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/crop.svg b/sandbox310/src/assets/img/icons/lineal/crop.svg new file mode 100644 index 0000000..5b6cd96 --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/crop.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/design.svg b/sandbox310/src/assets/img/icons/lineal/design.svg new file mode 100644 index 0000000..a93db77 --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/design.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/directions.svg b/sandbox310/src/assets/img/icons/lineal/directions.svg new file mode 100644 index 0000000..5b6e10f --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/directions.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/discount-tag.svg b/sandbox310/src/assets/img/icons/lineal/discount-tag.svg new file mode 100644 index 0000000..6529eea --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/discount-tag.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/download.svg b/sandbox310/src/assets/img/icons/lineal/download.svg new file mode 100644 index 0000000..6befaac --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/download.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/earth.svg b/sandbox310/src/assets/img/icons/lineal/earth.svg new file mode 100644 index 0000000..24a5fca --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/earth.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/edit-text.svg b/sandbox310/src/assets/img/icons/lineal/edit-text.svg new file mode 100644 index 0000000..2903f7e --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/edit-text.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/email-2.svg b/sandbox310/src/assets/img/icons/lineal/email-2.svg new file mode 100644 index 0000000..c4ee295 --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/email-2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/email-3.svg b/sandbox310/src/assets/img/icons/lineal/email-3.svg new file mode 100644 index 0000000..bf447c0 --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/email-3.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/email.svg b/sandbox310/src/assets/img/icons/lineal/email.svg new file mode 100644 index 0000000..cb34a76 --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/email.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/exchange.svg b/sandbox310/src/assets/img/icons/lineal/exchange.svg new file mode 100644 index 0000000..f26724c --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/exchange.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/expand.svg b/sandbox310/src/assets/img/icons/lineal/expand.svg new file mode 100644 index 0000000..4a21944 --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/expand.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/fax.svg b/sandbox310/src/assets/img/icons/lineal/fax.svg new file mode 100644 index 0000000..68c1f4a --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/fax.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/files.svg b/sandbox310/src/assets/img/icons/lineal/files.svg new file mode 100644 index 0000000..82ef7f6 --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/files.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/fullscreen.svg b/sandbox310/src/assets/img/icons/lineal/fullscreen.svg new file mode 100644 index 0000000..cff3a93 --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/fullscreen.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/geolocalization.svg b/sandbox310/src/assets/img/icons/lineal/geolocalization.svg new file mode 100644 index 0000000..6e5366d --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/geolocalization.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/gift.svg b/sandbox310/src/assets/img/icons/lineal/gift.svg new file mode 100644 index 0000000..b682319 --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/gift.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/group-2.svg b/sandbox310/src/assets/img/icons/lineal/group-2.svg new file mode 100644 index 0000000..7244659 --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/group-2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/group.svg b/sandbox310/src/assets/img/icons/lineal/group.svg new file mode 100644 index 0000000..617fd7c --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/group.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/growth.svg b/sandbox310/src/assets/img/icons/lineal/growth.svg new file mode 100644 index 0000000..1350bda --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/growth.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/handshake.svg b/sandbox310/src/assets/img/icons/lineal/handshake.svg new file mode 100644 index 0000000..b162c82 --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/handshake.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/headphone-2.svg b/sandbox310/src/assets/img/icons/lineal/headphone-2.svg new file mode 100644 index 0000000..82f3ecc --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/headphone-2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/headphone.svg b/sandbox310/src/assets/img/icons/lineal/headphone.svg new file mode 100644 index 0000000..f59a2b6 --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/headphone.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/heart.svg b/sandbox310/src/assets/img/icons/lineal/heart.svg new file mode 100644 index 0000000..e34e3aa --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/heart.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/home.svg b/sandbox310/src/assets/img/icons/lineal/home.svg new file mode 100644 index 0000000..0ff8d87 --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/home.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/hourglass.svg b/sandbox310/src/assets/img/icons/lineal/hourglass.svg new file mode 100644 index 0000000..31a876a --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/hourglass.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/house.svg b/sandbox310/src/assets/img/icons/lineal/house.svg new file mode 100644 index 0000000..0e79c4b --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/house.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/id-card.svg b/sandbox310/src/assets/img/icons/lineal/id-card.svg new file mode 100644 index 0000000..d6e4acc --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/id-card.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/insurance.svg b/sandbox310/src/assets/img/icons/lineal/insurance.svg new file mode 100644 index 0000000..8010600 --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/insurance.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/invoice.svg b/sandbox310/src/assets/img/icons/lineal/invoice.svg new file mode 100644 index 0000000..7c89426 --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/invoice.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/laptop.svg b/sandbox310/src/assets/img/icons/lineal/laptop.svg new file mode 100644 index 0000000..e26f0ad --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/laptop.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/levels.svg b/sandbox310/src/assets/img/icons/lineal/levels.svg new file mode 100644 index 0000000..f6e45eb --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/levels.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/light-bulb.svg b/sandbox310/src/assets/img/icons/lineal/light-bulb.svg new file mode 100644 index 0000000..51ba720 --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/light-bulb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/link.svg b/sandbox310/src/assets/img/icons/lineal/link.svg new file mode 100644 index 0000000..66141bd --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/link.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/list.svg b/sandbox310/src/assets/img/icons/lineal/list.svg new file mode 100644 index 0000000..0f4704c --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/list.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/loading.svg b/sandbox310/src/assets/img/icons/lineal/loading.svg new file mode 100644 index 0000000..67e9931 --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/loading.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/lock.svg b/sandbox310/src/assets/img/icons/lineal/lock.svg new file mode 100644 index 0000000..3824770 --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/lock.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/login.svg b/sandbox310/src/assets/img/icons/lineal/login.svg new file mode 100644 index 0000000..9215ee9 --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/login.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/logout.svg b/sandbox310/src/assets/img/icons/lineal/logout.svg new file mode 100644 index 0000000..1cf0e0e --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/logout.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/loss.svg b/sandbox310/src/assets/img/icons/lineal/loss.svg new file mode 100644 index 0000000..4caa041 --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/loss.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/loyalty.svg b/sandbox310/src/assets/img/icons/lineal/loyalty.svg new file mode 100644 index 0000000..72f3aa6 --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/loyalty.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/map.svg b/sandbox310/src/assets/img/icons/lineal/map.svg new file mode 100644 index 0000000..fe1db40 --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/map.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/maximize.svg b/sandbox310/src/assets/img/icons/lineal/maximize.svg new file mode 100644 index 0000000..ee81c8e --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/maximize.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/medal.svg b/sandbox310/src/assets/img/icons/lineal/medal.svg new file mode 100644 index 0000000..e1a8eed --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/medal.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/meeting.svg b/sandbox310/src/assets/img/icons/lineal/meeting.svg new file mode 100644 index 0000000..a3c8845 --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/meeting.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/megaphone.svg b/sandbox310/src/assets/img/icons/lineal/megaphone.svg new file mode 100644 index 0000000..6bf49c5 --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/megaphone.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/menu.svg b/sandbox310/src/assets/img/icons/lineal/menu.svg new file mode 100644 index 0000000..3df7a41 --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/menu.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/microphone.svg b/sandbox310/src/assets/img/icons/lineal/microphone.svg new file mode 100644 index 0000000..43aabaf --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/microphone.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/minimize.svg b/sandbox310/src/assets/img/icons/lineal/minimize.svg new file mode 100644 index 0000000..21ca529 --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/minimize.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/money.svg b/sandbox310/src/assets/img/icons/lineal/money.svg new file mode 100644 index 0000000..5a19e18 --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/money.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/music.svg b/sandbox310/src/assets/img/icons/lineal/music.svg new file mode 100644 index 0000000..e8e4dc8 --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/music.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/networking-2.svg b/sandbox310/src/assets/img/icons/lineal/networking-2.svg new file mode 100644 index 0000000..4309419 --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/networking-2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/networking.svg b/sandbox310/src/assets/img/icons/lineal/networking.svg new file mode 100644 index 0000000..04d3e75 --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/networking.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/open.svg b/sandbox310/src/assets/img/icons/lineal/open.svg new file mode 100644 index 0000000..11bdafe --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/open.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/padlock.svg b/sandbox310/src/assets/img/icons/lineal/padlock.svg new file mode 100644 index 0000000..33cdd16 --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/padlock.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/paint-roller.svg b/sandbox310/src/assets/img/icons/lineal/paint-roller.svg new file mode 100644 index 0000000..077e5a5 --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/paint-roller.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/paper-plane.svg b/sandbox310/src/assets/img/icons/lineal/paper-plane.svg new file mode 100644 index 0000000..430078f --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/paper-plane.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/paper.svg b/sandbox310/src/assets/img/icons/lineal/paper.svg new file mode 100644 index 0000000..a31a4f5 --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/paper.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/password.svg b/sandbox310/src/assets/img/icons/lineal/password.svg new file mode 100644 index 0000000..3801bf5 --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/password.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/photo-camera.svg b/sandbox310/src/assets/img/icons/lineal/photo-camera.svg new file mode 100644 index 0000000..8c8dcb5 --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/photo-camera.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/picture.svg b/sandbox310/src/assets/img/icons/lineal/picture.svg new file mode 100644 index 0000000..9add248 --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/picture.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/pictures.svg b/sandbox310/src/assets/img/icons/lineal/pictures.svg new file mode 100644 index 0000000..0bc24ca --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/pictures.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/pie-chart-2.svg b/sandbox310/src/assets/img/icons/lineal/pie-chart-2.svg new file mode 100644 index 0000000..57fb134 --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/pie-chart-2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/pie-chart.svg b/sandbox310/src/assets/img/icons/lineal/pie-chart.svg new file mode 100644 index 0000000..f4f9fd4 --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/pie-chart.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/pin-2.svg b/sandbox310/src/assets/img/icons/lineal/pin-2.svg new file mode 100644 index 0000000..27a6bdc --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/pin-2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/pin.svg b/sandbox310/src/assets/img/icons/lineal/pin.svg new file mode 100644 index 0000000..e35928c --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/pin.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/plan.svg b/sandbox310/src/assets/img/icons/lineal/plan.svg new file mode 100644 index 0000000..7197d77 --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/plan.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/price-tag.svg b/sandbox310/src/assets/img/icons/lineal/price-tag.svg new file mode 100644 index 0000000..7014475 --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/price-tag.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/printer.svg b/sandbox310/src/assets/img/icons/lineal/printer.svg new file mode 100644 index 0000000..e21c348 --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/printer.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/profits.svg b/sandbox310/src/assets/img/icons/lineal/profits.svg new file mode 100644 index 0000000..3f4a10d --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/profits.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/puzzle-2.svg b/sandbox310/src/assets/img/icons/lineal/puzzle-2.svg new file mode 100644 index 0000000..df1cb7c --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/puzzle-2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/puzzle.svg b/sandbox310/src/assets/img/icons/lineal/puzzle.svg new file mode 100644 index 0000000..163175e --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/puzzle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/ranking.svg b/sandbox310/src/assets/img/icons/lineal/ranking.svg new file mode 100644 index 0000000..95812ad --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/ranking.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/refresh.svg b/sandbox310/src/assets/img/icons/lineal/refresh.svg new file mode 100644 index 0000000..bc24420 --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/refresh.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/rocket.svg b/sandbox310/src/assets/img/icons/lineal/rocket.svg new file mode 100644 index 0000000..4985a0a --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/rocket.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/savings.svg b/sandbox310/src/assets/img/icons/lineal/savings.svg new file mode 100644 index 0000000..a065509 --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/savings.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/scale.svg b/sandbox310/src/assets/img/icons/lineal/scale.svg new file mode 100644 index 0000000..b5a025a --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/scale.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/scroll-2.svg b/sandbox310/src/assets/img/icons/lineal/scroll-2.svg new file mode 100644 index 0000000..39286d8 --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/scroll-2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/scroll.svg b/sandbox310/src/assets/img/icons/lineal/scroll.svg new file mode 100644 index 0000000..b7dafbb --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/scroll.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/search-2.svg b/sandbox310/src/assets/img/icons/lineal/search-2.svg new file mode 100644 index 0000000..438641c --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/search-2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/search.svg b/sandbox310/src/assets/img/icons/lineal/search.svg new file mode 100644 index 0000000..d2f1881 --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/search.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/server.svg b/sandbox310/src/assets/img/icons/lineal/server.svg new file mode 100644 index 0000000..f62fd9b --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/server.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/settings-2.svg b/sandbox310/src/assets/img/icons/lineal/settings-2.svg new file mode 100644 index 0000000..ee961f2 --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/settings-2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/settings-3.svg b/sandbox310/src/assets/img/icons/lineal/settings-3.svg new file mode 100644 index 0000000..f39c9c8 --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/settings-3.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/settings.svg b/sandbox310/src/assets/img/icons/lineal/settings.svg new file mode 100644 index 0000000..4c1d7db --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/settings.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/shield-2.svg b/sandbox310/src/assets/img/icons/lineal/shield-2.svg new file mode 100644 index 0000000..04a700f --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/shield-2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/shield.svg b/sandbox310/src/assets/img/icons/lineal/shield.svg new file mode 100644 index 0000000..3b3d4ce --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/shield.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/shop-2.svg b/sandbox310/src/assets/img/icons/lineal/shop-2.svg new file mode 100644 index 0000000..cfbcb06 --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/shop-2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/shop.svg b/sandbox310/src/assets/img/icons/lineal/shop.svg new file mode 100644 index 0000000..40d0692 --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/shop.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/shope-3.svg b/sandbox310/src/assets/img/icons/lineal/shope-3.svg new file mode 100644 index 0000000..c122d0a --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/shope-3.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/shopping-basket.svg b/sandbox310/src/assets/img/icons/lineal/shopping-basket.svg new file mode 100644 index 0000000..2ebbb53 --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/shopping-basket.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/shopping-cart.svg b/sandbox310/src/assets/img/icons/lineal/shopping-cart.svg new file mode 100644 index 0000000..3a56899 --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/shopping-cart.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/show.svg b/sandbox310/src/assets/img/icons/lineal/show.svg new file mode 100644 index 0000000..343c0c3 --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/show.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/sitemap.svg b/sandbox310/src/assets/img/icons/lineal/sitemap.svg new file mode 100644 index 0000000..c3be67d --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/sitemap.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/smartphone-2.svg b/sandbox310/src/assets/img/icons/lineal/smartphone-2.svg new file mode 100644 index 0000000..bc0d733 --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/smartphone-2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/smartphone-3.svg b/sandbox310/src/assets/img/icons/lineal/smartphone-3.svg new file mode 100644 index 0000000..28c9048 --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/smartphone-3.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/smartphone-4.svg b/sandbox310/src/assets/img/icons/lineal/smartphone-4.svg new file mode 100644 index 0000000..f649b7d --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/smartphone-4.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/smartphone.svg b/sandbox310/src/assets/img/icons/lineal/smartphone.svg new file mode 100644 index 0000000..80acc94 --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/smartphone.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/smartwatch.svg b/sandbox310/src/assets/img/icons/lineal/smartwatch.svg new file mode 100644 index 0000000..bd8de45 --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/smartwatch.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/speedometer.svg b/sandbox310/src/assets/img/icons/lineal/speedometer.svg new file mode 100644 index 0000000..15d7896 --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/speedometer.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/square.svg b/sandbox310/src/assets/img/icons/lineal/square.svg new file mode 100644 index 0000000..95bd752 --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/square.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/stars.svg b/sandbox310/src/assets/img/icons/lineal/stars.svg new file mode 100644 index 0000000..021114c --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/stars.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/startup.svg b/sandbox310/src/assets/img/icons/lineal/startup.svg new file mode 100644 index 0000000..2c2e7cf --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/startup.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/statistics.svg b/sandbox310/src/assets/img/icons/lineal/statistics.svg new file mode 100644 index 0000000..55c072f --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/statistics.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/sticker.svg b/sandbox310/src/assets/img/icons/lineal/sticker.svg new file mode 100644 index 0000000..c09a3c1 --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/sticker.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/target-2.svg b/sandbox310/src/assets/img/icons/lineal/target-2.svg new file mode 100644 index 0000000..88223f5 --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/target-2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/target.svg b/sandbox310/src/assets/img/icons/lineal/target.svg new file mode 100644 index 0000000..a8a5075 --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/target.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/team.svg b/sandbox310/src/assets/img/icons/lineal/team.svg new file mode 100644 index 0000000..592ba27 --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/team.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/telemarketer.svg b/sandbox310/src/assets/img/icons/lineal/telemarketer.svg new file mode 100644 index 0000000..2d94201 --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/telemarketer.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/telephone-2.svg b/sandbox310/src/assets/img/icons/lineal/telephone-2.svg new file mode 100644 index 0000000..474da05 --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/telephone-2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/telephone-3.svg b/sandbox310/src/assets/img/icons/lineal/telephone-3.svg new file mode 100644 index 0000000..f6167ff --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/telephone-3.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/telephone.svg b/sandbox310/src/assets/img/icons/lineal/telephone.svg new file mode 100644 index 0000000..ae2b03b --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/telephone.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/television.svg b/sandbox310/src/assets/img/icons/lineal/television.svg new file mode 100644 index 0000000..bdb8418 --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/television.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/tie.svg b/sandbox310/src/assets/img/icons/lineal/tie.svg new file mode 100644 index 0000000..df22464 --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/tie.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/tools.svg b/sandbox310/src/assets/img/icons/lineal/tools.svg new file mode 100644 index 0000000..c9e544c --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/tools.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/touch-screen.svg b/sandbox310/src/assets/img/icons/lineal/touch-screen.svg new file mode 100644 index 0000000..2092e0f --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/touch-screen.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/truck.svg b/sandbox310/src/assets/img/icons/lineal/truck.svg new file mode 100644 index 0000000..fb470eb --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/truck.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/upload.svg b/sandbox310/src/assets/img/icons/lineal/upload.svg new file mode 100644 index 0000000..e991256 --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/upload.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/user.svg b/sandbox310/src/assets/img/icons/lineal/user.svg new file mode 100644 index 0000000..6b65da5 --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/user.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/video-2.svg b/sandbox310/src/assets/img/icons/lineal/video-2.svg new file mode 100644 index 0000000..5166afd --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/video-2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/video-camera.svg b/sandbox310/src/assets/img/icons/lineal/video-camera.svg new file mode 100644 index 0000000..3748fdb --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/video-camera.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/video-editing.svg b/sandbox310/src/assets/img/icons/lineal/video-editing.svg new file mode 100644 index 0000000..19745a2 --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/video-editing.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/video.svg b/sandbox310/src/assets/img/icons/lineal/video.svg new file mode 100644 index 0000000..e14903a --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/video.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/wallet.svg b/sandbox310/src/assets/img/icons/lineal/wallet.svg new file mode 100644 index 0000000..5136c85 --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/wallet.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/watercolor.svg b/sandbox310/src/assets/img/icons/lineal/watercolor.svg new file mode 100644 index 0000000..d716b91 --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/watercolor.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/web.svg b/sandbox310/src/assets/img/icons/lineal/web.svg new file mode 100644 index 0000000..d200256 --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/web.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/lineal/workflow.svg b/sandbox310/src/assets/img/icons/lineal/workflow.svg new file mode 100644 index 0000000..374e6ed --- /dev/null +++ b/sandbox310/src/assets/img/icons/lineal/workflow.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/3d.svg b/sandbox310/src/assets/img/icons/solid/3d.svg new file mode 100644 index 0000000..86c55bc --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/3d.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/alarm.svg b/sandbox310/src/assets/img/icons/solid/alarm.svg new file mode 100644 index 0000000..2b7530f --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/alarm.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/audience.svg b/sandbox310/src/assets/img/icons/solid/audience.svg new file mode 100644 index 0000000..9f35032 --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/audience.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/badge.svg b/sandbox310/src/assets/img/icons/solid/badge.svg new file mode 100644 index 0000000..ca9b4a2 --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/badge.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/bar-chart-2.svg b/sandbox310/src/assets/img/icons/solid/bar-chart-2.svg new file mode 100644 index 0000000..e5dc63d --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/bar-chart-2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/bar-chart.svg b/sandbox310/src/assets/img/icons/solid/bar-chart.svg new file mode 100644 index 0000000..c27c37c --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/bar-chart.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/bell.svg b/sandbox310/src/assets/img/icons/solid/bell.svg new file mode 100644 index 0000000..29ccf09 --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/bell.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/briefcase.svg b/sandbox310/src/assets/img/icons/solid/briefcase.svg new file mode 100644 index 0000000..784b4c9 --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/briefcase.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/bucket.svg b/sandbox310/src/assets/img/icons/solid/bucket.svg new file mode 100644 index 0000000..a665f7d --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/bucket.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/building.svg b/sandbox310/src/assets/img/icons/solid/building.svg new file mode 100644 index 0000000..36f1c99 --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/building.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/bulb.svg b/sandbox310/src/assets/img/icons/solid/bulb.svg new file mode 100644 index 0000000..f095151 --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/bulb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/bullhorn.svg b/sandbox310/src/assets/img/icons/solid/bullhorn.svg new file mode 100644 index 0000000..db62a73 --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/bullhorn.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/calendar.svg b/sandbox310/src/assets/img/icons/solid/calendar.svg new file mode 100644 index 0000000..b8e80d4 --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/calendar.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/camera.svg b/sandbox310/src/assets/img/icons/solid/camera.svg new file mode 100644 index 0000000..7661ef4 --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/camera.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/chatting-2.svg b/sandbox310/src/assets/img/icons/solid/chatting-2.svg new file mode 100644 index 0000000..9a61941 --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/chatting-2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/chatting.svg b/sandbox310/src/assets/img/icons/solid/chatting.svg new file mode 100644 index 0000000..f4e5bbf --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/chatting.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/checked.svg b/sandbox310/src/assets/img/icons/solid/checked.svg new file mode 100644 index 0000000..47401e3 --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/checked.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/clipboard.svg b/sandbox310/src/assets/img/icons/solid/clipboard.svg new file mode 100644 index 0000000..08a0a03 --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/clipboard.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/cloud-download.svg b/sandbox310/src/assets/img/icons/solid/cloud-download.svg new file mode 100644 index 0000000..8c0eae4 --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/cloud-download.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/cloud-group.svg b/sandbox310/src/assets/img/icons/solid/cloud-group.svg new file mode 100644 index 0000000..6f30363 --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/cloud-group.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/cloud-network-2.svg b/sandbox310/src/assets/img/icons/solid/cloud-network-2.svg new file mode 100644 index 0000000..6676fc1 --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/cloud-network-2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/cloud-network.svg b/sandbox310/src/assets/img/icons/solid/cloud-network.svg new file mode 100644 index 0000000..a8dfb83 --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/cloud-network.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/cloud-transfer.svg b/sandbox310/src/assets/img/icons/solid/cloud-transfer.svg new file mode 100644 index 0000000..1b89246 --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/cloud-transfer.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/code.svg b/sandbox310/src/assets/img/icons/solid/code.svg new file mode 100644 index 0000000..e688c43 --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/code.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/coffee-cup.svg b/sandbox310/src/assets/img/icons/solid/coffee-cup.svg new file mode 100644 index 0000000..db016bb --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/coffee-cup.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/coin-decrease.svg b/sandbox310/src/assets/img/icons/solid/coin-decrease.svg new file mode 100644 index 0000000..8d35c82 --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/coin-decrease.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/coin-lock.svg b/sandbox310/src/assets/img/icons/solid/coin-lock.svg new file mode 100644 index 0000000..0528b6b --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/coin-lock.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/coin-reload.svg b/sandbox310/src/assets/img/icons/solid/coin-reload.svg new file mode 100644 index 0000000..6691d81 --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/coin-reload.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/coin-rise.svg b/sandbox310/src/assets/img/icons/solid/coin-rise.svg new file mode 100644 index 0000000..9825845 --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/coin-rise.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/coin.svg b/sandbox310/src/assets/img/icons/solid/coin.svg new file mode 100644 index 0000000..54059c4 --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/coin.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/compare.svg b/sandbox310/src/assets/img/icons/solid/compare.svg new file mode 100644 index 0000000..6721760 --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/compare.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/computer.svg b/sandbox310/src/assets/img/icons/solid/computer.svg new file mode 100644 index 0000000..54da5c9 --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/computer.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/conference.svg b/sandbox310/src/assets/img/icons/solid/conference.svg new file mode 100644 index 0000000..4b11deb --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/conference.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/content.svg b/sandbox310/src/assets/img/icons/solid/content.svg new file mode 100644 index 0000000..2bd9d7a --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/content.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/controls-2.svg b/sandbox310/src/assets/img/icons/solid/controls-2.svg new file mode 100644 index 0000000..ce1dc07 --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/controls-2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/controls.svg b/sandbox310/src/assets/img/icons/solid/controls.svg new file mode 100644 index 0000000..21c5e94 --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/controls.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/crop.svg b/sandbox310/src/assets/img/icons/solid/crop.svg new file mode 100644 index 0000000..beb01d3 --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/crop.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/crosshair.svg b/sandbox310/src/assets/img/icons/solid/crosshair.svg new file mode 100644 index 0000000..4fd662f --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/crosshair.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/deal.svg b/sandbox310/src/assets/img/icons/solid/deal.svg new file mode 100644 index 0000000..2d1de94 --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/deal.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/delivery-box.svg b/sandbox310/src/assets/img/icons/solid/delivery-box.svg new file mode 100644 index 0000000..b1b90bf --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/delivery-box.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/devices.svg b/sandbox310/src/assets/img/icons/solid/devices.svg new file mode 100644 index 0000000..16e81ed --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/devices.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/director.svg b/sandbox310/src/assets/img/icons/solid/director.svg new file mode 100644 index 0000000..4ec1fca --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/director.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/discussion.svg b/sandbox310/src/assets/img/icons/solid/discussion.svg new file mode 100644 index 0000000..6fff5d2 --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/discussion.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/dot.svg b/sandbox310/src/assets/img/icons/solid/dot.svg new file mode 100644 index 0000000..c515010 --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/dot.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/double-click.svg b/sandbox310/src/assets/img/icons/solid/double-click.svg new file mode 100644 index 0000000..d6976bc --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/double-click.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/e-commerce.svg b/sandbox310/src/assets/img/icons/solid/e-commerce.svg new file mode 100644 index 0000000..d39427d --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/e-commerce.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/edit-2.svg b/sandbox310/src/assets/img/icons/solid/edit-2.svg new file mode 100644 index 0000000..dce465c --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/edit-2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/edit.svg b/sandbox310/src/assets/img/icons/solid/edit.svg new file mode 100644 index 0000000..e5d4c32 --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/edit.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/email-2.svg b/sandbox310/src/assets/img/icons/solid/email-2.svg new file mode 100644 index 0000000..6321a36 --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/email-2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/emails.svg b/sandbox310/src/assets/img/icons/solid/emails.svg new file mode 100644 index 0000000..cae427d --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/emails.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/employees.svg b/sandbox310/src/assets/img/icons/solid/employees.svg new file mode 100644 index 0000000..5b3dcf3 --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/employees.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/feather.svg b/sandbox310/src/assets/img/icons/solid/feather.svg new file mode 100644 index 0000000..eb47456 --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/feather.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/gamepad.svg b/sandbox310/src/assets/img/icons/solid/gamepad.svg new file mode 100644 index 0000000..9b1d979 --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/gamepad.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/gears.svg b/sandbox310/src/assets/img/icons/solid/gears.svg new file mode 100644 index 0000000..f921966 --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/gears.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/globe-2.svg b/sandbox310/src/assets/img/icons/solid/globe-2.svg new file mode 100644 index 0000000..5fba58a --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/globe-2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/graph.svg b/sandbox310/src/assets/img/icons/solid/graph.svg new file mode 100644 index 0000000..8c7874a --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/graph.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/headphone.svg b/sandbox310/src/assets/img/icons/solid/headphone.svg new file mode 100644 index 0000000..77126f9 --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/headphone.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/health-insurance.svg b/sandbox310/src/assets/img/icons/solid/health-insurance.svg new file mode 100644 index 0000000..9cf41ab --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/health-insurance.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/image.svg b/sandbox310/src/assets/img/icons/solid/image.svg new file mode 100644 index 0000000..f705145 --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/image.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/images.svg b/sandbox310/src/assets/img/icons/solid/images.svg new file mode 100644 index 0000000..dce0396 --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/images.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/infographic.svg b/sandbox310/src/assets/img/icons/solid/infographic.svg new file mode 100644 index 0000000..ff8320c --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/infographic.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/lamp.svg b/sandbox310/src/assets/img/icons/solid/lamp.svg new file mode 100644 index 0000000..87e4939 --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/lamp.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/layers.svg b/sandbox310/src/assets/img/icons/solid/layers.svg new file mode 100644 index 0000000..7e91369 --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/layers.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/layout-2.svg b/sandbox310/src/assets/img/icons/solid/layout-2.svg new file mode 100644 index 0000000..20f24fb --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/layout-2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/layout-3.svg b/sandbox310/src/assets/img/icons/solid/layout-3.svg new file mode 100644 index 0000000..ced53ab --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/layout-3.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/layout.svg b/sandbox310/src/assets/img/icons/solid/layout.svg new file mode 100644 index 0000000..dc46c31 --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/layout.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/like.svg b/sandbox310/src/assets/img/icons/solid/like.svg new file mode 100644 index 0000000..645db38 --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/like.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/link.svg b/sandbox310/src/assets/img/icons/solid/link.svg new file mode 100644 index 0000000..41a2690 --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/link.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/list.svg b/sandbox310/src/assets/img/icons/solid/list.svg new file mode 100644 index 0000000..cfb12ea --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/list.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/lock.svg b/sandbox310/src/assets/img/icons/solid/lock.svg new file mode 100644 index 0000000..f78ad71 --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/lock.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/love.svg b/sandbox310/src/assets/img/icons/solid/love.svg new file mode 100644 index 0000000..4dc67c4 --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/love.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/marker.svg b/sandbox310/src/assets/img/icons/solid/marker.svg new file mode 100644 index 0000000..06f8057 --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/marker.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/mask.svg b/sandbox310/src/assets/img/icons/solid/mask.svg new file mode 100644 index 0000000..6d07411 --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/mask.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/medal.svg b/sandbox310/src/assets/img/icons/solid/medal.svg new file mode 100644 index 0000000..5c58a34 --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/medal.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/monitor.svg b/sandbox310/src/assets/img/icons/solid/monitor.svg new file mode 100644 index 0000000..f62d788 --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/monitor.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/navigation.svg b/sandbox310/src/assets/img/icons/solid/navigation.svg new file mode 100644 index 0000000..f7f9fbc --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/navigation.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/network.svg b/sandbox310/src/assets/img/icons/solid/network.svg new file mode 100644 index 0000000..06ddf88 --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/network.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/note.svg b/sandbox310/src/assets/img/icons/solid/note.svg new file mode 100644 index 0000000..2d7611c --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/note.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/paint.svg b/sandbox310/src/assets/img/icons/solid/paint.svg new file mode 100644 index 0000000..433b6f4 --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/paint.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/paper-plane.svg b/sandbox310/src/assets/img/icons/solid/paper-plane.svg new file mode 100644 index 0000000..87518b2 --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/paper-plane.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/partnership.svg b/sandbox310/src/assets/img/icons/solid/partnership.svg new file mode 100644 index 0000000..d013b8c --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/partnership.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/pen-tool.svg b/sandbox310/src/assets/img/icons/solid/pen-tool.svg new file mode 100644 index 0000000..6a50874 --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/pen-tool.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/pie-chart.svg b/sandbox310/src/assets/img/icons/solid/pie-chart.svg new file mode 100644 index 0000000..7423533 --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/pie-chart.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/pin.svg b/sandbox310/src/assets/img/icons/solid/pin.svg new file mode 100644 index 0000000..3850720 --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/pin.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/plane.svg b/sandbox310/src/assets/img/icons/solid/plane.svg new file mode 100644 index 0000000..cafc4f0 --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/plane.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/price-tag.svg b/sandbox310/src/assets/img/icons/solid/price-tag.svg new file mode 100644 index 0000000..14aaf82 --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/price-tag.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/printer.svg b/sandbox310/src/assets/img/icons/solid/printer.svg new file mode 100644 index 0000000..61be526 --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/printer.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/push-cart.svg b/sandbox310/src/assets/img/icons/solid/push-cart.svg new file mode 100644 index 0000000..eb1af07 --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/push-cart.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/puzzle.svg b/sandbox310/src/assets/img/icons/solid/puzzle.svg new file mode 100644 index 0000000..788f4ce --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/puzzle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/rocket.svg b/sandbox310/src/assets/img/icons/solid/rocket.svg new file mode 100644 index 0000000..ba41c6d --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/rocket.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/roller.svg b/sandbox310/src/assets/img/icons/solid/roller.svg new file mode 100644 index 0000000..f34694e --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/roller.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/rotary.svg b/sandbox310/src/assets/img/icons/solid/rotary.svg new file mode 100644 index 0000000..5e4584d --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/rotary.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/safe.svg b/sandbox310/src/assets/img/icons/solid/safe.svg new file mode 100644 index 0000000..7e78c7b --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/safe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/script.svg b/sandbox310/src/assets/img/icons/solid/script.svg new file mode 100644 index 0000000..db1d09d --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/script.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/search.svg b/sandbox310/src/assets/img/icons/solid/search.svg new file mode 100644 index 0000000..9be2eeb --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/search.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/secure.svg b/sandbox310/src/assets/img/icons/solid/secure.svg new file mode 100644 index 0000000..b34a335 --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/secure.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/selected.svg b/sandbox310/src/assets/img/icons/solid/selected.svg new file mode 100644 index 0000000..854a32a --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/selected.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/seo-2.svg b/sandbox310/src/assets/img/icons/solid/seo-2.svg new file mode 100644 index 0000000..280f8bc --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/seo-2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/seo.svg b/sandbox310/src/assets/img/icons/solid/seo.svg new file mode 100644 index 0000000..c476b2e --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/seo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/server.svg b/sandbox310/src/assets/img/icons/solid/server.svg new file mode 100644 index 0000000..f50f386 --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/server.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/setting.svg b/sandbox310/src/assets/img/icons/solid/setting.svg new file mode 100644 index 0000000..6406227 --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/setting.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/share.svg b/sandbox310/src/assets/img/icons/solid/share.svg new file mode 100644 index 0000000..4bec9a3 --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/share.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/sharing.svg b/sandbox310/src/assets/img/icons/solid/sharing.svg new file mode 100644 index 0000000..85f6dd1 --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/sharing.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/shipment.svg b/sandbox310/src/assets/img/icons/solid/shipment.svg new file mode 100644 index 0000000..3e343ea --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/shipment.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/shopping-bag.svg b/sandbox310/src/assets/img/icons/solid/shopping-bag.svg new file mode 100644 index 0000000..2976b49 --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/shopping-bag.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/shopping-basket.svg b/sandbox310/src/assets/img/icons/solid/shopping-basket.svg new file mode 100644 index 0000000..574b392 --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/shopping-basket.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/shopping-cart.svg b/sandbox310/src/assets/img/icons/solid/shopping-cart.svg new file mode 100644 index 0000000..62d978a --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/shopping-cart.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/smartphone.svg b/sandbox310/src/assets/img/icons/solid/smartphone.svg new file mode 100644 index 0000000..c448225 --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/smartphone.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/supermarket.svg b/sandbox310/src/assets/img/icons/solid/supermarket.svg new file mode 100644 index 0000000..a0f5879 --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/supermarket.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/synchronize.svg b/sandbox310/src/assets/img/icons/solid/synchronize.svg new file mode 100644 index 0000000..624f3ed --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/synchronize.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/target.svg b/sandbox310/src/assets/img/icons/solid/target.svg new file mode 100644 index 0000000..1575d53 --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/target.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/team.svg b/sandbox310/src/assets/img/icons/solid/team.svg new file mode 100644 index 0000000..7c0e5db --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/team.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/toggle.svg b/sandbox310/src/assets/img/icons/solid/toggle.svg new file mode 100644 index 0000000..d90f183 --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/toggle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/touchscreen.svg b/sandbox310/src/assets/img/icons/solid/touchscreen.svg new file mode 100644 index 0000000..5a456a3 --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/touchscreen.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/transfer.svg b/sandbox310/src/assets/img/icons/solid/transfer.svg new file mode 100644 index 0000000..9c2364b --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/transfer.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/travel-insurance.svg b/sandbox310/src/assets/img/icons/solid/travel-insurance.svg new file mode 100644 index 0000000..3a5a8cf --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/travel-insurance.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/tv-screen.svg b/sandbox310/src/assets/img/icons/solid/tv-screen.svg new file mode 100644 index 0000000..9a83042 --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/tv-screen.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/verify.svg b/sandbox310/src/assets/img/icons/solid/verify.svg new file mode 100644 index 0000000..df4b458 --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/verify.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/video-chat.svg b/sandbox310/src/assets/img/icons/solid/video-chat.svg new file mode 100644 index 0000000..d555a26 --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/video-chat.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/video-player.svg b/sandbox310/src/assets/img/icons/solid/video-player.svg new file mode 100644 index 0000000..98eafff --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/video-player.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/videocall-2.svg b/sandbox310/src/assets/img/icons/solid/videocall-2.svg new file mode 100644 index 0000000..a134e5c --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/videocall-2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/videocall.svg b/sandbox310/src/assets/img/icons/solid/videocall.svg new file mode 100644 index 0000000..ccccd91 --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/videocall.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/wallet.svg b/sandbox310/src/assets/img/icons/solid/wallet.svg new file mode 100644 index 0000000..8b75853 --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/wallet.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/web-browser.svg b/sandbox310/src/assets/img/icons/solid/web-browser.svg new file mode 100644 index 0000000..a263e9d --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/web-browser.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/icons/solid/web-programming.svg b/sandbox310/src/assets/img/icons/solid/web-programming.svg new file mode 100644 index 0000000..707e67f --- /dev/null +++ b/sandbox310/src/assets/img/icons/solid/web-programming.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/illustrations/3d1.png b/sandbox310/src/assets/img/illustrations/3d1.png new file mode 100644 index 0000000..c87724c Binary files /dev/null and b/sandbox310/src/assets/img/illustrations/3d1.png differ diff --git a/sandbox310/src/assets/img/illustrations/3d10.png b/sandbox310/src/assets/img/illustrations/3d10.png new file mode 100644 index 0000000..a65c5a2 Binary files /dev/null and b/sandbox310/src/assets/img/illustrations/3d10.png differ diff --git a/sandbox310/src/assets/img/illustrations/3d10@2x.png b/sandbox310/src/assets/img/illustrations/3d10@2x.png new file mode 100644 index 0000000..ac7537d Binary files /dev/null and b/sandbox310/src/assets/img/illustrations/3d10@2x.png differ diff --git a/sandbox310/src/assets/img/illustrations/3d11.png b/sandbox310/src/assets/img/illustrations/3d11.png new file mode 100644 index 0000000..ec7a775 Binary files /dev/null and b/sandbox310/src/assets/img/illustrations/3d11.png differ diff --git a/sandbox310/src/assets/img/illustrations/3d11@2x.png b/sandbox310/src/assets/img/illustrations/3d11@2x.png new file mode 100644 index 0000000..8c178c8 Binary files /dev/null and b/sandbox310/src/assets/img/illustrations/3d11@2x.png differ diff --git a/sandbox310/src/assets/img/illustrations/3d12.png b/sandbox310/src/assets/img/illustrations/3d12.png new file mode 100644 index 0000000..f18cda4 Binary files /dev/null and b/sandbox310/src/assets/img/illustrations/3d12.png differ diff --git a/sandbox310/src/assets/img/illustrations/3d12@2x.png b/sandbox310/src/assets/img/illustrations/3d12@2x.png new file mode 100644 index 0000000..afc7304 Binary files /dev/null and b/sandbox310/src/assets/img/illustrations/3d12@2x.png differ diff --git a/sandbox310/src/assets/img/illustrations/3d1@2x.png b/sandbox310/src/assets/img/illustrations/3d1@2x.png new file mode 100644 index 0000000..0d079a7 Binary files /dev/null and b/sandbox310/src/assets/img/illustrations/3d1@2x.png differ diff --git a/sandbox310/src/assets/img/illustrations/3d2.png b/sandbox310/src/assets/img/illustrations/3d2.png new file mode 100644 index 0000000..37b6652 Binary files /dev/null and b/sandbox310/src/assets/img/illustrations/3d2.png differ diff --git a/sandbox310/src/assets/img/illustrations/3d2@2x.png b/sandbox310/src/assets/img/illustrations/3d2@2x.png new file mode 100644 index 0000000..042e6bf Binary files /dev/null and b/sandbox310/src/assets/img/illustrations/3d2@2x.png differ diff --git a/sandbox310/src/assets/img/illustrations/3d3.png b/sandbox310/src/assets/img/illustrations/3d3.png new file mode 100644 index 0000000..08279a0 Binary files /dev/null and b/sandbox310/src/assets/img/illustrations/3d3.png differ diff --git a/sandbox310/src/assets/img/illustrations/3d3@2x.png b/sandbox310/src/assets/img/illustrations/3d3@2x.png new file mode 100644 index 0000000..1be39c9 Binary files /dev/null and b/sandbox310/src/assets/img/illustrations/3d3@2x.png differ diff --git a/sandbox310/src/assets/img/illustrations/3d4.png b/sandbox310/src/assets/img/illustrations/3d4.png new file mode 100644 index 0000000..1d3fe14 Binary files /dev/null and b/sandbox310/src/assets/img/illustrations/3d4.png differ diff --git a/sandbox310/src/assets/img/illustrations/3d4@2x.png b/sandbox310/src/assets/img/illustrations/3d4@2x.png new file mode 100644 index 0000000..f1b9674 Binary files /dev/null and b/sandbox310/src/assets/img/illustrations/3d4@2x.png differ diff --git a/sandbox310/src/assets/img/illustrations/3d5.png b/sandbox310/src/assets/img/illustrations/3d5.png new file mode 100644 index 0000000..1324db5 Binary files /dev/null and b/sandbox310/src/assets/img/illustrations/3d5.png differ diff --git a/sandbox310/src/assets/img/illustrations/3d5@2x.png b/sandbox310/src/assets/img/illustrations/3d5@2x.png new file mode 100644 index 0000000..b8737e5 Binary files /dev/null and b/sandbox310/src/assets/img/illustrations/3d5@2x.png differ diff --git a/sandbox310/src/assets/img/illustrations/3d6.png b/sandbox310/src/assets/img/illustrations/3d6.png new file mode 100644 index 0000000..601da63 Binary files /dev/null and b/sandbox310/src/assets/img/illustrations/3d6.png differ diff --git a/sandbox310/src/assets/img/illustrations/3d6@2x.png b/sandbox310/src/assets/img/illustrations/3d6@2x.png new file mode 100644 index 0000000..8b73cc4 Binary files /dev/null and b/sandbox310/src/assets/img/illustrations/3d6@2x.png differ diff --git a/sandbox310/src/assets/img/illustrations/3d7.png b/sandbox310/src/assets/img/illustrations/3d7.png new file mode 100644 index 0000000..5e2cd9f Binary files /dev/null and b/sandbox310/src/assets/img/illustrations/3d7.png differ diff --git a/sandbox310/src/assets/img/illustrations/3d7@2x.png b/sandbox310/src/assets/img/illustrations/3d7@2x.png new file mode 100644 index 0000000..25047bd Binary files /dev/null and b/sandbox310/src/assets/img/illustrations/3d7@2x.png differ diff --git a/sandbox310/src/assets/img/illustrations/3d8.png b/sandbox310/src/assets/img/illustrations/3d8.png new file mode 100644 index 0000000..38f66b0 Binary files /dev/null and b/sandbox310/src/assets/img/illustrations/3d8.png differ diff --git a/sandbox310/src/assets/img/illustrations/3d8@2x.png b/sandbox310/src/assets/img/illustrations/3d8@2x.png new file mode 100644 index 0000000..05910c3 Binary files /dev/null and b/sandbox310/src/assets/img/illustrations/3d8@2x.png differ diff --git a/sandbox310/src/assets/img/illustrations/3d9.png b/sandbox310/src/assets/img/illustrations/3d9.png new file mode 100644 index 0000000..9245edc Binary files /dev/null and b/sandbox310/src/assets/img/illustrations/3d9.png differ diff --git a/sandbox310/src/assets/img/illustrations/3d9@2x.png b/sandbox310/src/assets/img/illustrations/3d9@2x.png new file mode 100644 index 0000000..13acec4 Binary files /dev/null and b/sandbox310/src/assets/img/illustrations/3d9@2x.png differ diff --git a/sandbox310/src/assets/img/illustrations/404.png b/sandbox310/src/assets/img/illustrations/404.png new file mode 100644 index 0000000..2e88339 Binary files /dev/null and b/sandbox310/src/assets/img/illustrations/404.png differ diff --git a/sandbox310/src/assets/img/illustrations/404@2x.png b/sandbox310/src/assets/img/illustrations/404@2x.png new file mode 100644 index 0000000..da199aa Binary files /dev/null and b/sandbox310/src/assets/img/illustrations/404@2x.png differ diff --git a/sandbox310/src/assets/img/illustrations/i1.png b/sandbox310/src/assets/img/illustrations/i1.png new file mode 100644 index 0000000..6a1fa82 Binary files /dev/null and b/sandbox310/src/assets/img/illustrations/i1.png differ diff --git a/sandbox310/src/assets/img/illustrations/i10.png b/sandbox310/src/assets/img/illustrations/i10.png new file mode 100644 index 0000000..b9704c3 Binary files /dev/null and b/sandbox310/src/assets/img/illustrations/i10.png differ diff --git a/sandbox310/src/assets/img/illustrations/i10@2x.png b/sandbox310/src/assets/img/illustrations/i10@2x.png new file mode 100644 index 0000000..1d2f274 Binary files /dev/null and b/sandbox310/src/assets/img/illustrations/i10@2x.png differ diff --git a/sandbox310/src/assets/img/illustrations/i11.png b/sandbox310/src/assets/img/illustrations/i11.png new file mode 100644 index 0000000..36dfab0 Binary files /dev/null and b/sandbox310/src/assets/img/illustrations/i11.png differ diff --git a/sandbox310/src/assets/img/illustrations/i11@2x.png b/sandbox310/src/assets/img/illustrations/i11@2x.png new file mode 100644 index 0000000..38e8d54 Binary files /dev/null and b/sandbox310/src/assets/img/illustrations/i11@2x.png differ diff --git a/sandbox310/src/assets/img/illustrations/i12.png b/sandbox310/src/assets/img/illustrations/i12.png new file mode 100644 index 0000000..33842f2 Binary files /dev/null and b/sandbox310/src/assets/img/illustrations/i12.png differ diff --git a/sandbox310/src/assets/img/illustrations/i12@2x.png b/sandbox310/src/assets/img/illustrations/i12@2x.png new file mode 100644 index 0000000..5b78a42 Binary files /dev/null and b/sandbox310/src/assets/img/illustrations/i12@2x.png differ diff --git a/sandbox310/src/assets/img/illustrations/i13.png b/sandbox310/src/assets/img/illustrations/i13.png new file mode 100644 index 0000000..424e29d Binary files /dev/null and b/sandbox310/src/assets/img/illustrations/i13.png differ diff --git a/sandbox310/src/assets/img/illustrations/i13@2x.png b/sandbox310/src/assets/img/illustrations/i13@2x.png new file mode 100644 index 0000000..5a78761 Binary files /dev/null and b/sandbox310/src/assets/img/illustrations/i13@2x.png differ diff --git a/sandbox310/src/assets/img/illustrations/i14.png b/sandbox310/src/assets/img/illustrations/i14.png new file mode 100644 index 0000000..eb6282c Binary files /dev/null and b/sandbox310/src/assets/img/illustrations/i14.png differ diff --git a/sandbox310/src/assets/img/illustrations/i14@2x.png b/sandbox310/src/assets/img/illustrations/i14@2x.png new file mode 100644 index 0000000..bef459d Binary files /dev/null and b/sandbox310/src/assets/img/illustrations/i14@2x.png differ diff --git a/sandbox310/src/assets/img/illustrations/i15.png b/sandbox310/src/assets/img/illustrations/i15.png new file mode 100644 index 0000000..a68b3cd Binary files /dev/null and b/sandbox310/src/assets/img/illustrations/i15.png differ diff --git a/sandbox310/src/assets/img/illustrations/i15@2x.png b/sandbox310/src/assets/img/illustrations/i15@2x.png new file mode 100644 index 0000000..607f8f3 Binary files /dev/null and b/sandbox310/src/assets/img/illustrations/i15@2x.png differ diff --git a/sandbox310/src/assets/img/illustrations/i16.png b/sandbox310/src/assets/img/illustrations/i16.png new file mode 100644 index 0000000..f466937 Binary files /dev/null and b/sandbox310/src/assets/img/illustrations/i16.png differ diff --git a/sandbox310/src/assets/img/illustrations/i16@2x.png b/sandbox310/src/assets/img/illustrations/i16@2x.png new file mode 100644 index 0000000..b6d1ca1 Binary files /dev/null and b/sandbox310/src/assets/img/illustrations/i16@2x.png differ diff --git a/sandbox310/src/assets/img/illustrations/i17.png b/sandbox310/src/assets/img/illustrations/i17.png new file mode 100644 index 0000000..1cd4d58 Binary files /dev/null and b/sandbox310/src/assets/img/illustrations/i17.png differ diff --git a/sandbox310/src/assets/img/illustrations/i17@2x.png b/sandbox310/src/assets/img/illustrations/i17@2x.png new file mode 100644 index 0000000..b3c869e Binary files /dev/null and b/sandbox310/src/assets/img/illustrations/i17@2x.png differ diff --git a/sandbox310/src/assets/img/illustrations/i18.png b/sandbox310/src/assets/img/illustrations/i18.png new file mode 100644 index 0000000..0a849d6 Binary files /dev/null and b/sandbox310/src/assets/img/illustrations/i18.png differ diff --git a/sandbox310/src/assets/img/illustrations/i18@2x.png b/sandbox310/src/assets/img/illustrations/i18@2x.png new file mode 100644 index 0000000..2775ba5 Binary files /dev/null and b/sandbox310/src/assets/img/illustrations/i18@2x.png differ diff --git a/sandbox310/src/assets/img/illustrations/i19.png b/sandbox310/src/assets/img/illustrations/i19.png new file mode 100644 index 0000000..a4427f0 Binary files /dev/null and b/sandbox310/src/assets/img/illustrations/i19.png differ diff --git a/sandbox310/src/assets/img/illustrations/i19@2x.png b/sandbox310/src/assets/img/illustrations/i19@2x.png new file mode 100644 index 0000000..ab9cac8 Binary files /dev/null and b/sandbox310/src/assets/img/illustrations/i19@2x.png differ diff --git a/sandbox310/src/assets/img/illustrations/i1@2x.png b/sandbox310/src/assets/img/illustrations/i1@2x.png new file mode 100644 index 0000000..276430e Binary files /dev/null and b/sandbox310/src/assets/img/illustrations/i1@2x.png differ diff --git a/sandbox310/src/assets/img/illustrations/i2.png b/sandbox310/src/assets/img/illustrations/i2.png new file mode 100644 index 0000000..bff1b33 Binary files /dev/null and b/sandbox310/src/assets/img/illustrations/i2.png differ diff --git a/sandbox310/src/assets/img/illustrations/i20.png b/sandbox310/src/assets/img/illustrations/i20.png new file mode 100644 index 0000000..37b2122 Binary files /dev/null and b/sandbox310/src/assets/img/illustrations/i20.png differ diff --git a/sandbox310/src/assets/img/illustrations/i20@2x.png b/sandbox310/src/assets/img/illustrations/i20@2x.png new file mode 100644 index 0000000..92c3095 Binary files /dev/null and b/sandbox310/src/assets/img/illustrations/i20@2x.png differ diff --git a/sandbox310/src/assets/img/illustrations/i21.png b/sandbox310/src/assets/img/illustrations/i21.png new file mode 100644 index 0000000..38394ab Binary files /dev/null and b/sandbox310/src/assets/img/illustrations/i21.png differ diff --git a/sandbox310/src/assets/img/illustrations/i21@2x.png b/sandbox310/src/assets/img/illustrations/i21@2x.png new file mode 100644 index 0000000..68fefce Binary files /dev/null and b/sandbox310/src/assets/img/illustrations/i21@2x.png differ diff --git a/sandbox310/src/assets/img/illustrations/i22.png b/sandbox310/src/assets/img/illustrations/i22.png new file mode 100644 index 0000000..9b1961f Binary files /dev/null and b/sandbox310/src/assets/img/illustrations/i22.png differ diff --git a/sandbox310/src/assets/img/illustrations/i22@2x.png b/sandbox310/src/assets/img/illustrations/i22@2x.png new file mode 100644 index 0000000..f93ee1b Binary files /dev/null and b/sandbox310/src/assets/img/illustrations/i22@2x.png differ diff --git a/sandbox310/src/assets/img/illustrations/i23.png b/sandbox310/src/assets/img/illustrations/i23.png new file mode 100644 index 0000000..5106b35 Binary files /dev/null and b/sandbox310/src/assets/img/illustrations/i23.png differ diff --git a/sandbox310/src/assets/img/illustrations/i23@2x.png b/sandbox310/src/assets/img/illustrations/i23@2x.png new file mode 100644 index 0000000..aaf66ae Binary files /dev/null and b/sandbox310/src/assets/img/illustrations/i23@2x.png differ diff --git a/sandbox310/src/assets/img/illustrations/i24.png b/sandbox310/src/assets/img/illustrations/i24.png new file mode 100644 index 0000000..ea3baa2 Binary files /dev/null and b/sandbox310/src/assets/img/illustrations/i24.png differ diff --git a/sandbox310/src/assets/img/illustrations/i24@2x.png b/sandbox310/src/assets/img/illustrations/i24@2x.png new file mode 100644 index 0000000..658a1ff Binary files /dev/null and b/sandbox310/src/assets/img/illustrations/i24@2x.png differ diff --git a/sandbox310/src/assets/img/illustrations/i25.png b/sandbox310/src/assets/img/illustrations/i25.png new file mode 100644 index 0000000..e39e88c Binary files /dev/null and b/sandbox310/src/assets/img/illustrations/i25.png differ diff --git a/sandbox310/src/assets/img/illustrations/i25@2x.png b/sandbox310/src/assets/img/illustrations/i25@2x.png new file mode 100644 index 0000000..b3317db Binary files /dev/null and b/sandbox310/src/assets/img/illustrations/i25@2x.png differ diff --git a/sandbox310/src/assets/img/illustrations/i26.png b/sandbox310/src/assets/img/illustrations/i26.png new file mode 100644 index 0000000..02fdff3 Binary files /dev/null and b/sandbox310/src/assets/img/illustrations/i26.png differ diff --git a/sandbox310/src/assets/img/illustrations/i26@2x.png b/sandbox310/src/assets/img/illustrations/i26@2x.png new file mode 100644 index 0000000..547eb97 Binary files /dev/null and b/sandbox310/src/assets/img/illustrations/i26@2x.png differ diff --git a/sandbox310/src/assets/img/illustrations/i27.png b/sandbox310/src/assets/img/illustrations/i27.png new file mode 100644 index 0000000..8973b6e Binary files /dev/null and b/sandbox310/src/assets/img/illustrations/i27.png differ diff --git a/sandbox310/src/assets/img/illustrations/i27@2x.png b/sandbox310/src/assets/img/illustrations/i27@2x.png new file mode 100644 index 0000000..9f0caab Binary files /dev/null and b/sandbox310/src/assets/img/illustrations/i27@2x.png differ diff --git a/sandbox310/src/assets/img/illustrations/i2@2x.png b/sandbox310/src/assets/img/illustrations/i2@2x.png new file mode 100644 index 0000000..b195ee5 Binary files /dev/null and b/sandbox310/src/assets/img/illustrations/i2@2x.png differ diff --git a/sandbox310/src/assets/img/illustrations/i3.png b/sandbox310/src/assets/img/illustrations/i3.png new file mode 100644 index 0000000..be6f45f Binary files /dev/null and b/sandbox310/src/assets/img/illustrations/i3.png differ diff --git a/sandbox310/src/assets/img/illustrations/i3@2x.png b/sandbox310/src/assets/img/illustrations/i3@2x.png new file mode 100644 index 0000000..8efc00f Binary files /dev/null and b/sandbox310/src/assets/img/illustrations/i3@2x.png differ diff --git a/sandbox310/src/assets/img/illustrations/i4.png b/sandbox310/src/assets/img/illustrations/i4.png new file mode 100644 index 0000000..ae69475 Binary files /dev/null and b/sandbox310/src/assets/img/illustrations/i4.png differ diff --git a/sandbox310/src/assets/img/illustrations/i4@2x.png b/sandbox310/src/assets/img/illustrations/i4@2x.png new file mode 100644 index 0000000..96910a7 Binary files /dev/null and b/sandbox310/src/assets/img/illustrations/i4@2x.png differ diff --git a/sandbox310/src/assets/img/illustrations/i5.png b/sandbox310/src/assets/img/illustrations/i5.png new file mode 100644 index 0000000..461c488 Binary files /dev/null and b/sandbox310/src/assets/img/illustrations/i5.png differ diff --git a/sandbox310/src/assets/img/illustrations/i5@2x.png b/sandbox310/src/assets/img/illustrations/i5@2x.png new file mode 100644 index 0000000..3ace65a Binary files /dev/null and b/sandbox310/src/assets/img/illustrations/i5@2x.png differ diff --git a/sandbox310/src/assets/img/illustrations/i6.png b/sandbox310/src/assets/img/illustrations/i6.png new file mode 100644 index 0000000..9051688 Binary files /dev/null and b/sandbox310/src/assets/img/illustrations/i6.png differ diff --git a/sandbox310/src/assets/img/illustrations/i6@2x.png b/sandbox310/src/assets/img/illustrations/i6@2x.png new file mode 100644 index 0000000..a128cd3 Binary files /dev/null and b/sandbox310/src/assets/img/illustrations/i6@2x.png differ diff --git a/sandbox310/src/assets/img/illustrations/i7.png b/sandbox310/src/assets/img/illustrations/i7.png new file mode 100644 index 0000000..128fa85 Binary files /dev/null and b/sandbox310/src/assets/img/illustrations/i7.png differ diff --git a/sandbox310/src/assets/img/illustrations/i7@2x.png b/sandbox310/src/assets/img/illustrations/i7@2x.png new file mode 100644 index 0000000..7828ca4 Binary files /dev/null and b/sandbox310/src/assets/img/illustrations/i7@2x.png differ diff --git a/sandbox310/src/assets/img/illustrations/i8.png b/sandbox310/src/assets/img/illustrations/i8.png new file mode 100644 index 0000000..b4c4fd7 Binary files /dev/null and b/sandbox310/src/assets/img/illustrations/i8.png differ diff --git a/sandbox310/src/assets/img/illustrations/i8@2x.png b/sandbox310/src/assets/img/illustrations/i8@2x.png new file mode 100644 index 0000000..9a01443 Binary files /dev/null and b/sandbox310/src/assets/img/illustrations/i8@2x.png differ diff --git a/sandbox310/src/assets/img/illustrations/i9.png b/sandbox310/src/assets/img/illustrations/i9.png new file mode 100644 index 0000000..4c45025 Binary files /dev/null and b/sandbox310/src/assets/img/illustrations/i9.png differ diff --git a/sandbox310/src/assets/img/illustrations/i9@2x.png b/sandbox310/src/assets/img/illustrations/i9@2x.png new file mode 100644 index 0000000..c27a792 Binary files /dev/null and b/sandbox310/src/assets/img/illustrations/i9@2x.png differ diff --git a/sandbox310/src/assets/img/illustrations/ui1.png b/sandbox310/src/assets/img/illustrations/ui1.png new file mode 100644 index 0000000..1b32c30 Binary files /dev/null and b/sandbox310/src/assets/img/illustrations/ui1.png differ diff --git a/sandbox310/src/assets/img/illustrations/ui1@2x.png b/sandbox310/src/assets/img/illustrations/ui1@2x.png new file mode 100644 index 0000000..a5ed7c6 Binary files /dev/null and b/sandbox310/src/assets/img/illustrations/ui1@2x.png differ diff --git a/sandbox310/src/assets/img/illustrations/ui2.png b/sandbox310/src/assets/img/illustrations/ui2.png new file mode 100644 index 0000000..1f3cdd4 Binary files /dev/null and b/sandbox310/src/assets/img/illustrations/ui2.png differ diff --git a/sandbox310/src/assets/img/illustrations/ui2@2x.png b/sandbox310/src/assets/img/illustrations/ui2@2x.png new file mode 100644 index 0000000..0da939c Binary files /dev/null and b/sandbox310/src/assets/img/illustrations/ui2@2x.png differ diff --git a/sandbox310/src/assets/img/illustrations/ui3.png b/sandbox310/src/assets/img/illustrations/ui3.png new file mode 100644 index 0000000..4908d3a Binary files /dev/null and b/sandbox310/src/assets/img/illustrations/ui3.png differ diff --git a/sandbox310/src/assets/img/illustrations/ui3@2x.png b/sandbox310/src/assets/img/illustrations/ui3@2x.png new file mode 100644 index 0000000..aedfb82 Binary files /dev/null and b/sandbox310/src/assets/img/illustrations/ui3@2x.png differ diff --git a/sandbox310/src/assets/img/illustrations/ui4.png b/sandbox310/src/assets/img/illustrations/ui4.png new file mode 100644 index 0000000..f40da9b Binary files /dev/null and b/sandbox310/src/assets/img/illustrations/ui4.png differ diff --git a/sandbox310/src/assets/img/illustrations/ui4@2x.png b/sandbox310/src/assets/img/illustrations/ui4@2x.png new file mode 100644 index 0000000..14d7721 Binary files /dev/null and b/sandbox310/src/assets/img/illustrations/ui4@2x.png differ diff --git a/sandbox310/src/assets/img/illustrations/ui5.png b/sandbox310/src/assets/img/illustrations/ui5.png new file mode 100644 index 0000000..253b459 Binary files /dev/null and b/sandbox310/src/assets/img/illustrations/ui5.png differ diff --git a/sandbox310/src/assets/img/illustrations/ui5@2x.png b/sandbox310/src/assets/img/illustrations/ui5@2x.png new file mode 100644 index 0000000..b49cb15 Binary files /dev/null and b/sandbox310/src/assets/img/illustrations/ui5@2x.png differ diff --git a/sandbox310/src/assets/img/logo-dark.png b/sandbox310/src/assets/img/logo-dark.png new file mode 100644 index 0000000..a5310d9 Binary files /dev/null and b/sandbox310/src/assets/img/logo-dark.png differ diff --git a/sandbox310/src/assets/img/logo-dark@2x.png b/sandbox310/src/assets/img/logo-dark@2x.png new file mode 100644 index 0000000..2885b3f Binary files /dev/null and b/sandbox310/src/assets/img/logo-dark@2x.png differ diff --git a/sandbox310/src/assets/img/logo-light.png b/sandbox310/src/assets/img/logo-light.png new file mode 100644 index 0000000..1210da7 Binary files /dev/null and b/sandbox310/src/assets/img/logo-light.png differ diff --git a/sandbox310/src/assets/img/logo-light@2x.png b/sandbox310/src/assets/img/logo-light@2x.png new file mode 100644 index 0000000..d6292ff Binary files /dev/null and b/sandbox310/src/assets/img/logo-light@2x.png differ diff --git a/sandbox310/src/assets/img/logo-purple.png b/sandbox310/src/assets/img/logo-purple.png new file mode 100644 index 0000000..2f9441b Binary files /dev/null and b/sandbox310/src/assets/img/logo-purple.png differ diff --git a/sandbox310/src/assets/img/logo-purple@2x.png b/sandbox310/src/assets/img/logo-purple@2x.png new file mode 100644 index 0000000..c177ad2 Binary files /dev/null and b/sandbox310/src/assets/img/logo-purple@2x.png differ diff --git a/sandbox310/src/assets/img/logo.png b/sandbox310/src/assets/img/logo.png new file mode 100644 index 0000000..4b08601 Binary files /dev/null and b/sandbox310/src/assets/img/logo.png differ diff --git a/sandbox310/src/assets/img/logo@2x.png b/sandbox310/src/assets/img/logo@2x.png new file mode 100644 index 0000000..1151e92 Binary files /dev/null and b/sandbox310/src/assets/img/logo@2x.png differ diff --git a/sandbox310/src/assets/img/map.png b/sandbox310/src/assets/img/map.png new file mode 100644 index 0000000..d68c1b5 Binary files /dev/null and b/sandbox310/src/assets/img/map.png differ diff --git a/sandbox310/src/assets/img/pattern.png b/sandbox310/src/assets/img/pattern.png new file mode 100644 index 0000000..abf333a Binary files /dev/null and b/sandbox310/src/assets/img/pattern.png differ diff --git a/sandbox310/src/assets/img/photos/a1.jpg b/sandbox310/src/assets/img/photos/a1.jpg new file mode 100644 index 0000000..77d7662 Binary files /dev/null and b/sandbox310/src/assets/img/photos/a1.jpg differ diff --git a/sandbox310/src/assets/img/photos/a2.jpg b/sandbox310/src/assets/img/photos/a2.jpg new file mode 100644 index 0000000..2300058 Binary files /dev/null and b/sandbox310/src/assets/img/photos/a2.jpg differ diff --git a/sandbox310/src/assets/img/photos/a3.jpg b/sandbox310/src/assets/img/photos/a3.jpg new file mode 100644 index 0000000..e7b837e Binary files /dev/null and b/sandbox310/src/assets/img/photos/a3.jpg differ diff --git a/sandbox310/src/assets/img/photos/ab1.jpg b/sandbox310/src/assets/img/photos/ab1.jpg new file mode 100644 index 0000000..8545b5e Binary files /dev/null and b/sandbox310/src/assets/img/photos/ab1.jpg differ diff --git a/sandbox310/src/assets/img/photos/ab1@2x.jpg b/sandbox310/src/assets/img/photos/ab1@2x.jpg new file mode 100644 index 0000000..36ebbbe Binary files /dev/null and b/sandbox310/src/assets/img/photos/ab1@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/ab2.jpg b/sandbox310/src/assets/img/photos/ab2.jpg new file mode 100644 index 0000000..29f7aa4 Binary files /dev/null and b/sandbox310/src/assets/img/photos/ab2.jpg differ diff --git a/sandbox310/src/assets/img/photos/ab2@2x.jpg b/sandbox310/src/assets/img/photos/ab2@2x.jpg new file mode 100644 index 0000000..dd3d03f Binary files /dev/null and b/sandbox310/src/assets/img/photos/ab2@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/ab3.jpg b/sandbox310/src/assets/img/photos/ab3.jpg new file mode 100644 index 0000000..31b9f1b Binary files /dev/null and b/sandbox310/src/assets/img/photos/ab3.jpg differ diff --git a/sandbox310/src/assets/img/photos/ab3@2x.jpg b/sandbox310/src/assets/img/photos/ab3@2x.jpg new file mode 100644 index 0000000..11c0d9e Binary files /dev/null and b/sandbox310/src/assets/img/photos/ab3@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/about10.jpg b/sandbox310/src/assets/img/photos/about10.jpg new file mode 100644 index 0000000..4b29547 Binary files /dev/null and b/sandbox310/src/assets/img/photos/about10.jpg differ diff --git a/sandbox310/src/assets/img/photos/about10@2x.jpg b/sandbox310/src/assets/img/photos/about10@2x.jpg new file mode 100644 index 0000000..81b1d9f Binary files /dev/null and b/sandbox310/src/assets/img/photos/about10@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/about11.jpg b/sandbox310/src/assets/img/photos/about11.jpg new file mode 100644 index 0000000..d066fb3 Binary files /dev/null and b/sandbox310/src/assets/img/photos/about11.jpg differ diff --git a/sandbox310/src/assets/img/photos/about11@2x.jpg b/sandbox310/src/assets/img/photos/about11@2x.jpg new file mode 100644 index 0000000..9e86a36 Binary files /dev/null and b/sandbox310/src/assets/img/photos/about11@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/about12.jpg b/sandbox310/src/assets/img/photos/about12.jpg new file mode 100644 index 0000000..67dffd3 Binary files /dev/null and b/sandbox310/src/assets/img/photos/about12.jpg differ diff --git a/sandbox310/src/assets/img/photos/about12@2x.jpg b/sandbox310/src/assets/img/photos/about12@2x.jpg new file mode 100644 index 0000000..6bd0d13 Binary files /dev/null and b/sandbox310/src/assets/img/photos/about12@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/about13.jpg b/sandbox310/src/assets/img/photos/about13.jpg new file mode 100644 index 0000000..0da182e Binary files /dev/null and b/sandbox310/src/assets/img/photos/about13.jpg differ diff --git a/sandbox310/src/assets/img/photos/about13@2x.jpg b/sandbox310/src/assets/img/photos/about13@2x.jpg new file mode 100644 index 0000000..66b6619 Binary files /dev/null and b/sandbox310/src/assets/img/photos/about13@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/about14.jpg b/sandbox310/src/assets/img/photos/about14.jpg new file mode 100644 index 0000000..7cab9f1 Binary files /dev/null and b/sandbox310/src/assets/img/photos/about14.jpg differ diff --git a/sandbox310/src/assets/img/photos/about14@2x.jpg b/sandbox310/src/assets/img/photos/about14@2x.jpg new file mode 100644 index 0000000..3e0fe0a Binary files /dev/null and b/sandbox310/src/assets/img/photos/about14@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/about15.jpg b/sandbox310/src/assets/img/photos/about15.jpg new file mode 100644 index 0000000..0859fa3 Binary files /dev/null and b/sandbox310/src/assets/img/photos/about15.jpg differ diff --git a/sandbox310/src/assets/img/photos/about15@2x.jpg b/sandbox310/src/assets/img/photos/about15@2x.jpg new file mode 100644 index 0000000..94f4455 Binary files /dev/null and b/sandbox310/src/assets/img/photos/about15@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/about16.jpg b/sandbox310/src/assets/img/photos/about16.jpg new file mode 100644 index 0000000..0f8fa72 Binary files /dev/null and b/sandbox310/src/assets/img/photos/about16.jpg differ diff --git a/sandbox310/src/assets/img/photos/about17.jpg b/sandbox310/src/assets/img/photos/about17.jpg new file mode 100644 index 0000000..5504b07 Binary files /dev/null and b/sandbox310/src/assets/img/photos/about17.jpg differ diff --git a/sandbox310/src/assets/img/photos/about17@2x.jpg b/sandbox310/src/assets/img/photos/about17@2x.jpg new file mode 100644 index 0000000..5f45dbc Binary files /dev/null and b/sandbox310/src/assets/img/photos/about17@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/about18.jpg b/sandbox310/src/assets/img/photos/about18.jpg new file mode 100644 index 0000000..c37a5af Binary files /dev/null and b/sandbox310/src/assets/img/photos/about18.jpg differ diff --git a/sandbox310/src/assets/img/photos/about18@2x.jpg b/sandbox310/src/assets/img/photos/about18@2x.jpg new file mode 100644 index 0000000..e978b02 Binary files /dev/null and b/sandbox310/src/assets/img/photos/about18@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/about19.jpg b/sandbox310/src/assets/img/photos/about19.jpg new file mode 100644 index 0000000..890264c Binary files /dev/null and b/sandbox310/src/assets/img/photos/about19.jpg differ diff --git a/sandbox310/src/assets/img/photos/about19@2x.jpg b/sandbox310/src/assets/img/photos/about19@2x.jpg new file mode 100644 index 0000000..0eafb8f Binary files /dev/null and b/sandbox310/src/assets/img/photos/about19@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/about2.jpg b/sandbox310/src/assets/img/photos/about2.jpg new file mode 100644 index 0000000..41e3af9 Binary files /dev/null and b/sandbox310/src/assets/img/photos/about2.jpg differ diff --git a/sandbox310/src/assets/img/photos/about20.jpg b/sandbox310/src/assets/img/photos/about20.jpg new file mode 100644 index 0000000..15fc500 Binary files /dev/null and b/sandbox310/src/assets/img/photos/about20.jpg differ diff --git a/sandbox310/src/assets/img/photos/about20@2x.jpg b/sandbox310/src/assets/img/photos/about20@2x.jpg new file mode 100644 index 0000000..8620ca6 Binary files /dev/null and b/sandbox310/src/assets/img/photos/about20@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/about21.jpg b/sandbox310/src/assets/img/photos/about21.jpg new file mode 100644 index 0000000..8fa5c8f Binary files /dev/null and b/sandbox310/src/assets/img/photos/about21.jpg differ diff --git a/sandbox310/src/assets/img/photos/about21@2x.jpg b/sandbox310/src/assets/img/photos/about21@2x.jpg new file mode 100644 index 0000000..343f58b Binary files /dev/null and b/sandbox310/src/assets/img/photos/about21@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/about22.jpg b/sandbox310/src/assets/img/photos/about22.jpg new file mode 100644 index 0000000..49949a8 Binary files /dev/null and b/sandbox310/src/assets/img/photos/about22.jpg differ diff --git a/sandbox310/src/assets/img/photos/about22@2x.jpg b/sandbox310/src/assets/img/photos/about22@2x.jpg new file mode 100644 index 0000000..51921d3 Binary files /dev/null and b/sandbox310/src/assets/img/photos/about22@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/about23.jpg b/sandbox310/src/assets/img/photos/about23.jpg new file mode 100644 index 0000000..0926b59 Binary files /dev/null and b/sandbox310/src/assets/img/photos/about23.jpg differ diff --git a/sandbox310/src/assets/img/photos/about23@2x.jpg b/sandbox310/src/assets/img/photos/about23@2x.jpg new file mode 100644 index 0000000..8c0dedb Binary files /dev/null and b/sandbox310/src/assets/img/photos/about23@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/about24.jpg b/sandbox310/src/assets/img/photos/about24.jpg new file mode 100644 index 0000000..10ed4e3 Binary files /dev/null and b/sandbox310/src/assets/img/photos/about24.jpg differ diff --git a/sandbox310/src/assets/img/photos/about24@2x.jpg b/sandbox310/src/assets/img/photos/about24@2x.jpg new file mode 100644 index 0000000..a04165d Binary files /dev/null and b/sandbox310/src/assets/img/photos/about24@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/about25.jpg b/sandbox310/src/assets/img/photos/about25.jpg new file mode 100644 index 0000000..5d92e78 Binary files /dev/null and b/sandbox310/src/assets/img/photos/about25.jpg differ diff --git a/sandbox310/src/assets/img/photos/about25@2x.jpg b/sandbox310/src/assets/img/photos/about25@2x.jpg new file mode 100644 index 0000000..c0c7b60 Binary files /dev/null and b/sandbox310/src/assets/img/photos/about25@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/about26.png b/sandbox310/src/assets/img/photos/about26.png new file mode 100644 index 0000000..45a3193 Binary files /dev/null and b/sandbox310/src/assets/img/photos/about26.png differ diff --git a/sandbox310/src/assets/img/photos/about26@2x.png b/sandbox310/src/assets/img/photos/about26@2x.png new file mode 100644 index 0000000..c214210 Binary files /dev/null and b/sandbox310/src/assets/img/photos/about26@2x.png differ diff --git a/sandbox310/src/assets/img/photos/about27.jpg b/sandbox310/src/assets/img/photos/about27.jpg new file mode 100644 index 0000000..38424b4 Binary files /dev/null and b/sandbox310/src/assets/img/photos/about27.jpg differ diff --git a/sandbox310/src/assets/img/photos/about27@2x.jpg b/sandbox310/src/assets/img/photos/about27@2x.jpg new file mode 100644 index 0000000..5999b0a Binary files /dev/null and b/sandbox310/src/assets/img/photos/about27@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/about2@2x.jpg b/sandbox310/src/assets/img/photos/about2@2x.jpg new file mode 100644 index 0000000..0529bc2 Binary files /dev/null and b/sandbox310/src/assets/img/photos/about2@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/about3.jpg b/sandbox310/src/assets/img/photos/about3.jpg new file mode 100644 index 0000000..49701f0 Binary files /dev/null and b/sandbox310/src/assets/img/photos/about3.jpg differ diff --git a/sandbox310/src/assets/img/photos/about3@2x.jpg b/sandbox310/src/assets/img/photos/about3@2x.jpg new file mode 100644 index 0000000..ffdd0c1 Binary files /dev/null and b/sandbox310/src/assets/img/photos/about3@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/about4.jpg b/sandbox310/src/assets/img/photos/about4.jpg new file mode 100644 index 0000000..9137062 Binary files /dev/null and b/sandbox310/src/assets/img/photos/about4.jpg differ diff --git a/sandbox310/src/assets/img/photos/about4@2x.jpg b/sandbox310/src/assets/img/photos/about4@2x.jpg new file mode 100644 index 0000000..cbbc350 Binary files /dev/null and b/sandbox310/src/assets/img/photos/about4@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/about5.jpg b/sandbox310/src/assets/img/photos/about5.jpg new file mode 100644 index 0000000..d98927a Binary files /dev/null and b/sandbox310/src/assets/img/photos/about5.jpg differ diff --git a/sandbox310/src/assets/img/photos/about5@2x.jpg b/sandbox310/src/assets/img/photos/about5@2x.jpg new file mode 100644 index 0000000..431a925 Binary files /dev/null and b/sandbox310/src/assets/img/photos/about5@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/about6.jpg b/sandbox310/src/assets/img/photos/about6.jpg new file mode 100644 index 0000000..fbf20b6 Binary files /dev/null and b/sandbox310/src/assets/img/photos/about6.jpg differ diff --git a/sandbox310/src/assets/img/photos/about7.jpg b/sandbox310/src/assets/img/photos/about7.jpg new file mode 100644 index 0000000..770723d Binary files /dev/null and b/sandbox310/src/assets/img/photos/about7.jpg differ diff --git a/sandbox310/src/assets/img/photos/about7@2x.jpg b/sandbox310/src/assets/img/photos/about7@2x.jpg new file mode 100644 index 0000000..b7a9e58 Binary files /dev/null and b/sandbox310/src/assets/img/photos/about7@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/about8.jpg b/sandbox310/src/assets/img/photos/about8.jpg new file mode 100644 index 0000000..1177273 Binary files /dev/null and b/sandbox310/src/assets/img/photos/about8.jpg differ diff --git a/sandbox310/src/assets/img/photos/about8@2x.jpg b/sandbox310/src/assets/img/photos/about8@2x.jpg new file mode 100644 index 0000000..a8d837d Binary files /dev/null and b/sandbox310/src/assets/img/photos/about8@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/about9.jpg b/sandbox310/src/assets/img/photos/about9.jpg new file mode 100644 index 0000000..1afa2d0 Binary files /dev/null and b/sandbox310/src/assets/img/photos/about9.jpg differ diff --git a/sandbox310/src/assets/img/photos/about9@2x.jpg b/sandbox310/src/assets/img/photos/about9@2x.jpg new file mode 100644 index 0000000..70b5ea7 Binary files /dev/null and b/sandbox310/src/assets/img/photos/about9@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/b1.jpg b/sandbox310/src/assets/img/photos/b1.jpg new file mode 100644 index 0000000..8c53dd7 Binary files /dev/null and b/sandbox310/src/assets/img/photos/b1.jpg differ diff --git a/sandbox310/src/assets/img/photos/b10-full.jpg b/sandbox310/src/assets/img/photos/b10-full.jpg new file mode 100644 index 0000000..8a2040b Binary files /dev/null and b/sandbox310/src/assets/img/photos/b10-full.jpg differ diff --git a/sandbox310/src/assets/img/photos/b10.jpg b/sandbox310/src/assets/img/photos/b10.jpg new file mode 100644 index 0000000..cde4ef4 Binary files /dev/null and b/sandbox310/src/assets/img/photos/b10.jpg differ diff --git a/sandbox310/src/assets/img/photos/b11-full.jpg b/sandbox310/src/assets/img/photos/b11-full.jpg new file mode 100644 index 0000000..90510a6 Binary files /dev/null and b/sandbox310/src/assets/img/photos/b11-full.jpg differ diff --git a/sandbox310/src/assets/img/photos/b11.jpg b/sandbox310/src/assets/img/photos/b11.jpg new file mode 100644 index 0000000..04ce762 Binary files /dev/null and b/sandbox310/src/assets/img/photos/b11.jpg differ diff --git a/sandbox310/src/assets/img/photos/b2.jpg b/sandbox310/src/assets/img/photos/b2.jpg new file mode 100644 index 0000000..e5bb040 Binary files /dev/null and b/sandbox310/src/assets/img/photos/b2.jpg differ diff --git a/sandbox310/src/assets/img/photos/b3.jpg b/sandbox310/src/assets/img/photos/b3.jpg new file mode 100644 index 0000000..0179c9b Binary files /dev/null and b/sandbox310/src/assets/img/photos/b3.jpg differ diff --git a/sandbox310/src/assets/img/photos/b4.jpg b/sandbox310/src/assets/img/photos/b4.jpg new file mode 100644 index 0000000..04ed0f3 Binary files /dev/null and b/sandbox310/src/assets/img/photos/b4.jpg differ diff --git a/sandbox310/src/assets/img/photos/b5.jpg b/sandbox310/src/assets/img/photos/b5.jpg new file mode 100644 index 0000000..dcd5a23 Binary files /dev/null and b/sandbox310/src/assets/img/photos/b5.jpg differ diff --git a/sandbox310/src/assets/img/photos/b6.jpg b/sandbox310/src/assets/img/photos/b6.jpg new file mode 100644 index 0000000..dc87aaf Binary files /dev/null and b/sandbox310/src/assets/img/photos/b6.jpg differ diff --git a/sandbox310/src/assets/img/photos/b7.jpg b/sandbox310/src/assets/img/photos/b7.jpg new file mode 100644 index 0000000..798ba2f Binary files /dev/null and b/sandbox310/src/assets/img/photos/b7.jpg differ diff --git a/sandbox310/src/assets/img/photos/b8-full.jpg b/sandbox310/src/assets/img/photos/b8-full.jpg new file mode 100644 index 0000000..66e97e8 Binary files /dev/null and b/sandbox310/src/assets/img/photos/b8-full.jpg differ diff --git a/sandbox310/src/assets/img/photos/b8.jpg b/sandbox310/src/assets/img/photos/b8.jpg new file mode 100644 index 0000000..fe865ed Binary files /dev/null and b/sandbox310/src/assets/img/photos/b8.jpg differ diff --git a/sandbox310/src/assets/img/photos/b9-full.jpg b/sandbox310/src/assets/img/photos/b9-full.jpg new file mode 100644 index 0000000..39839ba Binary files /dev/null and b/sandbox310/src/assets/img/photos/b9-full.jpg differ diff --git a/sandbox310/src/assets/img/photos/b9.jpg b/sandbox310/src/assets/img/photos/b9.jpg new file mode 100644 index 0000000..d4c8eef Binary files /dev/null and b/sandbox310/src/assets/img/photos/b9.jpg differ diff --git a/sandbox310/src/assets/img/photos/bg1.jpg b/sandbox310/src/assets/img/photos/bg1.jpg new file mode 100644 index 0000000..9153df5 Binary files /dev/null and b/sandbox310/src/assets/img/photos/bg1.jpg differ diff --git a/sandbox310/src/assets/img/photos/bg10.jpg b/sandbox310/src/assets/img/photos/bg10.jpg new file mode 100644 index 0000000..913d3df Binary files /dev/null and b/sandbox310/src/assets/img/photos/bg10.jpg differ diff --git a/sandbox310/src/assets/img/photos/bg11.jpg b/sandbox310/src/assets/img/photos/bg11.jpg new file mode 100644 index 0000000..fef6bc7 Binary files /dev/null and b/sandbox310/src/assets/img/photos/bg11.jpg differ diff --git a/sandbox310/src/assets/img/photos/bg12.jpg b/sandbox310/src/assets/img/photos/bg12.jpg new file mode 100644 index 0000000..5c5b2a5 Binary files /dev/null and b/sandbox310/src/assets/img/photos/bg12.jpg differ diff --git a/sandbox310/src/assets/img/photos/bg13.jpg b/sandbox310/src/assets/img/photos/bg13.jpg new file mode 100644 index 0000000..51583ba Binary files /dev/null and b/sandbox310/src/assets/img/photos/bg13.jpg differ diff --git a/sandbox310/src/assets/img/photos/bg14.png b/sandbox310/src/assets/img/photos/bg14.png new file mode 100644 index 0000000..b22f6c3 Binary files /dev/null and b/sandbox310/src/assets/img/photos/bg14.png differ diff --git a/sandbox310/src/assets/img/photos/bg15.png b/sandbox310/src/assets/img/photos/bg15.png new file mode 100644 index 0000000..813e1d7 Binary files /dev/null and b/sandbox310/src/assets/img/photos/bg15.png differ diff --git a/sandbox310/src/assets/img/photos/bg16.png b/sandbox310/src/assets/img/photos/bg16.png new file mode 100644 index 0000000..c168d50 Binary files /dev/null and b/sandbox310/src/assets/img/photos/bg16.png differ diff --git a/sandbox310/src/assets/img/photos/bg17.png b/sandbox310/src/assets/img/photos/bg17.png new file mode 100644 index 0000000..1e085a4 Binary files /dev/null and b/sandbox310/src/assets/img/photos/bg17.png differ diff --git a/sandbox310/src/assets/img/photos/bg18.png b/sandbox310/src/assets/img/photos/bg18.png new file mode 100644 index 0000000..084875e Binary files /dev/null and b/sandbox310/src/assets/img/photos/bg18.png differ diff --git a/sandbox310/src/assets/img/photos/bg19.png b/sandbox310/src/assets/img/photos/bg19.png new file mode 100644 index 0000000..5fe801b Binary files /dev/null and b/sandbox310/src/assets/img/photos/bg19.png differ diff --git a/sandbox310/src/assets/img/photos/bg2.jpg b/sandbox310/src/assets/img/photos/bg2.jpg new file mode 100644 index 0000000..06a6da3 Binary files /dev/null and b/sandbox310/src/assets/img/photos/bg2.jpg differ diff --git a/sandbox310/src/assets/img/photos/bg20.png b/sandbox310/src/assets/img/photos/bg20.png new file mode 100644 index 0000000..63cccbf Binary files /dev/null and b/sandbox310/src/assets/img/photos/bg20.png differ diff --git a/sandbox310/src/assets/img/photos/bg21.png b/sandbox310/src/assets/img/photos/bg21.png new file mode 100644 index 0000000..c0c4df4 Binary files /dev/null and b/sandbox310/src/assets/img/photos/bg21.png differ diff --git a/sandbox310/src/assets/img/photos/bg22.png b/sandbox310/src/assets/img/photos/bg22.png new file mode 100644 index 0000000..13c779b Binary files /dev/null and b/sandbox310/src/assets/img/photos/bg22.png differ diff --git a/sandbox310/src/assets/img/photos/bg23.png b/sandbox310/src/assets/img/photos/bg23.png new file mode 100644 index 0000000..ce91ce4 Binary files /dev/null and b/sandbox310/src/assets/img/photos/bg23.png differ diff --git a/sandbox310/src/assets/img/photos/bg24.png b/sandbox310/src/assets/img/photos/bg24.png new file mode 100644 index 0000000..600d2d1 Binary files /dev/null and b/sandbox310/src/assets/img/photos/bg24.png differ diff --git a/sandbox310/src/assets/img/photos/bg25.png b/sandbox310/src/assets/img/photos/bg25.png new file mode 100644 index 0000000..6b9732c Binary files /dev/null and b/sandbox310/src/assets/img/photos/bg25.png differ diff --git a/sandbox310/src/assets/img/photos/bg3.jpg b/sandbox310/src/assets/img/photos/bg3.jpg new file mode 100644 index 0000000..cda0400 Binary files /dev/null and b/sandbox310/src/assets/img/photos/bg3.jpg differ diff --git a/sandbox310/src/assets/img/photos/bg4.jpg b/sandbox310/src/assets/img/photos/bg4.jpg new file mode 100644 index 0000000..84a8225 Binary files /dev/null and b/sandbox310/src/assets/img/photos/bg4.jpg differ diff --git a/sandbox310/src/assets/img/photos/bg5.jpg b/sandbox310/src/assets/img/photos/bg5.jpg new file mode 100644 index 0000000..a157162 Binary files /dev/null and b/sandbox310/src/assets/img/photos/bg5.jpg differ diff --git a/sandbox310/src/assets/img/photos/bg6.jpg b/sandbox310/src/assets/img/photos/bg6.jpg new file mode 100644 index 0000000..9417d02 Binary files /dev/null and b/sandbox310/src/assets/img/photos/bg6.jpg differ diff --git a/sandbox310/src/assets/img/photos/bg7.jpg b/sandbox310/src/assets/img/photos/bg7.jpg new file mode 100644 index 0000000..28780be Binary files /dev/null and b/sandbox310/src/assets/img/photos/bg7.jpg differ diff --git a/sandbox310/src/assets/img/photos/bg8.jpg b/sandbox310/src/assets/img/photos/bg8.jpg new file mode 100644 index 0000000..5096b82 Binary files /dev/null and b/sandbox310/src/assets/img/photos/bg8.jpg differ diff --git a/sandbox310/src/assets/img/photos/bg9.jpg b/sandbox310/src/assets/img/photos/bg9.jpg new file mode 100644 index 0000000..4dec63a Binary files /dev/null and b/sandbox310/src/assets/img/photos/bg9.jpg differ diff --git a/sandbox310/src/assets/img/photos/bs1.jpg b/sandbox310/src/assets/img/photos/bs1.jpg new file mode 100644 index 0000000..b7deda7 Binary files /dev/null and b/sandbox310/src/assets/img/photos/bs1.jpg differ diff --git a/sandbox310/src/assets/img/photos/bs2.jpg b/sandbox310/src/assets/img/photos/bs2.jpg new file mode 100644 index 0000000..9f7ad7f Binary files /dev/null and b/sandbox310/src/assets/img/photos/bs2.jpg differ diff --git a/sandbox310/src/assets/img/photos/bs3.jpg b/sandbox310/src/assets/img/photos/bs3.jpg new file mode 100644 index 0000000..41140af Binary files /dev/null and b/sandbox310/src/assets/img/photos/bs3.jpg differ diff --git a/sandbox310/src/assets/img/photos/co1.png b/sandbox310/src/assets/img/photos/co1.png new file mode 100644 index 0000000..19294ec Binary files /dev/null and b/sandbox310/src/assets/img/photos/co1.png differ diff --git a/sandbox310/src/assets/img/photos/co1@2x.png b/sandbox310/src/assets/img/photos/co1@2x.png new file mode 100644 index 0000000..dd63715 Binary files /dev/null and b/sandbox310/src/assets/img/photos/co1@2x.png differ diff --git a/sandbox310/src/assets/img/photos/co2.png b/sandbox310/src/assets/img/photos/co2.png new file mode 100644 index 0000000..7a8cc0a Binary files /dev/null and b/sandbox310/src/assets/img/photos/co2.png differ diff --git a/sandbox310/src/assets/img/photos/co2@2x.png b/sandbox310/src/assets/img/photos/co2@2x.png new file mode 100644 index 0000000..1eac941 Binary files /dev/null and b/sandbox310/src/assets/img/photos/co2@2x.png differ diff --git a/sandbox310/src/assets/img/photos/co3.png b/sandbox310/src/assets/img/photos/co3.png new file mode 100644 index 0000000..cc4740f Binary files /dev/null and b/sandbox310/src/assets/img/photos/co3.png differ diff --git a/sandbox310/src/assets/img/photos/co3@2x.png b/sandbox310/src/assets/img/photos/co3@2x.png new file mode 100644 index 0000000..10e56a3 Binary files /dev/null and b/sandbox310/src/assets/img/photos/co3@2x.png differ diff --git a/sandbox310/src/assets/img/photos/cs1-full.jpg b/sandbox310/src/assets/img/photos/cs1-full.jpg new file mode 100644 index 0000000..e82a211 Binary files /dev/null and b/sandbox310/src/assets/img/photos/cs1-full.jpg differ diff --git a/sandbox310/src/assets/img/photos/cs1.jpg b/sandbox310/src/assets/img/photos/cs1.jpg new file mode 100644 index 0000000..f47b080 Binary files /dev/null and b/sandbox310/src/assets/img/photos/cs1.jpg differ diff --git a/sandbox310/src/assets/img/photos/cs10-full.jpg b/sandbox310/src/assets/img/photos/cs10-full.jpg new file mode 100644 index 0000000..d9c3f31 Binary files /dev/null and b/sandbox310/src/assets/img/photos/cs10-full.jpg differ diff --git a/sandbox310/src/assets/img/photos/cs10.jpg b/sandbox310/src/assets/img/photos/cs10.jpg new file mode 100644 index 0000000..f0df60a Binary files /dev/null and b/sandbox310/src/assets/img/photos/cs10.jpg differ diff --git a/sandbox310/src/assets/img/photos/cs11-full.jpg b/sandbox310/src/assets/img/photos/cs11-full.jpg new file mode 100644 index 0000000..61914ae Binary files /dev/null and b/sandbox310/src/assets/img/photos/cs11-full.jpg differ diff --git a/sandbox310/src/assets/img/photos/cs11.jpg b/sandbox310/src/assets/img/photos/cs11.jpg new file mode 100644 index 0000000..e8a166f Binary files /dev/null and b/sandbox310/src/assets/img/photos/cs11.jpg differ diff --git a/sandbox310/src/assets/img/photos/cs12-full.jpg b/sandbox310/src/assets/img/photos/cs12-full.jpg new file mode 100644 index 0000000..ca87563 Binary files /dev/null and b/sandbox310/src/assets/img/photos/cs12-full.jpg differ diff --git a/sandbox310/src/assets/img/photos/cs12.jpg b/sandbox310/src/assets/img/photos/cs12.jpg new file mode 100644 index 0000000..b180ca4 Binary files /dev/null and b/sandbox310/src/assets/img/photos/cs12.jpg differ diff --git a/sandbox310/src/assets/img/photos/cs13-full.jpg b/sandbox310/src/assets/img/photos/cs13-full.jpg new file mode 100644 index 0000000..9ab27bd Binary files /dev/null and b/sandbox310/src/assets/img/photos/cs13-full.jpg differ diff --git a/sandbox310/src/assets/img/photos/cs13.jpg b/sandbox310/src/assets/img/photos/cs13.jpg new file mode 100644 index 0000000..4cd344c Binary files /dev/null and b/sandbox310/src/assets/img/photos/cs13.jpg differ diff --git a/sandbox310/src/assets/img/photos/cs14-full.jpg b/sandbox310/src/assets/img/photos/cs14-full.jpg new file mode 100644 index 0000000..c4c0668 Binary files /dev/null and b/sandbox310/src/assets/img/photos/cs14-full.jpg differ diff --git a/sandbox310/src/assets/img/photos/cs14.jpg b/sandbox310/src/assets/img/photos/cs14.jpg new file mode 100644 index 0000000..eefd548 Binary files /dev/null and b/sandbox310/src/assets/img/photos/cs14.jpg differ diff --git a/sandbox310/src/assets/img/photos/cs15-full.jpg b/sandbox310/src/assets/img/photos/cs15-full.jpg new file mode 100644 index 0000000..fd90561 Binary files /dev/null and b/sandbox310/src/assets/img/photos/cs15-full.jpg differ diff --git a/sandbox310/src/assets/img/photos/cs15.jpg b/sandbox310/src/assets/img/photos/cs15.jpg new file mode 100644 index 0000000..66efa43 Binary files /dev/null and b/sandbox310/src/assets/img/photos/cs15.jpg differ diff --git a/sandbox310/src/assets/img/photos/cs16.jpg b/sandbox310/src/assets/img/photos/cs16.jpg new file mode 100644 index 0000000..b015915 Binary files /dev/null and b/sandbox310/src/assets/img/photos/cs16.jpg differ diff --git a/sandbox310/src/assets/img/photos/cs17.jpg b/sandbox310/src/assets/img/photos/cs17.jpg new file mode 100644 index 0000000..139be5c Binary files /dev/null and b/sandbox310/src/assets/img/photos/cs17.jpg differ diff --git a/sandbox310/src/assets/img/photos/cs18.jpg b/sandbox310/src/assets/img/photos/cs18.jpg new file mode 100644 index 0000000..8664162 Binary files /dev/null and b/sandbox310/src/assets/img/photos/cs18.jpg differ diff --git a/sandbox310/src/assets/img/photos/cs19.jpg b/sandbox310/src/assets/img/photos/cs19.jpg new file mode 100644 index 0000000..f6e55e1 Binary files /dev/null and b/sandbox310/src/assets/img/photos/cs19.jpg differ diff --git a/sandbox310/src/assets/img/photos/cs2-full.jpg b/sandbox310/src/assets/img/photos/cs2-full.jpg new file mode 100644 index 0000000..e4eb10d Binary files /dev/null and b/sandbox310/src/assets/img/photos/cs2-full.jpg differ diff --git a/sandbox310/src/assets/img/photos/cs2.jpg b/sandbox310/src/assets/img/photos/cs2.jpg new file mode 100644 index 0000000..ad1270f Binary files /dev/null and b/sandbox310/src/assets/img/photos/cs2.jpg differ diff --git a/sandbox310/src/assets/img/photos/cs20.jpg b/sandbox310/src/assets/img/photos/cs20.jpg new file mode 100644 index 0000000..45e5b1c Binary files /dev/null and b/sandbox310/src/assets/img/photos/cs20.jpg differ diff --git a/sandbox310/src/assets/img/photos/cs21.jpg b/sandbox310/src/assets/img/photos/cs21.jpg new file mode 100644 index 0000000..4f421f0 Binary files /dev/null and b/sandbox310/src/assets/img/photos/cs21.jpg differ diff --git a/sandbox310/src/assets/img/photos/cs22.jpg b/sandbox310/src/assets/img/photos/cs22.jpg new file mode 100644 index 0000000..94200b7 Binary files /dev/null and b/sandbox310/src/assets/img/photos/cs22.jpg differ diff --git a/sandbox310/src/assets/img/photos/cs23.jpg b/sandbox310/src/assets/img/photos/cs23.jpg new file mode 100644 index 0000000..c805f8b Binary files /dev/null and b/sandbox310/src/assets/img/photos/cs23.jpg differ diff --git a/sandbox310/src/assets/img/photos/cs24.jpg b/sandbox310/src/assets/img/photos/cs24.jpg new file mode 100644 index 0000000..88f4ce7 Binary files /dev/null and b/sandbox310/src/assets/img/photos/cs24.jpg differ diff --git a/sandbox310/src/assets/img/photos/cs25.jpg b/sandbox310/src/assets/img/photos/cs25.jpg new file mode 100644 index 0000000..13f8865 Binary files /dev/null and b/sandbox310/src/assets/img/photos/cs25.jpg differ diff --git a/sandbox310/src/assets/img/photos/cs3-full.jpg b/sandbox310/src/assets/img/photos/cs3-full.jpg new file mode 100644 index 0000000..eb091ef Binary files /dev/null and b/sandbox310/src/assets/img/photos/cs3-full.jpg differ diff --git a/sandbox310/src/assets/img/photos/cs3.jpg b/sandbox310/src/assets/img/photos/cs3.jpg new file mode 100644 index 0000000..0eb82e7 Binary files /dev/null and b/sandbox310/src/assets/img/photos/cs3.jpg differ diff --git a/sandbox310/src/assets/img/photos/cs4-full.jpg b/sandbox310/src/assets/img/photos/cs4-full.jpg new file mode 100644 index 0000000..452dab9 Binary files /dev/null and b/sandbox310/src/assets/img/photos/cs4-full.jpg differ diff --git a/sandbox310/src/assets/img/photos/cs4.jpg b/sandbox310/src/assets/img/photos/cs4.jpg new file mode 100644 index 0000000..370d308 Binary files /dev/null and b/sandbox310/src/assets/img/photos/cs4.jpg differ diff --git a/sandbox310/src/assets/img/photos/cs5-full.jpg b/sandbox310/src/assets/img/photos/cs5-full.jpg new file mode 100644 index 0000000..f7bf824 Binary files /dev/null and b/sandbox310/src/assets/img/photos/cs5-full.jpg differ diff --git a/sandbox310/src/assets/img/photos/cs5.jpg b/sandbox310/src/assets/img/photos/cs5.jpg new file mode 100644 index 0000000..5664810 Binary files /dev/null and b/sandbox310/src/assets/img/photos/cs5.jpg differ diff --git a/sandbox310/src/assets/img/photos/cs6-full.jpg b/sandbox310/src/assets/img/photos/cs6-full.jpg new file mode 100644 index 0000000..aa532cd Binary files /dev/null and b/sandbox310/src/assets/img/photos/cs6-full.jpg differ diff --git a/sandbox310/src/assets/img/photos/cs6.jpg b/sandbox310/src/assets/img/photos/cs6.jpg new file mode 100644 index 0000000..7c8fe49 Binary files /dev/null and b/sandbox310/src/assets/img/photos/cs6.jpg differ diff --git a/sandbox310/src/assets/img/photos/cs7-full.jpg b/sandbox310/src/assets/img/photos/cs7-full.jpg new file mode 100644 index 0000000..a4a8316 Binary files /dev/null and b/sandbox310/src/assets/img/photos/cs7-full.jpg differ diff --git a/sandbox310/src/assets/img/photos/cs7.jpg b/sandbox310/src/assets/img/photos/cs7.jpg new file mode 100644 index 0000000..7b4a596 Binary files /dev/null and b/sandbox310/src/assets/img/photos/cs7.jpg differ diff --git a/sandbox310/src/assets/img/photos/cs8-full.jpg b/sandbox310/src/assets/img/photos/cs8-full.jpg new file mode 100644 index 0000000..89125d0 Binary files /dev/null and b/sandbox310/src/assets/img/photos/cs8-full.jpg differ diff --git a/sandbox310/src/assets/img/photos/cs8.jpg b/sandbox310/src/assets/img/photos/cs8.jpg new file mode 100644 index 0000000..927c94a Binary files /dev/null and b/sandbox310/src/assets/img/photos/cs8.jpg differ diff --git a/sandbox310/src/assets/img/photos/cs9-full.jpg b/sandbox310/src/assets/img/photos/cs9-full.jpg new file mode 100644 index 0000000..88fd149 Binary files /dev/null and b/sandbox310/src/assets/img/photos/cs9-full.jpg differ diff --git a/sandbox310/src/assets/img/photos/cs9.jpg b/sandbox310/src/assets/img/photos/cs9.jpg new file mode 100644 index 0000000..6f44359 Binary files /dev/null and b/sandbox310/src/assets/img/photos/cs9.jpg differ diff --git a/sandbox310/src/assets/img/photos/device.png b/sandbox310/src/assets/img/photos/device.png new file mode 100644 index 0000000..977ca9a Binary files /dev/null and b/sandbox310/src/assets/img/photos/device.png differ diff --git a/sandbox310/src/assets/img/photos/device@2x.png b/sandbox310/src/assets/img/photos/device@2x.png new file mode 100644 index 0000000..f3242e4 Binary files /dev/null and b/sandbox310/src/assets/img/photos/device@2x.png differ diff --git a/sandbox310/src/assets/img/photos/devices.png b/sandbox310/src/assets/img/photos/devices.png new file mode 100644 index 0000000..7ffffb9 Binary files /dev/null and b/sandbox310/src/assets/img/photos/devices.png differ diff --git a/sandbox310/src/assets/img/photos/devices2.png b/sandbox310/src/assets/img/photos/devices2.png new file mode 100644 index 0000000..84d5ccd Binary files /dev/null and b/sandbox310/src/assets/img/photos/devices2.png differ diff --git a/sandbox310/src/assets/img/photos/devices2@2x.png b/sandbox310/src/assets/img/photos/devices2@2x.png new file mode 100644 index 0000000..1953b6e Binary files /dev/null and b/sandbox310/src/assets/img/photos/devices2@2x.png differ diff --git a/sandbox310/src/assets/img/photos/devices@2x.png b/sandbox310/src/assets/img/photos/devices@2x.png new file mode 100644 index 0000000..4c62999 Binary files /dev/null and b/sandbox310/src/assets/img/photos/devices@2x.png differ diff --git a/sandbox310/src/assets/img/photos/f1.png b/sandbox310/src/assets/img/photos/f1.png new file mode 100644 index 0000000..600700e Binary files /dev/null and b/sandbox310/src/assets/img/photos/f1.png differ diff --git a/sandbox310/src/assets/img/photos/f1@2x.png b/sandbox310/src/assets/img/photos/f1@2x.png new file mode 100644 index 0000000..36e465c Binary files /dev/null and b/sandbox310/src/assets/img/photos/f1@2x.png differ diff --git a/sandbox310/src/assets/img/photos/f2.png b/sandbox310/src/assets/img/photos/f2.png new file mode 100644 index 0000000..70113e8 Binary files /dev/null and b/sandbox310/src/assets/img/photos/f2.png differ diff --git a/sandbox310/src/assets/img/photos/f2@2x.png b/sandbox310/src/assets/img/photos/f2@2x.png new file mode 100644 index 0000000..e29debf Binary files /dev/null and b/sandbox310/src/assets/img/photos/f2@2x.png differ diff --git a/sandbox310/src/assets/img/photos/f3.png b/sandbox310/src/assets/img/photos/f3.png new file mode 100644 index 0000000..9dcf937 Binary files /dev/null and b/sandbox310/src/assets/img/photos/f3.png differ diff --git a/sandbox310/src/assets/img/photos/f3@2x.png b/sandbox310/src/assets/img/photos/f3@2x.png new file mode 100644 index 0000000..93e5f63 Binary files /dev/null and b/sandbox310/src/assets/img/photos/f3@2x.png differ diff --git a/sandbox310/src/assets/img/photos/f4.png b/sandbox310/src/assets/img/photos/f4.png new file mode 100644 index 0000000..d4527f9 Binary files /dev/null and b/sandbox310/src/assets/img/photos/f4.png differ diff --git a/sandbox310/src/assets/img/photos/f4@2x.png b/sandbox310/src/assets/img/photos/f4@2x.png new file mode 100644 index 0000000..a6558be Binary files /dev/null and b/sandbox310/src/assets/img/photos/f4@2x.png differ diff --git a/sandbox310/src/assets/img/photos/g1.jpg b/sandbox310/src/assets/img/photos/g1.jpg new file mode 100644 index 0000000..b7e9b5f Binary files /dev/null and b/sandbox310/src/assets/img/photos/g1.jpg differ diff --git a/sandbox310/src/assets/img/photos/g10.jpg b/sandbox310/src/assets/img/photos/g10.jpg new file mode 100644 index 0000000..67cd6d9 Binary files /dev/null and b/sandbox310/src/assets/img/photos/g10.jpg differ diff --git a/sandbox310/src/assets/img/photos/g10@2x.jpg b/sandbox310/src/assets/img/photos/g10@2x.jpg new file mode 100644 index 0000000..1236095 Binary files /dev/null and b/sandbox310/src/assets/img/photos/g10@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/g11.jpg b/sandbox310/src/assets/img/photos/g11.jpg new file mode 100644 index 0000000..fa7b5bc Binary files /dev/null and b/sandbox310/src/assets/img/photos/g11.jpg differ diff --git a/sandbox310/src/assets/img/photos/g11@2x.jpg b/sandbox310/src/assets/img/photos/g11@2x.jpg new file mode 100644 index 0000000..1664900 Binary files /dev/null and b/sandbox310/src/assets/img/photos/g11@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/g12.jpg b/sandbox310/src/assets/img/photos/g12.jpg new file mode 100644 index 0000000..4635668 Binary files /dev/null and b/sandbox310/src/assets/img/photos/g12.jpg differ diff --git a/sandbox310/src/assets/img/photos/g12@2x.jpg b/sandbox310/src/assets/img/photos/g12@2x.jpg new file mode 100644 index 0000000..60175a0 Binary files /dev/null and b/sandbox310/src/assets/img/photos/g12@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/g13.jpg b/sandbox310/src/assets/img/photos/g13.jpg new file mode 100644 index 0000000..62e99eb Binary files /dev/null and b/sandbox310/src/assets/img/photos/g13.jpg differ diff --git a/sandbox310/src/assets/img/photos/g13@2x.jpg b/sandbox310/src/assets/img/photos/g13@2x.jpg new file mode 100644 index 0000000..75195eb Binary files /dev/null and b/sandbox310/src/assets/img/photos/g13@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/g1@2x.jpg b/sandbox310/src/assets/img/photos/g1@2x.jpg new file mode 100644 index 0000000..5cebd88 Binary files /dev/null and b/sandbox310/src/assets/img/photos/g1@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/g2.jpg b/sandbox310/src/assets/img/photos/g2.jpg new file mode 100644 index 0000000..2bf8952 Binary files /dev/null and b/sandbox310/src/assets/img/photos/g2.jpg differ diff --git a/sandbox310/src/assets/img/photos/g2@2x.jpg b/sandbox310/src/assets/img/photos/g2@2x.jpg new file mode 100644 index 0000000..06838c6 Binary files /dev/null and b/sandbox310/src/assets/img/photos/g2@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/g3.jpg b/sandbox310/src/assets/img/photos/g3.jpg new file mode 100644 index 0000000..164270a Binary files /dev/null and b/sandbox310/src/assets/img/photos/g3.jpg differ diff --git a/sandbox310/src/assets/img/photos/g3@2x.jpg b/sandbox310/src/assets/img/photos/g3@2x.jpg new file mode 100644 index 0000000..501a5ad Binary files /dev/null and b/sandbox310/src/assets/img/photos/g3@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/g4.jpg b/sandbox310/src/assets/img/photos/g4.jpg new file mode 100644 index 0000000..e884fa6 Binary files /dev/null and b/sandbox310/src/assets/img/photos/g4.jpg differ diff --git a/sandbox310/src/assets/img/photos/g4@2x.jpg b/sandbox310/src/assets/img/photos/g4@2x.jpg new file mode 100644 index 0000000..96fbb79 Binary files /dev/null and b/sandbox310/src/assets/img/photos/g4@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/g5.jpg b/sandbox310/src/assets/img/photos/g5.jpg new file mode 100644 index 0000000..90ea3ac Binary files /dev/null and b/sandbox310/src/assets/img/photos/g5.jpg differ diff --git a/sandbox310/src/assets/img/photos/g5@2x.jpg b/sandbox310/src/assets/img/photos/g5@2x.jpg new file mode 100644 index 0000000..ef7a374 Binary files /dev/null and b/sandbox310/src/assets/img/photos/g5@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/g6.jpg b/sandbox310/src/assets/img/photos/g6.jpg new file mode 100644 index 0000000..dbbde4f Binary files /dev/null and b/sandbox310/src/assets/img/photos/g6.jpg differ diff --git a/sandbox310/src/assets/img/photos/g6@2x.jpg b/sandbox310/src/assets/img/photos/g6@2x.jpg new file mode 100644 index 0000000..18e4f6b Binary files /dev/null and b/sandbox310/src/assets/img/photos/g6@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/g7.jpg b/sandbox310/src/assets/img/photos/g7.jpg new file mode 100644 index 0000000..5a6485e Binary files /dev/null and b/sandbox310/src/assets/img/photos/g7.jpg differ diff --git a/sandbox310/src/assets/img/photos/g7@2x.jpg b/sandbox310/src/assets/img/photos/g7@2x.jpg new file mode 100644 index 0000000..feff9dd Binary files /dev/null and b/sandbox310/src/assets/img/photos/g7@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/g8.jpg b/sandbox310/src/assets/img/photos/g8.jpg new file mode 100644 index 0000000..1255ed5 Binary files /dev/null and b/sandbox310/src/assets/img/photos/g8.jpg differ diff --git a/sandbox310/src/assets/img/photos/g8@2x.jpg b/sandbox310/src/assets/img/photos/g8@2x.jpg new file mode 100644 index 0000000..c864ead Binary files /dev/null and b/sandbox310/src/assets/img/photos/g8@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/g9.jpg b/sandbox310/src/assets/img/photos/g9.jpg new file mode 100644 index 0000000..775a3a4 Binary files /dev/null and b/sandbox310/src/assets/img/photos/g9.jpg differ diff --git a/sandbox310/src/assets/img/photos/g9@2x.jpg b/sandbox310/src/assets/img/photos/g9@2x.jpg new file mode 100644 index 0000000..7c31772 Binary files /dev/null and b/sandbox310/src/assets/img/photos/g9@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/h1.jpg b/sandbox310/src/assets/img/photos/h1.jpg new file mode 100644 index 0000000..a98e4aa Binary files /dev/null and b/sandbox310/src/assets/img/photos/h1.jpg differ diff --git a/sandbox310/src/assets/img/photos/is1.jpg b/sandbox310/src/assets/img/photos/is1.jpg new file mode 100644 index 0000000..27eb147 Binary files /dev/null and b/sandbox310/src/assets/img/photos/is1.jpg differ diff --git a/sandbox310/src/assets/img/photos/is2.jpg b/sandbox310/src/assets/img/photos/is2.jpg new file mode 100644 index 0000000..19b3eb7 Binary files /dev/null and b/sandbox310/src/assets/img/photos/is2.jpg differ diff --git a/sandbox310/src/assets/img/photos/is3.jpg b/sandbox310/src/assets/img/photos/is3.jpg new file mode 100644 index 0000000..b6e016c Binary files /dev/null and b/sandbox310/src/assets/img/photos/is3.jpg differ diff --git a/sandbox310/src/assets/img/photos/movie.jpg b/sandbox310/src/assets/img/photos/movie.jpg new file mode 100644 index 0000000..ff60227 Binary files /dev/null and b/sandbox310/src/assets/img/photos/movie.jpg differ diff --git a/sandbox310/src/assets/img/photos/movie2.jpg b/sandbox310/src/assets/img/photos/movie2.jpg new file mode 100644 index 0000000..29937af Binary files /dev/null and b/sandbox310/src/assets/img/photos/movie2.jpg differ diff --git a/sandbox310/src/assets/img/photos/p1-full.jpg b/sandbox310/src/assets/img/photos/p1-full.jpg new file mode 100644 index 0000000..8aefab2 Binary files /dev/null and b/sandbox310/src/assets/img/photos/p1-full.jpg differ diff --git a/sandbox310/src/assets/img/photos/p1.jpg b/sandbox310/src/assets/img/photos/p1.jpg new file mode 100644 index 0000000..6d164f5 Binary files /dev/null and b/sandbox310/src/assets/img/photos/p1.jpg differ diff --git a/sandbox310/src/assets/img/photos/p1@2x.jpg b/sandbox310/src/assets/img/photos/p1@2x.jpg new file mode 100644 index 0000000..ada0142 Binary files /dev/null and b/sandbox310/src/assets/img/photos/p1@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/p2-full.jpg b/sandbox310/src/assets/img/photos/p2-full.jpg new file mode 100644 index 0000000..20e60bf Binary files /dev/null and b/sandbox310/src/assets/img/photos/p2-full.jpg differ diff --git a/sandbox310/src/assets/img/photos/p2.jpg b/sandbox310/src/assets/img/photos/p2.jpg new file mode 100644 index 0000000..98e794d Binary files /dev/null and b/sandbox310/src/assets/img/photos/p2.jpg differ diff --git a/sandbox310/src/assets/img/photos/p2@2x.jpg b/sandbox310/src/assets/img/photos/p2@2x.jpg new file mode 100644 index 0000000..91c270d Binary files /dev/null and b/sandbox310/src/assets/img/photos/p2@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/p3.jpg b/sandbox310/src/assets/img/photos/p3.jpg new file mode 100644 index 0000000..6be152c Binary files /dev/null and b/sandbox310/src/assets/img/photos/p3.jpg differ diff --git a/sandbox310/src/assets/img/photos/p3@2x.jpg b/sandbox310/src/assets/img/photos/p3@2x.jpg new file mode 100644 index 0000000..02db64f Binary files /dev/null and b/sandbox310/src/assets/img/photos/p3@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/p4.jpg b/sandbox310/src/assets/img/photos/p4.jpg new file mode 100644 index 0000000..e932aed Binary files /dev/null and b/sandbox310/src/assets/img/photos/p4.jpg differ diff --git a/sandbox310/src/assets/img/photos/p4@2x.jpg b/sandbox310/src/assets/img/photos/p4@2x.jpg new file mode 100644 index 0000000..f1b669f Binary files /dev/null and b/sandbox310/src/assets/img/photos/p4@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/p5.jpg b/sandbox310/src/assets/img/photos/p5.jpg new file mode 100644 index 0000000..6134da0 Binary files /dev/null and b/sandbox310/src/assets/img/photos/p5.jpg differ diff --git a/sandbox310/src/assets/img/photos/p5@2x.jpg b/sandbox310/src/assets/img/photos/p5@2x.jpg new file mode 100644 index 0000000..6d7239d Binary files /dev/null and b/sandbox310/src/assets/img/photos/p5@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/p6.jpg b/sandbox310/src/assets/img/photos/p6.jpg new file mode 100644 index 0000000..5815503 Binary files /dev/null and b/sandbox310/src/assets/img/photos/p6.jpg differ diff --git a/sandbox310/src/assets/img/photos/p6@2x.jpg b/sandbox310/src/assets/img/photos/p6@2x.jpg new file mode 100644 index 0000000..fbe1af4 Binary files /dev/null and b/sandbox310/src/assets/img/photos/p6@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/pd1.jpg b/sandbox310/src/assets/img/photos/pd1.jpg new file mode 100644 index 0000000..293b506 Binary files /dev/null and b/sandbox310/src/assets/img/photos/pd1.jpg differ diff --git a/sandbox310/src/assets/img/photos/pd10-full.jpg b/sandbox310/src/assets/img/photos/pd10-full.jpg new file mode 100644 index 0000000..d64645e Binary files /dev/null and b/sandbox310/src/assets/img/photos/pd10-full.jpg differ diff --git a/sandbox310/src/assets/img/photos/pd10.jpg b/sandbox310/src/assets/img/photos/pd10.jpg new file mode 100644 index 0000000..2fd198b Binary files /dev/null and b/sandbox310/src/assets/img/photos/pd10.jpg differ diff --git a/sandbox310/src/assets/img/photos/pd10@2x.jpg b/sandbox310/src/assets/img/photos/pd10@2x.jpg new file mode 100644 index 0000000..71b7442 Binary files /dev/null and b/sandbox310/src/assets/img/photos/pd10@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/pd11-full.jpg b/sandbox310/src/assets/img/photos/pd11-full.jpg new file mode 100644 index 0000000..86c094c Binary files /dev/null and b/sandbox310/src/assets/img/photos/pd11-full.jpg differ diff --git a/sandbox310/src/assets/img/photos/pd11.jpg b/sandbox310/src/assets/img/photos/pd11.jpg new file mode 100644 index 0000000..255c80d Binary files /dev/null and b/sandbox310/src/assets/img/photos/pd11.jpg differ diff --git a/sandbox310/src/assets/img/photos/pd11@2x.jpg b/sandbox310/src/assets/img/photos/pd11@2x.jpg new file mode 100644 index 0000000..9fb04fa Binary files /dev/null and b/sandbox310/src/assets/img/photos/pd11@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/pd12-full.jpg b/sandbox310/src/assets/img/photos/pd12-full.jpg new file mode 100644 index 0000000..110fb3b Binary files /dev/null and b/sandbox310/src/assets/img/photos/pd12-full.jpg differ diff --git a/sandbox310/src/assets/img/photos/pd12.jpg b/sandbox310/src/assets/img/photos/pd12.jpg new file mode 100644 index 0000000..3994c42 Binary files /dev/null and b/sandbox310/src/assets/img/photos/pd12.jpg differ diff --git a/sandbox310/src/assets/img/photos/pd12@2x.jpg b/sandbox310/src/assets/img/photos/pd12@2x.jpg new file mode 100644 index 0000000..021c952 Binary files /dev/null and b/sandbox310/src/assets/img/photos/pd12@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/pd2.jpg b/sandbox310/src/assets/img/photos/pd2.jpg new file mode 100644 index 0000000..d36ea08 Binary files /dev/null and b/sandbox310/src/assets/img/photos/pd2.jpg differ diff --git a/sandbox310/src/assets/img/photos/pd3.jpg b/sandbox310/src/assets/img/photos/pd3.jpg new file mode 100644 index 0000000..760a867 Binary files /dev/null and b/sandbox310/src/assets/img/photos/pd3.jpg differ diff --git a/sandbox310/src/assets/img/photos/pd4.jpg b/sandbox310/src/assets/img/photos/pd4.jpg new file mode 100644 index 0000000..2ac4129 Binary files /dev/null and b/sandbox310/src/assets/img/photos/pd4.jpg differ diff --git a/sandbox310/src/assets/img/photos/pd5.jpg b/sandbox310/src/assets/img/photos/pd5.jpg new file mode 100644 index 0000000..1db2374 Binary files /dev/null and b/sandbox310/src/assets/img/photos/pd5.jpg differ diff --git a/sandbox310/src/assets/img/photos/pd6.jpg b/sandbox310/src/assets/img/photos/pd6.jpg new file mode 100644 index 0000000..c9a658f Binary files /dev/null and b/sandbox310/src/assets/img/photos/pd6.jpg differ diff --git a/sandbox310/src/assets/img/photos/pd7-full.jpg b/sandbox310/src/assets/img/photos/pd7-full.jpg new file mode 100644 index 0000000..c07b4a5 Binary files /dev/null and b/sandbox310/src/assets/img/photos/pd7-full.jpg differ diff --git a/sandbox310/src/assets/img/photos/pd7.jpg b/sandbox310/src/assets/img/photos/pd7.jpg new file mode 100644 index 0000000..eee8e73 Binary files /dev/null and b/sandbox310/src/assets/img/photos/pd7.jpg differ diff --git a/sandbox310/src/assets/img/photos/pd7@2x.jpg b/sandbox310/src/assets/img/photos/pd7@2x.jpg new file mode 100644 index 0000000..09a6719 Binary files /dev/null and b/sandbox310/src/assets/img/photos/pd7@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/pd8-full.jpg b/sandbox310/src/assets/img/photos/pd8-full.jpg new file mode 100644 index 0000000..d571329 Binary files /dev/null and b/sandbox310/src/assets/img/photos/pd8-full.jpg differ diff --git a/sandbox310/src/assets/img/photos/pd8.jpg b/sandbox310/src/assets/img/photos/pd8.jpg new file mode 100644 index 0000000..24453df Binary files /dev/null and b/sandbox310/src/assets/img/photos/pd8.jpg differ diff --git a/sandbox310/src/assets/img/photos/pd8@2x.jpg b/sandbox310/src/assets/img/photos/pd8@2x.jpg new file mode 100644 index 0000000..92a82d3 Binary files /dev/null and b/sandbox310/src/assets/img/photos/pd8@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/pd9-full.jpg b/sandbox310/src/assets/img/photos/pd9-full.jpg new file mode 100644 index 0000000..88718c5 Binary files /dev/null and b/sandbox310/src/assets/img/photos/pd9-full.jpg differ diff --git a/sandbox310/src/assets/img/photos/pd9.jpg b/sandbox310/src/assets/img/photos/pd9.jpg new file mode 100644 index 0000000..38a8594 Binary files /dev/null and b/sandbox310/src/assets/img/photos/pd9.jpg differ diff --git a/sandbox310/src/assets/img/photos/pd9@2x.jpg b/sandbox310/src/assets/img/photos/pd9@2x.jpg new file mode 100644 index 0000000..ab7131d Binary files /dev/null and b/sandbox310/src/assets/img/photos/pd9@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/pp1.jpg b/sandbox310/src/assets/img/photos/pp1.jpg new file mode 100644 index 0000000..f68483b Binary files /dev/null and b/sandbox310/src/assets/img/photos/pp1.jpg differ diff --git a/sandbox310/src/assets/img/photos/pp10.jpg b/sandbox310/src/assets/img/photos/pp10.jpg new file mode 100644 index 0000000..8423e12 Binary files /dev/null and b/sandbox310/src/assets/img/photos/pp10.jpg differ diff --git a/sandbox310/src/assets/img/photos/pp11.jpg b/sandbox310/src/assets/img/photos/pp11.jpg new file mode 100644 index 0000000..9e47609 Binary files /dev/null and b/sandbox310/src/assets/img/photos/pp11.jpg differ diff --git a/sandbox310/src/assets/img/photos/pp12.jpg b/sandbox310/src/assets/img/photos/pp12.jpg new file mode 100644 index 0000000..35304f7 Binary files /dev/null and b/sandbox310/src/assets/img/photos/pp12.jpg differ diff --git a/sandbox310/src/assets/img/photos/pp13.jpg b/sandbox310/src/assets/img/photos/pp13.jpg new file mode 100644 index 0000000..95a620d Binary files /dev/null and b/sandbox310/src/assets/img/photos/pp13.jpg differ diff --git a/sandbox310/src/assets/img/photos/pp14.jpg b/sandbox310/src/assets/img/photos/pp14.jpg new file mode 100644 index 0000000..567a1b3 Binary files /dev/null and b/sandbox310/src/assets/img/photos/pp14.jpg differ diff --git a/sandbox310/src/assets/img/photos/pp15.jpg b/sandbox310/src/assets/img/photos/pp15.jpg new file mode 100644 index 0000000..ef0a1f2 Binary files /dev/null and b/sandbox310/src/assets/img/photos/pp15.jpg differ diff --git a/sandbox310/src/assets/img/photos/pp16.jpg b/sandbox310/src/assets/img/photos/pp16.jpg new file mode 100644 index 0000000..a0eae4c Binary files /dev/null and b/sandbox310/src/assets/img/photos/pp16.jpg differ diff --git a/sandbox310/src/assets/img/photos/pp17.jpg b/sandbox310/src/assets/img/photos/pp17.jpg new file mode 100644 index 0000000..c5d82eb Binary files /dev/null and b/sandbox310/src/assets/img/photos/pp17.jpg differ diff --git a/sandbox310/src/assets/img/photos/pp18.jpg b/sandbox310/src/assets/img/photos/pp18.jpg new file mode 100644 index 0000000..afddf7c Binary files /dev/null and b/sandbox310/src/assets/img/photos/pp18.jpg differ diff --git a/sandbox310/src/assets/img/photos/pp19.jpg b/sandbox310/src/assets/img/photos/pp19.jpg new file mode 100644 index 0000000..9d4fba9 Binary files /dev/null and b/sandbox310/src/assets/img/photos/pp19.jpg differ diff --git a/sandbox310/src/assets/img/photos/pp2.jpg b/sandbox310/src/assets/img/photos/pp2.jpg new file mode 100644 index 0000000..639b985 Binary files /dev/null and b/sandbox310/src/assets/img/photos/pp2.jpg differ diff --git a/sandbox310/src/assets/img/photos/pp20.jpg b/sandbox310/src/assets/img/photos/pp20.jpg new file mode 100644 index 0000000..7f1e5a9 Binary files /dev/null and b/sandbox310/src/assets/img/photos/pp20.jpg differ diff --git a/sandbox310/src/assets/img/photos/pp21.jpg b/sandbox310/src/assets/img/photos/pp21.jpg new file mode 100644 index 0000000..b7cb98f Binary files /dev/null and b/sandbox310/src/assets/img/photos/pp21.jpg differ diff --git a/sandbox310/src/assets/img/photos/pp22.jpg b/sandbox310/src/assets/img/photos/pp22.jpg new file mode 100644 index 0000000..f2faa8a Binary files /dev/null and b/sandbox310/src/assets/img/photos/pp22.jpg differ diff --git a/sandbox310/src/assets/img/photos/pp3.jpg b/sandbox310/src/assets/img/photos/pp3.jpg new file mode 100644 index 0000000..525032a Binary files /dev/null and b/sandbox310/src/assets/img/photos/pp3.jpg differ diff --git a/sandbox310/src/assets/img/photos/pp4.jpg b/sandbox310/src/assets/img/photos/pp4.jpg new file mode 100644 index 0000000..ed89180 Binary files /dev/null and b/sandbox310/src/assets/img/photos/pp4.jpg differ diff --git a/sandbox310/src/assets/img/photos/pp5.jpg b/sandbox310/src/assets/img/photos/pp5.jpg new file mode 100644 index 0000000..90e9e92 Binary files /dev/null and b/sandbox310/src/assets/img/photos/pp5.jpg differ diff --git a/sandbox310/src/assets/img/photos/pp7.jpg b/sandbox310/src/assets/img/photos/pp7.jpg new file mode 100644 index 0000000..0d585a3 Binary files /dev/null and b/sandbox310/src/assets/img/photos/pp7.jpg differ diff --git a/sandbox310/src/assets/img/photos/pp8.jpg b/sandbox310/src/assets/img/photos/pp8.jpg new file mode 100644 index 0000000..3565098 Binary files /dev/null and b/sandbox310/src/assets/img/photos/pp8.jpg differ diff --git a/sandbox310/src/assets/img/photos/pp9.jpg b/sandbox310/src/assets/img/photos/pp9.jpg new file mode 100644 index 0000000..3619a1c Binary files /dev/null and b/sandbox310/src/assets/img/photos/pp9.jpg differ diff --git a/sandbox310/src/assets/img/photos/ps1.jpg b/sandbox310/src/assets/img/photos/ps1.jpg new file mode 100644 index 0000000..e4e614c Binary files /dev/null and b/sandbox310/src/assets/img/photos/ps1.jpg differ diff --git a/sandbox310/src/assets/img/photos/ps2.jpg b/sandbox310/src/assets/img/photos/ps2.jpg new file mode 100644 index 0000000..4aee58b Binary files /dev/null and b/sandbox310/src/assets/img/photos/ps2.jpg differ diff --git a/sandbox310/src/assets/img/photos/ps3.jpg b/sandbox310/src/assets/img/photos/ps3.jpg new file mode 100644 index 0000000..7840fe2 Binary files /dev/null and b/sandbox310/src/assets/img/photos/ps3.jpg differ diff --git a/sandbox310/src/assets/img/photos/rp1.jpg b/sandbox310/src/assets/img/photos/rp1.jpg new file mode 100644 index 0000000..5b2173f Binary files /dev/null and b/sandbox310/src/assets/img/photos/rp1.jpg differ diff --git a/sandbox310/src/assets/img/photos/rp1@2x.jpg b/sandbox310/src/assets/img/photos/rp1@2x.jpg new file mode 100644 index 0000000..2dc8221 Binary files /dev/null and b/sandbox310/src/assets/img/photos/rp1@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/rp2.jpg b/sandbox310/src/assets/img/photos/rp2.jpg new file mode 100644 index 0000000..62e062e Binary files /dev/null and b/sandbox310/src/assets/img/photos/rp2.jpg differ diff --git a/sandbox310/src/assets/img/photos/rp2@2x.jpg b/sandbox310/src/assets/img/photos/rp2@2x.jpg new file mode 100644 index 0000000..fd7d054 Binary files /dev/null and b/sandbox310/src/assets/img/photos/rp2@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/rp3.jpg b/sandbox310/src/assets/img/photos/rp3.jpg new file mode 100644 index 0000000..cb45ce3 Binary files /dev/null and b/sandbox310/src/assets/img/photos/rp3.jpg differ diff --git a/sandbox310/src/assets/img/photos/rp3@2x.jpg b/sandbox310/src/assets/img/photos/rp3@2x.jpg new file mode 100644 index 0000000..d9c661b Binary files /dev/null and b/sandbox310/src/assets/img/photos/rp3@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/sa1.jpg b/sandbox310/src/assets/img/photos/sa1.jpg new file mode 100644 index 0000000..2638659 Binary files /dev/null and b/sandbox310/src/assets/img/photos/sa1.jpg differ diff --git a/sandbox310/src/assets/img/photos/sa10.jpg b/sandbox310/src/assets/img/photos/sa10.jpg new file mode 100644 index 0000000..e71c4f9 Binary files /dev/null and b/sandbox310/src/assets/img/photos/sa10.jpg differ diff --git a/sandbox310/src/assets/img/photos/sa10@2x.jpg b/sandbox310/src/assets/img/photos/sa10@2x.jpg new file mode 100644 index 0000000..e880463 Binary files /dev/null and b/sandbox310/src/assets/img/photos/sa10@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/sa11.jpg b/sandbox310/src/assets/img/photos/sa11.jpg new file mode 100644 index 0000000..49f91ed Binary files /dev/null and b/sandbox310/src/assets/img/photos/sa11.jpg differ diff --git a/sandbox310/src/assets/img/photos/sa11@2x.jpg b/sandbox310/src/assets/img/photos/sa11@2x.jpg new file mode 100644 index 0000000..a27258f Binary files /dev/null and b/sandbox310/src/assets/img/photos/sa11@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/sa12.jpg b/sandbox310/src/assets/img/photos/sa12.jpg new file mode 100644 index 0000000..c77152f Binary files /dev/null and b/sandbox310/src/assets/img/photos/sa12.jpg differ diff --git a/sandbox310/src/assets/img/photos/sa12@2x.jpg b/sandbox310/src/assets/img/photos/sa12@2x.jpg new file mode 100644 index 0000000..229e2c0 Binary files /dev/null and b/sandbox310/src/assets/img/photos/sa12@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/sa13.jpg b/sandbox310/src/assets/img/photos/sa13.jpg new file mode 100644 index 0000000..4ae1b7b Binary files /dev/null and b/sandbox310/src/assets/img/photos/sa13.jpg differ diff --git a/sandbox310/src/assets/img/photos/sa13@2x.jpg b/sandbox310/src/assets/img/photos/sa13@2x.jpg new file mode 100644 index 0000000..1b98f32 Binary files /dev/null and b/sandbox310/src/assets/img/photos/sa13@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/sa14.jpg b/sandbox310/src/assets/img/photos/sa14.jpg new file mode 100644 index 0000000..bf7daa7 Binary files /dev/null and b/sandbox310/src/assets/img/photos/sa14.jpg differ diff --git a/sandbox310/src/assets/img/photos/sa14@2x.jpg b/sandbox310/src/assets/img/photos/sa14@2x.jpg new file mode 100644 index 0000000..b39953f Binary files /dev/null and b/sandbox310/src/assets/img/photos/sa14@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/sa15.jpg b/sandbox310/src/assets/img/photos/sa15.jpg new file mode 100644 index 0000000..2dec457 Binary files /dev/null and b/sandbox310/src/assets/img/photos/sa15.jpg differ diff --git a/sandbox310/src/assets/img/photos/sa15@2x.jpg b/sandbox310/src/assets/img/photos/sa15@2x.jpg new file mode 100644 index 0000000..a4275a0 Binary files /dev/null and b/sandbox310/src/assets/img/photos/sa15@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/sa16.jpg b/sandbox310/src/assets/img/photos/sa16.jpg new file mode 100644 index 0000000..3d8002f Binary files /dev/null and b/sandbox310/src/assets/img/photos/sa16.jpg differ diff --git a/sandbox310/src/assets/img/photos/sa16@2x.jpg b/sandbox310/src/assets/img/photos/sa16@2x.jpg new file mode 100644 index 0000000..3f36c8c Binary files /dev/null and b/sandbox310/src/assets/img/photos/sa16@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/sa17.jpg b/sandbox310/src/assets/img/photos/sa17.jpg new file mode 100644 index 0000000..bd4c77e Binary files /dev/null and b/sandbox310/src/assets/img/photos/sa17.jpg differ diff --git a/sandbox310/src/assets/img/photos/sa17@2x.jpg b/sandbox310/src/assets/img/photos/sa17@2x.jpg new file mode 100644 index 0000000..cb82044 Binary files /dev/null and b/sandbox310/src/assets/img/photos/sa17@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/sa18.jpg b/sandbox310/src/assets/img/photos/sa18.jpg new file mode 100644 index 0000000..e3342d5 Binary files /dev/null and b/sandbox310/src/assets/img/photos/sa18.jpg differ diff --git a/sandbox310/src/assets/img/photos/sa18@2x.jpg b/sandbox310/src/assets/img/photos/sa18@2x.jpg new file mode 100644 index 0000000..2a00133 Binary files /dev/null and b/sandbox310/src/assets/img/photos/sa18@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/sa19.jpg b/sandbox310/src/assets/img/photos/sa19.jpg new file mode 100644 index 0000000..433f491 Binary files /dev/null and b/sandbox310/src/assets/img/photos/sa19.jpg differ diff --git a/sandbox310/src/assets/img/photos/sa19@2x.jpg b/sandbox310/src/assets/img/photos/sa19@2x.jpg new file mode 100644 index 0000000..46c5454 Binary files /dev/null and b/sandbox310/src/assets/img/photos/sa19@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/sa1@2x.jpg b/sandbox310/src/assets/img/photos/sa1@2x.jpg new file mode 100644 index 0000000..8864522 Binary files /dev/null and b/sandbox310/src/assets/img/photos/sa1@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/sa2.jpg b/sandbox310/src/assets/img/photos/sa2.jpg new file mode 100644 index 0000000..b23cff0 Binary files /dev/null and b/sandbox310/src/assets/img/photos/sa2.jpg differ diff --git a/sandbox310/src/assets/img/photos/sa20.jpg b/sandbox310/src/assets/img/photos/sa20.jpg new file mode 100644 index 0000000..87d8283 Binary files /dev/null and b/sandbox310/src/assets/img/photos/sa20.jpg differ diff --git a/sandbox310/src/assets/img/photos/sa20@2x.jpg b/sandbox310/src/assets/img/photos/sa20@2x.jpg new file mode 100644 index 0000000..24582cd Binary files /dev/null and b/sandbox310/src/assets/img/photos/sa20@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/sa21.jpg b/sandbox310/src/assets/img/photos/sa21.jpg new file mode 100644 index 0000000..c107229 Binary files /dev/null and b/sandbox310/src/assets/img/photos/sa21.jpg differ diff --git a/sandbox310/src/assets/img/photos/sa21@2x.jpg b/sandbox310/src/assets/img/photos/sa21@2x.jpg new file mode 100644 index 0000000..40ef120 Binary files /dev/null and b/sandbox310/src/assets/img/photos/sa21@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/sa2@2x.jpg b/sandbox310/src/assets/img/photos/sa2@2x.jpg new file mode 100644 index 0000000..82fad01 Binary files /dev/null and b/sandbox310/src/assets/img/photos/sa2@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/sa3.jpg b/sandbox310/src/assets/img/photos/sa3.jpg new file mode 100644 index 0000000..5145118 Binary files /dev/null and b/sandbox310/src/assets/img/photos/sa3.jpg differ diff --git a/sandbox310/src/assets/img/photos/sa3@2x.jpg b/sandbox310/src/assets/img/photos/sa3@2x.jpg new file mode 100644 index 0000000..bc7234c Binary files /dev/null and b/sandbox310/src/assets/img/photos/sa3@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/sa4.jpg b/sandbox310/src/assets/img/photos/sa4.jpg new file mode 100644 index 0000000..481b98b Binary files /dev/null and b/sandbox310/src/assets/img/photos/sa4.jpg differ diff --git a/sandbox310/src/assets/img/photos/sa4@2x.jpg b/sandbox310/src/assets/img/photos/sa4@2x.jpg new file mode 100644 index 0000000..d9c2124 Binary files /dev/null and b/sandbox310/src/assets/img/photos/sa4@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/sa5.jpg b/sandbox310/src/assets/img/photos/sa5.jpg new file mode 100644 index 0000000..70d197f Binary files /dev/null and b/sandbox310/src/assets/img/photos/sa5.jpg differ diff --git a/sandbox310/src/assets/img/photos/sa5@2x.jpg b/sandbox310/src/assets/img/photos/sa5@2x.jpg new file mode 100644 index 0000000..1d1181d Binary files /dev/null and b/sandbox310/src/assets/img/photos/sa5@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/sa6.jpg b/sandbox310/src/assets/img/photos/sa6.jpg new file mode 100644 index 0000000..aec400c Binary files /dev/null and b/sandbox310/src/assets/img/photos/sa6.jpg differ diff --git a/sandbox310/src/assets/img/photos/sa6@2x.jpg b/sandbox310/src/assets/img/photos/sa6@2x.jpg new file mode 100644 index 0000000..4b0a676 Binary files /dev/null and b/sandbox310/src/assets/img/photos/sa6@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/sa7.jpg b/sandbox310/src/assets/img/photos/sa7.jpg new file mode 100644 index 0000000..ec194a6 Binary files /dev/null and b/sandbox310/src/assets/img/photos/sa7.jpg differ diff --git a/sandbox310/src/assets/img/photos/sa7@2x.jpg b/sandbox310/src/assets/img/photos/sa7@2x.jpg new file mode 100644 index 0000000..1a89d27 Binary files /dev/null and b/sandbox310/src/assets/img/photos/sa7@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/sa8.jpg b/sandbox310/src/assets/img/photos/sa8.jpg new file mode 100644 index 0000000..ec63eb5 Binary files /dev/null and b/sandbox310/src/assets/img/photos/sa8.jpg differ diff --git a/sandbox310/src/assets/img/photos/sa8@2x.jpg b/sandbox310/src/assets/img/photos/sa8@2x.jpg new file mode 100644 index 0000000..aab3832 Binary files /dev/null and b/sandbox310/src/assets/img/photos/sa8@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/sa9.jpg b/sandbox310/src/assets/img/photos/sa9.jpg new file mode 100644 index 0000000..d932671 Binary files /dev/null and b/sandbox310/src/assets/img/photos/sa9.jpg differ diff --git a/sandbox310/src/assets/img/photos/sa9@2x.jpg b/sandbox310/src/assets/img/photos/sa9@2x.jpg new file mode 100644 index 0000000..0b382b8 Binary files /dev/null and b/sandbox310/src/assets/img/photos/sa9@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/se1.jpg b/sandbox310/src/assets/img/photos/se1.jpg new file mode 100644 index 0000000..f4aee9a Binary files /dev/null and b/sandbox310/src/assets/img/photos/se1.jpg differ diff --git a/sandbox310/src/assets/img/photos/se1@2x.jpg b/sandbox310/src/assets/img/photos/se1@2x.jpg new file mode 100644 index 0000000..b9da72e Binary files /dev/null and b/sandbox310/src/assets/img/photos/se1@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/se2.jpg b/sandbox310/src/assets/img/photos/se2.jpg new file mode 100644 index 0000000..740b519 Binary files /dev/null and b/sandbox310/src/assets/img/photos/se2.jpg differ diff --git a/sandbox310/src/assets/img/photos/se2@2x.jpg b/sandbox310/src/assets/img/photos/se2@2x.jpg new file mode 100644 index 0000000..3940714 Binary files /dev/null and b/sandbox310/src/assets/img/photos/se2@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/se3.jpg b/sandbox310/src/assets/img/photos/se3.jpg new file mode 100644 index 0000000..9329774 Binary files /dev/null and b/sandbox310/src/assets/img/photos/se3.jpg differ diff --git a/sandbox310/src/assets/img/photos/se3@2x.jpg b/sandbox310/src/assets/img/photos/se3@2x.jpg new file mode 100644 index 0000000..ab7870f Binary files /dev/null and b/sandbox310/src/assets/img/photos/se3@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/se4.jpg b/sandbox310/src/assets/img/photos/se4.jpg new file mode 100644 index 0000000..de65248 Binary files /dev/null and b/sandbox310/src/assets/img/photos/se4.jpg differ diff --git a/sandbox310/src/assets/img/photos/se4@2x.jpg b/sandbox310/src/assets/img/photos/se4@2x.jpg new file mode 100644 index 0000000..3ad6733 Binary files /dev/null and b/sandbox310/src/assets/img/photos/se4@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/se5.jpg b/sandbox310/src/assets/img/photos/se5.jpg new file mode 100644 index 0000000..6d3216d Binary files /dev/null and b/sandbox310/src/assets/img/photos/se5.jpg differ diff --git a/sandbox310/src/assets/img/photos/se5@2x.jpg b/sandbox310/src/assets/img/photos/se5@2x.jpg new file mode 100644 index 0000000..9434d51 Binary files /dev/null and b/sandbox310/src/assets/img/photos/se5@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/se6.jpg b/sandbox310/src/assets/img/photos/se6.jpg new file mode 100644 index 0000000..d05c955 Binary files /dev/null and b/sandbox310/src/assets/img/photos/se6.jpg differ diff --git a/sandbox310/src/assets/img/photos/se6@2x.jpg b/sandbox310/src/assets/img/photos/se6@2x.jpg new file mode 100644 index 0000000..37446af Binary files /dev/null and b/sandbox310/src/assets/img/photos/se6@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/se7.jpg b/sandbox310/src/assets/img/photos/se7.jpg new file mode 100644 index 0000000..cf18afa Binary files /dev/null and b/sandbox310/src/assets/img/photos/se7.jpg differ diff --git a/sandbox310/src/assets/img/photos/se7@2x.jpg b/sandbox310/src/assets/img/photos/se7@2x.jpg new file mode 100644 index 0000000..9263687 Binary files /dev/null and b/sandbox310/src/assets/img/photos/se7@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/sh1.jpg b/sandbox310/src/assets/img/photos/sh1.jpg new file mode 100644 index 0000000..90ff872 Binary files /dev/null and b/sandbox310/src/assets/img/photos/sh1.jpg differ diff --git a/sandbox310/src/assets/img/photos/sh1@2x.jpg b/sandbox310/src/assets/img/photos/sh1@2x.jpg new file mode 100644 index 0000000..7bed156 Binary files /dev/null and b/sandbox310/src/assets/img/photos/sh1@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/sh2.jpg b/sandbox310/src/assets/img/photos/sh2.jpg new file mode 100644 index 0000000..4272c16 Binary files /dev/null and b/sandbox310/src/assets/img/photos/sh2.jpg differ diff --git a/sandbox310/src/assets/img/photos/sh2@2x.jpg b/sandbox310/src/assets/img/photos/sh2@2x.jpg new file mode 100644 index 0000000..b5bd81c Binary files /dev/null and b/sandbox310/src/assets/img/photos/sh2@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/sh3.jpg b/sandbox310/src/assets/img/photos/sh3.jpg new file mode 100644 index 0000000..e2ed3bb Binary files /dev/null and b/sandbox310/src/assets/img/photos/sh3.jpg differ diff --git a/sandbox310/src/assets/img/photos/sh3@2x.jpg b/sandbox310/src/assets/img/photos/sh3@2x.jpg new file mode 100644 index 0000000..6868fa8 Binary files /dev/null and b/sandbox310/src/assets/img/photos/sh3@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/sh4.jpg b/sandbox310/src/assets/img/photos/sh4.jpg new file mode 100644 index 0000000..a1452ae Binary files /dev/null and b/sandbox310/src/assets/img/photos/sh4.jpg differ diff --git a/sandbox310/src/assets/img/photos/sh4@2x.jpg b/sandbox310/src/assets/img/photos/sh4@2x.jpg new file mode 100644 index 0000000..46b27aa Binary files /dev/null and b/sandbox310/src/assets/img/photos/sh4@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/sh5.jpg b/sandbox310/src/assets/img/photos/sh5.jpg new file mode 100644 index 0000000..db7cb80 Binary files /dev/null and b/sandbox310/src/assets/img/photos/sh5.jpg differ diff --git a/sandbox310/src/assets/img/photos/sh5@2x.jpg b/sandbox310/src/assets/img/photos/sh5@2x.jpg new file mode 100644 index 0000000..7e17bec Binary files /dev/null and b/sandbox310/src/assets/img/photos/sh5@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/sh6.jpg b/sandbox310/src/assets/img/photos/sh6.jpg new file mode 100644 index 0000000..ef78422 Binary files /dev/null and b/sandbox310/src/assets/img/photos/sh6.jpg differ diff --git a/sandbox310/src/assets/img/photos/sh6@2x.jpg b/sandbox310/src/assets/img/photos/sh6@2x.jpg new file mode 100644 index 0000000..4d179b4 Binary files /dev/null and b/sandbox310/src/assets/img/photos/sh6@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/sh7.jpg b/sandbox310/src/assets/img/photos/sh7.jpg new file mode 100644 index 0000000..4393ecd Binary files /dev/null and b/sandbox310/src/assets/img/photos/sh7.jpg differ diff --git a/sandbox310/src/assets/img/photos/sh7@2x.jpg b/sandbox310/src/assets/img/photos/sh7@2x.jpg new file mode 100644 index 0000000..482d6be Binary files /dev/null and b/sandbox310/src/assets/img/photos/sh7@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/sh8.jpg b/sandbox310/src/assets/img/photos/sh8.jpg new file mode 100644 index 0000000..9fba3ee Binary files /dev/null and b/sandbox310/src/assets/img/photos/sh8.jpg differ diff --git a/sandbox310/src/assets/img/photos/sh8@2x.jpg b/sandbox310/src/assets/img/photos/sh8@2x.jpg new file mode 100644 index 0000000..24815a8 Binary files /dev/null and b/sandbox310/src/assets/img/photos/sh8@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/sh9.jpg b/sandbox310/src/assets/img/photos/sh9.jpg new file mode 100644 index 0000000..0ac10ba Binary files /dev/null and b/sandbox310/src/assets/img/photos/sh9.jpg differ diff --git a/sandbox310/src/assets/img/photos/sh9@2x.jpg b/sandbox310/src/assets/img/photos/sh9@2x.jpg new file mode 100644 index 0000000..c50e30c Binary files /dev/null and b/sandbox310/src/assets/img/photos/sh9@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/shs1-th.jpg b/sandbox310/src/assets/img/photos/shs1-th.jpg new file mode 100644 index 0000000..95e345d Binary files /dev/null and b/sandbox310/src/assets/img/photos/shs1-th.jpg differ diff --git a/sandbox310/src/assets/img/photos/shs1-th@2x.jpg b/sandbox310/src/assets/img/photos/shs1-th@2x.jpg new file mode 100644 index 0000000..15a13c1 Binary files /dev/null and b/sandbox310/src/assets/img/photos/shs1-th@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/shs1.jpg b/sandbox310/src/assets/img/photos/shs1.jpg new file mode 100644 index 0000000..5a121f7 Binary files /dev/null and b/sandbox310/src/assets/img/photos/shs1.jpg differ diff --git a/sandbox310/src/assets/img/photos/shs1@2x.jpg b/sandbox310/src/assets/img/photos/shs1@2x.jpg new file mode 100644 index 0000000..149eeef Binary files /dev/null and b/sandbox310/src/assets/img/photos/shs1@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/shs2-th.jpg b/sandbox310/src/assets/img/photos/shs2-th.jpg new file mode 100644 index 0000000..8a0b5a2 Binary files /dev/null and b/sandbox310/src/assets/img/photos/shs2-th.jpg differ diff --git a/sandbox310/src/assets/img/photos/shs2-th@2x.jpg b/sandbox310/src/assets/img/photos/shs2-th@2x.jpg new file mode 100644 index 0000000..d3f6c49 Binary files /dev/null and b/sandbox310/src/assets/img/photos/shs2-th@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/shs2.jpg b/sandbox310/src/assets/img/photos/shs2.jpg new file mode 100644 index 0000000..633f5d2 Binary files /dev/null and b/sandbox310/src/assets/img/photos/shs2.jpg differ diff --git a/sandbox310/src/assets/img/photos/shs2@2x.jpg b/sandbox310/src/assets/img/photos/shs2@2x.jpg new file mode 100644 index 0000000..decc585 Binary files /dev/null and b/sandbox310/src/assets/img/photos/shs2@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/shs3-th.jpg b/sandbox310/src/assets/img/photos/shs3-th.jpg new file mode 100644 index 0000000..8d10609 Binary files /dev/null and b/sandbox310/src/assets/img/photos/shs3-th.jpg differ diff --git a/sandbox310/src/assets/img/photos/shs3-th@2x.jpg b/sandbox310/src/assets/img/photos/shs3-th@2x.jpg new file mode 100644 index 0000000..31d6e3f Binary files /dev/null and b/sandbox310/src/assets/img/photos/shs3-th@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/shs3.jpg b/sandbox310/src/assets/img/photos/shs3.jpg new file mode 100644 index 0000000..becc27d Binary files /dev/null and b/sandbox310/src/assets/img/photos/shs3.jpg differ diff --git a/sandbox310/src/assets/img/photos/shs3@2x.jpg b/sandbox310/src/assets/img/photos/shs3@2x.jpg new file mode 100644 index 0000000..cd72270 Binary files /dev/null and b/sandbox310/src/assets/img/photos/shs3@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/shs4-th.jpg b/sandbox310/src/assets/img/photos/shs4-th.jpg new file mode 100644 index 0000000..9b210de Binary files /dev/null and b/sandbox310/src/assets/img/photos/shs4-th.jpg differ diff --git a/sandbox310/src/assets/img/photos/shs4-th@2x.jpg b/sandbox310/src/assets/img/photos/shs4-th@2x.jpg new file mode 100644 index 0000000..f8496d2 Binary files /dev/null and b/sandbox310/src/assets/img/photos/shs4-th@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/shs4.jpg b/sandbox310/src/assets/img/photos/shs4.jpg new file mode 100644 index 0000000..ab63fc7 Binary files /dev/null and b/sandbox310/src/assets/img/photos/shs4.jpg differ diff --git a/sandbox310/src/assets/img/photos/shs4@2x.jpg b/sandbox310/src/assets/img/photos/shs4@2x.jpg new file mode 100644 index 0000000..8ab7b50 Binary files /dev/null and b/sandbox310/src/assets/img/photos/shs4@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/sp1.jpg b/sandbox310/src/assets/img/photos/sp1.jpg new file mode 100644 index 0000000..7384056 Binary files /dev/null and b/sandbox310/src/assets/img/photos/sp1.jpg differ diff --git a/sandbox310/src/assets/img/photos/sp1@2x.jpg b/sandbox310/src/assets/img/photos/sp1@2x.jpg new file mode 100644 index 0000000..46ab647 Binary files /dev/null and b/sandbox310/src/assets/img/photos/sp1@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/sp2.jpg b/sandbox310/src/assets/img/photos/sp2.jpg new file mode 100644 index 0000000..5bc0abb Binary files /dev/null and b/sandbox310/src/assets/img/photos/sp2.jpg differ diff --git a/sandbox310/src/assets/img/photos/sp2@2x.jpg b/sandbox310/src/assets/img/photos/sp2@2x.jpg new file mode 100644 index 0000000..40b3dc9 Binary files /dev/null and b/sandbox310/src/assets/img/photos/sp2@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/sp3.jpg b/sandbox310/src/assets/img/photos/sp3.jpg new file mode 100644 index 0000000..fb12529 Binary files /dev/null and b/sandbox310/src/assets/img/photos/sp3.jpg differ diff --git a/sandbox310/src/assets/img/photos/sp3@2x.jpg b/sandbox310/src/assets/img/photos/sp3@2x.jpg new file mode 100644 index 0000000..e88db34 Binary files /dev/null and b/sandbox310/src/assets/img/photos/sp3@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/sp4.jpg b/sandbox310/src/assets/img/photos/sp4.jpg new file mode 100644 index 0000000..0d195e2 Binary files /dev/null and b/sandbox310/src/assets/img/photos/sp4.jpg differ diff --git a/sandbox310/src/assets/img/photos/sp4@2x.jpg b/sandbox310/src/assets/img/photos/sp4@2x.jpg new file mode 100644 index 0000000..db8d7a6 Binary files /dev/null and b/sandbox310/src/assets/img/photos/sp4@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/sp5.jpg b/sandbox310/src/assets/img/photos/sp5.jpg new file mode 100644 index 0000000..8974adc Binary files /dev/null and b/sandbox310/src/assets/img/photos/sp5.jpg differ diff --git a/sandbox310/src/assets/img/photos/sp5@2x.jpg b/sandbox310/src/assets/img/photos/sp5@2x.jpg new file mode 100644 index 0000000..6e62fd2 Binary files /dev/null and b/sandbox310/src/assets/img/photos/sp5@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/sp6.jpg b/sandbox310/src/assets/img/photos/sp6.jpg new file mode 100644 index 0000000..e8fa986 Binary files /dev/null and b/sandbox310/src/assets/img/photos/sp6.jpg differ diff --git a/sandbox310/src/assets/img/photos/sp6@2x.jpg b/sandbox310/src/assets/img/photos/sp6@2x.jpg new file mode 100644 index 0000000..a984474 Binary files /dev/null and b/sandbox310/src/assets/img/photos/sp6@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/ss1.jpg b/sandbox310/src/assets/img/photos/ss1.jpg new file mode 100644 index 0000000..8c17341 Binary files /dev/null and b/sandbox310/src/assets/img/photos/ss1.jpg differ diff --git a/sandbox310/src/assets/img/photos/sth1.jpg b/sandbox310/src/assets/img/photos/sth1.jpg new file mode 100644 index 0000000..9428218 Binary files /dev/null and b/sandbox310/src/assets/img/photos/sth1.jpg differ diff --git a/sandbox310/src/assets/img/photos/sth1@2x.jpg b/sandbox310/src/assets/img/photos/sth1@2x.jpg new file mode 100644 index 0000000..2a577c0 Binary files /dev/null and b/sandbox310/src/assets/img/photos/sth1@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/sth2.jpg b/sandbox310/src/assets/img/photos/sth2.jpg new file mode 100644 index 0000000..3772941 Binary files /dev/null and b/sandbox310/src/assets/img/photos/sth2.jpg differ diff --git a/sandbox310/src/assets/img/photos/sth2@2x.jpg b/sandbox310/src/assets/img/photos/sth2@2x.jpg new file mode 100644 index 0000000..384b756 Binary files /dev/null and b/sandbox310/src/assets/img/photos/sth2@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/sth3.jpg b/sandbox310/src/assets/img/photos/sth3.jpg new file mode 100644 index 0000000..a4dfd44 Binary files /dev/null and b/sandbox310/src/assets/img/photos/sth3.jpg differ diff --git a/sandbox310/src/assets/img/photos/sth3@2x.jpg b/sandbox310/src/assets/img/photos/sth3@2x.jpg new file mode 100644 index 0000000..ba19363 Binary files /dev/null and b/sandbox310/src/assets/img/photos/sth3@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/tei1.jpg b/sandbox310/src/assets/img/photos/tei1.jpg new file mode 100644 index 0000000..6180f9f Binary files /dev/null and b/sandbox310/src/assets/img/photos/tei1.jpg differ diff --git a/sandbox310/src/assets/img/photos/tei1@2x.jpg b/sandbox310/src/assets/img/photos/tei1@2x.jpg new file mode 100644 index 0000000..3866678 Binary files /dev/null and b/sandbox310/src/assets/img/photos/tei1@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/tm1.jpg b/sandbox310/src/assets/img/photos/tm1.jpg new file mode 100644 index 0000000..1332701 Binary files /dev/null and b/sandbox310/src/assets/img/photos/tm1.jpg differ diff --git a/sandbox310/src/assets/img/photos/tm2.jpg b/sandbox310/src/assets/img/photos/tm2.jpg new file mode 100644 index 0000000..8f0d977 Binary files /dev/null and b/sandbox310/src/assets/img/photos/tm2.jpg differ diff --git a/sandbox310/src/assets/img/photos/tm3.jpg b/sandbox310/src/assets/img/photos/tm3.jpg new file mode 100644 index 0000000..12b41db Binary files /dev/null and b/sandbox310/src/assets/img/photos/tm3.jpg differ diff --git a/sandbox310/src/assets/img/photos/v1.jpg b/sandbox310/src/assets/img/photos/v1.jpg new file mode 100644 index 0000000..6feed37 Binary files /dev/null and b/sandbox310/src/assets/img/photos/v1.jpg differ diff --git a/sandbox310/src/assets/img/photos/v1@2x.jpg b/sandbox310/src/assets/img/photos/v1@2x.jpg new file mode 100644 index 0000000..0a11c3f Binary files /dev/null and b/sandbox310/src/assets/img/photos/v1@2x.jpg differ diff --git a/sandbox310/src/assets/img/photos/vt1.png b/sandbox310/src/assets/img/photos/vt1.png new file mode 100644 index 0000000..af33f39 Binary files /dev/null and b/sandbox310/src/assets/img/photos/vt1.png differ diff --git a/sandbox310/src/assets/img/photos/vt1@2x.png b/sandbox310/src/assets/img/photos/vt1@2x.png new file mode 100644 index 0000000..ab2c5b8 Binary files /dev/null and b/sandbox310/src/assets/img/photos/vt1@2x.png differ diff --git a/sandbox310/src/assets/img/photos/vt2.png b/sandbox310/src/assets/img/photos/vt2.png new file mode 100644 index 0000000..518f3b9 Binary files /dev/null and b/sandbox310/src/assets/img/photos/vt2.png differ diff --git a/sandbox310/src/assets/img/photos/vt2@2x.png b/sandbox310/src/assets/img/photos/vt2@2x.png new file mode 100644 index 0000000..f9862d4 Binary files /dev/null and b/sandbox310/src/assets/img/photos/vt2@2x.png differ diff --git a/sandbox310/src/assets/img/photos/vt3.png b/sandbox310/src/assets/img/photos/vt3.png new file mode 100644 index 0000000..d3c9dde Binary files /dev/null and b/sandbox310/src/assets/img/photos/vt3.png differ diff --git a/sandbox310/src/assets/img/photos/vt3@2x.png b/sandbox310/src/assets/img/photos/vt3@2x.png new file mode 100644 index 0000000..d724db2 Binary files /dev/null and b/sandbox310/src/assets/img/photos/vt3@2x.png differ diff --git a/sandbox310/src/assets/img/photos/woman.png b/sandbox310/src/assets/img/photos/woman.png new file mode 100644 index 0000000..6eca135 Binary files /dev/null and b/sandbox310/src/assets/img/photos/woman.png differ diff --git a/sandbox310/src/assets/img/photos/woman@2x.png b/sandbox310/src/assets/img/photos/woman@2x.png new file mode 100644 index 0000000..a1fc5ac Binary files /dev/null and b/sandbox310/src/assets/img/photos/woman@2x.png differ diff --git a/sandbox310/src/assets/img/svg/blob.svg b/sandbox310/src/assets/img/svg/blob.svg new file mode 100644 index 0000000..b941e7e --- /dev/null +++ b/sandbox310/src/assets/img/svg/blob.svg @@ -0,0 +1 @@ +shape \ No newline at end of file diff --git a/sandbox310/src/assets/img/svg/circle.svg b/sandbox310/src/assets/img/svg/circle.svg new file mode 100644 index 0000000..1c43ca7 --- /dev/null +++ b/sandbox310/src/assets/img/svg/circle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/svg/hex.svg b/sandbox310/src/assets/img/svg/hex.svg new file mode 100644 index 0000000..fa0aabb --- /dev/null +++ b/sandbox310/src/assets/img/svg/hex.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/img/svg/tri.svg b/sandbox310/src/assets/img/svg/tri.svg new file mode 100644 index 0000000..1ff0d78 --- /dev/null +++ b/sandbox310/src/assets/img/svg/tri.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/sandbox310/src/assets/js/theme.js b/sandbox310/src/assets/js/theme.js new file mode 100644 index 0000000..19a9640 --- /dev/null +++ b/sandbox310/src/assets/js/theme.js @@ -0,0 +1,850 @@ +'use strict'; +var theme = { + /** + * Theme's components/functions list + * Comment out or delete the unnecessary component. + * Some components have dependencies (plugins). + * Do not forget to remove dependency from src/js/vendor/ and recompile. + */ + init: function () { + theme.stickyHeader(); + theme.subMenu(); + theme.offCanvas(); + theme.isotope(); + theme.onepageHeaderOffset(); + theme.anchorSmoothScroll(); + theme.svgInject(); + theme.backgroundImage(); + theme.backgroundImageMobile(); + theme.imageHoverOverlay(); + theme.rellax(); + theme.scrollCue(); + theme.swiperSlider(); + theme.lightbox(); + theme.plyr(); + theme.progressBar(); + theme.loader(); + theme.pageProgress(); + theme.counterUp(); + theme.bsTooltips(); + theme.bsPopovers(); + theme.bsModal(); + theme.iTooltip(); + theme.forms(); + theme.passVisibility(); + theme.pricingSwitcher(); + theme.textRotator(); + theme.codeSnippet(); + }, + /** + * Sticky Header + * Enables sticky behavior on navbar on page scroll + * Requires assets/js/vendor/headhesive.min.js + */ + stickyHeader: () => { + var navbar = document.querySelector(".navbar"); + if (navbar == null) return; + var options = { + offset: 350, + offsetSide: 'top', + classes: { + clone: 'navbar-clone fixed', + stick: 'navbar-stick', + unstick: 'navbar-unstick', + }, + onStick: function() { + var navbarClonedClass = this.clonedElem.classList; + if (navbarClonedClass.contains('transparent') && navbarClonedClass.contains('navbar-dark')) { + this.clonedElem.className = this.clonedElem.className.replace("navbar-dark","navbar-light"); + } + } + }; + var banner = new Headhesive('.navbar', options); + }, + /** + * Sub Menus + * Enables multilevel dropdown + */ + subMenu: function () { + (function($bs) { + const CLASS_NAME = 'has-child-dropdown-show'; + $bs.Dropdown.prototype.toggle = function(_original) { + return function() { + document.querySelectorAll('.' + CLASS_NAME).forEach(function(e) { + e.classList.remove(CLASS_NAME); + }); + let dd = this._element.closest('.dropdown').parentNode.closest('.dropdown'); + for (; dd && dd !== document; dd = dd.parentNode.closest('.dropdown')) { + dd.classList.add(CLASS_NAME); + } + return _original.call(this); + } + }($bs.Dropdown.prototype.toggle); + document.querySelectorAll('.dropdown').forEach(function(dd) { + dd.addEventListener('hide.bs.dropdown', function(e) { + if (this.classList.contains(CLASS_NAME)) { + this.classList.remove(CLASS_NAME); + e.preventDefault(); + } + e.stopPropagation(); + }); + }); + })(bootstrap); + }, + /** + * Offcanvas + * Enables offcanvas-nav, closes offcanvas on anchor clicks + */ + offCanvas: function () { + const navOffCanvasBtn = document.querySelectorAll(".offcanvas-nav-btn"); + const navOffCanvas = document.querySelector('.navbar:not(.navbar-clone) .offcanvas-nav'); + const bsOffCanvas = new bootstrap.Offcanvas(navOffCanvas, {scroll: true}); + const scrollLink = document.querySelectorAll('.onepage .navbar li a.scroll'); + navOffCanvasBtn.forEach(e => { + e.addEventListener('click', event => { + bsOffCanvas.show(); + }) + }); + scrollLink.forEach(e => { + e.addEventListener('click', event => { + bsOffCanvas.hide(); + }) + }); + }, + /** + * Isotope + * Enables isotope grid layout and filtering + * Requires assets/js/vendor/isotope.pkgd.min.js + * Requires assets/js/vendor/imagesloaded.pkgd.min.js + */ + isotope: function () { + var grids = document.querySelectorAll('.grid'); + if(grids != null) { + grids.forEach(g => { + var grid = g.querySelector('.isotope'); + var filtersElem = g.querySelector('.isotope-filter'); + var buttonGroups = g.querySelectorAll('.isotope-filter'); + var iso = new Isotope(grid, { + itemSelector: '.item', + layoutMode: 'masonry', + masonry: { + columnWidth: grid.offsetWidth / 12 + }, + percentPosition: true, + transitionDuration: '0.7s' + }); + imagesLoaded(grid).on("progress", function() { + iso.layout({ + masonry: { + columnWidth: grid.offsetWidth / 12 + } + }) + }), + window.addEventListener("resize", function() { + iso.arrange({ + masonry: { + columnWidth: grid.offsetWidth / 12 + } + }); + }, true); + if(filtersElem != null) { + filtersElem.addEventListener('click', function(event) { + if(!matchesSelector(event.target, '.filter-item')) { + return; + } + var filterValue = event.target.getAttribute('data-filter'); + iso.arrange({ + filter: filterValue + }); + }); + for(var i = 0, len = buttonGroups.length; i < len; i++) { + var buttonGroup = buttonGroups[i]; + buttonGroup.addEventListener('click', function(event) { + if(!matchesSelector(event.target, '.filter-item')) { + return; + } + buttonGroup.querySelector('.active').classList.remove('active'); + event.target.classList.add('active'); + }); + } + } + }); + } + }, + /** + * Onepage Header Offset + * Adds an offset value to anchor point equal to sticky header height on a onepage + */ + onepageHeaderOffset: function () { + const header_height = document.querySelector(".navbar").offsetHeight; + const shrinked_header_height = 75; + const sections = document.querySelectorAll(".onepage section"); + sections.forEach(section => { + section.style.paddingTop = shrinked_header_height + 'px'; + section.style.marginTop = '-' + shrinked_header_height + 'px'; + }); + const first_section = document.querySelector(".onepage section:first-of-type"); + if(first_section != null) { + first_section.style.paddingTop = header_height + 'px'; + first_section.style.marginTop = '-' + header_height + 'px'; + } + }, + /** + * Anchor Smooth Scroll + * Adds smooth scroll animation to links with .scroll class + * Requires assets/js/vendor/smoothscroll.js + */ + anchorSmoothScroll: function () { + const links = document.querySelectorAll(".scroll"); + for(const link of links) { + link.addEventListener("click", clickHandler); + } + function clickHandler(e) { + e.preventDefault(); + this.blur(); + const href = this.getAttribute("href"); + const offsetTop = document.querySelector(href).offsetTop; + scroll({ + top: offsetTop, + behavior: "smooth" + }); + } + }, + /** + * SVGInject + * Replaces an img element with an inline SVG so you can apply colors to your SVGs + * Requires assets/js/vendor/svg-inject.min.js + */ + svgInject: function () { + SVGInject.setOptions({ + onFail: function(img, svg) { + img.classList.remove('svg-inject'); + } + }); + document.addEventListener('DOMContentLoaded', function() { + SVGInject(document.querySelectorAll('img.svg-inject'), { + useCache: true + }); + }); + }, + /** + * Background Image + * Adds a background image link via data attribute "data-image-src" + */ + backgroundImage: function () { + var bg = document.querySelectorAll(".bg-image"); + for(var i = 0; i < bg.length; i++) { + var url = bg[i].getAttribute('data-image-src'); + bg[i].style.backgroundImage = "url('" + url + "')"; + } + }, + /** + * Background Image Mobile + * Adds .mobile class to background images on mobile devices for styling purposes + */ + backgroundImageMobile: function () { + var isMobile = (navigator.userAgent.match(/Android/i) || navigator.userAgent.match(/webOS/i) || navigator.userAgent.match(/iPhone/i) || navigator.userAgent.match(/iPad/i) || (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1) || navigator.userAgent.match(/iPod/i) || navigator.userAgent.match(/BlackBerry/i)) ? true : false; + if(isMobile) { + document.querySelectorAll(".image-wrapper").forEach(e => { + e.classList.add("mobile") + }) + } + }, + /** + * Image Hover Overlay + * Adds span.bg inside .overlay for simpler markup and styling purposes + */ + imageHoverOverlay: function () { + var overlay = document.querySelectorAll('.overlay > a, .overlay > span'); + for(var i = 0; i < overlay.length; i++) { + var overlay_bg = document.createElement('span'); + overlay_bg.className = "bg"; + overlay[i].appendChild(overlay_bg); + } + }, + /** + * Rellax.js + * Adds parallax animation to shapes and elements + * Requires assets/js/vendor/rellax.min.js + */ + rellax: function () { + if(document.querySelector(".rellax") != null) { + window.onload = function() { + var rellax = new Rellax('.rellax', { + speed: 2, + center: true, + breakpoints: [576, 992, 1201] + }); + var projects_overflow = document.querySelectorAll('.projects-overflow'); + imagesLoaded(projects_overflow, function() { + rellax.refresh(); + }); + } + } + }, + /** + * scrollCue.js + * Enables showing elements by scrolling + * Requires assets/js/vendor/scrollCue.min.js + */ + scrollCue: function () { + scrollCue.init({ + interval: -400, + duration: 700, + percentage: 0.8 + }); + scrollCue.update(); + }, + /** + * Swiper Slider + * Enables carousels and sliders + * Requires assets/js/vendor/swiper-bundle.min.js + */ + swiperSlider: function() { + var carousel = document.querySelectorAll('.swiper-container'); + for(var i = 0; i < carousel.length; i++) { + var slider1 = carousel[i]; + slider1.classList.add('swiper-container-' + i); + var controls = document.createElement('div'); + controls.className = "swiper-controls"; + var pagi = document.createElement('div'); + pagi.className = "swiper-pagination"; + var navi = document.createElement('div'); + navi.className = "swiper-navigation"; + var prev = document.createElement('div'); + prev.className = "swiper-button swiper-button-prev"; + var next = document.createElement('div'); + next.className = "swiper-button swiper-button-next"; + slider1.appendChild(controls); + controls.appendChild(navi); + navi.appendChild(prev); + navi.appendChild(next); + controls.appendChild(pagi); + var sliderEffect = slider1.getAttribute('data-effect') ? slider1.getAttribute('data-effect') : 'slide'; + var sliderItems = slider1.getAttribute('data-items') ? slider1.getAttribute('data-items') : 3; // items in all devices + var sliderItemsXs = slider1.getAttribute('data-items-xs') ? slider1.getAttribute('data-items-xs') : 1; // start - 575 + var sliderItemsSm = slider1.getAttribute('data-items-sm') ? slider1.getAttribute('data-items-sm') : Number(sliderItemsXs); // 576 - 767 + var sliderItemsMd = slider1.getAttribute('data-items-md') ? slider1.getAttribute('data-items-md') : Number(sliderItemsSm); // 768 - 991 + var sliderItemsLg = slider1.getAttribute('data-items-lg') ? slider1.getAttribute('data-items-lg') : Number(sliderItemsMd); // 992 - 1199 + var sliderItemsXl = slider1.getAttribute('data-items-xl') ? slider1.getAttribute('data-items-xl') : Number(sliderItemsLg); // 1200 - end + var sliderItemsXxl = slider1.getAttribute('data-items-xxl') ? slider1.getAttribute('data-items-xxl') : Number(sliderItemsXl); // 1500 - end + var sliderSpeed = slider1.getAttribute('data-speed') ? slider1.getAttribute('data-speed') : 500; + var sliderAutoPlay = slider1.getAttribute('data-autoplay') !== 'false'; + var sliderAutoPlayTime = slider1.getAttribute('data-autoplaytime') ? slider1.getAttribute('data-autoplaytime') : 5000; + var sliderAutoHeight = slider1.getAttribute('data-autoheight') === 'true'; + var sliderMargin = slider1.getAttribute('data-margin') ? slider1.getAttribute('data-margin') : 30; + var sliderLoop = slider1.getAttribute('data-loop') === 'true'; + var swiper = slider1.querySelector('.swiper:not(.swiper-thumbs)'); + var swiperTh = slider1.querySelector('.swiper-thumbs'); + var sliderTh = new Swiper(swiperTh, { + slidesPerView: 5, + spaceBetween: 10, + loop: false, + threshold: 2 + }); + if (slider1.getAttribute('data-thumbs') === 'true') { + var thumbsInit = sliderTh; + var swiperMain = document.createElement('div'); + swiperMain.className = "swiper-main"; + swiper.parentNode.insertBefore(swiperMain, swiper); + swiperMain.appendChild(swiper); + slider1.removeChild(controls); + swiperMain.appendChild(controls); + } else { + var thumbsInit = null; + } + var slider = new Swiper(swiper, { + on: { + beforeInit: function() { + if(slider1.getAttribute('data-nav') !== 'true' && slider1.getAttribute('data-dots') !== 'true') { + controls.remove(); + } + if(slider1.getAttribute('data-dots') !== 'true') { + pagi.remove(); + } + if(slider1.getAttribute('data-nav') !== 'true') { + navi.remove(); + } + }, + init: function() { + if(slider1.getAttribute('data-autoplay') !== 'true') { + this.autoplay.stop(); + } + this.update(); + } + }, + autoplay: { + delay: sliderAutoPlayTime, + disableOnInteraction: false + }, + speed: sliderSpeed, + slidesPerView: sliderItems, + loop: sliderLoop, + spaceBetween: Number(sliderMargin), + effect: sliderEffect, + autoHeight: sliderAutoHeight, + grabCursor: true, + resizeObserver: false, + breakpoints: { + 0: { + slidesPerView: Number(sliderItemsXs) + }, + 576: { + slidesPerView: Number(sliderItemsSm) + }, + 768: { + slidesPerView: Number(sliderItemsMd) + }, + 992: { + slidesPerView: Number(sliderItemsLg) + }, + 1200: { + slidesPerView: Number(sliderItemsXl) + }, + 1400: { + slidesPerView: Number(sliderItemsXxl) + } + }, + pagination: { + el: carousel[i].querySelector('.swiper-pagination'), + clickable: true + }, + navigation: { + prevEl: slider1.querySelector('.swiper-button-prev'), + nextEl: slider1.querySelector('.swiper-button-next'), + }, + thumbs: { + swiper: thumbsInit, + }, + }); + } + }, + /** + * GLightbox + * Enables lightbox functionality + * Requires assets/js/vendor/glightbox.js + */ + lightbox: function () { + const lightbox = GLightbox({ + selector: '*[data-glightbox]', + touchNavigation: true, + loop: false, + zoomable: false, + autoplayVideos: true, + moreLength: 0, + slideExtraAttributes: { + poster: '' + }, + plyr: { + css: '', + js: '', + config: { + ratio: '16:9', + fullscreen: { + enabled: false, + iosNative: false + }, + youtube: { + noCookie: true, + rel: 0, + showinfo: 0, + iv_load_policy: 3 + }, + vimeo: { + byline: false, + portrait: false, + title: false, + transparent: false + } + } + }, + }); + }, + /** + * Plyr + * Enables media player + * Requires assets/js/vendor/plyr.js + */ + plyr: function () { + var players = Plyr.setup('.player', { + loadSprite: true, + }); + }, + /** + * Progressbar + * Enables animated progressbars + * Requires assets/js/vendor/progressbar.min.js + * Requires assets/js/vendor/noframework.waypoints.min.js + */ + progressBar: function () { + const pline = document.querySelectorAll(".progressbar.line"); + const pcircle = document.querySelectorAll(".progressbar.semi-circle"); + pline.forEach(e => { + var line = new ProgressBar.Line(e, { + strokeWidth: 6, + trailWidth: 6, + duration: 3000, + easing: 'easeInOut', + text: { + style: { + color: 'inherit', + position: 'absolute', + right: '0', + top: '-30px', + padding: 0, + margin: 0, + transform: null + }, + autoStyleContainer: false + }, + step: (state, line) => { + line.setText(Math.round(line.value() * 100) + ' %'); + } + }); + var value = e.getAttribute('data-value') / 100; + new Waypoint({ + element: e, + handler: function() { + line.animate(value); + }, + offset: 'bottom-in-view', + }) + }); + pcircle.forEach(e => { + var circle = new ProgressBar.SemiCircle(e, { + strokeWidth: 6, + trailWidth: 6, + duration: 2000, + easing: 'easeInOut', + step: (state, circle) => { + circle.setText(Math.round(circle.value() * 100)); + } + }); + var value = e.getAttribute('data-value') / 100; + new Waypoint({ + element: e, + handler: function() { + circle.animate(value); + }, + offset: 'bottom-in-view', + }) + }); + }, + /** + * Loader + * + */ + loader: function () { + var preloader = document.querySelector('.page-loader'); + if(preloader != null) { + document.body.onload = function(){ + setTimeout(function() { + if( !preloader.classList.contains('done') ) + { + preloader.classList.add('done'); + } + }, 1000) + } + } + }, + /** + * Page Progress + * Shows page progress on the bottom right corner of pages + */ + pageProgress: function () { + var progressWrap = document.querySelector('.progress-wrap'); + var progressPath = document.querySelector('.progress-wrap path'); + var pathLength = progressPath.getTotalLength(); + var offset = 50; + if(progressWrap != null) { + progressPath.style.transition = progressPath.style.WebkitTransition = 'none'; + progressPath.style.strokeDasharray = pathLength + ' ' + pathLength; + progressPath.style.strokeDashoffset = pathLength; + progressPath.getBoundingClientRect(); + progressPath.style.transition = progressPath.style.WebkitTransition = 'stroke-dashoffset 10ms linear'; + window.addEventListener("scroll", function(event) { + var scroll = document.body.scrollTop || document.documentElement.scrollTop; + var height = document.documentElement.scrollHeight - document.documentElement.clientHeight; + var progress = pathLength - (scroll * pathLength / height); + progressPath.style.strokeDashoffset = progress; + var scrollElementPos = document.body.scrollTop || document.documentElement.scrollTop; + if(scrollElementPos >= offset) { + progressWrap.classList.add("active-progress") + } else { + progressWrap.classList.remove("active-progress") + } + }); + progressWrap.addEventListener('click', function(e) { + e.preventDefault(); + window.scroll({ + top: 0, + left: 0, + behavior: 'smooth' + }); + }); + } + }, + /** + * Counter Up + * Counts up to a targeted number when the number becomes visible + * Requires assets/js/vendor/counterup.min.js + * Requires assets/js/vendor/noframework.waypoints.min.js + */ + counterUp: function () { + var counterUp = window.counterUp["default"]; + const counters = document.querySelectorAll(".counter"); + counters.forEach(el => { + new Waypoint({ + element: el, + handler: function() { + counterUp(el, { + duration: 1000, + delay: 50 + }) + this.destroy() + }, + offset: 'bottom-in-view', + }) + }); + }, + /** + * Bootstrap Tooltips + * Enables Bootstrap tooltips + * Requires Poppers library + */ + bsTooltips: function () { + var tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]')) + var tooltipList = tooltipTriggerList.map(function(tooltipTriggerEl) { + return new bootstrap.Tooltip(tooltipTriggerEl, { + trigger: 'hover' + }) + }); + var tooltipTriggerWhite = [].slice.call(document.querySelectorAll('[data-bs-toggle="white-tooltip"]')) + var tooltipWhite = tooltipTriggerWhite.map(function(tooltipTriggerEl) { + return new bootstrap.Tooltip(tooltipTriggerEl, { + customClass: 'white-tooltip', + trigger: 'hover', + placement: 'left' + }) + }) + }, + /** + * Bootstrap Popovers + * Enables Bootstrap popovers + * Requires Poppers library + */ + bsPopovers: function () { + var popoverTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="popover"]')) + var popoverList = popoverTriggerList.map(function(popoverTriggerEl) { + return new bootstrap.Popover(popoverTriggerEl) + }) + }, + /** + * Bootstrap Modal + * Enables Bootstrap modal popup + */ + bsModal: function () { + if(document.querySelector(".modal-popup") != null) { + var myModalPopup = new bootstrap.Modal(document.querySelector('.modal-popup')); + setTimeout(function() { + myModalPopup.show(); + }, 200); + } + // Fixes jumping of page progress caused by modal + var innerWidth = window.innerWidth; + var clientWidth = document.body.clientWidth; + var scrollSize = innerWidth - clientWidth; + var myModalEl = document.querySelectorAll('.modal'); + var navbarFixed = document.querySelector('.navbar.fixed'); + var pageProgress = document.querySelector('.progress-wrap'); + function setPadding() { + if(navbarFixed != null) { + navbarFixed.style.paddingRight = scrollSize + 'px'; + } + if(pageProgress != null) { + pageProgress.style.marginRight = scrollSize + 'px'; + } + } + function removePadding() { + if(navbarFixed != null) { + navbarFixed.style.paddingRight = ''; + } + if(pageProgress != null) { + pageProgress.style.marginRight = ''; + } + } + myModalEl.forEach(myModalEl => { + myModalEl.addEventListener('show.bs.modal', function(e) { + setPadding(); + }) + myModalEl.addEventListener('hidden.bs.modal', function(e) { + removePadding(); + }) + }); + }, + /** + * iTooltip + * Enables custom tooltip style for image hover docs/elements/hover.html + * Requires assets/js/vendor/itooltip.min.js + */ + iTooltip: function () { + var tooltip = new iTooltip('.itooltip') + tooltip.init({ + className: 'itooltip-inner', + indentX: 15, + indentY: 15, + positionX: 'right', + positionY: 'bottom' + }) + }, + /** + * Form Validation and Contact Form submit + * Bootstrap validation - Only sends messages if form has class ".contact-form" and is validated and shows success/fail messages + */ + forms: function () { + (function() { + "use strict"; + window.addEventListener("load", function() { + var forms = document.querySelectorAll(".needs-validation"); + var validation = Array.prototype.filter.call(forms, function(form) { + form.addEventListener("submit", function(event) { + if(form.checkValidity() === false) { + event.preventDefault(); + event.stopPropagation(); + } + form.classList.add("was-validated"); + if(form.checkValidity() === true) { + event.preventDefault(); + form.classList.remove("was-validated"); + // Send message only if the form has class .contact-form + var isContactForm = form.classList.contains('contact-form'); + console.log(isContactForm); + if(isContactForm) { + var data = new FormData(form); + var alertClass = 'alert-danger'; + fetch("assets/php/contact.php", { + method: "post", + body: data + }).then((data) => { + if(data.ok) { + alertClass = 'alert-success'; + } + return data.text(); + }).then((txt) => { + var alertBox = '
' + txt + '
'; + if(alertClass && txt) { + form.querySelector(".messages").insertAdjacentHTML('beforeend', alertBox); + form.reset(); + } + }).catch((err) => { + console.log(err); + }); + } + } + }, false); + }); + }, false); + })(); + }, + /** + * Password Visibility Toggle + * Toggles password visibility in password input + */ + passVisibility: function () { + let pass = document.querySelectorAll('.password-field'); + for (let i = 0; i < pass.length; i++) { + let passInput = pass[i].querySelector('.form-control'); + let passToggle = pass[i].querySelector('.password-toggle > i'); + passToggle.addEventListener('click', (e) => { + if (passInput.type === "password") { + passInput.type = "text"; + passToggle.classList.remove('uil-eye'); + passToggle.classList.add('uil-eye-slash'); + } else { + passInput.type = "password"; + passToggle.classList.remove('uil-eye-slash'); + passToggle.classList.add('uil-eye'); + } + }, false); + } + }, + /** + * Pricing Switcher + * Enables monthly/yearly switcher seen on pricing tables + */ + pricingSwitcher: function () { + const wrapper = document.querySelectorAll(".pricing-wrapper"); + wrapper.forEach(wrap => { + const switchers = wrap.querySelector(".pricing-switchers"); + const switcher = wrap.querySelectorAll(".pricing-switcher"); + const price = wrap.querySelectorAll(".price"); + switchers.addEventListener("click", (e) => { + switcher.forEach(s => { + s.classList.toggle("pricing-switcher-active"); + }); + price.forEach(p => { + p.classList.remove("price-hidden"); + p.classList.toggle("price-show"); + p.classList.toggle("price-hide"); + }); + }); + }); + }, + /** + * ReplaceMe.js + * Enables text rotator + * Requires assets/js/vendor/replaceme.min.js + */ + textRotator: function () { + if(document.querySelector(".rotator-zoom") != null) { + var replace = new ReplaceMe(document.querySelector('.rotator-zoom'), { + animation: 'animate__animated animate__zoomIn', + speed: 2500, + separator: ',', + clickChange: false, + loopCount: 'infinite' + }); + } + if(document.querySelector(".rotator-fade") != null) { + var replace = new ReplaceMe(document.querySelector('.rotator-fade'), { + animation: 'animate__animated animate__fadeInDown', + speed: 2500, + separator: ',', + clickChange: false, + loopCount: 'infinite' + }); + } + }, + /** + * Clipboard.js + * Enables clipboard on docs + * Requires assets/js/vendor/clipboard.min.js + */ + codeSnippet: function () { + var btnHtml = '' + document.querySelectorAll('.code-wrapper-inner').forEach(function(element) { + element.insertAdjacentHTML('beforebegin', btnHtml) + }) + var clipboard = new ClipboardJS('.btn-clipboard', { + target: function(trigger) { + return trigger.nextElementSibling + } + }) + clipboard.on('success', event => { + event.trigger.textContent = 'Copied!'; + event.clearSelection(); + setTimeout(function () { + event.trigger.textContent = 'Copy'; + }, 2000); + }); + var copyIconCode = new ClipboardJS('.btn-copy-icon'); + copyIconCode.on('success', function(event) { + event.clearSelection(); + event.trigger.textContent = 'Copied!'; + window.setTimeout(function() { + event.trigger.textContent = 'Copy'; + }, 2300); + }); + }, +} +theme.init(); \ No newline at end of file diff --git a/sandbox310/src/assets/media/movie.mp4 b/sandbox310/src/assets/media/movie.mp4 new file mode 100644 index 0000000..926cbff Binary files /dev/null and b/sandbox310/src/assets/media/movie.mp4 differ diff --git a/sandbox310/src/assets/media/movie2.mp4 b/sandbox310/src/assets/media/movie2.mp4 new file mode 100644 index 0000000..1c54a80 Binary files /dev/null and b/sandbox310/src/assets/media/movie2.mp4 differ diff --git a/sandbox310/src/assets/php/PHPMailer/COMMITMENT b/sandbox310/src/assets/php/PHPMailer/COMMITMENT new file mode 100644 index 0000000..a687e0d --- /dev/null +++ b/sandbox310/src/assets/php/PHPMailer/COMMITMENT @@ -0,0 +1,46 @@ +GPL Cooperation Commitment +Version 1.0 + +Before filing or continuing to prosecute any legal proceeding or claim +(other than a Defensive Action) arising from termination of a Covered +License, we commit to extend to the person or entity ('you') accused +of violating the Covered License the following provisions regarding +cure and reinstatement, taken from GPL version 3. As used here, the +term 'this License' refers to the specific Covered License being +enforced. + + However, if you cease all violation of this License, then your + license from a particular copyright holder is reinstated (a) + provisionally, unless and until the copyright holder explicitly + and finally terminates your license, and (b) permanently, if the + copyright holder fails to notify you of the violation by some + reasonable means prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is + reinstated permanently if the copyright holder notifies you of the + violation by some reasonable means, this is the first time you + have received notice of violation of this License (for any work) + from that copyright holder, and you cure the violation prior to 30 + days after your receipt of the notice. + +We intend this Commitment to be irrevocable, and binding and +enforceable against us and assignees of or successors to our +copyrights. + +Definitions + +'Covered License' means the GNU General Public License, version 2 +(GPLv2), the GNU Lesser General Public License, version 2.1 +(LGPLv2.1), or the GNU Library General Public License, version 2 +(LGPLv2), all as published by the Free Software Foundation. + +'Defensive Action' means a legal proceeding or claim that We bring +against you in response to a prior proceeding or claim initiated by +you or your affiliate. + +'We' means each contributor to this repository as of the date of +inclusion of this file, including subsidiaries of a corporate +contributor. + +This work is available under a Creative Commons Attribution-ShareAlike +4.0 International license (https://creativecommons.org/licenses/by-sa/4.0/). diff --git a/sandbox310/src/assets/php/PHPMailer/LICENSE b/sandbox310/src/assets/php/PHPMailer/LICENSE new file mode 100644 index 0000000..f166cc5 --- /dev/null +++ b/sandbox310/src/assets/php/PHPMailer/LICENSE @@ -0,0 +1,502 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! \ No newline at end of file diff --git a/sandbox310/src/assets/php/PHPMailer/README.md b/sandbox310/src/assets/php/PHPMailer/README.md new file mode 100644 index 0000000..81b0897 --- /dev/null +++ b/sandbox310/src/assets/php/PHPMailer/README.md @@ -0,0 +1,227 @@ +![PHPMailer](https://raw.github.com/PHPMailer/PHPMailer/master/examples/images/phpmailer.png) + +# PHPMailer – A full-featured email creation and transfer class for PHP + +[![Test status](https://github.com/PHPMailer/PHPMailer/workflows/Tests/badge.svg)](https://github.com/PHPMailer/PHPMailer/actions) +[![codecov.io](https://codecov.io/gh/PHPMailer/PHPMailer/branch/master/graph/badge.svg?token=iORZpwmYmM)](https://codecov.io/gh/PHPMailer/PHPMailer) +[![Latest Stable Version](https://poser.pugx.org/phpmailer/phpmailer/v/stable.svg)](https://packagist.org/packages/phpmailer/phpmailer) +[![Total Downloads](https://poser.pugx.org/phpmailer/phpmailer/downloads)](https://packagist.org/packages/phpmailer/phpmailer) +[![License](https://poser.pugx.org/phpmailer/phpmailer/license.svg)](https://packagist.org/packages/phpmailer/phpmailer) +[![API Docs](https://github.com/phpmailer/phpmailer/workflows/Docs/badge.svg)](https://phpmailer.github.io/PHPMailer/) + +## Features +- Probably the world's most popular code for sending email from PHP! +- Used by many open-source projects: WordPress, Drupal, 1CRM, SugarCRM, Yii, Joomla! and many more +- Integrated SMTP support – send without a local mail server +- Send emails with multiple To, CC, BCC and Reply-to addresses +- Multipart/alternative emails for mail clients that do not read HTML email +- Add attachments, including inline +- Support for UTF-8 content and 8bit, base64, binary, and quoted-printable encodings +- SMTP authentication with LOGIN, PLAIN, CRAM-MD5, and XOAUTH2 mechanisms over SMTPS and SMTP+STARTTLS transports +- Validates email addresses automatically +- Protects against header injection attacks +- Error messages in over 50 languages! +- DKIM and S/MIME signing support +- Compatible with PHP 5.5 and later, including PHP 8.1 +- Namespaced to prevent name clashes +- Much more! + +## Why you might need it +Many PHP developers need to send email from their code. The only PHP function that supports this directly is [`mail()`](https://www.php.net/manual/en/function.mail.php). However, it does not provide any assistance for making use of popular features such as encryption, authentication, HTML messages, and attachments. + +Formatting email correctly is surprisingly difficult. There are myriad overlapping (and conflicting) standards, requiring tight adherence to horribly complicated formatting and encoding rules – the vast majority of code that you'll find online that uses the `mail()` function directly is just plain wrong, if not unsafe! + +The PHP `mail()` function usually sends via a local mail server, typically fronted by a `sendmail` binary on Linux, BSD, and macOS platforms, however, Windows usually doesn't include a local mail server; PHPMailer's integrated SMTP client allows email sending on all platforms without needing a local mail server. Be aware though, that the `mail()` function should be avoided when possible; it's both faster and [safer](https://exploitbox.io/paper/Pwning-PHP-Mail-Function-For-Fun-And-RCE.html) to use SMTP to localhost. + +*Please* don't be tempted to do it yourself – if you don't use PHPMailer, there are many other excellent libraries that +you should look at before rolling your own. Try [SwiftMailer](https://swiftmailer.symfony.com/) +, [Laminas/Mail](https://docs.laminas.dev/laminas-mail/), [ZetaComponents](https://github.com/zetacomponents/Mail) etc. + +## License +This software is distributed under the [LGPL 2.1](http://www.gnu.org/licenses/lgpl-2.1.html) license, along with the [GPL Cooperation Commitment](https://gplcc.github.io/gplcc/). Please read [LICENSE](https://github.com/PHPMailer/PHPMailer/blob/master/LICENSE) for information on the software availability and distribution. + +## Installation & loading +PHPMailer is available on [Packagist](https://packagist.org/packages/phpmailer/phpmailer) (using semantic versioning), and installation via [Composer](https://getcomposer.org) is the recommended way to install PHPMailer. Just add this line to your `composer.json` file: + +```json +"phpmailer/phpmailer": "^6.5" +``` + +or run + +```sh +composer require phpmailer/phpmailer +``` + +Note that the `vendor` folder and the `vendor/autoload.php` script are generated by Composer; they are not part of PHPMailer. + +If you want to use the Gmail XOAUTH2 authentication class, you will also need to add a dependency on the `league/oauth2-client` package in your `composer.json`. + +Alternatively, if you're not using Composer, you +can [download PHPMailer as a zip file](https://github.com/PHPMailer/PHPMailer/archive/master.zip), (note that docs and examples are not included in the zip file), then copy the contents of the PHPMailer folder into one of the `include_path` directories specified in your PHP configuration and load each class file manually: + +```php +SMTPDebug = SMTP::DEBUG_SERVER; //Enable verbose debug output + $mail->isSMTP(); //Send using SMTP + $mail->Host = 'smtp.example.com'; //Set the SMTP server to send through + $mail->SMTPAuth = true; //Enable SMTP authentication + $mail->Username = 'user@example.com'; //SMTP username + $mail->Password = 'secret'; //SMTP password + $mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS; //Enable implicit TLS encryption + $mail->Port = 465; //TCP port to connect to; use 587 if you have set `SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS` + + //Recipients + $mail->setFrom('from@example.com', 'Mailer'); + $mail->addAddress('joe@example.net', 'Joe User'); //Add a recipient + $mail->addAddress('ellen@example.com'); //Name is optional + $mail->addReplyTo('info@example.com', 'Information'); + $mail->addCC('cc@example.com'); + $mail->addBCC('bcc@example.com'); + + //Attachments + $mail->addAttachment('/var/tmp/file.tar.gz'); //Add attachments + $mail->addAttachment('/tmp/image.jpg', 'new.jpg'); //Optional name + + //Content + $mail->isHTML(true); //Set email format to HTML + $mail->Subject = 'Here is the subject'; + $mail->Body = 'This is the HTML message body in bold!'; + $mail->AltBody = 'This is the body in plain text for non-HTML mail clients'; + + $mail->send(); + echo 'Message has been sent'; +} catch (Exception $e) { + echo "Message could not be sent. Mailer Error: {$mail->ErrorInfo}"; +} +``` + +You'll find plenty to play with in the [examples](https://github.com/PHPMailer/PHPMailer/tree/master/examples) folder, which covers many common scenarios including sending through gmail, building contact forms, sending to mailing lists, and more. + +If you are re-using the instance (e.g. when sending to a mailing list), you may need to clear the recipient list to avoid sending duplicate messages. See [the mailing list example](https://github.com/PHPMailer/PHPMailer/blob/master/examples/mailing_list.phps) for further guidance. + +That's it. You should now be ready to use PHPMailer! + +## Localization +PHPMailer defaults to English, but in the [language](https://github.com/PHPMailer/PHPMailer/tree/master/language/) folder you'll find many translations for PHPMailer error messages that you may encounter. Their filenames contain [ISO 639-1](http://en.wikipedia.org/wiki/ISO_639-1) language code for the translations, for example `fr` for French. To specify a language, you need to tell PHPMailer which one to use, like this: + +```php +//To load the French version +$mail->setLanguage('fr', '/optional/path/to/language/directory/'); +``` + +We welcome corrections and new languages – if you're looking for corrections, run the [PHPMailerLangTest.php](https://github.com/PHPMailer/PHPMailer/tree/master/test/PHPMailerLangTest.php) script in the tests folder and it will show any missing translations. + +## Documentation +Start reading at the [GitHub wiki](https://github.com/PHPMailer/PHPMailer/wiki). If you're having trouble, head for [the troubleshooting guide](https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting) as it's frequently updated. + +Examples of how to use PHPMailer for common scenarios can be found in the [examples](https://github.com/PHPMailer/PHPMailer/tree/master/examples) folder. If you're looking for a good starting point, we recommend you start with [the Gmail example](https://github.com/PHPMailer/PHPMailer/tree/master/examples/gmail.phps). + +To reduce PHPMailer's deployed code footprint, examples are not included if you load PHPMailer via Composer or via [GitHub's zip file download](https://github.com/PHPMailer/PHPMailer/archive/master.zip), so you'll need to either clone the git repository or use the above links to get to the examples directly. + +Complete generated API documentation is [available online](https://phpmailer.github.io/PHPMailer/). + +You can generate complete API-level documentation by running `phpdoc` in the top-level folder, and documentation will appear in the `docs` folder, though you'll need to have [PHPDocumentor](http://www.phpdoc.org) installed. You may find [the unit tests](https://github.com/PHPMailer/PHPMailer/blob/master/test/PHPMailerTest.php) a good reference for how to do various operations such as encryption. + +If the documentation doesn't cover what you need, search the [many questions on Stack Overflow](http://stackoverflow.com/questions/tagged/phpmailer), and before you ask a question about "SMTP Error: Could not connect to SMTP host.", [read the troubleshooting guide](https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting). + +## Tests +[PHPMailer tests](https://github.com/PHPMailer/PHPMailer/tree/master/test/) use PHPUnit 9, with [a polyfill](https://github.com/Yoast/PHPUnit-Polyfills) to let 9-style tests run on older PHPUnit and PHP versions. + +[![Test status](https://github.com/PHPMailer/PHPMailer/workflows/Tests/badge.svg)](https://github.com/PHPMailer/PHPMailer/actions) + +If this isn't passing, is there something you can do to help? + +## Security +Please disclose any vulnerabilities found responsibly – report security issues to the maintainers privately. + +See [SECURITY](https://github.com/PHPMailer/PHPMailer/tree/master/SECURITY.md) and [PHPMailer's security advisories on GitHub](https://github.com/PHPMailer/PHPMailer/security). + +## Contributing +Please submit bug reports, suggestions and pull requests to the [GitHub issue tracker](https://github.com/PHPMailer/PHPMailer/issues). + +We're particularly interested in fixing edge-cases, expanding test coverage and updating translations. + +If you found a mistake in the docs, or want to add something, go ahead and amend the wiki – anyone can edit it. + +If you have git clones from prior to the move to the PHPMailer GitHub organisation, you'll need to update any remote URLs referencing the old GitHub location with a command like this from within your clone: + +```sh +git remote set-url upstream https://github.com/PHPMailer/PHPMailer.git +``` + +Please *don't* use the SourceForge or Google Code projects any more; they are obsolete and no longer maintained. + +## Sponsorship +Development time and resources for PHPMailer are provided by [Smartmessages.net](https://info.smartmessages.net/), the world's only privacy-first email marketing system. + +Smartmessages.net privacy-first email marketing logo + +Donations are very welcome, whether in beer šŸŗ, T-shirts šŸ‘•, or cold, hard cash šŸ’°. Sponsorship through GitHub is a simple and convenient way to say "thank you" to PHPMailer's maintainers and contributors – just click the "Sponsor" button [on the project page](https://github.com/PHPMailer/PHPMailer). If your company uses PHPMailer, consider taking part in Tidelift's enterprise support programme. + +## PHPMailer For Enterprise + +Available as part of the Tidelift Subscription. + +The maintainers of PHPMailer and thousands of other packages are working with Tidelift to deliver commercial +support and maintenance for the open source packages you use to build your applications. Save time, reduce risk, and +improve code health, while paying the maintainers of the exact packages you +use. [Learn more.](https://tidelift.com/subscription/pkg/packagist-phpmailer-phpmailer?utm_source=packagist-phpmailer-phpmailer&utm_medium=referral&utm_campaign=enterprise&utm_term=repo) + +## Changelog +See [changelog](changelog.md). + +## History +- PHPMailer was originally written in 2001 by Brent R. Matzelle as a [SourceForge project](http://sourceforge.net/projects/phpmailer/). +- [Marcus Bointon](https://github.com/Synchro) (`coolbru` on SF) and Andy Prevost (`codeworxtech`) took over the project in 2004. +- Became an Apache incubator project on Google Code in 2010, managed by Jim Jagielski. +- Marcus created [his fork on GitHub](https://github.com/Synchro/PHPMailer) in 2008. +- Jim and Marcus decide to join forces and use GitHub as the canonical and official repo for PHPMailer in 2013. +- PHPMailer moves to [the PHPMailer organisation](https://github.com/PHPMailer) on GitHub in 2013. + +### What's changed since moving from SourceForge? +- Official successor to the SourceForge and Google Code projects. +- Test suite. +- Continuous integration with Github Actions. +- Composer support. +- Public development. +- Additional languages and language strings. +- CRAM-MD5 authentication support. +- Preserves full repo history of authors, commits and branches from the original SourceForge project. diff --git a/sandbox310/src/assets/php/PHPMailer/SECURITY.md b/sandbox310/src/assets/php/PHPMailer/SECURITY.md new file mode 100644 index 0000000..035a87f --- /dev/null +++ b/sandbox310/src/assets/php/PHPMailer/SECURITY.md @@ -0,0 +1,37 @@ +# Security notices relating to PHPMailer + +Please disclose any security issues or vulnerabilities found through [Tidelift's coordinated disclosure system](https://tidelift.com/security) or to the maintainers privately. + +PHPMailer 6.4.1 and earlier contain a vulnerability that can result in untrusted code being called (if such code is injected into the host project's scope by other means). If the `$patternselect` parameter to `validateAddress()` is set to `'php'` (the default, defined by `PHPMailer::$validator`), and the global namespace contains a function called `php`, it will be called in preference to the built-in validator of the same name. Mitigated in PHPMailer 6.5.0 by denying the use of simple strings as validator function names. Recorded as [CVE-2021-3603](https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2021-3603). Reported by [Vikrant Singh Chauhan](mailto:vi@hackberry.xyz) via [huntr.dev](https://www.huntr.dev/). + +PHPMailer versions 6.4.1 and earlier contain a possible remote code execution vulnerability through the `$lang_path` parameter of the `setLanguage()` method. If the `$lang_path` parameter is passed unfiltered from user input, it can be set to [a UNC path](https://docs.microsoft.com/en-us/dotnet/standard/io/file-path-formats#unc-paths), and if an attacker is also able to persuade the server to load a file from that UNC path, a script file under their control may be executed. This vulnerability only applies to systems that resolve UNC paths, typically only Microsoft Windows. +PHPMailer 6.5.0 mitigates this by no longer treating translation files as PHP code, but by parsing their text content directly. This approach avoids the possibility of executing unknown code while retaining backward compatibility. This isn't ideal, so the current translation format is deprecated and will be replaced in the next major release. Recorded as [CVE-2021-34551](https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2021-34551). Reported by [Jilin Diting Information Technology Co., Ltd](https://listensec.com) via Tidelift. + +PHPMailer versions between 6.1.8 and 6.4.0 contain a regression of the earlier CVE-2018-19296 object injection vulnerability as a result of [a fix for Windows UNC paths in 6.1.8](https://github.com/PHPMailer/PHPMailer/commit/e2e07a355ee8ff36aba21d0242c5950c56e4c6f9). Recorded as [CVE-2020-36326](https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2020-36326). Reported by Fariskhi Vidyan via Tidelift. 6.4.1 fixes this issue, and also enforces stricter checks for URL schemes in local path contexts. + +PHPMailer versions 6.1.5 and earlier contain an output escaping bug that occurs in `Content-Type` and `Content-Disposition` when filenames passed into `addAttachment` and other methods that accept attachment names contain double quote characters, in contravention of RFC822 3.4.1. No specific vulnerability has been found relating to this, but it could allow file attachments to bypass attachment filters that are based on matching filename extensions. Recorded as [CVE-2020-13625](https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2020-13625). Reported by Elar Lang of Clarified Security. + +PHPMailer versions prior to 6.0.6 and 5.2.27 are vulnerable to an object injection attack by passing `phar://` paths into `addAttachment()` and other functions that may receive unfiltered local paths, possibly leading to RCE. Recorded as [CVE-2018-19296](https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2018-19296). See [this article](https://knasmueller.net/5-answers-about-php-phar-exploitation) for more info on this type of vulnerability. Mitigated by blocking the use of paths containing URL-protocol style prefixes such as `phar://`. Reported by Sehun Oh of cyberone.kr. + +PHPMailer versions prior to 5.2.24 (released July 26th 2017) have an XSS vulnerability in one of the code examples, [CVE-2017-11503](https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2017-11503). The `code_generator.phps` example did not filter user input prior to output. This file is distributed with a `.phps` extension, so it it not normally executable unless it is explicitly renamed, and the file is not included when PHPMailer is loaded through composer, so it is safe by default. There was also an undisclosed potential XSS vulnerability in the default exception handler (unused by default). Patches for both issues kindly provided by Patrick Monnerat of the Fedora Project. + +PHPMailer versions prior to 5.2.22 (released January 9th 2017) have a local file disclosure vulnerability, [CVE-2017-5223](https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2017-5223). If content passed into `msgHTML()` is sourced from unfiltered user input, relative paths can map to absolute local file paths and added as attachments. Also note that `addAttachment` (just like `file_get_contents`, `passthru`, `unlink`, etc) should not be passed user-sourced params either! Reported by Yongxiang Li of Asiasecurity. + +PHPMailer versions prior to 5.2.20 (released December 28th 2016) are vulnerable to [CVE-2016-10045](https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2016-10045) a remote code execution vulnerability, responsibly reported by [Dawid Golunski](https://legalhackers.com/advisories/PHPMailer-Exploit-Remote-Code-Exec-CVE-2016-10045-Vuln-Patch-Bypass.html), and patched by Paul Buonopane (@Zenexer). + +PHPMailer versions prior to 5.2.18 (released December 2016) are vulnerable to [CVE-2016-10033](https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2016-10033) a remote code execution vulnerability, responsibly reported by [Dawid Golunski](http://legalhackers.com/advisories/PHPMailer-Exploit-Remote-Code-Exec-CVE-2016-10033-Vuln.html). + +PHPMailer versions prior to 5.2.14 (released November 2015) are vulnerable to [CVE-2015-8476](https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2015-8476) an SMTP CRLF injection bug permitting arbitrary message sending. + +PHPMailer versions prior to 5.2.10 (released May 2015) are vulnerable to [CVE-2008-5619](https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2008-5619), a remote code execution vulnerability in the bundled html2text library. This file was removed in 5.2.10, so if you are using a version prior to that and make use of the html2text function, it's vitally important that you upgrade and remove this file. + +PHPMailer versions prior to 2.0.7 and 2.2.1 are vulnerable to [CVE-2012-0796](https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2012-0796), an email header injection attack. + +Joomla 1.6.0 uses PHPMailer in an unsafe way, allowing it to reveal local file paths, reported in [CVE-2011-3747](https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2011-3747). + +PHPMailer didn't sanitise the `$lang_path` parameter in `SetLanguage`. This wasn't a problem in itself, but some apps (PHPClassifieds, ATutor) also failed to sanitise user-provided parameters passed to it, permitting semi-arbitrary local file inclusion, reported in [CVE-2010-4914](https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2010-4914), [CVE-2007-2021](https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2007-2021) and [CVE-2006-5734](https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2006-5734). + +PHPMailer 1.7.2 and earlier contained a possible DDoS vulnerability reported in [CVE-2005-1807](https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2005-1807). + +PHPMailer 1.7 and earlier (June 2003) have a possible vulnerability in the `SendmailSend` method where shell commands may not be sanitised. Reported in [CVE-2007-3215](https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2007-3215). + diff --git a/sandbox310/src/assets/php/PHPMailer/VERSION b/sandbox310/src/assets/php/PHPMailer/VERSION new file mode 100644 index 0000000..73092f3 --- /dev/null +++ b/sandbox310/src/assets/php/PHPMailer/VERSION @@ -0,0 +1 @@ +6.5.3 \ No newline at end of file diff --git a/sandbox310/src/assets/php/PHPMailer/composer.json b/sandbox310/src/assets/php/PHPMailer/composer.json new file mode 100644 index 0000000..b13732b --- /dev/null +++ b/sandbox310/src/assets/php/PHPMailer/composer.json @@ -0,0 +1,76 @@ +{ + "name": "phpmailer/phpmailer", + "type": "library", + "description": "PHPMailer is a full-featured email creation and transfer class for PHP", + "authors": [ + { + "name": "Marcus Bointon", + "email": "phpmailer@synchromedia.co.uk" + }, + { + "name": "Jim Jagielski", + "email": "jimjag@gmail.com" + }, + { + "name": "Andy Prevost", + "email": "codeworxtech@users.sourceforge.net" + }, + { + "name": "Brent R. Matzelle" + } + ], + "funding": [ + { + "url": "https://github.com/Synchro", + "type": "github" + } + ], + "config": { + "allow-plugins": { + "dealerdirect/phpcodesniffer-composer-installer": true + } + }, + "require": { + "php": ">=5.5.0", + "ext-ctype": "*", + "ext-filter": "*", + "ext-hash": "*" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", + "doctrine/annotations": "^1.2", + "php-parallel-lint/php-console-highlighter": "^0.5.0", + "php-parallel-lint/php-parallel-lint": "^1.3.1", + "phpcompatibility/php-compatibility": "^9.3.5", + "roave/security-advisories": "dev-latest", + "squizlabs/php_codesniffer": "^3.6.2", + "yoast/phpunit-polyfills": "^1.0.0" + }, + "suggest": { + "ext-mbstring": "Needed to send email in multibyte encoding charset or decode encoded addresses", + "hayageek/oauth2-yahoo": "Needed for Yahoo XOAUTH2 authentication", + "league/oauth2-google": "Needed for Google XOAUTH2 authentication", + "psr/log": "For optional PSR-3 debug logging", + "stevenmaguire/oauth2-microsoft": "Needed for Microsoft XOAUTH2 authentication", + "symfony/polyfill-mbstring": "To support UTF-8 if the Mbstring PHP extension is not enabled (^1.2)" + }, + "autoload": { + "psr-4": { + "PHPMailer\\PHPMailer\\": "src/" + } + }, + "autoload-dev": { + "psr-4": { + "PHPMailer\\Test\\": "test/" + } + }, + "license": "LGPL-2.1-only", + "scripts": { + "check": "./vendor/bin/phpcs", + "test": "./vendor/bin/phpunit --no-coverage", + "coverage": "./vendor/bin/phpunit", + "lint": [ + "@php ./vendor/php-parallel-lint/php-parallel-lint/parallel-lint . -e php,phps --exclude vendor --exclude .git --exclude build" + ] + } +} diff --git a/sandbox310/src/assets/php/PHPMailer/get_oauth_token.php b/sandbox310/src/assets/php/PHPMailer/get_oauth_token.php new file mode 100644 index 0000000..befdc34 --- /dev/null +++ b/sandbox310/src/assets/php/PHPMailer/get_oauth_token.php @@ -0,0 +1,146 @@ + + * @author Jim Jagielski (jimjag) + * @author Andy Prevost (codeworxtech) + * @author Brent R. Matzelle (original founder) + * @copyright 2012 - 2020 Marcus Bointon + * @copyright 2010 - 2012 Jim Jagielski + * @copyright 2004 - 2009 Andy Prevost + * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License + * @note This program is distributed in the hope that it will be useful - WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. + */ + +/** + * Get an OAuth2 token from an OAuth2 provider. + * * Install this script on your server so that it's accessible + * as [https/http]:////get_oauth_token.php + * e.g.: http://localhost/phpmailer/get_oauth_token.php + * * Ensure dependencies are installed with 'composer install' + * * Set up an app in your Google/Yahoo/Microsoft account + * * Set the script address as the app's redirect URL + * If no refresh token is obtained when running this file, + * revoke access to your app and run the script again. + */ + +namespace PHPMailer\PHPMailer; + +/** + * Aliases for League Provider Classes + * Make sure you have added these to your composer.json and run `composer install` + * Plenty to choose from here: + * @see http://oauth2-client.thephpleague.com/providers/thirdparty/ + */ +//@see https://github.com/thephpleague/oauth2-google +use League\OAuth2\Client\Provider\Google; +//@see https://packagist.org/packages/hayageek/oauth2-yahoo +use Hayageek\OAuth2\Client\Provider\Yahoo; +//@see https://github.com/stevenmaguire/oauth2-microsoft +use Stevenmaguire\OAuth2\Client\Provider\Microsoft; + +if (!isset($_GET['code']) && !isset($_GET['provider'])) { + ?> + +Select Provider:
+Google
+Yahoo
+Microsoft/Outlook/Hotmail/Live/Office365
+ + + $clientId, + 'clientSecret' => $clientSecret, + 'redirectUri' => $redirectUri, + 'accessType' => 'offline' +]; + +$options = []; +$provider = null; + +switch ($providerName) { + case 'Google': + $provider = new Google($params); + $options = [ + 'scope' => [ + 'https://mail.google.com/' + ] + ]; + break; + case 'Yahoo': + $provider = new Yahoo($params); + break; + case 'Microsoft': + $provider = new Microsoft($params); + $options = [ + 'scope' => [ + 'wl.imap', + 'wl.offline_access' + ] + ]; + break; +} + +if (null === $provider) { + exit('Provider missing'); +} + +if (!isset($_GET['code'])) { + //If we don't have an authorization code then get one + $authUrl = $provider->getAuthorizationUrl($options); + $_SESSION['oauth2state'] = $provider->getState(); + header('Location: ' . $authUrl); + exit; + //Check given state against previously stored one to mitigate CSRF attack +} elseif (empty($_GET['state']) || ($_GET['state'] !== $_SESSION['oauth2state'])) { + unset($_SESSION['oauth2state']); + unset($_SESSION['provider']); + exit('Invalid state'); +} else { + unset($_SESSION['provider']); + //Try to get an access token (using the authorization code grant) + $token = $provider->getAccessToken( + 'authorization_code', + [ + 'code' => $_GET['code'] + ] + ); + //Use this to interact with an API on the users behalf + //Use this to get a new access token if the old one expires + echo 'Refresh Token: ', $token->getRefreshToken(); +} diff --git a/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-af.php b/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-af.php new file mode 100644 index 0000000..0b2a72d --- /dev/null +++ b/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-af.php @@ -0,0 +1,26 @@ + + */ + +$PHPMAILER_LANG['authenticate'] = 'Ų®Ų·Ų£ SMTP : لا ŁŠŁ…ŁƒŁ† تأكيد Ų§Ł„Ł‡ŁˆŁŠŲ©.'; +$PHPMAILER_LANG['connect_host'] = 'Ų®Ų·Ų£ SMTP: لا ŁŠŁ…ŁƒŁ† الاتصال بالخادم SMTP.'; +$PHPMAILER_LANG['data_not_accepted'] = 'Ų®Ų·Ų£ SMTP: لم ŁŠŲŖŁ… Ł‚ŲØŁˆŁ„ Ų§Ł„Ł…Ų¹Ł„ŁˆŁ…Ų§ŲŖ .'; +$PHPMAILER_LANG['empty_message'] = 'نص الرسالة فارغ'; +$PHPMAILER_LANG['encoding'] = 'ŲŖŲ±Ł…ŁŠŲ² غير Ł…Ų¹Ų±ŁˆŁ: '; +$PHPMAILER_LANG['execute'] = 'لا ŁŠŁ…ŁƒŁ† ŲŖŁ†ŁŁŠŲ° : '; +$PHPMAILER_LANG['file_access'] = 'لا ŁŠŁ…ŁƒŁ† Ų§Ł„ŁˆŲµŁˆŁ„ للملف: '; +$PHPMAILER_LANG['file_open'] = 'Ų®Ų·Ų£ في الملف: لا ŁŠŁ…ŁƒŁ† فتحه: '; +$PHPMAILER_LANG['from_failed'] = 'Ų®Ų·Ų£ على Ł…Ų³ŲŖŁˆŁ‰ Ų¹Ł†ŁˆŲ§Ł† المرسل : '; +$PHPMAILER_LANG['instantiate'] = 'لا ŁŠŁ…ŁƒŁ† توفير Ų®ŲÆŁ…Ų© Ų§Ł„ŲØŲ±ŁŠŲÆ.'; +$PHPMAILER_LANG['invalid_address'] = 'ال؄رسال غير Ł…Ł…ŁƒŁ† لأن Ų¹Ł†ŁˆŲ§Ł† Ų§Ł„ŲØŲ±ŁŠŲÆ Ų§Ł„Ų„Ł„ŁƒŲŖŲ±ŁˆŁ†ŁŠ غير صالح: '; +$PHPMAILER_LANG['mailer_not_supported'] = ' برنامج ال؄رسال غير Ł…ŲÆŲ¹ŁˆŁ….'; +$PHPMAILER_LANG['provide_address'] = 'يجب توفير Ų¹Ł†ŁˆŲ§Ł† Ų§Ł„ŲØŲ±ŁŠŲÆ Ų§Ł„Ų„Ł„ŁƒŲŖŲ±ŁˆŁ†ŁŠ لمستلم واحد على الأقل.'; +$PHPMAILER_LANG['recipients_failed'] = 'Ų®Ų·Ų£ SMTP: الأخطاؔ Ų§Ł„ŲŖŲ§Ł„ŁŠŲ© فؓل في الارسال Ł„ŁƒŁ„ من : '; +$PHPMAILER_LANG['signing'] = 'Ų®Ų·Ų£ في Ų§Ł„ŲŖŁˆŁ‚ŁŠŲ¹: '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP Connect() غير Ł…Ł…ŁƒŁ†.'; +$PHPMAILER_LANG['smtp_error'] = 'Ų®Ų·Ų£ على Ł…Ų³ŲŖŁˆŁ‰ الخادم SMTP: '; +$PHPMAILER_LANG['variable_set'] = 'لا ŁŠŁ…ŁƒŁ† ŲŖŲ¹ŁŠŁŠŁ† أو Ų„Ų¹Ų§ŲÆŲ© ŲŖŲ¹ŁŠŁŠŁ† Ł…ŲŖŲŗŁŠŲ±: '; +$PHPMAILER_LANG['extension_missing'] = 'ال؄ضافة غير Ł…ŁˆŲ¬ŁˆŲÆŲ©: '; diff --git a/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-az.php b/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-az.php new file mode 100644 index 0000000..552167e --- /dev/null +++ b/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-az.php @@ -0,0 +1,27 @@ + + */ + +$PHPMAILER_LANG['authenticate'] = 'SMTP GreÅ”ka: Neuspjela prijava.'; +$PHPMAILER_LANG['connect_host'] = 'SMTP GreÅ”ka: Nije moguće spojiti se sa SMTP serverom.'; +$PHPMAILER_LANG['data_not_accepted'] = 'SMTP GreÅ”ka: Podatci nisu prihvaćeni.'; +$PHPMAILER_LANG['empty_message'] = 'Sadržaj poruke je prazan.'; +$PHPMAILER_LANG['encoding'] = 'Nepoznata kriptografija: '; +$PHPMAILER_LANG['execute'] = 'Nije moguće izvrÅ”iti naredbu: '; +$PHPMAILER_LANG['file_access'] = 'Nije moguće pristupiti datoteci: '; +$PHPMAILER_LANG['file_open'] = 'Nije moguće otvoriti datoteku: '; +$PHPMAILER_LANG['from_failed'] = 'SMTP GreÅ”ka: Slanje sa navedenih e-mail adresa nije uspjelo: '; +$PHPMAILER_LANG['recipients_failed'] = 'SMTP GreÅ”ka: Slanje na navedene e-mail adrese nije uspjelo: '; +$PHPMAILER_LANG['instantiate'] = 'Ne mogu pokrenuti mail funkcionalnost.'; +$PHPMAILER_LANG['invalid_address'] = 'E-mail nije poslan. Neispravna e-mail adresa: '; +$PHPMAILER_LANG['mailer_not_supported'] = ' mailer nije podržan.'; +$PHPMAILER_LANG['provide_address'] = 'DefiniÅ”ite barem jednu adresu primaoca.'; +$PHPMAILER_LANG['signing'] = 'GreÅ”ka prilikom prijave: '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'Spajanje na SMTP server nije uspjelo.'; +$PHPMAILER_LANG['smtp_error'] = 'SMTP greÅ”ka: '; +$PHPMAILER_LANG['variable_set'] = 'Nije moguće postaviti varijablu ili je vratiti nazad: '; +$PHPMAILER_LANG['extension_missing'] = 'Nedostaje ekstenzija: '; diff --git a/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-be.php b/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-be.php new file mode 100644 index 0000000..9e92dda --- /dev/null +++ b/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-be.php @@ -0,0 +1,27 @@ + + */ + +$PHPMAILER_LANG['authenticate'] = 'ŠŸŠ°Š¼Ń‹Š»ŠŗŠ° SMTP: памылка Ń–Š“ŃŠ½Ń‚Ń‹Ń„Ń–ŠŗŠ°Ń†Ń‹Ń–.'; +$PHPMAILER_LANG['connect_host'] = 'ŠŸŠ°Š¼Ń‹Š»ŠŗŠ° SMTP: нельга ŃžŃŃ‚Š°Š½Š°Š²Ń–Ń†ŃŒ ŃŃƒŠ²ŃŠ·ŃŒ Š· SMTP-серверам.'; +$PHPMAILER_LANG['data_not_accepted'] = 'ŠŸŠ°Š¼Ń‹Š»ŠŗŠ° SMTP: звесткі Š½ŠµŠæŃ€Ń‹Š½ŃŃ‚Ń‹Ń.'; +$PHPMAILER_LANG['empty_message'] = 'ŠŸŃƒŃŃ‚Š¾Šµ павеГамленне.'; +$PHPMAILER_LANG['encoding'] = 'ŠŠµŠ²ŃŠ“Š¾Š¼Š°Ń ŠŗŠ°Š“Ń‹Ń€Š¾ŃžŠŗŠ° Ń‚ŃŠŗŃŃ‚Ńƒ: '; +$PHPMAILER_LANG['execute'] = 'ŠŠµŠ»ŃŒŠ³Š° Š²Ń‹ŠŗŠ°Š½Š°Ń†ŃŒ каманГу: '; +$PHPMAILER_LANG['file_access'] = 'ŠŃŠ¼Š° Š“Š¾ŃŃ‚ŃƒŠæŃƒ Га файла: '; +$PHPMAILER_LANG['file_open'] = 'ŠŠµŠ»ŃŒŠ³Š° Š°Š“ŠŗŃ€Ń‹Ń†ŃŒ файл: '; +$PHPMAILER_LANG['from_failed'] = 'ŠŃŠæŃ€Š°Š²Ń–Š»ŃŒŠ½Ń‹ аГрас Š°Š“ŠæŃ€Š°ŃžŠ½Ń–ŠŗŠ°: '; +$PHPMAILER_LANG['instantiate'] = 'ŠŠµŠ»ŃŒŠ³Š° ŠæŃ€Ń‹Š¼ŃŠ½Ń–Ń†ŃŒ Ń„ŃƒŠ½ŠŗŃ†Ń‹ŃŽ mail().'; +$PHPMAILER_LANG['invalid_address'] = 'ŠŠµŠ»ŃŒŠ³Š° Š“Š°ŃŠ»Š°Ń†ŃŒ павеГамленне, Š½ŃŠæŃ€Š°Š²Ń–Š»ŃŒŠ½Ń‹ email Š°Ń‚Ń€Ń‹Š¼Š°Š»ŃŒŠ½Ń–ŠŗŠ°: '; +$PHPMAILER_LANG['provide_address'] = 'Š—Š°ŠæŠ¾ŃžŠ½Ń–Ń†Šµ, калі ласка, ŠæŃ€Š°Š²Ń–Š»ŃŒŠ½Ń‹ email Š°Ń‚Ń€Ń‹Š¼Š°Š»ŃŒŠ½Ń–ŠŗŠ°.'; +$PHPMAILER_LANG['mailer_not_supported'] = ' - ŠæŠ°ŃˆŃ‚Š¾Š²Ń‹ сервер не паГтрымліваецца.'; +$PHPMAILER_LANG['recipients_failed'] = 'ŠŸŠ°Š¼Ń‹Š»ŠŗŠ° SMTP: Š½ŃŠæŃ€Š°Š²Ń–Š»ŃŒŠ½Ń‹Ń Š°Ń‚Ń€Ń‹Š¼Š°Š»ŃŒŠ½Ń–ŠŗŃ–: '; +$PHPMAILER_LANG['signing'] = 'ŠŸŠ°Š¼Ń‹Š»ŠŗŠ° ŠæŠ¾Š“ŠæŃ–ŃŃƒ ŠæŠ°Š²ŠµŠ“Š°Š¼Š»ŠµŠ½Š½Ń: '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'ŠŸŠ°Š¼Ń‹Š»ŠŗŠ° ŃŃƒŠ²ŃŠ·Ń– Š· SMTP-серверам.'; +$PHPMAILER_LANG['smtp_error'] = 'ŠŸŠ°Š¼Ń‹Š»ŠŗŠ° SMTP: '; +$PHPMAILER_LANG['variable_set'] = 'ŠŠµŠ»ŃŒŠ³Š° ŃžŃŃ‚Š°Š½Š°Š²Ń–Ń†ŃŒ або ŠæŠµŃ€Š°Š¼ŃŠ½Ń–Ń†ŃŒ Š·Š½Š°Ń‡ŃŠ½Š½Šµ пераменнай: '; +//$PHPMAILER_LANG['extension_missing'] = 'Extension missing: '; diff --git a/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-bg.php b/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-bg.php new file mode 100644 index 0000000..c41f675 --- /dev/null +++ b/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-bg.php @@ -0,0 +1,27 @@ + + */ + +$PHPMAILER_LANG['authenticate'] = 'SMTP Š³Ń€ŠµŃˆŠŗŠ°: ŠŠµ може Га се ŃƒŠ“Š¾ŃŃ‚Š¾Š²ŠµŃ€Šø преГ ŃŃŠŃ€Š²ŃŠŃ€Š°.'; +$PHPMAILER_LANG['connect_host'] = 'SMTP Š³Ń€ŠµŃˆŠŗŠ°: ŠŠµ може Га се ŃŠ²ŃŠŃ€Š¶Šµ с SMTP хоста.'; +$PHPMAILER_LANG['data_not_accepted'] = 'SMTP Š³Ń€ŠµŃˆŠŗŠ°: Ганните не са приети.'; +$PHPMAILER_LANG['empty_message'] = 'Š”ŃŠŠ“ŃŠŃ€Š¶Š°Š½ŠøŠµŃ‚Š¾ на ŃŃŠŠ¾Š±Ń‰ŠµŠ½ŠøŠµŃ‚Š¾ е празно'; +$PHPMAILER_LANG['encoding'] = 'ŠŠµŠøŠ·Š²ŠµŃŃ‚Š½Š¾ коГиране: '; +$PHPMAILER_LANG['execute'] = 'ŠŠµ може Га се изпълни: '; +$PHPMAILER_LANG['file_access'] = 'ŠŃŠ¼Š° Š“Š¾ŃŃ‚ŃŠŠæ Го файл: '; +$PHPMAILER_LANG['file_open'] = 'Файлова Š³Ń€ŠµŃˆŠŗŠ°: ŠŠµ може Га се отвори файл: '; +$PHPMAILER_LANG['from_failed'] = 'ДлеГните аГреси за поГател са невалиГни: '; +$PHPMAILER_LANG['instantiate'] = 'ŠŠµ може Га се инстанцира Ń„ŃƒŠ½ŠŗŃ†ŠøŃŃ‚Š° mail.'; +$PHPMAILER_LANG['invalid_address'] = 'ŠŠµŠ²Š°Š»ŠøŠ“ŠµŠ½ аГрес: '; +$PHPMAILER_LANG['mailer_not_supported'] = ' - пощенски ŃŃŠŃ€Š²ŃŠŃ€ не се ŠæŠ¾Š“Š“ŃŠŃ€Š¶Š°.'; +$PHPMAILER_LANG['provide_address'] = 'Š¢Ń€ŃŠ±Š²Š° Га преГоставите поне еГин email аГрес за ŠæŠ¾Š»ŃƒŃ‡Š°Ń‚ŠµŠ».'; +$PHPMAILER_LANG['recipients_failed'] = 'SMTP Š³Ń€ŠµŃˆŠŗŠ°: ДлеГните аГреси за ŠŸŠ¾Š»ŃƒŃ‡Š°Ń‚ел са невалиГни: '; +$PHPMAILER_LANG['signing'] = 'Š“Ń€ŠµŃˆŠŗŠ° при поГписване: '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP провален connect().'; +$PHPMAILER_LANG['smtp_error'] = 'SMTP ŃŃŠŃ€Š²ŃŠŃ€Š½Š° Š³Ń€ŠµŃˆŠŗŠ°: '; +$PHPMAILER_LANG['variable_set'] = 'ŠŠµ може Га се ŃƒŃŃ‚Š°Š½Š¾Š²Šø или Š²ŃŠŠ·ŃŃ‚анови променлива: '; +$PHPMAILER_LANG['extension_missing'] = 'Липсва Ń€Š°Š·ŃˆŠøŃ€ŠµŠ½ŠøŠµ: '; diff --git a/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-ca.php b/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-ca.php new file mode 100644 index 0000000..3468485 --- /dev/null +++ b/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-ca.php @@ -0,0 +1,27 @@ + + */ + +$PHPMAILER_LANG['authenticate'] = 'Error SMTP: No s’ha pogut autenticar.'; +$PHPMAILER_LANG['connect_host'] = 'Error SMTP: No es pot connectar al servidor SMTP.'; +$PHPMAILER_LANG['data_not_accepted'] = 'Error SMTP: Dades no acceptades.'; +$PHPMAILER_LANG['empty_message'] = 'El cos del missatge estĆ  buit.'; +$PHPMAILER_LANG['encoding'] = 'Codificació desconeguda: '; +$PHPMAILER_LANG['execute'] = 'No es pot executar: '; +$PHPMAILER_LANG['file_access'] = 'No es pot accedir a l’arxiu: '; +$PHPMAILER_LANG['file_open'] = 'Error d’Arxiu: No es pot obrir l’arxiu: '; +$PHPMAILER_LANG['from_failed'] = 'La(s) següent(s) adreces de remitent han fallat: '; +$PHPMAILER_LANG['instantiate'] = 'No s’ha pogut crear una instĆ ncia de la funció Mail.'; +$PHPMAILER_LANG['invalid_address'] = 'AdreƧa d’email invalida: '; +$PHPMAILER_LANG['mailer_not_supported'] = ' mailer no estĆ  suportat'; +$PHPMAILER_LANG['provide_address'] = 'S’ha de proveir almenys una adreƧa d’email com a destinatari.'; +$PHPMAILER_LANG['recipients_failed'] = 'Error SMTP: Els següents destinataris han fallat: '; +$PHPMAILER_LANG['signing'] = 'Error al signar: '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'Ha fallat el SMTP Connect().'; +$PHPMAILER_LANG['smtp_error'] = 'Error del servidor SMTP: '; +$PHPMAILER_LANG['variable_set'] = 'No s’ha pogut establir o restablir la variable: '; +//$PHPMAILER_LANG['extension_missing'] = 'Extension missing: '; diff --git a/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-ch.php b/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-ch.php new file mode 100644 index 0000000..500c952 --- /dev/null +++ b/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-ch.php @@ -0,0 +1,27 @@ + + */ + +$PHPMAILER_LANG['authenticate'] = 'SMTP é”™čÆÆļ¼ščŗ«ä»½éŖŒčÆå¤±č“„ć€‚'; +$PHPMAILER_LANG['connect_host'] = 'SMTP 错误: äøčƒ½čæžęŽ„SMTPäø»ęœŗć€‚'; +$PHPMAILER_LANG['data_not_accepted'] = 'SMTP 错误: ę•°ę®äøåÆęŽ„å—ć€‚'; +//$PHPMAILER_LANG['empty_message'] = 'Message body empty'; +$PHPMAILER_LANG['encoding'] = 'ęœŖēŸ„ē¼–ē ļ¼š'; +$PHPMAILER_LANG['execute'] = 'äøčƒ½ę‰§č”Œ: '; +$PHPMAILER_LANG['file_access'] = 'äøčƒ½č®æé—®ę–‡ä»¶ļ¼š'; +$PHPMAILER_LANG['file_open'] = 'ę–‡ä»¶é”™čÆÆļ¼šäøčƒ½ę‰“å¼€ę–‡ä»¶ļ¼š'; +$PHPMAILER_LANG['from_failed'] = 'äø‹é¢ēš„å‘é€åœ°å€é‚®ä»¶å‘é€å¤±č“„äŗ†ļ¼š '; +$PHPMAILER_LANG['instantiate'] = 'äøčƒ½å®žēŽ°mail方法。'; +//$PHPMAILER_LANG['invalid_address'] = 'Invalid address: '; +$PHPMAILER_LANG['mailer_not_supported'] = ' ę‚Øę‰€é€‰ę‹©ēš„å‘é€é‚®ä»¶ēš„ę–¹ę³•å¹¶äøę”ÆęŒć€‚'; +$PHPMAILER_LANG['provide_address'] = 'ę‚Øåæ…é”»ęä¾›č‡³å°‘äø€äøŖ ę”¶äæ”äŗŗēš„emailåœ°å€ć€‚'; +$PHPMAILER_LANG['recipients_failed'] = 'SMTP é”™čÆÆļ¼š äø‹é¢ēš„ ę”¶ä»¶äŗŗå¤±č“„äŗ†ļ¼š '; +//$PHPMAILER_LANG['signing'] = 'Signing Error: '; +//$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP Connect() failed.'; +//$PHPMAILER_LANG['smtp_error'] = 'SMTP server error: '; +//$PHPMAILER_LANG['variable_set'] = 'Cannot set or reset variable: '; +//$PHPMAILER_LANG['extension_missing'] = 'Extension missing: '; diff --git a/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-cs.php b/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-cs.php new file mode 100644 index 0000000..e770a1a --- /dev/null +++ b/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-cs.php @@ -0,0 +1,28 @@ + + * Rewrite and extension of the work by Mikael Stokkebro + * + */ + +$PHPMAILER_LANG['authenticate'] = 'SMTP fejl: Login mislykkedes.'; +$PHPMAILER_LANG['connect_host'] = 'SMTP fejl: Forbindelse til SMTP serveren kunne ikke oprettes.'; +$PHPMAILER_LANG['data_not_accepted'] = 'SMTP fejl: Data blev ikke accepteret.'; +$PHPMAILER_LANG['empty_message'] = 'Meddelelsen er uden indhold'; +$PHPMAILER_LANG['encoding'] = 'Ukendt encode-format: '; +$PHPMAILER_LANG['execute'] = 'Kunne ikke afvikle: '; +$PHPMAILER_LANG['file_access'] = 'Kunne ikke tilgĆ„ filen: '; +$PHPMAILER_LANG['file_open'] = 'Fil fejl: Kunne ikke Ć„bne filen: '; +$PHPMAILER_LANG['from_failed'] = 'FĆølgende afsenderadresse er forkert: '; +$PHPMAILER_LANG['instantiate'] = 'Email funktionen kunne ikke initialiseres.'; +$PHPMAILER_LANG['invalid_address'] = 'Udgyldig adresse: '; +$PHPMAILER_LANG['mailer_not_supported'] = ' mailer understĆøttes ikke.'; +$PHPMAILER_LANG['provide_address'] = 'Indtast mindst en modtagers email adresse.'; +$PHPMAILER_LANG['recipients_failed'] = 'SMTP fejl: FĆølgende modtagere er forkerte: '; +$PHPMAILER_LANG['signing'] = 'Signeringsfejl: '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP Connect() fejlede.'; +$PHPMAILER_LANG['smtp_error'] = 'SMTP server fejl: '; +$PHPMAILER_LANG['variable_set'] = 'Kunne ikke definere eller nulstille variablen: '; +$PHPMAILER_LANG['extension_missing'] = 'Udvidelse mangler: '; diff --git a/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-de.php b/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-de.php new file mode 100644 index 0000000..e7e59d2 --- /dev/null +++ b/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-de.php @@ -0,0 +1,28 @@ + + */ + +$PHPMAILER_LANG['authenticate'] = 'Error SMTP: Imposible autentificar.'; +$PHPMAILER_LANG['connect_host'] = 'Error SMTP: Imposible conectar al servidor SMTP.'; +$PHPMAILER_LANG['data_not_accepted'] = 'Error SMTP: Datos no aceptados.'; +$PHPMAILER_LANG['empty_message'] = 'El cuerpo del mensaje estĆ” vacĆ­o.'; +$PHPMAILER_LANG['encoding'] = 'Codificación desconocida: '; +$PHPMAILER_LANG['execute'] = 'Imposible ejecutar: '; +$PHPMAILER_LANG['file_access'] = 'Imposible acceder al archivo: '; +$PHPMAILER_LANG['file_open'] = 'Error de Archivo: Imposible abrir el archivo: '; +$PHPMAILER_LANG['from_failed'] = 'La(s) siguiente(s) direcciones de remitente fallaron: '; +$PHPMAILER_LANG['instantiate'] = 'Imposible crear una instancia de la función Mail.'; +$PHPMAILER_LANG['invalid_address'] = 'Imposible enviar: dirección de email invĆ”lido: '; +$PHPMAILER_LANG['mailer_not_supported'] = ' mailer no estĆ” soportado.'; +$PHPMAILER_LANG['provide_address'] = 'Debe proporcionar al menos una dirección de email de destino.'; +$PHPMAILER_LANG['recipients_failed'] = 'Error SMTP: Los siguientes destinos fallaron: '; +$PHPMAILER_LANG['signing'] = 'Error al firmar: '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP Connect() falló.'; +$PHPMAILER_LANG['smtp_error'] = 'Error del servidor SMTP: '; +$PHPMAILER_LANG['variable_set'] = 'No se pudo configurar la variable: '; +$PHPMAILER_LANG['extension_missing'] = 'Extensión faltante: '; diff --git a/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-et.php b/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-et.php new file mode 100644 index 0000000..93addc9 --- /dev/null +++ b/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-et.php @@ -0,0 +1,28 @@ + + */ + +$PHPMAILER_LANG['authenticate'] = 'SMTP Viga: Autoriseerimise viga.'; +$PHPMAILER_LANG['connect_host'] = 'SMTP Viga: Ei Ƶnnestunud luua ühendust SMTP serveriga.'; +$PHPMAILER_LANG['data_not_accepted'] = 'SMTP Viga: Vigased andmed.'; +$PHPMAILER_LANG['empty_message'] = 'Tühi kirja sisu'; +$PHPMAILER_LANG["encoding"] = 'Tundmatu kodeering: '; +$PHPMAILER_LANG['execute'] = 'Tegevus ebaƵnnestus: '; +$PHPMAILER_LANG['file_access'] = 'Pole piisavalt Ƶiguseid jƤrgneva faili avamiseks: '; +$PHPMAILER_LANG['file_open'] = 'Faili Viga: Faili avamine ebaƵnnestus: '; +$PHPMAILER_LANG['from_failed'] = 'JƤrgnev saatja e-posti aadress on vigane: '; +$PHPMAILER_LANG['instantiate'] = 'mail funktiooni kƤivitamine ebaƵnnestus.'; +$PHPMAILER_LANG['invalid_address'] = 'Saatmine peatatud, e-posti address vigane: '; +$PHPMAILER_LANG['provide_address'] = 'Te peate mƤƤrama vƤhemalt ühe saaja e-posti aadressi.'; +$PHPMAILER_LANG['mailer_not_supported'] = ' maileri tugi puudub.'; +$PHPMAILER_LANG['recipients_failed'] = 'SMTP Viga: JƤrgnevate saajate e-posti aadressid on vigased: '; +$PHPMAILER_LANG["signing"] = 'Viga allkirjastamisel: '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP Connect() ebaƵnnestus.'; +$PHPMAILER_LANG['smtp_error'] = 'SMTP serveri viga: '; +$PHPMAILER_LANG['variable_set'] = 'Ei Ƶnnestunud mƤƤrata vƵi lƤhtestada muutujat: '; +$PHPMAILER_LANG['extension_missing'] = 'NƵutud laiendus on puudu: '; diff --git a/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-fa.php b/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-fa.php new file mode 100644 index 0000000..295a47f --- /dev/null +++ b/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-fa.php @@ -0,0 +1,28 @@ + + * @author Mohammad Hossein Mojtahedi + */ + +$PHPMAILER_LANG['authenticate'] = 'خطای SMTP: Ų§Ų­Ų±Ų§Ų² Ł‡ŁˆŪŒŲŖ ŲØŲ§ ؓکست Ł…ŁˆŲ§Ų¬Ł‡ Ų“ŲÆ.'; +$PHPMAILER_LANG['connect_host'] = 'خطای SMTP: Ų§ŲŖŲµŲ§Ł„ به سرور SMTP برقرار نؓد.'; +$PHPMAILER_LANG['data_not_accepted'] = 'خطای SMTP: ŲÆŲ§ŲÆŁ‡ā€ŒŁ‡Ų§ Ł†Ų§ā€ŒŲÆŲ±Ų³ŲŖ هستند.'; +$PHPMAILER_LANG['empty_message'] = 'ŲØŲ®Ų“ متن Ł¾ŪŒŲ§Ł… Ų®Ų§Ł„ŪŒ Ų§Ų³ŲŖ.'; +$PHPMAILER_LANG['encoding'] = 'Ś©ŲÆā€ŒŚÆŲ°Ų§Ų±ŪŒ Ł†Ų§ā€ŒŲ“Ł†Ų§Ų®ŲŖŁ‡: '; +$PHPMAILER_LANG['execute'] = 'امکان Ų§Ų¬Ų±Ų§ وجود ندارد: '; +$PHPMAILER_LANG['file_access'] = 'امکان دسترسی به ŁŲ§ŪŒŁ„ وجود ندارد: '; +$PHPMAILER_LANG['file_open'] = 'خطای File: امکان بازکردن ŁŲ§ŪŒŁ„ وجود ندارد: '; +$PHPMAILER_LANG['from_failed'] = 'Ų¢ŲÆŲ±Ų³ فرستنده اؓتباه Ų§Ų³ŲŖ: '; +$PHPMAILER_LANG['instantiate'] = 'امکان Ł…Ų¹Ų±ŁŪŒ ŲŖŲ§ŲØŲ¹ Ų§ŪŒŁ…ŪŒŁ„ وجود ندارد.'; +$PHPMAILER_LANG['invalid_address'] = 'Ų¢ŲÆŲ±Ų³ Ų§ŪŒŁ…ŪŒŁ„ Ł…Ų¹ŲŖŲØŲ± Ł†ŪŒŲ³ŲŖ: '; +$PHPMAILER_LANG['mailer_not_supported'] = ' mailer Ł¾Ų“ŲŖŪŒŲØŲ§Ł†ŪŒ Ł†Ł…ŪŒā€ŒŲ“ŁˆŲÆ.'; +$PHPMAILER_LANG['provide_address'] = 'باید حداقل یک Ų¢ŲÆŲ±Ų³ ŚÆŪŒŲ±Ł†ŲÆŁ‡ وارد Ś©Ł†ŪŒŲÆ.'; +$PHPMAILER_LANG['recipients_failed'] = 'خطای SMTP: Ų§Ų±Ų³Ų§Ł„ به Ų¢ŲÆŲ±Ų³ ŚÆŪŒŲ±Ł†ŲÆŁ‡ ŲØŲ§ Ų®Ų·Ų§ Ł…ŁˆŲ§Ų¬Ł‡ Ų“ŲÆ: '; +$PHPMAILER_LANG['signing'] = 'Ų®Ų·Ų§ ŲÆŲ± Ų§Ł…Ų¶Ų§: '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'Ų®Ų·Ų§ ŲÆŲ± Ų§ŲŖŲµŲ§Ł„ به SMTP.'; +$PHPMAILER_LANG['smtp_error'] = 'Ų®Ų·Ų§ ŲÆŲ± SMTP Server: '; +$PHPMAILER_LANG['variable_set'] = 'امکان Ų§Ų±Ų³Ų§Ł„ یا Ų§Ų±Ų³Ų§Ł„ Ł…Ų¬ŲÆŲÆ Ł…ŲŖŲŗŪŒŲ±ā€ŒŁ‡Ų§ وجود ندارد: '; +$PHPMAILER_LANG['extension_missing'] = 'Ų§ŁŲ²ŁˆŁ†Ł‡ Ł…ŁˆŲ¬ŁˆŲÆ Ł†ŪŒŲ³ŲŖ: '; diff --git a/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-fi.php b/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-fi.php new file mode 100644 index 0000000..243c054 --- /dev/null +++ b/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-fi.php @@ -0,0 +1,28 @@ + + */ + +$PHPMAILER_LANG['authenticate'] = 'SMTP feilur: Kundi ikki góðkenna.'; +$PHPMAILER_LANG['connect_host'] = 'SMTP feilur: Kundi ikki knýta samband viư SMTP vert.'; +$PHPMAILER_LANG['data_not_accepted'] = 'SMTP feilur: Data ikki góðkent.'; +//$PHPMAILER_LANG['empty_message'] = 'Message body empty'; +$PHPMAILER_LANG['encoding'] = 'Ɠkend encoding: '; +$PHPMAILER_LANG['execute'] = 'Kundi ikki ĆŗtfĆøra: '; +$PHPMAILER_LANG['file_access'] = 'Kundi ikki tilganga fĆ­lu: '; +$PHPMAILER_LANG['file_open'] = 'FĆ­lu feilur: Kundi ikki opna fĆ­lu: '; +$PHPMAILER_LANG['from_failed'] = 'fylgjandi FrĆ”/From adressa miseydnaưist: '; +$PHPMAILER_LANG['instantiate'] = 'Kuni ikki instantiera mail funktión.'; +//$PHPMAILER_LANG['invalid_address'] = 'Invalid address: '; +$PHPMAILER_LANG['mailer_not_supported'] = ' er ikki supporteraư.'; +$PHPMAILER_LANG['provide_address'] = 'TĆŗ skal uppgeva minst móttakara-emailadressu(r).'; +$PHPMAILER_LANG['recipients_failed'] = 'SMTP Feilur: Fylgjandi móttakarar miseydnaưust: '; +//$PHPMAILER_LANG['signing'] = 'Signing Error: '; +//$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP Connect() failed.'; +//$PHPMAILER_LANG['smtp_error'] = 'SMTP server error: '; +//$PHPMAILER_LANG['variable_set'] = 'Cannot set or reset variable: '; +//$PHPMAILER_LANG['extension_missing'] = 'Extension missing: '; diff --git a/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-fr.php b/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-fr.php new file mode 100644 index 0000000..38a7a8e --- /dev/null +++ b/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-fr.php @@ -0,0 +1,38 @@ + + */ + +$PHPMAILER_LANG['authenticate'] = 'Erro SMTP: Non puido ser autentificado.'; +$PHPMAILER_LANG['connect_host'] = 'Erro SMTP: Non puido conectar co servidor SMTP.'; +$PHPMAILER_LANG['data_not_accepted'] = 'Erro SMTP: Datos non aceptados.'; +$PHPMAILER_LANG['empty_message'] = 'Corpo da mensaxe vacĆ­a'; +$PHPMAILER_LANG['encoding'] = 'Codificación descoƱecida: '; +$PHPMAILER_LANG['execute'] = 'Non puido ser executado: '; +$PHPMAILER_LANG['file_access'] = 'Nob puido acceder ó arquivo: '; +$PHPMAILER_LANG['file_open'] = 'Erro de Arquivo: No puido abrir o arquivo: '; +$PHPMAILER_LANG['from_failed'] = 'A(s) seguinte(s) dirección(s) de remitente(s) deron erro: '; +$PHPMAILER_LANG['instantiate'] = 'Non puido crear unha instancia da función Mail.'; +$PHPMAILER_LANG['invalid_address'] = 'Non puido envia-lo correo: dirección de email invĆ”lida: '; +$PHPMAILER_LANG['mailer_not_supported'] = ' mailer non estĆ” soportado.'; +$PHPMAILER_LANG['provide_address'] = 'Debe engadir polo menos unha dirección de email coma destino.'; +$PHPMAILER_LANG['recipients_failed'] = 'Erro SMTP: Os seguintes destinos fallaron: '; +$PHPMAILER_LANG['signing'] = 'Erro ó firmar: '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP Connect() fallou.'; +$PHPMAILER_LANG['smtp_error'] = 'Erro do servidor SMTP: '; +$PHPMAILER_LANG['variable_set'] = 'Non puidemos axustar ou reaxustar a variĆ”bel: '; +//$PHPMAILER_LANG['extension_missing'] = 'Extension missing: '; diff --git a/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-he.php b/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-he.php new file mode 100644 index 0000000..b123aa5 --- /dev/null +++ b/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-he.php @@ -0,0 +1,27 @@ + + */ + +$PHPMAILER_LANG['authenticate'] = 'שגיאת SMTP: ×¤×¢×•×œ×Ŗ ×”××™×ž×•×Ŗ נכשלה.'; +$PHPMAILER_LANG['connect_host'] = 'שגיאת SMTP: לא ×”×¦×œ×—×Ŗ×™ ×œ×”×Ŗ×—×‘×Ø לשרת SMTP.'; +$PHPMAILER_LANG['data_not_accepted'] = 'שגיאת SMTP: מידע לא ×”×Ŗ×§×‘×œ.'; +$PHPMAILER_LANG['empty_message'] = 'גוף ההודעה ריק'; +$PHPMAILER_LANG['invalid_address'] = 'כתובת שגויה: '; +$PHPMAILER_LANG['encoding'] = 'קידוד לא ×ž×•×›×Ø: '; +$PHPMAILER_LANG['execute'] = 'לא ×”×¦×œ×—×Ŗ×™ להפעיל את: '; +$PHPMAILER_LANG['file_access'] = 'לא × ×™×Ŗ×Ÿ ×œ×’×©×Ŗ לקובׄ: '; +$PHPMAILER_LANG['file_open'] = 'שגיאת קובׄ: לא × ×™×Ŗ×Ÿ ×œ×’×©×Ŗ לקובׄ: '; +$PHPMAILER_LANG['from_failed'] = 'כתובות הנמענים הבאות נכשלו: '; +$PHPMAILER_LANG['instantiate'] = 'לא ×”×¦×œ×—×Ŗ×™ להפעיל את פונקציית המייל.'; +$PHPMAILER_LANG['mailer_not_supported'] = ' אינה × ×Ŗ×ž×›×Ŗ.'; +$PHPMAILER_LANG['provide_address'] = 'חובה להפק ×œ×¤×—×•×Ŗ כתובת אחת של מקבל המייל.'; +$PHPMAILER_LANG['recipients_failed'] = 'שגיאת SMTP: הנמענים הבאים נכשלו: '; +$PHPMAILER_LANG['signing'] = 'שגיאת ×—×Ŗ×™×ž×”: '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP Connect() failed.'; +$PHPMAILER_LANG['smtp_error'] = 'שגיאת שרת SMTP: '; +$PHPMAILER_LANG['variable_set'] = 'לא × ×™×Ŗ×Ÿ לקבוע או ×œ×©× ×•×Ŗ את ×”×ž×©×Ŗ× ×”: '; +//$PHPMAILER_LANG['extension_missing'] = 'Extension missing: '; diff --git a/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-hi.php b/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-hi.php new file mode 100644 index 0000000..d973a35 --- /dev/null +++ b/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-hi.php @@ -0,0 +1,27 @@ + + */ + +$PHPMAILER_LANG['authenticate'] = 'SMTP ą¤¤ą„ą¤°ą„ą¤Ÿą¤æ: ą¤Ŗą„ą¤°ą¤¾ą¤®ą¤¾ą¤£ą¤æą¤•ą¤¤ą¤¾ ą¤•ą„€ ą¤œą¤¾ą¤‚ą¤š ą¤Øą¤¹ą„€ą¤‚ ą¤¹ą„‹ ą¤øą¤•ą¤¾ą„¤ '; +$PHPMAILER_LANG['connect_host'] = 'SMTP ą¤¤ą„ą¤°ą„ą¤Ÿą¤æ: SMTP ą¤øą¤°ą„ą¤µą¤° ą¤øą„‡ ą¤•ą¤Øą„‡ą¤•ą„ą¤Ÿ ą¤Øą¤¹ą„€ą¤‚ ą¤¹ą„‹ ą¤øą¤•ą¤¾ą„¤ '; +$PHPMAILER_LANG['data_not_accepted'] = 'SMTP ą¤¤ą„ą¤°ą„ą¤Ÿą¤æ: ą¤”ą„‡ą¤Ÿą¤¾ ą¤øą„ą¤µą„€ą¤•ą¤¾ą¤° ą¤Øą¤¹ą„€ą¤‚ किया जाता ą¤¹ą„ˆą„¤ '; +$PHPMAILER_LANG['empty_message'] = 'ą¤øą¤‚ą¤¦ą„‡ą¤¶ ą¤–ą¤¾ą¤²ą„€ ą¤¹ą„ˆą„¤ '; +$PHPMAILER_LANG['encoding'] = 'ą¤…ą¤œą„ą¤žą¤¾ą¤¤ ą¤ą¤Øą„ą¤•ą„‹ą¤”ą¤æą¤‚ą¤— ą¤Ŗą„ą¤°ą¤•ą¤¾ą¤°ą„¤ '; +$PHPMAILER_LANG['execute'] = 'ą¤†ą¤¦ą„‡ą¤¶ ą¤•ą„‹ ą¤Øą¤æą¤·ą„ą¤Ŗą¤¾ą¤¦ą¤æą¤¤ ą¤•ą¤°ą¤Øą„‡ ą¤®ą„‡ą¤‚ ą¤µą¤æą¤«ą¤²ą„¤ '; +$PHPMAILER_LANG['file_access'] = 'फ़ाइल ą¤‰ą¤Ŗą¤²ą¤¬ą„ą¤§ ą¤Øą¤¹ą„€ą¤‚ ą¤¹ą„ˆą„¤ '; +$PHPMAILER_LANG['file_open'] = 'फ़ाइल ą¤¤ą„ą¤°ą„ą¤Ÿą¤æ: फाइल ą¤•ą„‹ ą¤–ą„‹ą¤²ą¤¾ ą¤Øą¤¹ą„€ą¤‚ जा ą¤øą¤•ą¤¾ą„¤ '; +$PHPMAILER_LANG['from_failed'] = 'ą¤Ŗą„ą¤°ą„‡ą¤·ą¤• का पता गलत ą¤¹ą„ˆą„¤ '; +$PHPMAILER_LANG['instantiate'] = 'ą¤®ą„‡ą¤² ą¤«ą¤¼ą¤‚ą¤•ą„ą¤¶ą¤Ø ą¤•ą„‰ą¤² ą¤Øą¤¹ą„€ą¤‚ कर सकता ą¤¹ą„ˆą„¤'; +$PHPMAILER_LANG['invalid_address'] = 'पता गलत ą¤¹ą„ˆą„¤ '; +$PHPMAILER_LANG['mailer_not_supported'] = 'ą¤®ą„‡ą¤² ą¤øą¤°ą„ą¤µą¤° ą¤•ą„‡ साऄ काम ą¤Øą¤¹ą„€ą¤‚ करता ą¤¹ą„ˆą„¤ '; +$PHPMAILER_LANG['provide_address'] = 'ą¤†ą¤Ŗą¤•ą„‹ कम ą¤øą„‡ कम ą¤ą¤• ą¤Ŗą„ą¤°ą¤¾ą¤Ŗą„ą¤¤ą¤•ą¤°ą„ą¤¤ą¤¾ का ई-ą¤®ą„‡ą¤² पता ą¤Ŗą„ą¤°ą¤¦ą¤¾ą¤Ø करना ą¤¹ą„‹ą¤—ą¤¾ą„¤'; +$PHPMAILER_LANG['recipients_failed'] = 'SMTP ą¤¤ą„ą¤°ą„ą¤Ÿą¤æ: ą¤Øą¤æą¤®ą„ą¤Ø ą¤Ŗą„ą¤°ą¤¾ą¤Ŗą„ą¤¤ą¤•ą¤°ą„ą¤¤ą¤¾ą¤“ą¤‚ ą¤•ą„‹ ą¤Ŗą¤¤ą„‡ ą¤­ą„‡ą¤œą¤Øą„‡ ą¤®ą„‡ą¤‚ ą¤µą¤æą¤«ą¤²ą„¤ '; +$PHPMAILER_LANG['signing'] = 'साइनअप ą¤¤ą„ą¤°ą„ą¤Ÿą¤æ:ą„¤ '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP का connect () ą¤«ą¤¼ą¤‚ą¤•ą„ą¤¶ą¤Ø विफल ą¤¹ą„ą¤†ą„¤ '; +$PHPMAILER_LANG['smtp_error'] = 'SMTP ą¤øą¤°ą„ą¤µą¤° ą¤¤ą„ą¤°ą„ą¤Ÿą¤æą„¤ '; +$PHPMAILER_LANG['variable_set'] = 'चर ą¤•ą„‹ बना या ą¤øą¤‚ą¤¶ą„‹ą¤§ą¤æą¤¤ ą¤Øą¤¹ą„€ą¤‚ किया जा ą¤øą¤•ą¤¤ą¤¾ą„¤ '; +$PHPMAILER_LANG['extension_missing'] = 'ą¤ą¤•ą„ą¤øą¤Ÿą„‡ą¤Øą„ą¤·ą¤Ø गायब ą¤¹ą„ˆ: '; diff --git a/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-hr.php b/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-hr.php new file mode 100644 index 0000000..cacb6c3 --- /dev/null +++ b/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-hr.php @@ -0,0 +1,27 @@ + + */ + +$PHPMAILER_LANG['authenticate'] = 'SMTP GreÅ”ka: Neuspjela autentikacija.'; +$PHPMAILER_LANG['connect_host'] = 'SMTP GreÅ”ka: Ne mogu se spojiti na SMTP poslužitelj.'; +$PHPMAILER_LANG['data_not_accepted'] = 'SMTP GreÅ”ka: Podatci nisu prihvaćeni.'; +$PHPMAILER_LANG['empty_message'] = 'Sadržaj poruke je prazan.'; +$PHPMAILER_LANG['encoding'] = 'Nepoznati encoding: '; +$PHPMAILER_LANG['execute'] = 'Nije moguće izvrÅ”iti naredbu: '; +$PHPMAILER_LANG['file_access'] = 'Nije moguće pristupiti datoteci: '; +$PHPMAILER_LANG['file_open'] = 'Nije moguće otvoriti datoteku: '; +$PHPMAILER_LANG['from_failed'] = 'SMTP GreÅ”ka: Slanje s navedenih e-mail adresa nije uspjelo: '; +$PHPMAILER_LANG['recipients_failed'] = 'SMTP GreÅ”ka: Slanje na navedenih e-mail adresa nije uspjelo: '; +$PHPMAILER_LANG['instantiate'] = 'Ne mogu pokrenuti mail funkcionalnost.'; +$PHPMAILER_LANG['invalid_address'] = 'E-mail nije poslan. Neispravna e-mail adresa: '; +$PHPMAILER_LANG['mailer_not_supported'] = ' mailer nije podržan.'; +$PHPMAILER_LANG['provide_address'] = 'Definirajte barem jednu adresu primatelja.'; +$PHPMAILER_LANG['signing'] = 'GreÅ”ka prilikom prijave: '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'Spajanje na SMTP poslužitelj nije uspjelo.'; +$PHPMAILER_LANG['smtp_error'] = 'GreÅ”ka SMTP poslužitelja: '; +$PHPMAILER_LANG['variable_set'] = 'Ne mogu postaviti varijablu niti ju vratiti nazad: '; +$PHPMAILER_LANG['extension_missing'] = 'Nedostaje proÅ”irenje: '; diff --git a/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-hu.php b/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-hu.php new file mode 100644 index 0000000..e6b58b0 --- /dev/null +++ b/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-hu.php @@ -0,0 +1,27 @@ + + */ + +$PHPMAILER_LANG['authenticate'] = 'SMTP -Õ« Õ½Õ­Õ”Õ¬: չհՔջողվՄց Õ½ÕæÕøÖ‚Õ£Õ„Õ¬ Õ«Õ½ÕÆÕøÖ‚Õ©ÕµÕøÖ‚Õ¶ÕØ.'; +$PHPMAILER_LANG['connect_host'] = 'SMTP -Õ« Õ½Õ­Õ”Õ¬: չհՔջողվՄց ÕÆÕ”Õŗ Õ°Õ”Õ½ÕæÕ”ÕæÕ„Õ¬ SMTP Õ½Õ„Ö€Õ¾Õ„Ö€Õ« Õ°Õ„Õæ.'; +$PHPMAILER_LANG['data_not_accepted'] = 'SMTP -Õ« Õ½Õ­Õ”Õ¬: ÕæÕ¾ÕµÕ”Õ¬Õ¶Õ„Ö€ÕØ ÕØÕ¶Õ¤ÕøÖ‚Õ¶Õ¾Õ”Õ® Õ¹Õ„Õ¶.'; +$PHPMAILER_LANG['empty_message'] = 'Õ€Õ”Õ²ÕøÖ€Õ¤Õ”Õ£Ö€ÕøÖ‚Õ©ÕµÕøÖ‚Õ¶ÕØ Õ¤Õ”ÕæÕ”Ö€ÕÆ Õ§'; +$PHPMAILER_LANG['encoding'] = 'ŌæÕøÕ¤Õ”Õ¾ÕøÖ€Õ“Õ”Õ¶ Õ”Õ¶Õ°Õ”ÕµÕæ ÕæÕ„Õ½Õ”ÕÆ: '; +$PHPMAILER_LANG['execute'] = 'ՉհՔջողվՄց իրՔկՔնՔցնՄլ Õ°Ö€Õ”Õ“Õ”Õ¶ÕØ: '; +$PHPMAILER_LANG['file_access'] = 'Õ–Õ”ÕµÕ¬ÕØ Õ°Õ”Õ½Õ”Õ¶Õ„Õ¬Õ« Õ¹Õ§: '; +$PHPMAILER_LANG['file_open'] = 'Õ–Õ”ÕµÕ¬Õ« Õ½Õ­Õ”Õ¬: Ö†Õ”ÕµÕ¬ÕØ չհՔջողվՄց բՔցՄլ: '; +$PHPMAILER_LANG['from_failed'] = 'ÕˆÖ‚Õ²Õ”Ö€ÕÆÕøÕ²Õ« Õ°Õ„ÕæÖ‡ÕµÕ”Õ¬ հՔսցՄն Õ½Õ­Õ”Õ¬ Õ§: '; +$PHPMAILER_LANG['instantiate'] = 'Õ€Õ¶Õ”Ö€Õ”Õ¾ÕøÖ€ Õ¹Õ§ ÕÆÕ”Õ¶Õ¹Õ„Õ¬ mail ֆունկցիՔն.'; +$PHPMAILER_LANG['invalid_address'] = 'ՀՔսցՄն Õ½Õ­Õ”Õ¬ Õ§: '; +$PHPMAILER_LANG['mailer_not_supported'] = ' փոստՔյին Õ½Õ„Ö€Õ¾Õ„Ö€Õ« Õ°Õ„Õæ Õ¹Õ« Õ”Õ·Õ­Õ”ÕæÕøÖ‚Õ“.'; +$PHPMAILER_LANG['provide_address'] = 'Ō±Õ¶Õ°Ö€Õ”ÕŖÕ„Õ·Õæ Õ§ ÕæÖ€Õ”Õ“Õ”Õ¤Ö€Õ„Õ¬ Õ£ÕøÕ¶Õ„ Õ“Õ„ÕÆ ստՔցողի e-mail հՔսցՄ.'; +$PHPMAILER_LANG['recipients_failed'] = 'SMTP -Õ« Õ½Õ­Õ”Õ¬: Õ¹Õ« Õ°Õ”Õ»ÕøÕ²Õ¾Õ„Õ¬ ÕøÖ‚Õ²Õ”Ö€ÕÆÕ„Õ¬ Õ°Õ„ÕæÖ‡ÕµÕ”Õ¬ ստՔցողնՄրի հՔսցՄնՄրին: '; +$PHPMAILER_LANG['signing'] = 'ÕÕæÕøÖ€Õ”Õ£Ö€Õ“Õ”Õ¶ Õ½Õ­Õ”Õ¬: '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP -Õ« connect() ֆունկցիՔն Õ¹Õ« Õ°Õ”Õ»ÕøÕ²Õ¾Õ„Õ¬'; +$PHPMAILER_LANG['smtp_error'] = 'SMTP Õ½Õ„Ö€Õ¾Õ„Ö€Õ« Õ½Õ­Õ”Õ¬: '; +$PHPMAILER_LANG['variable_set'] = 'Չի Õ°Õ”Õ»ÕøÕ²Õ¾ÕøÖ‚Õ“ Õ½ÕæÕ„Õ²Õ®Õ„Õ¬ ÕÆÕ”Õ“ Õ¾Õ„Ö€Õ”ÖƒÕøÕ­Õ„Õ¬ փոփոխՔկՔնը: '; +$PHPMAILER_LANG['extension_missing'] = 'Õ€Õ”Õ¾Õ„Õ¬Õ¾Õ”Õ®ÕØ բՔցՔկՔյուՓ Õ§: '; diff --git a/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-id.php b/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-id.php new file mode 100644 index 0000000..212a11f --- /dev/null +++ b/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-id.php @@ -0,0 +1,31 @@ + + * @author @januridp + * @author Ian Mustafa + */ + +$PHPMAILER_LANG['authenticate'] = 'Kesalahan SMTP: Tidak dapat mengotentikasi.'; +$PHPMAILER_LANG['connect_host'] = 'Kesalahan SMTP: Tidak dapat terhubung ke host SMTP.'; +$PHPMAILER_LANG['data_not_accepted'] = 'Kesalahan SMTP: Data tidak diterima.'; +$PHPMAILER_LANG['empty_message'] = 'Isi pesan kosong'; +$PHPMAILER_LANG['encoding'] = 'Pengkodean karakter tidak dikenali: '; +$PHPMAILER_LANG['execute'] = 'Tidak dapat menjalankan proses: '; +$PHPMAILER_LANG['file_access'] = 'Tidak dapat mengakses berkas: '; +$PHPMAILER_LANG['file_open'] = 'Kesalahan Berkas: Berkas tidak dapat dibuka: '; +$PHPMAILER_LANG['from_failed'] = 'Alamat pengirim berikut mengakibatkan kesalahan: '; +$PHPMAILER_LANG['instantiate'] = 'Tidak dapat menginisialisasi fungsi surel.'; +$PHPMAILER_LANG['invalid_address'] = 'Gagal terkirim, alamat surel tidak sesuai: '; +$PHPMAILER_LANG['invalid_hostentry'] = 'Gagal terkirim, entri host tidak sesuai: '; +$PHPMAILER_LANG['invalid_host'] = 'Gagal terkirim, host tidak sesuai: '; +$PHPMAILER_LANG['provide_address'] = 'Harus tersedia minimal satu alamat tujuan'; +$PHPMAILER_LANG['mailer_not_supported'] = ' mailer tidak didukung'; +$PHPMAILER_LANG['recipients_failed'] = 'Kesalahan SMTP: Alamat tujuan berikut menyebabkan kesalahan: '; +$PHPMAILER_LANG['signing'] = 'Kesalahan dalam penandatangan SSL: '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP Connect() gagal.'; +$PHPMAILER_LANG['smtp_error'] = 'Kesalahan pada pelayan SMTP: '; +$PHPMAILER_LANG['variable_set'] = 'Tidak dapat mengatur atau mengatur ulang variabel: '; +$PHPMAILER_LANG['extension_missing'] = 'Ekstensi PHP tidak tersedia: '; diff --git a/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-it.php b/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-it.php new file mode 100644 index 0000000..08a6b73 --- /dev/null +++ b/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-it.php @@ -0,0 +1,28 @@ + + * @author Stefano Sabatini + */ + +$PHPMAILER_LANG['authenticate'] = 'SMTP Error: Impossibile autenticarsi.'; +$PHPMAILER_LANG['connect_host'] = 'SMTP Error: Impossibile connettersi all\'host SMTP.'; +$PHPMAILER_LANG['data_not_accepted'] = 'SMTP Error: Dati non accettati dal server.'; +$PHPMAILER_LANG['empty_message'] = 'Il corpo del messaggio ĆØ vuoto'; +$PHPMAILER_LANG['encoding'] = 'Codifica dei caratteri sconosciuta: '; +$PHPMAILER_LANG['execute'] = 'Impossibile eseguire l\'operazione: '; +$PHPMAILER_LANG['file_access'] = 'Impossibile accedere al file: '; +$PHPMAILER_LANG['file_open'] = 'File Error: Impossibile aprire il file: '; +$PHPMAILER_LANG['from_failed'] = 'I seguenti indirizzi mittenti hanno generato errore: '; +$PHPMAILER_LANG['instantiate'] = 'Impossibile istanziare la funzione mail'; +$PHPMAILER_LANG['invalid_address'] = 'Impossibile inviare, l\'indirizzo email non ĆØ valido: '; +$PHPMAILER_LANG['provide_address'] = 'Deve essere fornito almeno un indirizzo ricevente'; +$PHPMAILER_LANG['mailer_not_supported'] = 'Mailer non supportato'; +$PHPMAILER_LANG['recipients_failed'] = 'SMTP Error: I seguenti indirizzi destinatari hanno generato un errore: '; +$PHPMAILER_LANG['signing'] = 'Errore nella firma: '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP Connect() fallita.'; +$PHPMAILER_LANG['smtp_error'] = 'Errore del server SMTP: '; +$PHPMAILER_LANG['variable_set'] = 'Impossibile impostare o resettare la variabile: '; +$PHPMAILER_LANG['extension_missing'] = 'Estensione mancante: '; diff --git a/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-ja.php b/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-ja.php new file mode 100644 index 0000000..c76f526 --- /dev/null +++ b/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-ja.php @@ -0,0 +1,29 @@ + + * @author Yoshi Sakai + * @author Arisophy + */ + +$PHPMAILER_LANG['authenticate'] = 'SMTPć‚Øćƒ©ćƒ¼: čŖčØ¼ć§ćć¾ć›ć‚“ć§ć—ćŸć€‚'; +$PHPMAILER_LANG['connect_host'] = 'SMTPć‚Øćƒ©ćƒ¼: SMTPćƒ›ć‚¹ćƒˆć«ęŽ„ē¶šć§ćć¾ć›ć‚“ć§ć—ćŸć€‚'; +$PHPMAILER_LANG['data_not_accepted'] = 'SMTPć‚Øćƒ©ćƒ¼: ćƒ‡ćƒ¼ć‚æćŒå—ć‘ä»˜ć‘ć‚‰ć‚Œć¾ć›ć‚“ć§ć—ćŸć€‚'; +$PHPMAILER_LANG['empty_message'] = 'ćƒ”ćƒ¼ćƒ«ęœ¬ę–‡ćŒē©ŗć§ć™ć€‚'; +$PHPMAILER_LANG['encoding'] = 'äøę˜ŽćŖć‚Øćƒ³ć‚³ćƒ¼ćƒ‡ć‚£ćƒ³ć‚°: '; +$PHPMAILER_LANG['execute'] = 'å®Ÿč”Œć§ćć¾ć›ć‚“ć§ć—ćŸ: '; +$PHPMAILER_LANG['file_access'] = 'ćƒ•ć‚”ć‚¤ćƒ«ć«ć‚¢ć‚Æć‚»ć‚¹ć§ćć¾ć›ć‚“: '; +$PHPMAILER_LANG['file_open'] = 'ćƒ•ć‚”ć‚¤ćƒ«ć‚Øćƒ©ćƒ¼: ćƒ•ć‚”ć‚¤ćƒ«ć‚’é–‹ć‘ć¾ć›ć‚“: '; +$PHPMAILER_LANG['from_failed'] = 'Fromć‚¢ćƒ‰ćƒ¬ć‚¹ć‚’ē™»éŒ²ć™ć‚‹éš›ć«ć‚Øćƒ©ćƒ¼ćŒē™ŗē”Ÿć—ć¾ć—ćŸ: '; +$PHPMAILER_LANG['instantiate'] = 'ćƒ”ćƒ¼ćƒ«é–¢ę•°ćŒę­£åøøć«å‹•ä½œć—ć¾ć›ć‚“ć§ć—ćŸć€‚'; +$PHPMAILER_LANG['invalid_address'] = 'äøę­£ćŖćƒ”ćƒ¼ćƒ«ć‚¢ćƒ‰ćƒ¬ć‚¹: '; +$PHPMAILER_LANG['provide_address'] = 'å°‘ćŖććØć‚‚1ć¤ćƒ”ćƒ¼ćƒ«ć‚¢ćƒ‰ćƒ¬ć‚¹ć‚’ ęŒ‡å®šć™ć‚‹åæ…č¦ćŒć‚ć‚Šć¾ć™ć€‚'; +$PHPMAILER_LANG['mailer_not_supported'] = ' ćƒ”ćƒ¼ćƒ©ćƒ¼ćŒć‚µćƒćƒ¼ćƒˆć•ć‚Œć¦ć„ć¾ć›ć‚“ć€‚'; +$PHPMAILER_LANG['recipients_failed'] = 'SMTPć‚Øćƒ©ćƒ¼: ę¬”ć®å—äæ”č€…ć‚¢ćƒ‰ćƒ¬ć‚¹ć« é–“é•ć„ćŒć‚ć‚Šć¾ć™: '; +$PHPMAILER_LANG['signing'] = 'ē½²åć‚Øćƒ©ćƒ¼: '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTPęŽ„ē¶šć«å¤±ę•—ć—ć¾ć—ćŸć€‚'; +$PHPMAILER_LANG['smtp_error'] = 'SMTPć‚µćƒ¼ćƒćƒ¼ć‚Øćƒ©ćƒ¼: '; +$PHPMAILER_LANG['variable_set'] = 'å¤‰ę•°ćŒå­˜åœØć—ć¾ć›ć‚“: '; +$PHPMAILER_LANG['extension_missing'] = 'ę‹”å¼µę©Ÿčƒ½ćŒč¦‹ć¤ć‹ć‚Šć¾ć›ć‚“: '; diff --git a/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-ka.php b/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-ka.php new file mode 100644 index 0000000..51fe403 --- /dev/null +++ b/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-ka.php @@ -0,0 +1,27 @@ + + */ + +$PHPMAILER_LANG['authenticate'] = 'SMTP įƒØįƒ”įƒŖįƒ“įƒįƒ›įƒ: įƒįƒ•įƒ¢įƒįƒ įƒ˜įƒ–įƒįƒŖįƒ˜įƒ įƒØįƒ”įƒ£įƒ«įƒšįƒ”įƒ‘įƒ”įƒšįƒ˜įƒ.'; +$PHPMAILER_LANG['connect_host'] = 'SMTP įƒØįƒ”įƒŖįƒ“įƒįƒ›įƒ: SMTP įƒ”įƒ”įƒ įƒ•įƒ”įƒ įƒ—įƒįƒœ įƒ“įƒįƒ™įƒįƒ•įƒØįƒ˜įƒ įƒ”įƒ‘įƒ įƒØįƒ”įƒ£įƒ«įƒšįƒ”įƒ‘įƒ”įƒšįƒ˜įƒ.'; +$PHPMAILER_LANG['data_not_accepted'] = 'SMTP įƒØįƒ”įƒŖįƒ“įƒįƒ›įƒ: įƒ›įƒįƒœįƒįƒŖįƒ”įƒ›įƒ”įƒ‘įƒ˜ არ იჄნა įƒ›įƒ˜įƒ¦įƒ”įƒ‘įƒ£įƒšįƒ˜.'; +$PHPMAILER_LANG['encoding'] = 'įƒ™įƒįƒ“įƒ˜įƒ įƒ”įƒ‘įƒ˜įƒ” įƒ£įƒŖįƒœįƒįƒ‘įƒ˜ įƒ¢įƒ˜įƒžįƒ˜: '; +$PHPMAILER_LANG['execute'] = 'įƒØįƒ”įƒ£įƒ«įƒšįƒ”įƒ‘įƒ”įƒšįƒ˜įƒ įƒØįƒ”įƒ›įƒ“įƒ”įƒ’įƒ˜ įƒ‘įƒ įƒ«įƒįƒœįƒ”įƒ‘įƒ˜įƒ” įƒØįƒ”įƒ”įƒ įƒ£įƒšįƒ”įƒ‘įƒ: '; +$PHPMAILER_LANG['file_access'] = 'įƒØįƒ”įƒ£įƒ«įƒšįƒ”įƒ‘įƒ”įƒšįƒ˜įƒ įƒ¬įƒ•įƒ“įƒįƒ›įƒ įƒ¤įƒįƒ˜įƒšįƒ—įƒįƒœ: '; +$PHPMAILER_LANG['file_open'] = 'ფაილური įƒ”įƒ˜įƒ”įƒ¢įƒ”įƒ›įƒ˜įƒ” įƒØįƒ”įƒŖįƒ“įƒįƒ›įƒ: არ įƒ˜įƒ®įƒ”įƒœįƒ”įƒ‘įƒ ფაილი: '; +$PHPMAILER_LANG['from_failed'] = 'įƒ’įƒįƒ›įƒ’įƒ–įƒįƒ•įƒœįƒ˜įƒ” įƒįƒ įƒįƒ”įƒ¬įƒįƒ įƒ˜ įƒ›įƒ˜įƒ”įƒįƒ›įƒįƒ įƒ—įƒ˜: '; +$PHPMAILER_LANG['instantiate'] = 'mail ფუნჄციიე įƒ’įƒįƒØįƒ•įƒ”įƒ‘įƒ įƒ•įƒ”įƒ  įƒ®įƒ”įƒ įƒ®įƒ“įƒ”įƒ‘įƒ.'; +$PHPMAILER_LANG['provide_address'] = 'įƒ’įƒ—įƒ®įƒįƒ•įƒ— įƒ›įƒ˜įƒ£įƒ—įƒ˜įƒ—įƒįƒ— įƒ”įƒ įƒ—įƒ˜ įƒįƒ“įƒ įƒ”įƒ”įƒįƒ¢įƒ˜įƒ” e-mail įƒ›įƒ˜įƒ”įƒįƒ›įƒįƒ įƒ—įƒ˜ įƒ›įƒįƒ˜įƒœįƒŖ.'; +$PHPMAILER_LANG['mailer_not_supported'] = ' - įƒ”įƒįƒ¤įƒįƒ”įƒ¢įƒ įƒ”įƒ”įƒ įƒ•įƒ”įƒ įƒ˜įƒ” įƒ›įƒ®įƒįƒ įƒ“įƒįƒ­įƒ”įƒ įƒ არ არიე.'; +$PHPMAILER_LANG['recipients_failed'] = 'SMTP įƒØįƒ”įƒŖįƒ“įƒįƒ›įƒ: įƒØįƒ”įƒ›įƒ“įƒ”įƒ’ įƒ›įƒ˜įƒ”įƒįƒ›įƒįƒ įƒ—įƒ”įƒ‘įƒ–įƒ” įƒ’įƒįƒ’įƒ–įƒįƒ•įƒœįƒ įƒ•įƒ”įƒ  įƒ›įƒįƒ®įƒ”įƒ įƒ®įƒ“įƒ: '; +$PHPMAILER_LANG['empty_message'] = 'įƒØįƒ”įƒ¢įƒ§įƒįƒ‘įƒ˜įƒœįƒ”įƒ‘įƒ įƒŖįƒįƒ įƒ˜įƒ”įƒšįƒ˜įƒ'; +$PHPMAILER_LANG['invalid_address'] = 'არ įƒ’įƒįƒ˜įƒ’įƒ–įƒįƒ•įƒœįƒ, e-mail įƒ›įƒ˜įƒ”įƒįƒ›įƒįƒ įƒ—įƒ˜įƒ” įƒįƒ įƒįƒ”įƒ¬įƒįƒ įƒ˜ įƒ¤įƒįƒ įƒ›įƒįƒ¢įƒ˜: '; +$PHPMAILER_LANG['signing'] = 'įƒ®įƒ”įƒšįƒ›įƒįƒ¬įƒ”įƒ įƒ˜įƒ” įƒØįƒ”įƒŖįƒ“įƒįƒ›įƒ: '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'įƒØįƒ”įƒŖįƒ“įƒįƒ›įƒ SMTP įƒ”įƒ”įƒ įƒ•įƒ”įƒ įƒ—įƒįƒœ įƒ“įƒįƒ™įƒįƒ•įƒØįƒ˜įƒ įƒ”įƒ‘įƒ˜įƒ”įƒįƒ”'; +$PHPMAILER_LANG['smtp_error'] = 'SMTP įƒ”įƒ”įƒ įƒ•įƒ”įƒ įƒ˜įƒ” įƒØįƒ”įƒŖįƒ“įƒįƒ›įƒ: '; +$PHPMAILER_LANG['variable_set'] = 'įƒØįƒ”įƒ£įƒ«įƒšįƒ”įƒ‘įƒ”įƒšįƒ˜įƒ įƒØįƒ”įƒ›įƒ“įƒ”įƒ’įƒ˜ įƒŖįƒ•įƒšįƒįƒ“įƒ˜įƒ” įƒØįƒ”įƒ„įƒ›įƒœįƒ ან įƒØįƒ”įƒŖįƒ•įƒšįƒ: '; +$PHPMAILER_LANG['extension_missing'] = 'įƒ‘įƒ˜įƒ‘įƒšįƒ˜įƒįƒ—įƒ”įƒ™įƒ არ įƒįƒ įƒ”įƒ”įƒ‘įƒįƒ‘įƒ”: '; diff --git a/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-ko.php b/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-ko.php new file mode 100644 index 0000000..8c97dd9 --- /dev/null +++ b/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-ko.php @@ -0,0 +1,27 @@ + + */ + +$PHPMAILER_LANG['authenticate'] = 'SMTP 오넘: ģøģ¦ķ•  수 ģ—†ģŠµė‹ˆė‹¤.'; +$PHPMAILER_LANG['connect_host'] = 'SMTP 오넘: SMTP ķ˜øģŠ¤ķŠøģ— ģ ‘ģ†ķ•  수 ģ—†ģŠµė‹ˆė‹¤.'; +$PHPMAILER_LANG['data_not_accepted'] = 'SMTP 오넘: ė°ģ“ķ„°ź°€ 받아들여지지 ģ•Šģ•˜ģŠµė‹ˆė‹¤.'; +$PHPMAILER_LANG['empty_message'] = '메세지 ė‚“ģš©ģ“ ģ—†ģŠµė‹ˆė‹¤'; +$PHPMAILER_LANG['encoding'] = 'ģ•Œ 수 ģ—†ėŠ” ģøģ½”ė”©: '; +$PHPMAILER_LANG['execute'] = '실행 ė¶ˆź°€: '; +$PHPMAILER_LANG['file_access'] = 'ķŒŒģ¼ ģ ‘ź·¼ ė¶ˆź°€: '; +$PHPMAILER_LANG['file_open'] = 'ķŒŒģ¼ 오넘: ķŒŒģ¼ģ„ ģ—“ 수 ģ—†ģŠµė‹ˆė‹¤: '; +$PHPMAILER_LANG['from_failed'] = 'ė‹¤ģŒ From ģ£¼ģ†Œģ—ģ„œ ģ˜¤ė„˜ź°€ ė°œģƒķ–ˆģŠµė‹ˆė‹¤: '; +$PHPMAILER_LANG['instantiate'] = 'mail ķ•Øģˆ˜ė„¼ ģøģŠ¤ķ„“ģŠ¤ķ™”ķ•  수 ģ—†ģŠµė‹ˆė‹¤'; +$PHPMAILER_LANG['invalid_address'] = 'ģž˜ėŖ»ėœ ģ£¼ģ†Œ: '; +$PHPMAILER_LANG['mailer_not_supported'] = ' ė©”ģ¼ėŸ¬ėŠ” ģ§€ģ›ė˜ģ§€ ģ•ŠģŠµė‹ˆė‹¤.'; +$PHPMAILER_LANG['provide_address'] = 'ģ ģ–“ė„ ķ•œ 개 ģ“ģƒģ˜ ģˆ˜ģ‹ ģž ė©”ģ¼ ģ£¼ģ†Œė„¼ ģ œź³µķ•“ģ•¼ ķ•©ė‹ˆė‹¤.'; +$PHPMAILER_LANG['recipients_failed'] = 'SMTP 오넘: ė‹¤ģŒ ģˆ˜ģ‹ ģžģ—ģ„œ ģ˜¤ė„˜ź°€ ė°œģƒķ–ˆģŠµė‹ˆė‹¤: '; +$PHPMAILER_LANG['signing'] = 'ģ„œėŖ… 오넘: '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP ģ—°ź²°ģ„ ģ‹¤ķŒØķ•˜ģ˜€ģŠµė‹ˆė‹¤.'; +$PHPMAILER_LANG['smtp_error'] = 'SMTP ģ„œė²„ 오넘: '; +$PHPMAILER_LANG['variable_set'] = 'ė³€ģˆ˜ 설정 ė° ģ“ˆźø°ķ™” ė¶ˆź°€: '; +$PHPMAILER_LANG['extension_missing'] = 'ķ™•ģž„ģž ģ—†ģŒ: '; diff --git a/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-lt.php b/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-lt.php new file mode 100644 index 0000000..4f115b1 --- /dev/null +++ b/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-lt.php @@ -0,0 +1,27 @@ + + */ + +$PHPMAILER_LANG['authenticate'] = 'SMTP klaida: autentifikacija nepavyko.'; +$PHPMAILER_LANG['connect_host'] = 'SMTP klaida: nepavyksta prisijungti prie SMTP stoties.'; +$PHPMAILER_LANG['data_not_accepted'] = 'SMTP klaida: duomenys nepriimti.'; +$PHPMAILER_LANG['empty_message'] = 'LaiÅ”ko turinys tuŔčias'; +$PHPMAILER_LANG['encoding'] = 'Neatpažinta koduotė: '; +$PHPMAILER_LANG['execute'] = 'Nepavyko ÄÆvykdyti komandos: '; +$PHPMAILER_LANG['file_access'] = 'Byla nepasiekiama: '; +$PHPMAILER_LANG['file_open'] = 'Bylos klaida: Nepavyksta atidaryti: '; +$PHPMAILER_LANG['from_failed'] = 'Neteisingas siuntėjo adresas: '; +$PHPMAILER_LANG['instantiate'] = 'Nepavyko paleisti mail funkcijos.'; +$PHPMAILER_LANG['invalid_address'] = 'Neteisingas adresas: '; +$PHPMAILER_LANG['mailer_not_supported'] = ' paÅ”to stotis nepalaikoma.'; +$PHPMAILER_LANG['provide_address'] = 'Nurodykite bent vieną gavėjo adresą.'; +$PHPMAILER_LANG['recipients_failed'] = 'SMTP klaida: nepavyko iÅ”siųsti Å”iems gavėjams: '; +$PHPMAILER_LANG['signing'] = 'Prisijungimo klaida: '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP susijungimo klaida'; +$PHPMAILER_LANG['smtp_error'] = 'SMTP stoties klaida: '; +$PHPMAILER_LANG['variable_set'] = 'Nepavyko priskirti reikÅ”mės kintamajam: '; +//$PHPMAILER_LANG['extension_missing'] = 'Extension missing: '; diff --git a/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-lv.php b/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-lv.php new file mode 100644 index 0000000..679b18c --- /dev/null +++ b/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-lv.php @@ -0,0 +1,27 @@ + + */ + +$PHPMAILER_LANG['authenticate'] = 'SMTP kļūda: Autorizācija neizdevās.'; +$PHPMAILER_LANG['connect_host'] = 'SMTP Kļūda: Nevar izveidot savienojumu ar SMTP serveri.'; +$PHPMAILER_LANG['data_not_accepted'] = 'SMTP Kļūda: Nepieņem informāciju.'; +$PHPMAILER_LANG['empty_message'] = 'Ziņojuma teksts ir tukÅ”s'; +$PHPMAILER_LANG['encoding'] = 'NeatpazÄ«ts kodējums: '; +$PHPMAILER_LANG['execute'] = 'Neizdevās izpildÄ«t komandu: '; +$PHPMAILER_LANG['file_access'] = 'Fails nav pieejams: '; +$PHPMAILER_LANG['file_open'] = 'Faila kļūda: Nevar atvērt failu: '; +$PHPMAILER_LANG['from_failed'] = 'Nepareiza sÅ«tÄ«tāja adrese: '; +$PHPMAILER_LANG['instantiate'] = 'Nevar palaist sÅ«tīŔanas funkciju.'; +$PHPMAILER_LANG['invalid_address'] = 'Nepareiza adrese: '; +$PHPMAILER_LANG['mailer_not_supported'] = ' sÅ«tÄ«tājs netiek atbalstÄ«ts.'; +$PHPMAILER_LANG['provide_address'] = 'LÅ«dzu, norādiet vismaz vienu adresātu.'; +$PHPMAILER_LANG['recipients_failed'] = 'SMTP kļūda: neizdevās nosÅ«tÄ«t Ŕādiem saņēmējiem: '; +$PHPMAILER_LANG['signing'] = 'Autorizācijas kļūda: '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP savienojuma kļūda'; +$PHPMAILER_LANG['smtp_error'] = 'SMTP servera kļūda: '; +$PHPMAILER_LANG['variable_set'] = 'Nevar pieŔķirt mainÄ«gā vērtÄ«bu: '; +//$PHPMAILER_LANG['extension_missing'] = 'Extension missing: '; diff --git a/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-mg.php b/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-mg.php new file mode 100644 index 0000000..8a94f6a --- /dev/null +++ b/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-mg.php @@ -0,0 +1,27 @@ + + */ + +$PHPMAILER_LANG['authenticate'] = 'Hadisoana SMTP: Tsy nahomby ny fanamarinana.'; +$PHPMAILER_LANG['connect_host'] = 'SMTP Error: Tsy afaka mampifandray amin\'ny mpampiantrano SMTP.'; +$PHPMAILER_LANG['data_not_accepted'] = 'SMTP diso: tsy voarakitra ny angona.'; +$PHPMAILER_LANG['empty_message'] = 'Tsy misy ny votoaty mailaka.'; +$PHPMAILER_LANG['encoding'] = 'Tsy fantatra encoding: '; +$PHPMAILER_LANG['execute'] = 'Tsy afaka manatanteraka ity baiko manaraka ity: '; +$PHPMAILER_LANG['file_access'] = 'Tsy nahomby ny fidirana amin\'ity rakitra ity: '; +$PHPMAILER_LANG['file_open'] = 'Hadisoana diso: Tsy afaka nanokatra ity file manaraka ity: '; +$PHPMAILER_LANG['from_failed'] = 'Ny adiresy iraka manaraka dia diso: '; +$PHPMAILER_LANG['instantiate'] = 'Tsy afaka nanomboka ny hetsika mail.'; +$PHPMAILER_LANG['invalid_address'] = 'Tsy mety ny adiresy: '; +$PHPMAILER_LANG['mailer_not_supported'] = ' mailer tsy manohana.'; +$PHPMAILER_LANG['provide_address'] = 'Alefaso azafady iray adiresy iray farafahakeliny.'; +$PHPMAILER_LANG['recipients_failed'] = 'SMTP Error: Tsy mety ireo mpanaraka ireto: '; +$PHPMAILER_LANG['signing'] = 'Error nandritra ny sonia:'; +$PHPMAILER_LANG['smtp_connect_failed'] = 'Tsy nahomby ny fifandraisana tamin\'ny server SMTP.'; +$PHPMAILER_LANG['smtp_error'] = 'Fahadisoana tamin\'ny server SMTP: '; +$PHPMAILER_LANG['variable_set'] = 'Tsy azo atao ny mametraka na mamerina ny variable: '; +$PHPMAILER_LANG['extension_missing'] = 'Tsy hita ny ampahany: '; diff --git a/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-ms.php b/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-ms.php new file mode 100644 index 0000000..71db338 --- /dev/null +++ b/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-ms.php @@ -0,0 +1,27 @@ + + */ + +$PHPMAILER_LANG['authenticate'] = 'Ralat SMTP: Tidak dapat pengesahan.'; +$PHPMAILER_LANG['connect_host'] = 'Ralat SMTP: Tidak dapat menghubungi hos pelayan SMTP.'; +$PHPMAILER_LANG['data_not_accepted'] = 'Ralat SMTP: Data tidak diterima oleh pelayan.'; +$PHPMAILER_LANG['empty_message'] = 'Tiada isi untuk mesej'; +$PHPMAILER_LANG['encoding'] = 'Pengekodan tidak diketahui: '; +$PHPMAILER_LANG['execute'] = 'Tidak dapat melaksanakan: '; +$PHPMAILER_LANG['file_access'] = 'Tidak dapat mengakses fail: '; +$PHPMAILER_LANG['file_open'] = 'Ralat Fail: Tidak dapat membuka fail: '; +$PHPMAILER_LANG['from_failed'] = 'Berikut merupakan ralat dari alamat e-mel: '; +$PHPMAILER_LANG['instantiate'] = 'Tidak dapat memberi contoh fungsi e-mel.'; +$PHPMAILER_LANG['invalid_address'] = 'Alamat emel tidak sah: '; +$PHPMAILER_LANG['mailer_not_supported'] = ' jenis penghantar emel tidak disokong.'; +$PHPMAILER_LANG['provide_address'] = 'Anda perlu menyediakan sekurang-kurangnya satu alamat e-mel penerima.'; +$PHPMAILER_LANG['recipients_failed'] = 'Ralat SMTP: Penerima e-mel berikut telah gagal: '; +$PHPMAILER_LANG['signing'] = 'Ralat pada tanda tangan: '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP Connect() telah gagal.'; +$PHPMAILER_LANG['smtp_error'] = 'Ralat pada pelayan SMTP: '; +$PHPMAILER_LANG['variable_set'] = 'Tidak boleh menetapkan atau menetapkan semula pembolehubah: '; +$PHPMAILER_LANG['extension_missing'] = 'Sambungan hilang: '; diff --git a/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-nb.php b/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-nb.php new file mode 100644 index 0000000..65793ce --- /dev/null +++ b/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-nb.php @@ -0,0 +1,26 @@ + + */ + +$PHPMAILER_LANG['authenticate'] = 'SMTP-fout: authenticatie mislukt.'; +$PHPMAILER_LANG['buggy_php'] = 'PHP versie gededecteerd die onderhavig is aan een bug die kan resulteren in gecorrumpeerde berichten. Om dit te voorkomen, gebruik SMTP voor het verzenden van berichten, zet de mail.add_x_header optie in uw php.ini file uit, gebruik MacOS of Linux, of pas de gebruikte PHP versie aan naar versie 7.0.17+ or 7.1.3+.'; +$PHPMAILER_LANG['connect_host'] = 'SMTP-fout: kon niet verbinden met SMTP-host.'; +$PHPMAILER_LANG['data_not_accepted'] = 'SMTP-fout: data niet geaccepteerd.'; +$PHPMAILER_LANG['empty_message'] = 'Berichttekst is leeg'; +$PHPMAILER_LANG['encoding'] = 'Onbekende codering: '; +$PHPMAILER_LANG['execute'] = 'Kon niet uitvoeren: '; +$PHPMAILER_LANG['extension_missing'] = 'Extensie afwezig: '; +$PHPMAILER_LANG['file_access'] = 'Kreeg geen toegang tot bestand: '; +$PHPMAILER_LANG['file_open'] = 'Bestandsfout: kon bestand niet openen: '; +$PHPMAILER_LANG['from_failed'] = 'Het volgende afzendersadres is mislukt: '; +$PHPMAILER_LANG['instantiate'] = 'Kon mailfunctie niet initialiseren.'; +$PHPMAILER_LANG['invalid_address'] = 'Ongeldig adres: '; +$PHPMAILER_LANG['invalid_header'] = 'Ongeldige header naam of waarde'; +$PHPMAILER_LANG['invalid_hostentry'] = 'Ongeldige hostentry: '; +$PHPMAILER_LANG['invalid_host'] = 'Ongeldige host: '; +$PHPMAILER_LANG['mailer_not_supported'] = ' mailer wordt niet ondersteund.'; +$PHPMAILER_LANG['provide_address'] = 'Er moet minstens ƩƩn ontvanger worden opgegeven.'; +$PHPMAILER_LANG['recipients_failed'] = 'SMTP-fout: de volgende ontvangers zijn mislukt: '; +$PHPMAILER_LANG['signing'] = 'Signeerfout: '; +$PHPMAILER_LANG['smtp_code'] = 'SMTP code: '; +$PHPMAILER_LANG['smtp_code_ex'] = 'Aanvullende SMTP informatie: '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP Verbinding mislukt.'; +$PHPMAILER_LANG['smtp_detail'] = 'Detail: '; +$PHPMAILER_LANG['smtp_error'] = 'SMTP-serverfout: '; +$PHPMAILER_LANG['variable_set'] = 'Kan de volgende variabele niet instellen of resetten: '; diff --git a/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-pl.php b/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-pl.php new file mode 100644 index 0000000..23caa71 --- /dev/null +++ b/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-pl.php @@ -0,0 +1,27 @@ + + */ + +$PHPMAILER_LANG['authenticate'] = 'Erro do SMTP: NĆ£o foi possĆ­vel realizar a autenticação.'; +$PHPMAILER_LANG['connect_host'] = 'Erro do SMTP: NĆ£o foi possĆ­vel realizar ligação com o servidor SMTP.'; +$PHPMAILER_LANG['data_not_accepted'] = 'Erro do SMTP: Os dados foram rejeitados.'; +$PHPMAILER_LANG['empty_message'] = 'A mensagem no e-mail estĆ” vazia.'; +$PHPMAILER_LANG['encoding'] = 'Codificação desconhecida: '; +$PHPMAILER_LANG['execute'] = 'NĆ£o foi possĆ­vel executar: '; +$PHPMAILER_LANG['file_access'] = 'NĆ£o foi possĆ­vel aceder o ficheiro: '; +$PHPMAILER_LANG['file_open'] = 'Abertura do ficheiro: NĆ£o foi possĆ­vel abrir o ficheiro: '; +$PHPMAILER_LANG['from_failed'] = 'Ocorreram falhas nos endereƧos dos seguintes remententes: '; +$PHPMAILER_LANG['instantiate'] = 'NĆ£o foi possĆ­vel iniciar uma instĆ¢ncia da função mail.'; +$PHPMAILER_LANG['invalid_address'] = 'NĆ£o foi enviado nenhum e-mail para o endereƧo de e-mail invĆ”lido: '; +$PHPMAILER_LANG['mailer_not_supported'] = ' mailer nĆ£o Ć© suportado.'; +$PHPMAILER_LANG['provide_address'] = 'Tem de fornecer pelo menos um endereƧo como destinatĆ”rio do e-mail.'; +$PHPMAILER_LANG['recipients_failed'] = 'Erro do SMTP: O endereƧo do seguinte destinatĆ”rio falhou: '; +$PHPMAILER_LANG['signing'] = 'Erro ao assinar: '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP Connect() falhou.'; +$PHPMAILER_LANG['smtp_error'] = 'Erro de servidor SMTP: '; +$PHPMAILER_LANG['variable_set'] = 'NĆ£o foi possĆ­vel definir ou redefinir a variĆ”vel: '; +$PHPMAILER_LANG['extension_missing'] = 'ExtensĆ£o em falta: '; diff --git a/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-pt_br.php b/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-pt_br.php new file mode 100644 index 0000000..5239865 --- /dev/null +++ b/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-pt_br.php @@ -0,0 +1,38 @@ + + * @author Lucas GuimarĆ£es + * @author Phelipe Alves + * @author Fabio Beneditto + * @author Geidson BenĆ­cio Coelho + */ + +$PHPMAILER_LANG['authenticate'] = 'Erro de SMTP: NĆ£o foi possĆ­vel autenticar.'; +$PHPMAILER_LANG['buggy_php'] = 'Sua versĆ£o do PHP Ć© afetada por um bug que por resultar em messagens corrompidas. Para corrigir, mude para enviar usando SMTP, desative a opção mail.add_x_header em seu php.ini, mude para MacOS ou Linux, ou atualize seu PHP para versĆ£o 7.0.17+ ou 7.1.3+ '; +$PHPMAILER_LANG['connect_host'] = 'Erro de SMTP: NĆ£o foi possĆ­vel conectar ao servidor SMTP.'; +$PHPMAILER_LANG['data_not_accepted'] = 'Erro de SMTP: Dados rejeitados.'; +$PHPMAILER_LANG['empty_message'] = 'Mensagem vazia'; +$PHPMAILER_LANG['encoding'] = 'Codificação desconhecida: '; +$PHPMAILER_LANG['execute'] = 'NĆ£o foi possĆ­vel executar: '; +$PHPMAILER_LANG['extension_missing'] = 'ExtensĆ£o nĆ£o existe: '; +$PHPMAILER_LANG['file_access'] = 'NĆ£o foi possĆ­vel acessar o arquivo: '; +$PHPMAILER_LANG['file_open'] = 'Erro de Arquivo: NĆ£o foi possĆ­vel abrir o arquivo: '; +$PHPMAILER_LANG['from_failed'] = 'Os seguintes remetentes falharam: '; +$PHPMAILER_LANG['instantiate'] = 'NĆ£o foi possĆ­vel instanciar a função mail.'; +$PHPMAILER_LANG['invalid_address'] = 'EndereƧo de e-mail invĆ”lido: '; +$PHPMAILER_LANG['invalid_header'] = 'Nome ou valor de cabeƧalho invĆ”lido'; +$PHPMAILER_LANG['invalid_hostentry'] = 'hostentry invĆ”lido: '; +$PHPMAILER_LANG['invalid_host'] = 'host invĆ”lido: '; +$PHPMAILER_LANG['mailer_not_supported'] = ' mailer nĆ£o Ć© suportado.'; +$PHPMAILER_LANG['provide_address'] = 'VocĆŖ deve informar pelo menos um destinatĆ”rio.'; +$PHPMAILER_LANG['recipients_failed'] = 'Erro de SMTP: Os seguintes destinatĆ”rios falharam: '; +$PHPMAILER_LANG['signing'] = 'Erro de Assinatura: '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP Connect() falhou.'; +$PHPMAILER_LANG['smtp_code'] = 'Código do servidor SMTP: '; +$PHPMAILER_LANG['smtp_error'] = 'Erro de servidor SMTP: '; +$PHPMAILER_LANG['smtp_code_ex'] = 'InformaƧƵes adicionais do servidor SMTP: '; +$PHPMAILER_LANG['smtp_detail'] = 'Detalhes do servidor SMTP: '; +$PHPMAILER_LANG['variable_set'] = 'NĆ£o foi possĆ­vel definir ou redefinir a variĆ”vel: '; diff --git a/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-ro.php b/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-ro.php new file mode 100644 index 0000000..45bef91 --- /dev/null +++ b/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-ro.php @@ -0,0 +1,33 @@ + + * @author Foster Snowhill + */ + +$PHPMAILER_LANG['authenticate'] = 'ŠžŃˆŠøŠ±ŠŗŠ° SMTP: ошибка авторизации.'; +$PHPMAILER_LANG['connect_host'] = 'ŠžŃˆŠøŠ±ŠŗŠ° SMTP: не ŃƒŠ“Š°ŠµŃ‚ŃŃ ŠæŠ¾Š“ŠŗŠ»ŃŽŃ‡ŠøŃ‚ŃŒŃŃ Šŗ SMTP-ŃŠµŃ€Š²ŠµŃ€Ńƒ.'; +$PHPMAILER_LANG['data_not_accepted'] = 'ŠžŃˆŠøŠ±ŠŗŠ° SMTP: Ганные не ŠæŃ€ŠøŠ½ŃŃ‚Ń‹.'; +$PHPMAILER_LANG['encoding'] = 'ŠŠµŠøŠ·Š²ŠµŃŃ‚Š½Š°Ń коГировка: '; +$PHPMAILER_LANG['execute'] = 'ŠŠµŠ²Š¾Š·Š¼Š¾Š¶Š½Š¾ Š²Ń‹ŠæŠ¾Š»Š½ŠøŃ‚ŃŒ команГу: '; +$PHPMAILER_LANG['file_access'] = 'ŠŠµŃ‚ Š“Š¾ŃŃ‚ŃƒŠæŠ° Šŗ Ń„Š°Š¹Š»Ńƒ: '; +$PHPMAILER_LANG['file_open'] = 'Š¤Š°Š¹Š»Š¾Š²Š°Ń ошибка: не ŃƒŠ“Š°Ń‘Ń‚ŃŃ Š¾Ń‚ŠŗŃ€Ń‹Ń‚ŃŒ файл: '; +$PHPMAILER_LANG['from_failed'] = 'ŠŠµŠ²ŠµŃ€Š½Ń‹Š¹ аГрес Š¾Ń‚ŠæŃ€Š°Š²ŠøŃ‚ŠµŠ»Ń: '; +$PHPMAILER_LANG['instantiate'] = 'ŠŠµŠ²Š¾Š·Š¼Š¾Š¶Š½Š¾ Š·Š°ŠæŃƒŃŃ‚ŠøŃ‚ŃŒ Ń„ŃƒŠ½ŠŗŃ†ŠøŃŽ mail().'; +$PHPMAILER_LANG['provide_address'] = 'ŠŸŠ¾Š¶Š°Š»ŃƒŠ¹ŃŃ‚Š°, ввеГите Ń…Š¾Ń‚Ń бы оГин email-аГрес ŠæŠ¾Š»ŃƒŃ‡Š°Ń‚ŠµŠ»Ń.'; +$PHPMAILER_LANG['mailer_not_supported'] = ' — почтовый сервер не ŠæŠ¾Š“Š“ŠµŃ€Š¶ŠøŠ²Š°ŠµŃ‚ŃŃ.'; +$PHPMAILER_LANG['recipients_failed'] = 'ŠžŃˆŠøŠ±ŠŗŠ° SMTP: не уГалась отправка таким аГресатам: '; +$PHPMAILER_LANG['empty_message'] = 'ŠŸŃƒŃŃ‚Š¾Šµ сообщение'; +$PHPMAILER_LANG['invalid_address'] = 'ŠŠµ отправлено ŠøŠ·-за Š½ŠµŠæŃ€Š°Š²ŠøŠ»ŃŒŠ½Š¾Š³Š¾ формата email-аГреса: '; +$PHPMAILER_LANG['signing'] = 'ŠžŃˆŠøŠ±ŠŗŠ° поГписи: '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'ŠžŃˆŠøŠ±ŠŗŠ° ŃŠ¾ŠµŠ“ŠøŠ½ŠµŠ½ŠøŃ с SMTP-сервером'; +$PHPMAILER_LANG['smtp_error'] = 'ŠžŃˆŠøŠ±ŠŗŠ° SMTP-сервера: '; +$PHPMAILER_LANG['variable_set'] = 'ŠŠµŠ²Š¾Š·Š¼Š¾Š¶Š½Š¾ ŃƒŃŃ‚Š°Š½Š¾Š²ŠøŃ‚ŃŒ или ŃŠ±Ń€Š¾ŃŠøŃ‚ŃŒ ŠæŠµŃ€ŠµŠ¼ŠµŠ½Š½ŃƒŃŽ: '; +$PHPMAILER_LANG['extension_missing'] = 'Š Š°ŃŃˆŠøŃ€ŠµŠ½ŠøŠµ Š¾Ń‚ŃŃƒŃ‚ŃŃ‚Š²ŃƒŠµŃ‚: '; diff --git a/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-sk.php b/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-sk.php new file mode 100644 index 0000000..028f5bc --- /dev/null +++ b/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-sk.php @@ -0,0 +1,30 @@ + + * @author Peter Orlický + */ + +$PHPMAILER_LANG['authenticate'] = 'SMTP Error: Chyba autentifikĆ”cie.'; +$PHPMAILER_LANG['connect_host'] = 'SMTP Error: Nebolo možnĆ© nadviazaÅ„ spojenie so SMTP serverom.'; +$PHPMAILER_LANG['data_not_accepted'] = 'SMTP Error: DĆ”ta neboli prijatĆ©'; +$PHPMAILER_LANG['empty_message'] = 'PrĆ”zdne telo sprĆ”vy.'; +$PHPMAILER_LANG['encoding'] = 'NeznĆ”me kódovanie: '; +$PHPMAILER_LANG['execute'] = 'NedĆ” sa vykonaÅ„: '; +$PHPMAILER_LANG['file_access'] = 'SĆŗbor nebol nĆ”jdený: '; +$PHPMAILER_LANG['file_open'] = 'File Error: SĆŗbor sa otvoriÅ„ pre čƭtanie: '; +$PHPMAILER_LANG['from_failed'] = 'NĆ”sledujĆŗca adresa From je nesprĆ”vna: '; +$PHPMAILER_LANG['instantiate'] = 'NedĆ” sa vytvoriÅ„ inÅ”tancia emailovej funkcie.'; +$PHPMAILER_LANG['invalid_address'] = 'NeodoslanĆ©, emailovĆ” adresa je nesprĆ”vna: '; +$PHPMAILER_LANG['invalid_hostentry'] = 'ZĆ”znam hostiteľa je nesprĆ”vny: '; +$PHPMAILER_LANG['invalid_host'] = 'Hostiteľ je nesprĆ”vny: '; +$PHPMAILER_LANG['mailer_not_supported'] = ' emailový klient nieje podporovaný.'; +$PHPMAILER_LANG['provide_address'] = 'MusĆ­te zadaÅ„ aspoň jednu emailovĆŗ adresu prĆ­jemcu.'; +$PHPMAILER_LANG['recipients_failed'] = 'SMTP Error: Adresy prĆ­jemcov niesu sprĆ”vne '; +$PHPMAILER_LANG['signing'] = 'Chyba prihlasovania: '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP Connect() zlyhalo.'; +$PHPMAILER_LANG['smtp_error'] = 'SMTP chyba serveru: '; +$PHPMAILER_LANG['variable_set'] = 'Nemožno nastaviÅ„ alebo resetovaÅ„ premennĆŗ: '; +$PHPMAILER_LANG['extension_missing'] = 'Chýba rozŔírenie: '; diff --git a/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-sl.php b/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-sl.php new file mode 100644 index 0000000..3e00c25 --- /dev/null +++ b/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-sl.php @@ -0,0 +1,36 @@ + + * @author Filip Å  + * @author Blaž Oražem + */ + +$PHPMAILER_LANG['authenticate'] = 'SMTP napaka: Avtentikacija ni uspela.'; +$PHPMAILER_LANG['buggy_php'] = 'Na vaÅ”o PHP različico vpliva napaka, ki lahko povzroči poÅ”kodovana sporočila. Če želite težavo odpraviti, preklopite na poÅ”iljanje prek SMTP, onemogočite možnost mail.add_x_header v vaÅ”i php.ini datoteki, preklopite na MacOS ali Linux, ali nadgradite vaÅ”o PHP zaličico na 7.0.17+ ali 7.1.3+.'; +$PHPMAILER_LANG['connect_host'] = 'SMTP napaka: Vzpostavljanje povezave s SMTP gostiteljem ni uspelo.'; +$PHPMAILER_LANG['data_not_accepted'] = 'SMTP napaka: Strežnik zavrača podatke.'; +$PHPMAILER_LANG['empty_message'] = 'E-poÅ”tno sporočilo nima vsebine.'; +$PHPMAILER_LANG['encoding'] = 'Nepoznan tip kodiranja: '; +$PHPMAILER_LANG['execute'] = 'Operacija ni uspela: '; +$PHPMAILER_LANG['extension_missing'] = 'Manjkajoča razÅ”iritev: '; +$PHPMAILER_LANG['file_access'] = 'Nimam dostopa do datoteke: '; +$PHPMAILER_LANG['file_open'] = 'Ne morem odpreti datoteke: '; +$PHPMAILER_LANG['from_failed'] = 'Neveljaven e-naslov poÅ”iljatelja: '; +$PHPMAILER_LANG['instantiate'] = 'Ne morem inicializirati mail funkcije.'; +$PHPMAILER_LANG['invalid_address'] = 'E-poÅ”tno sporočilo ni bilo poslano. E-naslov je neveljaven: '; +$PHPMAILER_LANG['invalid_header'] = 'Neveljavno ime ali vrednost glave'; +$PHPMAILER_LANG['invalid_hostentry'] = 'Neveljaven vnos gostitelja: '; +$PHPMAILER_LANG['invalid_host'] = 'Neveljaven gostitelj: '; +$PHPMAILER_LANG['mailer_not_supported'] = ' mailer ni podprt.'; +$PHPMAILER_LANG['provide_address'] = 'Prosimo, vnesite vsaj enega naslovnika.'; +$PHPMAILER_LANG['recipients_failed'] = 'SMTP napaka: Sledeči naslovniki so neveljavni: '; +$PHPMAILER_LANG['signing'] = 'Napaka pri podpisovanju: '; +$PHPMAILER_LANG['smtp_code'] = 'SMTP koda: '; +$PHPMAILER_LANG['smtp_code_ex'] = 'Dodatne informacije o SMTP: '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'Ne morem vzpostaviti povezave s SMTP strežnikom.'; +$PHPMAILER_LANG['smtp_detail'] = 'Podrobnosti: '; +$PHPMAILER_LANG['smtp_error'] = 'Napaka SMTP strežnika: '; +$PHPMAILER_LANG['variable_set'] = 'Ne morem nastaviti oz. ponastaviti spremenljivke: '; diff --git a/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-sr.php b/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-sr.php new file mode 100644 index 0000000..0b5280f --- /dev/null +++ b/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-sr.php @@ -0,0 +1,28 @@ + + * @author MiloÅ” Milanović + */ + +$PHPMAILER_LANG['authenticate'] = 'SMTP Š³Ń€ŠµŃˆŠŗŠ°: Š°ŃƒŃ‚ŠµŠ½Ń‚ŠøŃ„ŠøŠŗŠ°Ń†ŠøŃ˜Š° није успела.'; +$PHPMAILER_LANG['connect_host'] = 'SMTP Š³Ń€ŠµŃˆŠŗŠ°: повезивање са SMTP сервером није успело.'; +$PHPMAILER_LANG['data_not_accepted'] = 'SMTP Š³Ń€ŠµŃˆŠŗŠ°: поГаци нису прихваћени.'; +$PHPMAILER_LANG['empty_message'] = 'Š”Š°Š“Ń€Š¶Š°Ń˜ ŠæŠ¾Ń€ŃƒŠŗŠµ је празан.'; +$PHPMAILER_LANG['encoding'] = 'ŠŠµŠæŠ¾Š·Š½Š°Ń‚Š¾ ŠŗŠ¾Š“ŠøŃ€Š°ŃšŠµ: '; +$PHPMAILER_LANG['execute'] = 'ŠŠøŃ˜Šµ Š¼Š¾Š³ŃƒŃ›Šµ ŠøŠ·Š²Ń€ŃˆŠøŃ‚Šø Š½Š°Ń€ŠµŠ“Š±Ńƒ: '; +$PHPMAILER_LANG['file_access'] = 'ŠŠøŃ˜Šµ Š¼Š¾Š³ŃƒŃ›Šµ ŠæŃ€ŠøŃŃ‚ŃƒŠæŠøŃ‚Šø Гатотеци: '; +$PHPMAILER_LANG['file_open'] = 'ŠŠøŃ˜Šµ Š¼Š¾Š³ŃƒŃ›Šµ отворити Š“Š°Ń‚Š¾Ń‚ŠµŠŗŃƒ: '; +$PHPMAILER_LANG['from_failed'] = 'SMTP Š³Ń€ŠµŃˆŠŗŠ°: слање са слеГећих аГреса није успело: '; +$PHPMAILER_LANG['recipients_failed'] = 'SMTP Š³Ń€ŠµŃˆŠŗŠ°: слање на слеГеће аГресе није успело: '; +$PHPMAILER_LANG['instantiate'] = 'ŠŠøŃ˜Šµ Š¼Š¾Š³ŃƒŃ›Šµ ŠæŠ¾ŠŗŃ€ŠµŠ½ŃƒŃ‚Šø mail Ń„ŃƒŠ½ŠŗŃ†ŠøŃ˜Ńƒ.'; +$PHPMAILER_LANG['invalid_address'] = 'ŠŸŠ¾Ń€ŃƒŠŗŠ° није послата. ŠŠµŠøŃŠæŃ€Š°Š²Š½Š° аГреса: '; +$PHPMAILER_LANG['mailer_not_supported'] = ' Š¼ŠµŃ˜Š»ŠµŃ€ није поГржан.'; +$PHPMAILER_LANG['provide_address'] = 'Š”ŠµŃ„ŠøŠ½ŠøŃˆŠøŃ‚Šµ бар јеГну Š°Š“Ń€ŠµŃŃƒ примаоца.'; +$PHPMAILER_LANG['signing'] = 'Š“Ń€ŠµŃˆŠŗŠ° приликом ŠæŃ€ŠøŃ˜Š°Š²Šµ: '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'Повезивање са SMTP сервером није успело.'; +$PHPMAILER_LANG['smtp_error'] = 'Š“Ń€ŠµŃˆŠŗŠ° SMTP сервера: '; +$PHPMAILER_LANG['variable_set'] = 'ŠŠøŃ˜Šµ Š¼Š¾Š³ŃƒŃ›Šµ заГати нити ресетовати ŠæŃ€Š¾Š¼ŠµŠ½Ń™ŠøŠ²Ńƒ: '; +$PHPMAILER_LANG['extension_missing'] = 'ŠŠµŠ“Š¾ŃŃ‚Š°Ń˜Šµ ŠæŃ€Š¾ŃˆŠøŃ€ŠµŃšŠµ: '; diff --git a/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-sr_latn.php b/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-sr_latn.php new file mode 100644 index 0000000..6213832 --- /dev/null +++ b/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-sr_latn.php @@ -0,0 +1,28 @@ + + * @author MiloÅ” Milanović + */ + +$PHPMAILER_LANG['authenticate'] = 'SMTP greÅ”ka: autentifikacija nije uspela.'; +$PHPMAILER_LANG['connect_host'] = 'SMTP greÅ”ka: povezivanje sa SMTP serverom nije uspelo.'; +$PHPMAILER_LANG['data_not_accepted'] = 'SMTP greÅ”ka: podaci nisu prihvaćeni.'; +$PHPMAILER_LANG['empty_message'] = 'Sadržaj poruke je prazan.'; +$PHPMAILER_LANG['encoding'] = 'Nepoznato kodiranje: '; +$PHPMAILER_LANG['execute'] = 'Nije moguće izvrÅ”iti naredbu: '; +$PHPMAILER_LANG['file_access'] = 'Nije moguće pristupiti datoteci: '; +$PHPMAILER_LANG['file_open'] = 'Nije moguće otvoriti datoteku: '; +$PHPMAILER_LANG['from_failed'] = 'SMTP greÅ”ka: slanje sa sledećih adresa nije uspelo: '; +$PHPMAILER_LANG['recipients_failed'] = 'SMTP greÅ”ka: slanje na sledeće adrese nije uspelo: '; +$PHPMAILER_LANG['instantiate'] = 'Nije moguće pokrenuti mail funkciju.'; +$PHPMAILER_LANG['invalid_address'] = 'Poruka nije poslata. Neispravna adresa: '; +$PHPMAILER_LANG['mailer_not_supported'] = ' majler nije podržan.'; +$PHPMAILER_LANG['provide_address'] = 'DefiniÅ”ite bar jednu adresu primaoca.'; +$PHPMAILER_LANG['signing'] = 'GreÅ”ka prilikom prijave: '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'Povezivanje sa SMTP serverom nije uspelo.'; +$PHPMAILER_LANG['smtp_error'] = 'GreÅ”ka SMTP servera: '; +$PHPMAILER_LANG['variable_set'] = 'Nije moguće zadati niti resetovati promenljivu: '; +$PHPMAILER_LANG['extension_missing'] = 'Nedostaje proÅ”irenje: '; diff --git a/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-sv.php b/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-sv.php new file mode 100644 index 0000000..9872c19 --- /dev/null +++ b/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-sv.php @@ -0,0 +1,27 @@ + + */ + +$PHPMAILER_LANG['authenticate'] = 'SMTP fel: Kunde inte autentisera.'; +$PHPMAILER_LANG['connect_host'] = 'SMTP fel: Kunde inte ansluta till SMTP-server.'; +$PHPMAILER_LANG['data_not_accepted'] = 'SMTP fel: Data accepterades inte.'; +//$PHPMAILER_LANG['empty_message'] = 'Message body empty'; +$PHPMAILER_LANG['encoding'] = 'OkƤnt encode-format: '; +$PHPMAILER_LANG['execute'] = 'Kunde inte kƶra: '; +$PHPMAILER_LANG['file_access'] = 'Ingen Ć„tkomst till fil: '; +$PHPMAILER_LANG['file_open'] = 'Fil fel: Kunde inte ƶppna fil: '; +$PHPMAILER_LANG['from_failed'] = 'Fƶljande avsƤndaradress Ƥr felaktig: '; +$PHPMAILER_LANG['instantiate'] = 'Kunde inte initiera e-postfunktion.'; +$PHPMAILER_LANG['invalid_address'] = 'Felaktig adress: '; +$PHPMAILER_LANG['provide_address'] = 'Du mĆ„ste ange minst en mottagares e-postadress.'; +$PHPMAILER_LANG['mailer_not_supported'] = ' mailer stƶds inte.'; +$PHPMAILER_LANG['recipients_failed'] = 'SMTP fel: Fƶljande mottagare Ƥr felaktig: '; +$PHPMAILER_LANG['signing'] = 'Signeringsfel: '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP Connect() misslyckades.'; +$PHPMAILER_LANG['smtp_error'] = 'SMTP serverfel: '; +$PHPMAILER_LANG['variable_set'] = 'Kunde inte definiera eller Ć„terstƤlla variabel: '; +$PHPMAILER_LANG['extension_missing'] = 'TillƤgg ej tillgƤngligt: '; diff --git a/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-tl.php b/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-tl.php new file mode 100644 index 0000000..d15bed1 --- /dev/null +++ b/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-tl.php @@ -0,0 +1,28 @@ + + */ + +$PHPMAILER_LANG['authenticate'] = 'SMTP Error: Hindi mapatotohanan.'; +$PHPMAILER_LANG['connect_host'] = 'SMTP Error: Hindi makakonekta sa SMTP host.'; +$PHPMAILER_LANG['data_not_accepted'] = 'SMTP Error: Ang datos ay hindi naitanggap.'; +$PHPMAILER_LANG['empty_message'] = 'Walang laman ang mensahe'; +$PHPMAILER_LANG['encoding'] = 'Hindi alam ang encoding: '; +$PHPMAILER_LANG['execute'] = 'Hindi maisasagawa: '; +$PHPMAILER_LANG['file_access'] = 'Hindi ma-access ang file: '; +$PHPMAILER_LANG['file_open'] = 'File Error: Hindi mabuksan ang file: '; +$PHPMAILER_LANG['from_failed'] = 'Ang sumusunod na address ay nabigo: '; +$PHPMAILER_LANG['instantiate'] = 'Hindi maisimulan ang instance ng mail function.'; +$PHPMAILER_LANG['invalid_address'] = 'Hindi wasto ang address na naibigay: '; +$PHPMAILER_LANG['mailer_not_supported'] = 'Ang mailer ay hindi suportado.'; +$PHPMAILER_LANG['provide_address'] = 'Kailangan mong magbigay ng kahit isang email address na tatanggap.'; +$PHPMAILER_LANG['recipients_failed'] = 'SMTP Error: Ang mga sumusunod na tatanggap ay nabigo: '; +$PHPMAILER_LANG['signing'] = 'Hindi ma-sign: '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'Ang SMTP connect() ay nabigo.'; +$PHPMAILER_LANG['smtp_error'] = 'Ang server ng SMTP ay nabigo: '; +$PHPMAILER_LANG['variable_set'] = 'Hindi matatakda o ma-reset ang mga variables: '; +$PHPMAILER_LANG['extension_missing'] = 'Nawawala ang extension: '; diff --git a/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-tr.php b/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-tr.php new file mode 100644 index 0000000..f938f80 --- /dev/null +++ b/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-tr.php @@ -0,0 +1,31 @@ + + * @fixed by Boris Yurchenko + */ + +$PHPMAILER_LANG['authenticate'] = 'Помилка SMTP: помилка авторизації.'; +$PHPMAILER_LANG['connect_host'] = 'Помилка SMTP: не Š²Š“Š°Ń”Ń‚ŃŒŃŃ піГ\'Ń”Š“Š½Š°Ń‚ŠøŃŃ Го SMTP-ŃŠµŃ€Š²ŠµŃ€Ńƒ.'; +$PHPMAILER_LANG['data_not_accepted'] = 'Помилка SMTP: Гані не ŠæŃ€ŠøŠ¹Š½ŃŃ‚о.'; +$PHPMAILER_LANG['encoding'] = 'ŠŠµŠ²Ń–Š“Š¾Š¼Šµ ŠŗŠ¾Š“ŃƒŠ²Š°Š½Š½Ń: '; +$PHPMAILER_LANG['execute'] = 'ŠŠµŠ¼Š¾Š¶Š»ŠøŠ²Š¾ виконати команГу: '; +$PHPMAILER_LANG['file_access'] = 'ŠŠµŠ¼Š°Ń” Š“Š¾ŃŃ‚ŃƒŠæŃƒ Го Ń„Š°Š¹Š»Ńƒ: '; +$PHPMAILER_LANG['file_open'] = 'Помилка файлової системи: не Š²Š“Š°Ń”Ń‚ŃŒŃŃ віГкрити файл: '; +$PHPMAILER_LANG['from_failed'] = 'ŠŠµŠ²Ń–Ń€Š½Š° аГреса віГправника: '; +$PHPMAILER_LANG['instantiate'] = 'ŠŠµŠ¼Š¾Š¶Š»ŠøŠ²Š¾ Š·Š°ŠæŃƒŃŃ‚ŠøŃ‚Šø Ń„ŃƒŠ½ŠŗŃ†Ń–ŃŽ mail().'; +$PHPMAILER_LANG['provide_address'] = 'Š‘ŃƒŠ“ŃŒ ласка, Š²Š²ŠµŠ“Ń–Ń‚ŃŒ хоча б оГну email-Š°Š“Ń€ŠµŃŃƒ Š¾Ń‚Ń€ŠøŠ¼ŃƒŠ²Š°Ń‡Š°.'; +$PHPMAILER_LANG['mailer_not_supported'] = ' - ŠæŠ¾ŃˆŃ‚Š¾Š²ŠøŠ¹ сервер не ŠæŃ–Š“Ń‚Ń€ŠøŠ¼ŃƒŃ”Ń‚ŃŒŃŃ.'; +$PHPMAILER_LANG['recipients_failed'] = 'Помилка SMTP: не Š²Š“Š°Š»Š¾ŃŃ Š²Ń–Š“ŠæŃ€Š°Š²Š»ŠµŠ½Š½Ń Š“Š»Ń таких Š¾Ń‚Ń€ŠøŠ¼ŃƒŠ²Š°Ń‡Ń–Š²: '; +$PHPMAILER_LANG['empty_message'] = 'ŠŸŃƒŃŃ‚Šµ ŠæŠ¾Š²Ń–Š“Š¾Š¼Š»ŠµŠ½Š½Ń'; +$PHPMAILER_LANG['invalid_address'] = 'ŠŠµ віГправлено через Š½ŠµŠæŃ€Š°Š²ŠøŠ»ŃŒŠ½ŠøŠ¹ формат email-аГреси: '; +$PHPMAILER_LANG['signing'] = 'Помилка ŠæŃ–Š“ŠæŠøŃŃƒ: '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'Помилка Š·\'Ń”Š“Š½Š°Š½Š½Ń Š· SMTP-сервером'; +$PHPMAILER_LANG['smtp_error'] = 'Помилка SMTP-сервера: '; +$PHPMAILER_LANG['variable_set'] = 'ŠŠµŠ¼Š¾Š¶Š»ŠøŠ²Š¾ встановити або ŃŠŗŠøŠ½ŃƒŃ‚Šø Š·Š¼Ń–Š½Š½Ńƒ: '; +$PHPMAILER_LANG['extension_missing'] = 'Š Š¾Š·ŃˆŠøŃ€ŠµŠ½Š½Ń Š²Ń–Š“ŃŃƒŃ‚Š½Ń”: '; diff --git a/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-vi.php b/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-vi.php new file mode 100644 index 0000000..d65576e --- /dev/null +++ b/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-vi.php @@ -0,0 +1,27 @@ + + */ + +$PHPMAILER_LANG['authenticate'] = 'Lį»—i SMTP: KhĆ“ng thể xĆ”c thį»±c.'; +$PHPMAILER_LANG['connect_host'] = 'Lį»—i SMTP: KhĆ“ng thể kįŗæt nối mĆ”y chį»§ SMTP.'; +$PHPMAILER_LANG['data_not_accepted'] = 'Lį»—i SMTP: Dữ liệu khĆ“ng được chįŗ„p nhįŗ­n.'; +$PHPMAILER_LANG['empty_message'] = 'KhĆ“ng có nį»™i dung'; +$PHPMAILER_LANG['encoding'] = 'MĆ£ hóa khĆ“ng xĆ”c định: '; +$PHPMAILER_LANG['execute'] = 'KhĆ“ng thį»±c hiện được: '; +$PHPMAILER_LANG['file_access'] = 'KhĆ“ng thể truy cįŗ­p tệp tin '; +$PHPMAILER_LANG['file_open'] = 'Lį»—i Tįŗ­p tin: KhĆ“ng thể mở tệp tin: '; +$PHPMAILER_LANG['from_failed'] = 'Lį»—i địa chỉ gį»­i đi: '; +$PHPMAILER_LANG['instantiate'] = 'KhĆ“ng dùng được cĆ”c hĆ m gį»­i thʰ.'; +$PHPMAILER_LANG['invalid_address'] = 'ĐẔi chỉ emai khĆ“ng đúng: '; +$PHPMAILER_LANG['mailer_not_supported'] = ' trƬnh gį»­i thʰ khĆ“ng được hį»— trợ.'; +$PHPMAILER_LANG['provide_address'] = 'Bįŗ”n phįŗ£i cung cįŗ„p Ć­t nhįŗ„t mį»™t địa chỉ ngĘ°į»i nhįŗ­n.'; +$PHPMAILER_LANG['recipients_failed'] = 'Lį»—i SMTP: lį»—i địa chỉ ngĘ°į»i nhįŗ­n: '; +$PHPMAILER_LANG['signing'] = 'Lį»—i đăng nhįŗ­p: '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'Lį»—i kįŗæt nối vį»›i SMTP'; +$PHPMAILER_LANG['smtp_error'] = 'Lį»—i mĆ”y chį»§ smtp '; +$PHPMAILER_LANG['variable_set'] = 'KhĆ“ng thể thiįŗæt lįŗ­p hoįŗ·c thiįŗæt lįŗ­p lįŗ”i biįŗæn: '; +//$PHPMAILER_LANG['extension_missing'] = 'Extension missing: '; diff --git a/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-zh.php b/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-zh.php new file mode 100644 index 0000000..35e4e70 --- /dev/null +++ b/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-zh.php @@ -0,0 +1,29 @@ + + * @author Peter Dave Hello <@PeterDaveHello/> + * @author Jason Chiang + */ + +$PHPMAILER_LANG['authenticate'] = 'SMTP éŒÆčŖ¤ļ¼šē™»å…„å¤±ę•—ć€‚'; +$PHPMAILER_LANG['connect_host'] = 'SMTP éŒÆčŖ¤ļ¼šē„”ę³•é€£ē·šåˆ° SMTP äø»ę©Ÿć€‚'; +$PHPMAILER_LANG['data_not_accepted'] = 'SMTP éŒÆčŖ¤ļ¼šē„”ę³•ęŽ„å—ēš„č³‡ę–™ć€‚'; +$PHPMAILER_LANG['empty_message'] = 'éƒµä»¶å…§å®¹ē‚ŗē©ŗ'; +$PHPMAILER_LANG['encoding'] = '未矄編碼: '; +$PHPMAILER_LANG['execute'] = 'ē„”ę³•åŸ·č”Œļ¼š'; +$PHPMAILER_LANG['file_access'] = 'ē„”ę³•å­˜å–ęŖ”ę”ˆļ¼š'; +$PHPMAILER_LANG['file_open'] = 'ęŖ”ę”ˆéŒÆčŖ¤ļ¼šē„”ę³•é–‹å•ŸęŖ”ę”ˆļ¼š'; +$PHPMAILER_LANG['from_failed'] = 'ē™¼é€åœ°å€éŒÆčŖ¤ļ¼š'; +$PHPMAILER_LANG['instantiate'] = 'ęœŖēŸ„å‡½ę•øå‘¼å«ć€‚'; +$PHPMAILER_LANG['invalid_address'] = 'å› ē‚ŗé›»å­éƒµä»¶åœ°å€ē„”ę•ˆļ¼Œē„”ę³•å‚³é€: '; +$PHPMAILER_LANG['mailer_not_supported'] = 'äøę”Æę“ēš„ē™¼äæ”å®¢ęˆ¶ē«Æć€‚'; +$PHPMAILER_LANG['provide_address'] = 'åæ…é ˆęä¾›č‡³å°‘äø€å€‹ę”¶ä»¶äŗŗåœ°å€ć€‚'; +$PHPMAILER_LANG['recipients_failed'] = 'SMTP éŒÆčŖ¤ļ¼šä»„äø‹ę”¶ä»¶äŗŗåœ°å€éŒÆčŖ¤ļ¼š'; +$PHPMAILER_LANG['signing'] = 'é›»å­ē°½ē« éŒÆčŖ¤: '; +$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTP é€£ē·šå¤±ę•—'; +$PHPMAILER_LANG['smtp_error'] = 'SMTP ä¼ŗęœå™ØéŒÆčŖ¤: '; +$PHPMAILER_LANG['variable_set'] = 'ē„”ę³•čØ­å®šęˆ–é‡čØ­č®Šę•ø: '; +$PHPMAILER_LANG['extension_missing'] = '遺失樔組 Extension: '; diff --git a/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-zh_cn.php b/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-zh_cn.php new file mode 100644 index 0000000..728a499 --- /dev/null +++ b/sandbox310/src/assets/php/PHPMailer/language/phpmailer.lang-zh_cn.php @@ -0,0 +1,29 @@ + + * @author young + * @author Teddysun + */ + +$PHPMAILER_LANG['authenticate'] = 'SMTP é”™čÆÆļ¼šē™»å½•å¤±č“„ć€‚'; +$PHPMAILER_LANG['connect_host'] = 'SMTP é”™čÆÆļ¼šę— ę³•čæžęŽ„åˆ° SMTP äø»ęœŗć€‚'; +$PHPMAILER_LANG['data_not_accepted'] = 'SMTP é”™čÆÆļ¼šę•°ę®äøč¢«ęŽ„å—ć€‚'; +$PHPMAILER_LANG['empty_message'] = '邮件正文为空。'; +$PHPMAILER_LANG['encoding'] = 'ęœŖēŸ„ē¼–ē ļ¼š'; +$PHPMAILER_LANG['execute'] = 'ę— ę³•ę‰§č”Œļ¼š'; +$PHPMAILER_LANG['file_access'] = 'ę— ę³•č®æé—®ę–‡ä»¶ļ¼š'; +$PHPMAILER_LANG['file_open'] = 'ę–‡ä»¶é”™čÆÆļ¼šę— ę³•ę‰“å¼€ę–‡ä»¶ļ¼š'; +$PHPMAILER_LANG['from_failed'] = 'å‘é€åœ°å€é”™čÆÆļ¼š'; +$PHPMAILER_LANG['instantiate'] = 'ęœŖēŸ„å‡½ę•°č°ƒē”Øć€‚'; +$PHPMAILER_LANG['invalid_address'] = 'å‘é€å¤±č“„ļ¼Œē”µå­é‚®ē®±åœ°å€ę˜Æę— ę•ˆēš„ļ¼š'; +$PHPMAILER_LANG['mailer_not_supported'] = 'å‘äæ”å®¢ęˆ·ē«Æäøč¢«ę”ÆęŒć€‚'; +$PHPMAILER_LANG['provide_address'] = 'åæ…é”»ęä¾›č‡³å°‘äø€äøŖę”¶ä»¶äŗŗåœ°å€ć€‚'; +$PHPMAILER_LANG['recipients_failed'] = 'SMTP é”™čÆÆļ¼šę”¶ä»¶äŗŗåœ°å€é”™čÆÆļ¼š'; +$PHPMAILER_LANG['signing'] = 'ē™»å½•å¤±č“„ļ¼š'; +$PHPMAILER_LANG['smtp_connect_failed'] = 'SMTPęœåŠ”å™ØčæžęŽ„å¤±č“„ć€‚'; +$PHPMAILER_LANG['smtp_error'] = 'SMTPęœåŠ”å™Øå‡ŗé”™ļ¼š'; +$PHPMAILER_LANG['variable_set'] = 'ę— ę³•č®¾ē½®ęˆ–é‡ē½®å˜é‡ļ¼š'; +$PHPMAILER_LANG['extension_missing'] = 'äø¢å¤±ęØ”å— Extension:'; diff --git a/sandbox310/src/assets/php/PHPMailer/src/Exception.php b/sandbox310/src/assets/php/PHPMailer/src/Exception.php new file mode 100644 index 0000000..52eaf95 --- /dev/null +++ b/sandbox310/src/assets/php/PHPMailer/src/Exception.php @@ -0,0 +1,40 @@ + + * @author Jim Jagielski (jimjag) + * @author Andy Prevost (codeworxtech) + * @author Brent R. Matzelle (original founder) + * @copyright 2012 - 2020 Marcus Bointon + * @copyright 2010 - 2012 Jim Jagielski + * @copyright 2004 - 2009 Andy Prevost + * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License + * @note This program is distributed in the hope that it will be useful - WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. + */ + +namespace PHPMailer\PHPMailer; + +/** + * PHPMailer exception handler. + * + * @author Marcus Bointon + */ +class Exception extends \Exception +{ + /** + * Prettify error message output. + * + * @return string + */ + public function errorMessage() + { + return '' . htmlspecialchars($this->getMessage(), ENT_COMPAT | ENT_HTML401) . "
\n"; + } +} diff --git a/sandbox310/src/assets/php/PHPMailer/src/OAuth.php b/sandbox310/src/assets/php/PHPMailer/src/OAuth.php new file mode 100644 index 0000000..c93d0be --- /dev/null +++ b/sandbox310/src/assets/php/PHPMailer/src/OAuth.php @@ -0,0 +1,139 @@ + + * @author Jim Jagielski (jimjag) + * @author Andy Prevost (codeworxtech) + * @author Brent R. Matzelle (original founder) + * @copyright 2012 - 2020 Marcus Bointon + * @copyright 2010 - 2012 Jim Jagielski + * @copyright 2004 - 2009 Andy Prevost + * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License + * @note This program is distributed in the hope that it will be useful - WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. + */ + +namespace PHPMailer\PHPMailer; + +use League\OAuth2\Client\Grant\RefreshToken; +use League\OAuth2\Client\Provider\AbstractProvider; +use League\OAuth2\Client\Token\AccessToken; + +/** + * OAuth - OAuth2 authentication wrapper class. + * Uses the oauth2-client package from the League of Extraordinary Packages. + * + * @see http://oauth2-client.thephpleague.com + * + * @author Marcus Bointon (Synchro/coolbru) + */ +class OAuth +{ + /** + * An instance of the League OAuth Client Provider. + * + * @var AbstractProvider + */ + protected $provider; + + /** + * The current OAuth access token. + * + * @var AccessToken + */ + protected $oauthToken; + + /** + * The user's email address, usually used as the login ID + * and also the from address when sending email. + * + * @var string + */ + protected $oauthUserEmail = ''; + + /** + * The client secret, generated in the app definition of the service you're connecting to. + * + * @var string + */ + protected $oauthClientSecret = ''; + + /** + * The client ID, generated in the app definition of the service you're connecting to. + * + * @var string + */ + protected $oauthClientId = ''; + + /** + * The refresh token, used to obtain new AccessTokens. + * + * @var string + */ + protected $oauthRefreshToken = ''; + + /** + * OAuth constructor. + * + * @param array $options Associative array containing + * `provider`, `userName`, `clientSecret`, `clientId` and `refreshToken` elements + */ + public function __construct($options) + { + $this->provider = $options['provider']; + $this->oauthUserEmail = $options['userName']; + $this->oauthClientSecret = $options['clientSecret']; + $this->oauthClientId = $options['clientId']; + $this->oauthRefreshToken = $options['refreshToken']; + } + + /** + * Get a new RefreshToken. + * + * @return RefreshToken + */ + protected function getGrant() + { + return new RefreshToken(); + } + + /** + * Get a new AccessToken. + * + * @return AccessToken + */ + protected function getToken() + { + return $this->provider->getAccessToken( + $this->getGrant(), + ['refresh_token' => $this->oauthRefreshToken] + ); + } + + /** + * Generate a base64-encoded OAuth token. + * + * @return string + */ + public function getOauth64() + { + //Get a new token if it's not available or has expired + if (null === $this->oauthToken || $this->oauthToken->hasExpired()) { + $this->oauthToken = $this->getToken(); + } + + return base64_encode( + 'user=' . + $this->oauthUserEmail . + "\001auth=Bearer " . + $this->oauthToken . + "\001\001" + ); + } +} diff --git a/sandbox310/src/assets/php/PHPMailer/src/PHPMailer.php b/sandbox310/src/assets/php/PHPMailer/src/PHPMailer.php new file mode 100644 index 0000000..e1b0c88 --- /dev/null +++ b/sandbox310/src/assets/php/PHPMailer/src/PHPMailer.php @@ -0,0 +1,5041 @@ + + * @author Jim Jagielski (jimjag) + * @author Andy Prevost (codeworxtech) + * @author Brent R. Matzelle (original founder) + * @copyright 2012 - 2020 Marcus Bointon + * @copyright 2010 - 2012 Jim Jagielski + * @copyright 2004 - 2009 Andy Prevost + * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License + * @note This program is distributed in the hope that it will be useful - WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. + */ + +namespace PHPMailer\PHPMailer; + +/** + * PHPMailer - PHP email creation and transport class. + * + * @author Marcus Bointon (Synchro/coolbru) + * @author Jim Jagielski (jimjag) + * @author Andy Prevost (codeworxtech) + * @author Brent R. Matzelle (original founder) + */ +class PHPMailer +{ + const CHARSET_ASCII = 'us-ascii'; + const CHARSET_ISO88591 = 'iso-8859-1'; + const CHARSET_UTF8 = 'utf-8'; + + const CONTENT_TYPE_PLAINTEXT = 'text/plain'; + const CONTENT_TYPE_TEXT_CALENDAR = 'text/calendar'; + const CONTENT_TYPE_TEXT_HTML = 'text/html'; + const CONTENT_TYPE_MULTIPART_ALTERNATIVE = 'multipart/alternative'; + const CONTENT_TYPE_MULTIPART_MIXED = 'multipart/mixed'; + const CONTENT_TYPE_MULTIPART_RELATED = 'multipart/related'; + + const ENCODING_7BIT = '7bit'; + const ENCODING_8BIT = '8bit'; + const ENCODING_BASE64 = 'base64'; + const ENCODING_BINARY = 'binary'; + const ENCODING_QUOTED_PRINTABLE = 'quoted-printable'; + + const ENCRYPTION_STARTTLS = 'tls'; + const ENCRYPTION_SMTPS = 'ssl'; + + const ICAL_METHOD_REQUEST = 'REQUEST'; + const ICAL_METHOD_PUBLISH = 'PUBLISH'; + const ICAL_METHOD_REPLY = 'REPLY'; + const ICAL_METHOD_ADD = 'ADD'; + const ICAL_METHOD_CANCEL = 'CANCEL'; + const ICAL_METHOD_REFRESH = 'REFRESH'; + const ICAL_METHOD_COUNTER = 'COUNTER'; + const ICAL_METHOD_DECLINECOUNTER = 'DECLINECOUNTER'; + + /** + * Email priority. + * Options: null (default), 1 = High, 3 = Normal, 5 = low. + * When null, the header is not set at all. + * + * @var int|null + */ + public $Priority; + + /** + * The character set of the message. + * + * @var string + */ + public $CharSet = self::CHARSET_ISO88591; + + /** + * The MIME Content-type of the message. + * + * @var string + */ + public $ContentType = self::CONTENT_TYPE_PLAINTEXT; + + /** + * The message encoding. + * Options: "8bit", "7bit", "binary", "base64", and "quoted-printable". + * + * @var string + */ + public $Encoding = self::ENCODING_8BIT; + + /** + * Holds the most recent mailer error message. + * + * @var string + */ + public $ErrorInfo = ''; + + /** + * The From email address for the message. + * + * @var string + */ + public $From = ''; + + /** + * The From name of the message. + * + * @var string + */ + public $FromName = ''; + + /** + * The envelope sender of the message. + * This will usually be turned into a Return-Path header by the receiver, + * and is the address that bounces will be sent to. + * If not empty, will be passed via `-f` to sendmail or as the 'MAIL FROM' value over SMTP. + * + * @var string + */ + public $Sender = ''; + + /** + * The Subject of the message. + * + * @var string + */ + public $Subject = ''; + + /** + * An HTML or plain text message body. + * If HTML then call isHTML(true). + * + * @var string + */ + public $Body = ''; + + /** + * The plain-text message body. + * This body can be read by mail clients that do not have HTML email + * capability such as mutt & Eudora. + * Clients that can read HTML will view the normal Body. + * + * @var string + */ + public $AltBody = ''; + + /** + * An iCal message part body. + * Only supported in simple alt or alt_inline message types + * To generate iCal event structures, use classes like EasyPeasyICS or iCalcreator. + * + * @see http://sprain.ch/blog/downloads/php-class-easypeasyics-create-ical-files-with-php/ + * @see http://kigkonsult.se/iCalcreator/ + * + * @var string + */ + public $Ical = ''; + + /** + * Value-array of "method" in Contenttype header "text/calendar" + * + * @var string[] + */ + protected static $IcalMethods = [ + self::ICAL_METHOD_REQUEST, + self::ICAL_METHOD_PUBLISH, + self::ICAL_METHOD_REPLY, + self::ICAL_METHOD_ADD, + self::ICAL_METHOD_CANCEL, + self::ICAL_METHOD_REFRESH, + self::ICAL_METHOD_COUNTER, + self::ICAL_METHOD_DECLINECOUNTER, + ]; + + /** + * The complete compiled MIME message body. + * + * @var string + */ + protected $MIMEBody = ''; + + /** + * The complete compiled MIME message headers. + * + * @var string + */ + protected $MIMEHeader = ''; + + /** + * Extra headers that createHeader() doesn't fold in. + * + * @var string + */ + protected $mailHeader = ''; + + /** + * Word-wrap the message body to this number of chars. + * Set to 0 to not wrap. A useful value here is 78, for RFC2822 section 2.1.1 compliance. + * + * @see static::STD_LINE_LENGTH + * + * @var int + */ + public $WordWrap = 0; + + /** + * Which method to use to send mail. + * Options: "mail", "sendmail", or "smtp". + * + * @var string + */ + public $Mailer = 'mail'; + + /** + * The path to the sendmail program. + * + * @var string + */ + public $Sendmail = '/usr/sbin/sendmail'; + + /** + * Whether mail() uses a fully sendmail-compatible MTA. + * One which supports sendmail's "-oi -f" options. + * + * @var bool + */ + public $UseSendmailOptions = true; + + /** + * The email address that a reading confirmation should be sent to, also known as read receipt. + * + * @var string + */ + public $ConfirmReadingTo = ''; + + /** + * The hostname to use in the Message-ID header and as default HELO string. + * If empty, PHPMailer attempts to find one with, in order, + * $_SERVER['SERVER_NAME'], gethostname(), php_uname('n'), or the value + * 'localhost.localdomain'. + * + * @see PHPMailer::$Helo + * + * @var string + */ + public $Hostname = ''; + + /** + * An ID to be used in the Message-ID header. + * If empty, a unique id will be generated. + * You can set your own, but it must be in the format "", + * as defined in RFC5322 section 3.6.4 or it will be ignored. + * + * @see https://tools.ietf.org/html/rfc5322#section-3.6.4 + * + * @var string + */ + public $MessageID = ''; + + /** + * The message Date to be used in the Date header. + * If empty, the current date will be added. + * + * @var string + */ + public $MessageDate = ''; + + /** + * SMTP hosts. + * Either a single hostname or multiple semicolon-delimited hostnames. + * You can also specify a different port + * for each host by using this format: [hostname:port] + * (e.g. "smtp1.example.com:25;smtp2.example.com"). + * You can also specify encryption type, for example: + * (e.g. "tls://smtp1.example.com:587;ssl://smtp2.example.com:465"). + * Hosts will be tried in order. + * + * @var string + */ + public $Host = 'localhost'; + + /** + * The default SMTP server port. + * + * @var int + */ + public $Port = 25; + + /** + * The SMTP HELO/EHLO name used for the SMTP connection. + * Default is $Hostname. If $Hostname is empty, PHPMailer attempts to find + * one with the same method described above for $Hostname. + * + * @see PHPMailer::$Hostname + * + * @var string + */ + public $Helo = ''; + + /** + * What kind of encryption to use on the SMTP connection. + * Options: '', static::ENCRYPTION_STARTTLS, or static::ENCRYPTION_SMTPS. + * + * @var string + */ + public $SMTPSecure = ''; + + /** + * Whether to enable TLS encryption automatically if a server supports it, + * even if `SMTPSecure` is not set to 'tls'. + * Be aware that in PHP >= 5.6 this requires that the server's certificates are valid. + * + * @var bool + */ + public $SMTPAutoTLS = true; + + /** + * Whether to use SMTP authentication. + * Uses the Username and Password properties. + * + * @see PHPMailer::$Username + * @see PHPMailer::$Password + * + * @var bool + */ + public $SMTPAuth = false; + + /** + * Options array passed to stream_context_create when connecting via SMTP. + * + * @var array + */ + public $SMTPOptions = []; + + /** + * SMTP username. + * + * @var string + */ + public $Username = ''; + + /** + * SMTP password. + * + * @var string + */ + public $Password = ''; + + /** + * SMTP auth type. + * Options are CRAM-MD5, LOGIN, PLAIN, XOAUTH2, attempted in that order if not specified. + * + * @var string + */ + public $AuthType = ''; + + /** + * An instance of the PHPMailer OAuth class. + * + * @var OAuth + */ + protected $oauth; + + /** + * The SMTP server timeout in seconds. + * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2. + * + * @var int + */ + public $Timeout = 300; + + /** + * Comma separated list of DSN notifications + * 'NEVER' under no circumstances a DSN must be returned to the sender. + * If you use NEVER all other notifications will be ignored. + * 'SUCCESS' will notify you when your mail has arrived at its destination. + * 'FAILURE' will arrive if an error occurred during delivery. + * 'DELAY' will notify you if there is an unusual delay in delivery, but the actual + * delivery's outcome (success or failure) is not yet decided. + * + * @see https://tools.ietf.org/html/rfc3461 See section 4.1 for more information about NOTIFY + */ + public $dsn = ''; + + /** + * SMTP class debug output mode. + * Debug output level. + * Options: + * @see SMTP::DEBUG_OFF: No output + * @see SMTP::DEBUG_CLIENT: Client messages + * @see SMTP::DEBUG_SERVER: Client and server messages + * @see SMTP::DEBUG_CONNECTION: As SERVER plus connection status + * @see SMTP::DEBUG_LOWLEVEL: Noisy, low-level data output, rarely needed + * + * @see SMTP::$do_debug + * + * @var int + */ + public $SMTPDebug = 0; + + /** + * How to handle debug output. + * Options: + * * `echo` Output plain-text as-is, appropriate for CLI + * * `html` Output escaped, line breaks converted to `
`, appropriate for browser output + * * `error_log` Output to error log as configured in php.ini + * By default PHPMailer will use `echo` if run from a `cli` or `cli-server` SAPI, `html` otherwise. + * Alternatively, you can provide a callable expecting two params: a message string and the debug level: + * + * ```php + * $mail->Debugoutput = function($str, $level) {echo "debug level $level; message: $str";}; + * ``` + * + * Alternatively, you can pass in an instance of a PSR-3 compatible logger, though only `debug` + * level output is used: + * + * ```php + * $mail->Debugoutput = new myPsr3Logger; + * ``` + * + * @see SMTP::$Debugoutput + * + * @var string|callable|\Psr\Log\LoggerInterface + */ + public $Debugoutput = 'echo'; + + /** + * Whether to keep the SMTP connection open after each message. + * If this is set to true then the connection will remain open after a send, + * and closing the connection will require an explicit call to smtpClose(). + * It's a good idea to use this if you are sending multiple messages as it reduces overhead. + * See the mailing list example for how to use it. + * + * @var bool + */ + public $SMTPKeepAlive = false; + + /** + * Whether to split multiple to addresses into multiple messages + * or send them all in one message. + * Only supported in `mail` and `sendmail` transports, not in SMTP. + * + * @var bool + * + * @deprecated 6.0.0 PHPMailer isn't a mailing list manager! + */ + public $SingleTo = false; + + /** + * Storage for addresses when SingleTo is enabled. + * + * @var array + */ + protected $SingleToArray = []; + + /** + * Whether to generate VERP addresses on send. + * Only applicable when sending via SMTP. + * + * @see https://en.wikipedia.org/wiki/Variable_envelope_return_path + * @see http://www.postfix.org/VERP_README.html Postfix VERP info + * + * @var bool + */ + public $do_verp = false; + + /** + * Whether to allow sending messages with an empty body. + * + * @var bool + */ + public $AllowEmpty = false; + + /** + * DKIM selector. + * + * @var string + */ + public $DKIM_selector = ''; + + /** + * DKIM Identity. + * Usually the email address used as the source of the email. + * + * @var string + */ + public $DKIM_identity = ''; + + /** + * DKIM passphrase. + * Used if your key is encrypted. + * + * @var string + */ + public $DKIM_passphrase = ''; + + /** + * DKIM signing domain name. + * + * @example 'example.com' + * + * @var string + */ + public $DKIM_domain = ''; + + /** + * DKIM Copy header field values for diagnostic use. + * + * @var bool + */ + public $DKIM_copyHeaderFields = true; + + /** + * DKIM Extra signing headers. + * + * @example ['List-Unsubscribe', 'List-Help'] + * + * @var array + */ + public $DKIM_extraHeaders = []; + + /** + * DKIM private key file path. + * + * @var string + */ + public $DKIM_private = ''; + + /** + * DKIM private key string. + * + * If set, takes precedence over `$DKIM_private`. + * + * @var string + */ + public $DKIM_private_string = ''; + + /** + * Callback Action function name. + * + * The function that handles the result of the send email action. + * It is called out by send() for each email sent. + * + * Value can be any php callable: http://www.php.net/is_callable + * + * Parameters: + * bool $result result of the send action + * array $to email addresses of the recipients + * array $cc cc email addresses + * array $bcc bcc email addresses + * string $subject the subject + * string $body the email body + * string $from email address of sender + * string $extra extra information of possible use + * "smtp_transaction_id' => last smtp transaction id + * + * @var string + */ + public $action_function = ''; + + /** + * What to put in the X-Mailer header. + * Options: An empty string for PHPMailer default, whitespace/null for none, or a string to use. + * + * @var string|null + */ + public $XMailer = ''; + + /** + * Which validator to use by default when validating email addresses. + * May be a callable to inject your own validator, but there are several built-in validators. + * The default validator uses PHP's FILTER_VALIDATE_EMAIL filter_var option. + * + * @see PHPMailer::validateAddress() + * + * @var string|callable + */ + public static $validator = 'php'; + + /** + * An instance of the SMTP sender class. + * + * @var SMTP + */ + protected $smtp; + + /** + * The array of 'to' names and addresses. + * + * @var array + */ + protected $to = []; + + /** + * The array of 'cc' names and addresses. + * + * @var array + */ + protected $cc = []; + + /** + * The array of 'bcc' names and addresses. + * + * @var array + */ + protected $bcc = []; + + /** + * The array of reply-to names and addresses. + * + * @var array + */ + protected $ReplyTo = []; + + /** + * An array of all kinds of addresses. + * Includes all of $to, $cc, $bcc. + * + * @see PHPMailer::$to + * @see PHPMailer::$cc + * @see PHPMailer::$bcc + * + * @var array + */ + protected $all_recipients = []; + + /** + * An array of names and addresses queued for validation. + * In send(), valid and non duplicate entries are moved to $all_recipients + * and one of $to, $cc, or $bcc. + * This array is used only for addresses with IDN. + * + * @see PHPMailer::$to + * @see PHPMailer::$cc + * @see PHPMailer::$bcc + * @see PHPMailer::$all_recipients + * + * @var array + */ + protected $RecipientsQueue = []; + + /** + * An array of reply-to names and addresses queued for validation. + * In send(), valid and non duplicate entries are moved to $ReplyTo. + * This array is used only for addresses with IDN. + * + * @see PHPMailer::$ReplyTo + * + * @var array + */ + protected $ReplyToQueue = []; + + /** + * The array of attachments. + * + * @var array + */ + protected $attachment = []; + + /** + * The array of custom headers. + * + * @var array + */ + protected $CustomHeader = []; + + /** + * The most recent Message-ID (including angular brackets). + * + * @var string + */ + protected $lastMessageID = ''; + + /** + * The message's MIME type. + * + * @var string + */ + protected $message_type = ''; + + /** + * The array of MIME boundary strings. + * + * @var array + */ + protected $boundary = []; + + /** + * The array of available text strings for the current language. + * + * @var array + */ + protected $language = []; + + /** + * The number of errors encountered. + * + * @var int + */ + protected $error_count = 0; + + /** + * The S/MIME certificate file path. + * + * @var string + */ + protected $sign_cert_file = ''; + + /** + * The S/MIME key file path. + * + * @var string + */ + protected $sign_key_file = ''; + + /** + * The optional S/MIME extra certificates ("CA Chain") file path. + * + * @var string + */ + protected $sign_extracerts_file = ''; + + /** + * The S/MIME password for the key. + * Used only if the key is encrypted. + * + * @var string + */ + protected $sign_key_pass = ''; + + /** + * Whether to throw exceptions for errors. + * + * @var bool + */ + protected $exceptions = false; + + /** + * Unique ID used for message ID and boundaries. + * + * @var string + */ + protected $uniqueid = ''; + + /** + * The PHPMailer Version number. + * + * @var string + */ + const VERSION = '6.5.3'; + + /** + * Error severity: message only, continue processing. + * + * @var int + */ + const STOP_MESSAGE = 0; + + /** + * Error severity: message, likely ok to continue processing. + * + * @var int + */ + const STOP_CONTINUE = 1; + + /** + * Error severity: message, plus full stop, critical error reached. + * + * @var int + */ + const STOP_CRITICAL = 2; + + /** + * The SMTP standard CRLF line break. + * If you want to change line break format, change static::$LE, not this. + */ + const CRLF = "\r\n"; + + /** + * "Folding White Space" a white space string used for line folding. + */ + const FWS = ' '; + + /** + * SMTP RFC standard line ending; Carriage Return, Line Feed. + * + * @var string + */ + protected static $LE = self::CRLF; + + /** + * The maximum line length supported by mail(). + * + * Background: mail() will sometimes corrupt messages + * with headers headers longer than 65 chars, see #818. + * + * @var int + */ + const MAIL_MAX_LINE_LENGTH = 63; + + /** + * The maximum line length allowed by RFC 2822 section 2.1.1. + * + * @var int + */ + const MAX_LINE_LENGTH = 998; + + /** + * The lower maximum line length allowed by RFC 2822 section 2.1.1. + * This length does NOT include the line break + * 76 means that lines will be 77 or 78 chars depending on whether + * the line break format is LF or CRLF; both are valid. + * + * @var int + */ + const STD_LINE_LENGTH = 76; + + /** + * Constructor. + * + * @param bool $exceptions Should we throw external exceptions? + */ + public function __construct($exceptions = null) + { + if (null !== $exceptions) { + $this->exceptions = (bool) $exceptions; + } + //Pick an appropriate debug output format automatically + $this->Debugoutput = (strpos(PHP_SAPI, 'cli') !== false ? 'echo' : 'html'); + } + + /** + * Destructor. + */ + public function __destruct() + { + //Close any open SMTP connection nicely + $this->smtpClose(); + } + + /** + * Call mail() in a safe_mode-aware fashion. + * Also, unless sendmail_path points to sendmail (or something that + * claims to be sendmail), don't pass params (not a perfect fix, + * but it will do). + * + * @param string $to To + * @param string $subject Subject + * @param string $body Message Body + * @param string $header Additional Header(s) + * @param string|null $params Params + * + * @return bool + */ + private function mailPassthru($to, $subject, $body, $header, $params) + { + //Check overloading of mail function to avoid double-encoding + if (ini_get('mbstring.func_overload') & 1) { + $subject = $this->secureHeader($subject); + } else { + $subject = $this->encodeHeader($this->secureHeader($subject)); + } + //Calling mail() with null params breaks + $this->edebug('Sending with mail()'); + $this->edebug('Sendmail path: ' . ini_get('sendmail_path')); + $this->edebug("Envelope sender: {$this->Sender}"); + $this->edebug("To: {$to}"); + $this->edebug("Subject: {$subject}"); + $this->edebug("Headers: {$header}"); + if (!$this->UseSendmailOptions || null === $params) { + $result = @mail($to, $subject, $body, $header); + } else { + $this->edebug("Additional params: {$params}"); + $result = @mail($to, $subject, $body, $header, $params); + } + $this->edebug('Result: ' . ($result ? 'true' : 'false')); + return $result; + } + + /** + * Output debugging info via a user-defined method. + * Only generates output if debug output is enabled. + * + * @see PHPMailer::$Debugoutput + * @see PHPMailer::$SMTPDebug + * + * @param string $str + */ + protected function edebug($str) + { + if ($this->SMTPDebug <= 0) { + return; + } + //Is this a PSR-3 logger? + if ($this->Debugoutput instanceof \Psr\Log\LoggerInterface) { + $this->Debugoutput->debug($str); + + return; + } + //Avoid clash with built-in function names + if (is_callable($this->Debugoutput) && !in_array($this->Debugoutput, ['error_log', 'html', 'echo'])) { + call_user_func($this->Debugoutput, $str, $this->SMTPDebug); + + return; + } + switch ($this->Debugoutput) { + case 'error_log': + //Don't output, just log + /** @noinspection ForgottenDebugOutputInspection */ + error_log($str); + break; + case 'html': + //Cleans up output a bit for a better looking, HTML-safe output + echo htmlentities( + preg_replace('/[\r\n]+/', '', $str), + ENT_QUOTES, + 'UTF-8' + ), "
\n"; + break; + case 'echo': + default: + //Normalize line breaks + $str = preg_replace('/\r\n|\r/m', "\n", $str); + echo gmdate('Y-m-d H:i:s'), + "\t", + //Trim trailing space + trim( + //Indent for readability, except for trailing break + str_replace( + "\n", + "\n \t ", + trim($str) + ) + ), + "\n"; + } + } + + /** + * Sets message type to HTML or plain. + * + * @param bool $isHtml True for HTML mode + */ + public function isHTML($isHtml = true) + { + if ($isHtml) { + $this->ContentType = static::CONTENT_TYPE_TEXT_HTML; + } else { + $this->ContentType = static::CONTENT_TYPE_PLAINTEXT; + } + } + + /** + * Send messages using SMTP. + */ + public function isSMTP() + { + $this->Mailer = 'smtp'; + } + + /** + * Send messages using PHP's mail() function. + */ + public function isMail() + { + $this->Mailer = 'mail'; + } + + /** + * Send messages using $Sendmail. + */ + public function isSendmail() + { + $ini_sendmail_path = ini_get('sendmail_path'); + + if (false === stripos($ini_sendmail_path, 'sendmail')) { + $this->Sendmail = '/usr/sbin/sendmail'; + } else { + $this->Sendmail = $ini_sendmail_path; + } + $this->Mailer = 'sendmail'; + } + + /** + * Send messages using qmail. + */ + public function isQmail() + { + $ini_sendmail_path = ini_get('sendmail_path'); + + if (false === stripos($ini_sendmail_path, 'qmail')) { + $this->Sendmail = '/var/qmail/bin/qmail-inject'; + } else { + $this->Sendmail = $ini_sendmail_path; + } + $this->Mailer = 'qmail'; + } + + /** + * Add a "To" address. + * + * @param string $address The email address to send to + * @param string $name + * + * @throws Exception + * + * @return bool true on success, false if address already used or invalid in some way + */ + public function addAddress($address, $name = '') + { + return $this->addOrEnqueueAnAddress('to', $address, $name); + } + + /** + * Add a "CC" address. + * + * @param string $address The email address to send to + * @param string $name + * + * @throws Exception + * + * @return bool true on success, false if address already used or invalid in some way + */ + public function addCC($address, $name = '') + { + return $this->addOrEnqueueAnAddress('cc', $address, $name); + } + + /** + * Add a "BCC" address. + * + * @param string $address The email address to send to + * @param string $name + * + * @throws Exception + * + * @return bool true on success, false if address already used or invalid in some way + */ + public function addBCC($address, $name = '') + { + return $this->addOrEnqueueAnAddress('bcc', $address, $name); + } + + /** + * Add a "Reply-To" address. + * + * @param string $address The email address to reply to + * @param string $name + * + * @throws Exception + * + * @return bool true on success, false if address already used or invalid in some way + */ + public function addReplyTo($address, $name = '') + { + return $this->addOrEnqueueAnAddress('Reply-To', $address, $name); + } + + /** + * Add an address to one of the recipient arrays or to the ReplyTo array. Because PHPMailer + * can't validate addresses with an IDN without knowing the PHPMailer::$CharSet (that can still + * be modified after calling this function), addition of such addresses is delayed until send(). + * Addresses that have been added already return false, but do not throw exceptions. + * + * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo' + * @param string $address The email address to send, resp. to reply to + * @param string $name + * + * @throws Exception + * + * @return bool true on success, false if address already used or invalid in some way + */ + protected function addOrEnqueueAnAddress($kind, $address, $name) + { + $address = trim($address); + $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim + $pos = strrpos($address, '@'); + if (false === $pos) { + //At-sign is missing. + $error_message = sprintf( + '%s (%s): %s', + $this->lang('invalid_address'), + $kind, + $address + ); + $this->setError($error_message); + $this->edebug($error_message); + if ($this->exceptions) { + throw new Exception($error_message); + } + + return false; + } + $params = [$kind, $address, $name]; + //Enqueue addresses with IDN until we know the PHPMailer::$CharSet. + if (static::idnSupported() && $this->has8bitChars(substr($address, ++$pos))) { + if ('Reply-To' !== $kind) { + if (!array_key_exists($address, $this->RecipientsQueue)) { + $this->RecipientsQueue[$address] = $params; + + return true; + } + } elseif (!array_key_exists($address, $this->ReplyToQueue)) { + $this->ReplyToQueue[$address] = $params; + + return true; + } + + return false; + } + + //Immediately add standard addresses without IDN. + return call_user_func_array([$this, 'addAnAddress'], $params); + } + + /** + * Add an address to one of the recipient arrays or to the ReplyTo array. + * Addresses that have been added already return false, but do not throw exceptions. + * + * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo' + * @param string $address The email address to send, resp. to reply to + * @param string $name + * + * @throws Exception + * + * @return bool true on success, false if address already used or invalid in some way + */ + protected function addAnAddress($kind, $address, $name = '') + { + if (!in_array($kind, ['to', 'cc', 'bcc', 'Reply-To'])) { + $error_message = sprintf( + '%s: %s', + $this->lang('Invalid recipient kind'), + $kind + ); + $this->setError($error_message); + $this->edebug($error_message); + if ($this->exceptions) { + throw new Exception($error_message); + } + + return false; + } + if (!static::validateAddress($address)) { + $error_message = sprintf( + '%s (%s): %s', + $this->lang('invalid_address'), + $kind, + $address + ); + $this->setError($error_message); + $this->edebug($error_message); + if ($this->exceptions) { + throw new Exception($error_message); + } + + return false; + } + if ('Reply-To' !== $kind) { + if (!array_key_exists(strtolower($address), $this->all_recipients)) { + $this->{$kind}[] = [$address, $name]; + $this->all_recipients[strtolower($address)] = true; + + return true; + } + } elseif (!array_key_exists(strtolower($address), $this->ReplyTo)) { + $this->ReplyTo[strtolower($address)] = [$address, $name]; + + return true; + } + + return false; + } + + /** + * Parse and validate a string containing one or more RFC822-style comma-separated email addresses + * of the form "display name
" into an array of name/address pairs. + * Uses the imap_rfc822_parse_adrlist function if the IMAP extension is available. + * Note that quotes in the name part are removed. + * + * @see http://www.andrew.cmu.edu/user/agreen1/testing/mrbs/web/Mail/RFC822.php A more careful implementation + * + * @param string $addrstr The address list string + * @param bool $useimap Whether to use the IMAP extension to parse the list + * @param string $charset The charset to use when decoding the address list string. + * + * @return array + */ + public static function parseAddresses($addrstr, $useimap = true, $charset = self::CHARSET_ISO88591) + { + $addresses = []; + if ($useimap && function_exists('imap_rfc822_parse_adrlist')) { + //Use this built-in parser if it's available + $list = imap_rfc822_parse_adrlist($addrstr, ''); + // Clear any potential IMAP errors to get rid of notices being thrown at end of script. + imap_errors(); + foreach ($list as $address) { + if ( + '.SYNTAX-ERROR.' !== $address->host && + static::validateAddress($address->mailbox . '@' . $address->host) + ) { + //Decode the name part if it's present and encoded + if ( + property_exists($address, 'personal') && + //Check for a Mbstring constant rather than using extension_loaded, which is sometimes disabled + defined('MB_CASE_UPPER') && + preg_match('/^=\?.*\?=$/s', $address->personal) + ) { + $origCharset = mb_internal_encoding(); + mb_internal_encoding($charset); + //Undo any RFC2047-encoded spaces-as-underscores + $address->personal = str_replace('_', '=20', $address->personal); + //Decode the name + $address->personal = mb_decode_mimeheader($address->personal); + mb_internal_encoding($origCharset); + } + + $addresses[] = [ + 'name' => (property_exists($address, 'personal') ? $address->personal : ''), + 'address' => $address->mailbox . '@' . $address->host, + ]; + } + } + } else { + //Use this simpler parser + $list = explode(',', $addrstr); + foreach ($list as $address) { + $address = trim($address); + //Is there a separate name part? + if (strpos($address, '<') === false) { + //No separate name, just use the whole thing + if (static::validateAddress($address)) { + $addresses[] = [ + 'name' => '', + 'address' => $address, + ]; + } + } else { + list($name, $email) = explode('<', $address); + $email = trim(str_replace('>', '', $email)); + $name = trim($name); + if (static::validateAddress($email)) { + //Check for a Mbstring constant rather than using extension_loaded, which is sometimes disabled + //If this name is encoded, decode it + if (defined('MB_CASE_UPPER') && preg_match('/^=\?.*\?=$/s', $name)) { + $origCharset = mb_internal_encoding(); + mb_internal_encoding($charset); + //Undo any RFC2047-encoded spaces-as-underscores + $name = str_replace('_', '=20', $name); + //Decode the name + $name = mb_decode_mimeheader($name); + mb_internal_encoding($origCharset); + } + $addresses[] = [ + //Remove any surrounding quotes and spaces from the name + 'name' => trim($name, '\'" '), + 'address' => $email, + ]; + } + } + } + } + + return $addresses; + } + + /** + * Set the From and FromName properties. + * + * @param string $address + * @param string $name + * @param bool $auto Whether to also set the Sender address, defaults to true + * + * @throws Exception + * + * @return bool + */ + public function setFrom($address, $name = '', $auto = true) + { + $address = trim($address); + $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim + //Don't validate now addresses with IDN. Will be done in send(). + $pos = strrpos($address, '@'); + if ( + (false === $pos) + || ((!$this->has8bitChars(substr($address, ++$pos)) || !static::idnSupported()) + && !static::validateAddress($address)) + ) { + $error_message = sprintf( + '%s (From): %s', + $this->lang('invalid_address'), + $address + ); + $this->setError($error_message); + $this->edebug($error_message); + if ($this->exceptions) { + throw new Exception($error_message); + } + + return false; + } + $this->From = $address; + $this->FromName = $name; + if ($auto && empty($this->Sender)) { + $this->Sender = $address; + } + + return true; + } + + /** + * Return the Message-ID header of the last email. + * Technically this is the value from the last time the headers were created, + * but it's also the message ID of the last sent message except in + * pathological cases. + * + * @return string + */ + public function getLastMessageID() + { + return $this->lastMessageID; + } + + /** + * Check that a string looks like an email address. + * Validation patterns supported: + * * `auto` Pick best pattern automatically; + * * `pcre8` Use the squiloople.com pattern, requires PCRE > 8.0; + * * `pcre` Use old PCRE implementation; + * * `php` Use PHP built-in FILTER_VALIDATE_EMAIL; + * * `html5` Use the pattern given by the HTML5 spec for 'email' type form input elements. + * * `noregex` Don't use a regex: super fast, really dumb. + * Alternatively you may pass in a callable to inject your own validator, for example: + * + * ```php + * PHPMailer::validateAddress('user@example.com', function($address) { + * return (strpos($address, '@') !== false); + * }); + * ``` + * + * You can also set the PHPMailer::$validator static to a callable, allowing built-in methods to use your validator. + * + * @param string $address The email address to check + * @param string|callable $patternselect Which pattern to use + * + * @return bool + */ + public static function validateAddress($address, $patternselect = null) + { + if (null === $patternselect) { + $patternselect = static::$validator; + } + //Don't allow strings as callables, see SECURITY.md and CVE-2021-3603 + if (is_callable($patternselect) && !is_string($patternselect)) { + return call_user_func($patternselect, $address); + } + //Reject line breaks in addresses; it's valid RFC5322, but not RFC5321 + if (strpos($address, "\n") !== false || strpos($address, "\r") !== false) { + return false; + } + switch ($patternselect) { + case 'pcre': //Kept for BC + case 'pcre8': + /* + * A more complex and more permissive version of the RFC5322 regex on which FILTER_VALIDATE_EMAIL + * is based. + * In addition to the addresses allowed by filter_var, also permits: + * * dotless domains: `a@b` + * * comments: `1234 @ local(blah) .machine .example` + * * quoted elements: `'"test blah"@example.org'` + * * numeric TLDs: `a@b.123` + * * unbracketed IPv4 literals: `a@192.168.0.1` + * * IPv6 literals: 'first.last@[IPv6:a1::]' + * Not all of these will necessarily work for sending! + * + * @see http://squiloople.com/2009/12/20/email-address-validation/ + * @copyright 2009-2010 Michael Rushton + * Feel free to use and redistribute this code. But please keep this copyright notice. + */ + return (bool) preg_match( + '/^(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){255,})(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){65,}@)' . + '((?>(?>(?>((?>(?>(?>\x0D\x0A)?[\t ])+|(?>[\t ]*\x0D\x0A)?[\t ]+)?)(\((?>(?2)' . + '(?>[\x01-\x08\x0B\x0C\x0E-\'*-\[\]-\x7F]|\\\[\x00-\x7F]|(?3)))*(?2)\)))+(?2))|(?2))?)' . + '([!#-\'*+\/-9=?^-~-]+|"(?>(?2)(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\x7F]))*' . + '(?2)")(?>(?1)\.(?1)(?4))*(?1)@(?!(?1)[a-z0-9-]{64,})(?1)(?>([a-z0-9](?>[a-z0-9-]*[a-z0-9])?)' . + '(?>(?1)\.(?!(?1)[a-z0-9-]{64,})(?1)(?5)){0,126}|\[(?:(?>IPv6:(?>([a-f0-9]{1,4})(?>:(?6)){7}' . + '|(?!(?:.*[a-f0-9][:\]]){8,})((?6)(?>:(?6)){0,6})?::(?7)?))|(?>(?>IPv6:(?>(?6)(?>:(?6)){5}:' . + '|(?!(?:.*[a-f0-9]:){6,})(?8)?::(?>((?6)(?>:(?6)){0,4}):)?))?(25[0-5]|2[0-4][0-9]|1[0-9]{2}' . + '|[1-9]?[0-9])(?>\.(?9)){3}))\])(?1)$/isD', + $address + ); + case 'html5': + /* + * This is the pattern used in the HTML5 spec for validation of 'email' type form input elements. + * + * @see https://html.spec.whatwg.org/#e-mail-state-(type=email) + */ + return (bool) preg_match( + '/^[a-zA-Z0-9.!#$%&\'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}' . + '[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/sD', + $address + ); + case 'php': + default: + return filter_var($address, FILTER_VALIDATE_EMAIL) !== false; + } + } + + /** + * Tells whether IDNs (Internationalized Domain Names) are supported or not. This requires the + * `intl` and `mbstring` PHP extensions. + * + * @return bool `true` if required functions for IDN support are present + */ + public static function idnSupported() + { + return function_exists('idn_to_ascii') && function_exists('mb_convert_encoding'); + } + + /** + * Converts IDN in given email address to its ASCII form, also known as punycode, if possible. + * Important: Address must be passed in same encoding as currently set in PHPMailer::$CharSet. + * This function silently returns unmodified address if: + * - No conversion is necessary (i.e. domain name is not an IDN, or is already in ASCII form) + * - Conversion to punycode is impossible (e.g. required PHP functions are not available) + * or fails for any reason (e.g. domain contains characters not allowed in an IDN). + * + * @see PHPMailer::$CharSet + * + * @param string $address The email address to convert + * + * @return string The encoded address in ASCII form + */ + public function punyencodeAddress($address) + { + //Verify we have required functions, CharSet, and at-sign. + $pos = strrpos($address, '@'); + if ( + !empty($this->CharSet) && + false !== $pos && + static::idnSupported() + ) { + $domain = substr($address, ++$pos); + //Verify CharSet string is a valid one, and domain properly encoded in this CharSet. + if ($this->has8bitChars($domain) && @mb_check_encoding($domain, $this->CharSet)) { + //Convert the domain from whatever charset it's in to UTF-8 + $domain = mb_convert_encoding($domain, self::CHARSET_UTF8, $this->CharSet); + //Ignore IDE complaints about this line - method signature changed in PHP 5.4 + $errorcode = 0; + if (defined('INTL_IDNA_VARIANT_UTS46')) { + //Use the current punycode standard (appeared in PHP 7.2) + $punycode = idn_to_ascii( + $domain, + \IDNA_DEFAULT | \IDNA_USE_STD3_RULES | \IDNA_CHECK_BIDI | + \IDNA_CHECK_CONTEXTJ | \IDNA_NONTRANSITIONAL_TO_ASCII, + \INTL_IDNA_VARIANT_UTS46 + ); + } elseif (defined('INTL_IDNA_VARIANT_2003')) { + //Fall back to this old, deprecated/removed encoding + $punycode = idn_to_ascii($domain, $errorcode, \INTL_IDNA_VARIANT_2003); + } else { + //Fall back to a default we don't know about + $punycode = idn_to_ascii($domain, $errorcode); + } + if (false !== $punycode) { + return substr($address, 0, $pos) . $punycode; + } + } + } + + return $address; + } + + /** + * Create a message and send it. + * Uses the sending method specified by $Mailer. + * + * @throws Exception + * + * @return bool false on error - See the ErrorInfo property for details of the error + */ + public function send() + { + try { + if (!$this->preSend()) { + return false; + } + + return $this->postSend(); + } catch (Exception $exc) { + $this->mailHeader = ''; + $this->setError($exc->getMessage()); + if ($this->exceptions) { + throw $exc; + } + + return false; + } + } + + /** + * Prepare a message for sending. + * + * @throws Exception + * + * @return bool + */ + public function preSend() + { + if ( + 'smtp' === $this->Mailer + || ('mail' === $this->Mailer && (\PHP_VERSION_ID >= 80000 || stripos(PHP_OS, 'WIN') === 0)) + ) { + //SMTP mandates RFC-compliant line endings + //and it's also used with mail() on Windows + static::setLE(self::CRLF); + } else { + //Maintain backward compatibility with legacy Linux command line mailers + static::setLE(PHP_EOL); + } + //Check for buggy PHP versions that add a header with an incorrect line break + if ( + 'mail' === $this->Mailer + && ((\PHP_VERSION_ID >= 70000 && \PHP_VERSION_ID < 70017) + || (\PHP_VERSION_ID >= 70100 && \PHP_VERSION_ID < 70103)) + && ini_get('mail.add_x_header') === '1' + && stripos(PHP_OS, 'WIN') === 0 + ) { + trigger_error($this->lang('buggy_php'), E_USER_WARNING); + } + + try { + $this->error_count = 0; //Reset errors + $this->mailHeader = ''; + + //Dequeue recipient and Reply-To addresses with IDN + foreach (array_merge($this->RecipientsQueue, $this->ReplyToQueue) as $params) { + $params[1] = $this->punyencodeAddress($params[1]); + call_user_func_array([$this, 'addAnAddress'], $params); + } + if (count($this->to) + count($this->cc) + count($this->bcc) < 1) { + throw new Exception($this->lang('provide_address'), self::STOP_CRITICAL); + } + + //Validate From, Sender, and ConfirmReadingTo addresses + foreach (['From', 'Sender', 'ConfirmReadingTo'] as $address_kind) { + $this->$address_kind = trim($this->$address_kind); + if (empty($this->$address_kind)) { + continue; + } + $this->$address_kind = $this->punyencodeAddress($this->$address_kind); + if (!static::validateAddress($this->$address_kind)) { + $error_message = sprintf( + '%s (%s): %s', + $this->lang('invalid_address'), + $address_kind, + $this->$address_kind + ); + $this->setError($error_message); + $this->edebug($error_message); + if ($this->exceptions) { + throw new Exception($error_message); + } + + return false; + } + } + + //Set whether the message is multipart/alternative + if ($this->alternativeExists()) { + $this->ContentType = static::CONTENT_TYPE_MULTIPART_ALTERNATIVE; + } + + $this->setMessageType(); + //Refuse to send an empty message unless we are specifically allowing it + if (!$this->AllowEmpty && empty($this->Body)) { + throw new Exception($this->lang('empty_message'), self::STOP_CRITICAL); + } + + //Trim subject consistently + $this->Subject = trim($this->Subject); + //Create body before headers in case body makes changes to headers (e.g. altering transfer encoding) + $this->MIMEHeader = ''; + $this->MIMEBody = $this->createBody(); + //createBody may have added some headers, so retain them + $tempheaders = $this->MIMEHeader; + $this->MIMEHeader = $this->createHeader(); + $this->MIMEHeader .= $tempheaders; + + //To capture the complete message when using mail(), create + //an extra header list which createHeader() doesn't fold in + if ('mail' === $this->Mailer) { + if (count($this->to) > 0) { + $this->mailHeader .= $this->addrAppend('To', $this->to); + } else { + $this->mailHeader .= $this->headerLine('To', 'undisclosed-recipients:;'); + } + $this->mailHeader .= $this->headerLine( + 'Subject', + $this->encodeHeader($this->secureHeader($this->Subject)) + ); + } + + //Sign with DKIM if enabled + if ( + !empty($this->DKIM_domain) + && !empty($this->DKIM_selector) + && (!empty($this->DKIM_private_string) + || (!empty($this->DKIM_private) + && static::isPermittedPath($this->DKIM_private) + && file_exists($this->DKIM_private) + ) + ) + ) { + $header_dkim = $this->DKIM_Add( + $this->MIMEHeader . $this->mailHeader, + $this->encodeHeader($this->secureHeader($this->Subject)), + $this->MIMEBody + ); + $this->MIMEHeader = static::stripTrailingWSP($this->MIMEHeader) . static::$LE . + static::normalizeBreaks($header_dkim) . static::$LE; + } + + return true; + } catch (Exception $exc) { + $this->setError($exc->getMessage()); + if ($this->exceptions) { + throw $exc; + } + + return false; + } + } + + /** + * Actually send a message via the selected mechanism. + * + * @throws Exception + * + * @return bool + */ + public function postSend() + { + try { + //Choose the mailer and send through it + switch ($this->Mailer) { + case 'sendmail': + case 'qmail': + return $this->sendmailSend($this->MIMEHeader, $this->MIMEBody); + case 'smtp': + return $this->smtpSend($this->MIMEHeader, $this->MIMEBody); + case 'mail': + return $this->mailSend($this->MIMEHeader, $this->MIMEBody); + default: + $sendMethod = $this->Mailer . 'Send'; + if (method_exists($this, $sendMethod)) { + return $this->$sendMethod($this->MIMEHeader, $this->MIMEBody); + } + + return $this->mailSend($this->MIMEHeader, $this->MIMEBody); + } + } catch (Exception $exc) { + if ($this->Mailer === 'smtp' && $this->SMTPKeepAlive == true) { + $this->smtp->reset(); + } + $this->setError($exc->getMessage()); + $this->edebug($exc->getMessage()); + if ($this->exceptions) { + throw $exc; + } + } + + return false; + } + + /** + * Send mail using the $Sendmail program. + * + * @see PHPMailer::$Sendmail + * + * @param string $header The message headers + * @param string $body The message body + * + * @throws Exception + * + * @return bool + */ + protected function sendmailSend($header, $body) + { + if ($this->Mailer === 'qmail') { + $this->edebug('Sending with qmail'); + } else { + $this->edebug('Sending with sendmail'); + } + $header = static::stripTrailingWSP($header) . static::$LE . static::$LE; + //This sets the SMTP envelope sender which gets turned into a return-path header by the receiver + //A space after `-f` is optional, but there is a long history of its presence + //causing problems, so we don't use one + //Exim docs: http://www.exim.org/exim-html-current/doc/html/spec_html/ch-the_exim_command_line.html + //Sendmail docs: http://www.sendmail.org/~ca/email/man/sendmail.html + //Qmail docs: http://www.qmail.org/man/man8/qmail-inject.html + //Example problem: https://www.drupal.org/node/1057954 + + //PHP 5.6 workaround + $sendmail_from_value = ini_get('sendmail_from'); + if (empty($this->Sender) && !empty($sendmail_from_value)) { + //PHP config has a sender address we can use + $this->Sender = ini_get('sendmail_from'); + } + //CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped. + if (!empty($this->Sender) && static::validateAddress($this->Sender) && self::isShellSafe($this->Sender)) { + if ($this->Mailer === 'qmail') { + $sendmailFmt = '%s -f%s'; + } else { + $sendmailFmt = '%s -oi -f%s -t'; + } + } else { + //allow sendmail to choose a default envelope sender. It may + //seem preferable to force it to use the From header as with + //SMTP, but that introduces new problems (see + //), and + //it has historically worked this way. + $sendmailFmt = '%s -oi -t'; + } + + $sendmail = sprintf($sendmailFmt, escapeshellcmd($this->Sendmail), $this->Sender); + $this->edebug('Sendmail path: ' . $this->Sendmail); + $this->edebug('Sendmail command: ' . $sendmail); + $this->edebug('Envelope sender: ' . $this->Sender); + $this->edebug("Headers: {$header}"); + + if ($this->SingleTo) { + foreach ($this->SingleToArray as $toAddr) { + $mail = @popen($sendmail, 'w'); + if (!$mail) { + throw new Exception($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL); + } + $this->edebug("To: {$toAddr}"); + fwrite($mail, 'To: ' . $toAddr . "\n"); + fwrite($mail, $header); + fwrite($mail, $body); + $result = pclose($mail); + $addrinfo = static::parseAddresses($toAddr, true, $this->CharSet); + $this->doCallback( + ($result === 0), + [[$addrinfo['address'], $addrinfo['name']]], + $this->cc, + $this->bcc, + $this->Subject, + $body, + $this->From, + [] + ); + $this->edebug("Result: " . ($result === 0 ? 'true' : 'false')); + if (0 !== $result) { + throw new Exception($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL); + } + } + } else { + $mail = @popen($sendmail, 'w'); + if (!$mail) { + throw new Exception($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL); + } + fwrite($mail, $header); + fwrite($mail, $body); + $result = pclose($mail); + $this->doCallback( + ($result === 0), + $this->to, + $this->cc, + $this->bcc, + $this->Subject, + $body, + $this->From, + [] + ); + $this->edebug("Result: " . ($result === 0 ? 'true' : 'false')); + if (0 !== $result) { + throw new Exception($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL); + } + } + + return true; + } + + /** + * Fix CVE-2016-10033 and CVE-2016-10045 by disallowing potentially unsafe shell characters. + * Note that escapeshellarg and escapeshellcmd are inadequate for our purposes, especially on Windows. + * + * @see https://github.com/PHPMailer/PHPMailer/issues/924 CVE-2016-10045 bug report + * + * @param string $string The string to be validated + * + * @return bool + */ + protected static function isShellSafe($string) + { + //Future-proof + if ( + escapeshellcmd($string) !== $string + || !in_array(escapeshellarg($string), ["'$string'", "\"$string\""]) + ) { + return false; + } + + $length = strlen($string); + + for ($i = 0; $i < $length; ++$i) { + $c = $string[$i]; + + //All other characters have a special meaning in at least one common shell, including = and +. + //Full stop (.) has a special meaning in cmd.exe, but its impact should be negligible here. + //Note that this does permit non-Latin alphanumeric characters based on the current locale. + if (!ctype_alnum($c) && strpos('@_-.', $c) === false) { + return false; + } + } + + return true; + } + + /** + * Check whether a file path is of a permitted type. + * Used to reject URLs and phar files from functions that access local file paths, + * such as addAttachment. + * + * @param string $path A relative or absolute path to a file + * + * @return bool + */ + protected static function isPermittedPath($path) + { + //Matches scheme definition from https://tools.ietf.org/html/rfc3986#section-3.1 + return !preg_match('#^[a-z][a-z\d+.-]*://#i', $path); + } + + /** + * Check whether a file path is safe, accessible, and readable. + * + * @param string $path A relative or absolute path to a file + * + * @return bool + */ + protected static function fileIsAccessible($path) + { + if (!static::isPermittedPath($path)) { + return false; + } + $readable = file_exists($path); + //If not a UNC path (expected to start with \\), check read permission, see #2069 + if (strpos($path, '\\\\') !== 0) { + $readable = $readable && is_readable($path); + } + return $readable; + } + + /** + * Send mail using the PHP mail() function. + * + * @see http://www.php.net/manual/en/book.mail.php + * + * @param string $header The message headers + * @param string $body The message body + * + * @throws Exception + * + * @return bool + */ + protected function mailSend($header, $body) + { + $header = static::stripTrailingWSP($header) . static::$LE . static::$LE; + + $toArr = []; + foreach ($this->to as $toaddr) { + $toArr[] = $this->addrFormat($toaddr); + } + $to = implode(', ', $toArr); + + $params = null; + //This sets the SMTP envelope sender which gets turned into a return-path header by the receiver + //A space after `-f` is optional, but there is a long history of its presence + //causing problems, so we don't use one + //Exim docs: http://www.exim.org/exim-html-current/doc/html/spec_html/ch-the_exim_command_line.html + //Sendmail docs: http://www.sendmail.org/~ca/email/man/sendmail.html + //Qmail docs: http://www.qmail.org/man/man8/qmail-inject.html + //Example problem: https://www.drupal.org/node/1057954 + //CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped. + + //PHP 5.6 workaround + $sendmail_from_value = ini_get('sendmail_from'); + if (empty($this->Sender) && !empty($sendmail_from_value)) { + //PHP config has a sender address we can use + $this->Sender = ini_get('sendmail_from'); + } + if (!empty($this->Sender) && static::validateAddress($this->Sender)) { + if (self::isShellSafe($this->Sender)) { + $params = sprintf('-f%s', $this->Sender); + } + $old_from = ini_get('sendmail_from'); + ini_set('sendmail_from', $this->Sender); + } + $result = false; + if ($this->SingleTo && count($toArr) > 1) { + foreach ($toArr as $toAddr) { + $result = $this->mailPassthru($toAddr, $this->Subject, $body, $header, $params); + $addrinfo = static::parseAddresses($toAddr, true, $this->CharSet); + $this->doCallback( + $result, + [[$addrinfo['address'], $addrinfo['name']]], + $this->cc, + $this->bcc, + $this->Subject, + $body, + $this->From, + [] + ); + } + } else { + $result = $this->mailPassthru($to, $this->Subject, $body, $header, $params); + $this->doCallback($result, $this->to, $this->cc, $this->bcc, $this->Subject, $body, $this->From, []); + } + if (isset($old_from)) { + ini_set('sendmail_from', $old_from); + } + if (!$result) { + throw new Exception($this->lang('instantiate'), self::STOP_CRITICAL); + } + + return true; + } + + /** + * Get an instance to use for SMTP operations. + * Override this function to load your own SMTP implementation, + * or set one with setSMTPInstance. + * + * @return SMTP + */ + public function getSMTPInstance() + { + if (!is_object($this->smtp)) { + $this->smtp = new SMTP(); + } + + return $this->smtp; + } + + /** + * Provide an instance to use for SMTP operations. + * + * @return SMTP + */ + public function setSMTPInstance(SMTP $smtp) + { + $this->smtp = $smtp; + + return $this->smtp; + } + + /** + * Send mail via SMTP. + * Returns false if there is a bad MAIL FROM, RCPT, or DATA input. + * + * @see PHPMailer::setSMTPInstance() to use a different class. + * + * @uses \PHPMailer\PHPMailer\SMTP + * + * @param string $header The message headers + * @param string $body The message body + * + * @throws Exception + * + * @return bool + */ + protected function smtpSend($header, $body) + { + $header = static::stripTrailingWSP($header) . static::$LE . static::$LE; + $bad_rcpt = []; + if (!$this->smtpConnect($this->SMTPOptions)) { + throw new Exception($this->lang('smtp_connect_failed'), self::STOP_CRITICAL); + } + //Sender already validated in preSend() + if ('' === $this->Sender) { + $smtp_from = $this->From; + } else { + $smtp_from = $this->Sender; + } + if (!$this->smtp->mail($smtp_from)) { + $this->setError($this->lang('from_failed') . $smtp_from . ' : ' . implode(',', $this->smtp->getError())); + throw new Exception($this->ErrorInfo, self::STOP_CRITICAL); + } + + $callbacks = []; + //Attempt to send to all recipients + foreach ([$this->to, $this->cc, $this->bcc] as $togroup) { + foreach ($togroup as $to) { + if (!$this->smtp->recipient($to[0], $this->dsn)) { + $error = $this->smtp->getError(); + $bad_rcpt[] = ['to' => $to[0], 'error' => $error['detail']]; + $isSent = false; + } else { + $isSent = true; + } + + $callbacks[] = ['issent' => $isSent, 'to' => $to[0], 'name' => $to[1]]; + } + } + + //Only send the DATA command if we have viable recipients + if ((count($this->all_recipients) > count($bad_rcpt)) && !$this->smtp->data($header . $body)) { + throw new Exception($this->lang('data_not_accepted'), self::STOP_CRITICAL); + } + + $smtp_transaction_id = $this->smtp->getLastTransactionID(); + + if ($this->SMTPKeepAlive) { + $this->smtp->reset(); + } else { + $this->smtp->quit(); + $this->smtp->close(); + } + + foreach ($callbacks as $cb) { + $this->doCallback( + $cb['issent'], + [[$cb['to'], $cb['name']]], + [], + [], + $this->Subject, + $body, + $this->From, + ['smtp_transaction_id' => $smtp_transaction_id] + ); + } + + //Create error message for any bad addresses + if (count($bad_rcpt) > 0) { + $errstr = ''; + foreach ($bad_rcpt as $bad) { + $errstr .= $bad['to'] . ': ' . $bad['error']; + } + throw new Exception($this->lang('recipients_failed') . $errstr, self::STOP_CONTINUE); + } + + return true; + } + + /** + * Initiate a connection to an SMTP server. + * Returns false if the operation failed. + * + * @param array $options An array of options compatible with stream_context_create() + * + * @throws Exception + * + * @uses \PHPMailer\PHPMailer\SMTP + * + * @return bool + */ + public function smtpConnect($options = null) + { + if (null === $this->smtp) { + $this->smtp = $this->getSMTPInstance(); + } + + //If no options are provided, use whatever is set in the instance + if (null === $options) { + $options = $this->SMTPOptions; + } + + //Already connected? + if ($this->smtp->connected()) { + return true; + } + + $this->smtp->setTimeout($this->Timeout); + $this->smtp->setDebugLevel($this->SMTPDebug); + $this->smtp->setDebugOutput($this->Debugoutput); + $this->smtp->setVerp($this->do_verp); + $hosts = explode(';', $this->Host); + $lastexception = null; + + foreach ($hosts as $hostentry) { + $hostinfo = []; + if ( + !preg_match( + '/^(?:(ssl|tls):\/\/)?(.+?)(?::(\d+))?$/', + trim($hostentry), + $hostinfo + ) + ) { + $this->edebug($this->lang('invalid_hostentry') . ' ' . trim($hostentry)); + //Not a valid host entry + continue; + } + //$hostinfo[1]: optional ssl or tls prefix + //$hostinfo[2]: the hostname + //$hostinfo[3]: optional port number + //The host string prefix can temporarily override the current setting for SMTPSecure + //If it's not specified, the default value is used + + //Check the host name is a valid name or IP address before trying to use it + if (!static::isValidHost($hostinfo[2])) { + $this->edebug($this->lang('invalid_host') . ' ' . $hostinfo[2]); + continue; + } + $prefix = ''; + $secure = $this->SMTPSecure; + $tls = (static::ENCRYPTION_STARTTLS === $this->SMTPSecure); + if ('ssl' === $hostinfo[1] || ('' === $hostinfo[1] && static::ENCRYPTION_SMTPS === $this->SMTPSecure)) { + $prefix = 'ssl://'; + $tls = false; //Can't have SSL and TLS at the same time + $secure = static::ENCRYPTION_SMTPS; + } elseif ('tls' === $hostinfo[1]) { + $tls = true; + //TLS doesn't use a prefix + $secure = static::ENCRYPTION_STARTTLS; + } + //Do we need the OpenSSL extension? + $sslext = defined('OPENSSL_ALGO_SHA256'); + if (static::ENCRYPTION_STARTTLS === $secure || static::ENCRYPTION_SMTPS === $secure) { + //Check for an OpenSSL constant rather than using extension_loaded, which is sometimes disabled + if (!$sslext) { + throw new Exception($this->lang('extension_missing') . 'openssl', self::STOP_CRITICAL); + } + } + $host = $hostinfo[2]; + $port = $this->Port; + if ( + array_key_exists(3, $hostinfo) && + is_numeric($hostinfo[3]) && + $hostinfo[3] > 0 && + $hostinfo[3] < 65536 + ) { + $port = (int) $hostinfo[3]; + } + if ($this->smtp->connect($prefix . $host, $port, $this->Timeout, $options)) { + try { + if ($this->Helo) { + $hello = $this->Helo; + } else { + $hello = $this->serverHostname(); + } + $this->smtp->hello($hello); + //Automatically enable TLS encryption if: + //* it's not disabled + //* we have openssl extension + //* we are not already using SSL + //* the server offers STARTTLS + if ($this->SMTPAutoTLS && $sslext && 'ssl' !== $secure && $this->smtp->getServerExt('STARTTLS')) { + $tls = true; + } + if ($tls) { + if (!$this->smtp->startTLS()) { + throw new Exception($this->lang('connect_host')); + } + //We must resend EHLO after TLS negotiation + $this->smtp->hello($hello); + } + if ( + $this->SMTPAuth && !$this->smtp->authenticate( + $this->Username, + $this->Password, + $this->AuthType, + $this->oauth + ) + ) { + throw new Exception($this->lang('authenticate')); + } + + return true; + } catch (Exception $exc) { + $lastexception = $exc; + $this->edebug($exc->getMessage()); + //We must have connected, but then failed TLS or Auth, so close connection nicely + $this->smtp->quit(); + } + } + } + //If we get here, all connection attempts have failed, so close connection hard + $this->smtp->close(); + //As we've caught all exceptions, just report whatever the last one was + if ($this->exceptions && null !== $lastexception) { + throw $lastexception; + } + + return false; + } + + /** + * Close the active SMTP session if one exists. + */ + public function smtpClose() + { + if ((null !== $this->smtp) && $this->smtp->connected()) { + $this->smtp->quit(); + $this->smtp->close(); + } + } + + /** + * Set the language for error messages. + * The default language is English. + * + * @param string $langcode ISO 639-1 2-character language code (e.g. French is "fr") + * Optionally, the language code can be enhanced with a 4-character + * script annotation and/or a 2-character country annotation. + * @param string $lang_path Path to the language file directory, with trailing separator (slash) + * Do not set this from user input! + * + * @return bool Returns true if the requested language was loaded, false otherwise. + */ + public function setLanguage($langcode = 'en', $lang_path = '') + { + //Backwards compatibility for renamed language codes + $renamed_langcodes = [ + 'br' => 'pt_br', + 'cz' => 'cs', + 'dk' => 'da', + 'no' => 'nb', + 'se' => 'sv', + 'rs' => 'sr', + 'tg' => 'tl', + 'am' => 'hy', + ]; + + if (array_key_exists($langcode, $renamed_langcodes)) { + $langcode = $renamed_langcodes[$langcode]; + } + + //Define full set of translatable strings in English + $PHPMAILER_LANG = [ + 'authenticate' => 'SMTP Error: Could not authenticate.', + 'buggy_php' => 'Your version of PHP is affected by a bug that may result in corrupted messages.' . + ' To fix it, switch to sending using SMTP, disable the mail.add_x_header option in' . + ' your php.ini, switch to MacOS or Linux, or upgrade your PHP to version 7.0.17+ or 7.1.3+.', + 'connect_host' => 'SMTP Error: Could not connect to SMTP host.', + 'data_not_accepted' => 'SMTP Error: data not accepted.', + 'empty_message' => 'Message body empty', + 'encoding' => 'Unknown encoding: ', + 'execute' => 'Could not execute: ', + 'extension_missing' => 'Extension missing: ', + 'file_access' => 'Could not access file: ', + 'file_open' => 'File Error: Could not open file: ', + 'from_failed' => 'The following From address failed: ', + 'instantiate' => 'Could not instantiate mail function.', + 'invalid_address' => 'Invalid address: ', + 'invalid_header' => 'Invalid header name or value', + 'invalid_hostentry' => 'Invalid hostentry: ', + 'invalid_host' => 'Invalid host: ', + 'mailer_not_supported' => ' mailer is not supported.', + 'provide_address' => 'You must provide at least one recipient email address.', + 'recipients_failed' => 'SMTP Error: The following recipients failed: ', + 'signing' => 'Signing Error: ', + 'smtp_code' => 'SMTP code: ', + 'smtp_code_ex' => 'Additional SMTP info: ', + 'smtp_connect_failed' => 'SMTP connect() failed.', + 'smtp_detail' => 'Detail: ', + 'smtp_error' => 'SMTP server error: ', + 'variable_set' => 'Cannot set or reset variable: ', + ]; + if (empty($lang_path)) { + //Calculate an absolute path so it can work if CWD is not here + $lang_path = dirname(__DIR__) . DIRECTORY_SEPARATOR . 'language' . DIRECTORY_SEPARATOR; + } + + //Validate $langcode + $foundlang = true; + $langcode = strtolower($langcode); + if ( + !preg_match('/^(?P[a-z]{2})(?P + + \ No newline at end of file diff --git a/sandbox310/src/docs/elements/avatars.html b/sandbox310/src/docs/elements/avatars.html new file mode 100644 index 0000000..cec9f3f --- /dev/null +++ b/sandbox310/src/docs/elements/avatars.html @@ -0,0 +1,132 @@ + + + + @@include('_head.html') + + +
+
+ @@include('_navbar.html', { + "classList": "center-nav transparent navbar-light", + "otherClassList": "w-100 d-flex ms-auto", + "otherLanguageSelect": true, + "otherBtn": true, + "otherBtnClassList": "btn-sm btn-primary rounded-pill", + "otherBtnText": "Contact", + "otherBtnLink": "@@webRoot/contact.html" + }) +
+ +
+
+
+
+

Avatars

+

Use our custom avatar styles on your profile images or initials.

+
+ +
+ +
+ +
+ +
+
+ @@include('docs/_sidebar.html', {"page": "elements-avatars"}) + + +
+
+

Letters

+

Use any size between .w-1 / .h-1 and .w-25 / .h-25 to change the avatar size.

+
+
+ TC + AH + CH +
+ + + + + +
+ +
+
+

Image

+

Use any size between .w-1 and .w-25 to change the image size. Image height will change automatically. Make sure to use images with 1:1 ratio to avoid stretching.

+
+
+ + + +
+ + + + + +
+ +
+
+ +
+ +
+ +
+ + @@include('docs/_footer.html') + @@include('_page-progress.html') + @@include('_scripts.html') + + \ No newline at end of file diff --git a/sandbox310/src/docs/elements/background.html b/sandbox310/src/docs/elements/background.html new file mode 100644 index 0000000..ef36cd5 --- /dev/null +++ b/sandbox310/src/docs/elements/background.html @@ -0,0 +1,357 @@ + + + + @@include('_head.html') + + +
+
+ @@include('_navbar.html', { + "classList": "center-nav transparent navbar-light", + "otherClassList": "w-100 d-flex ms-auto", + "otherLanguageSelect": true, + "otherBtn": true, + "otherBtnClassList": "btn-sm btn-primary rounded-pill", + "otherBtnText": "Contact", + "otherBtnLink": "@@webRoot/contact.html" + }) +
+ +
+
+
+
+

Background

+

Use our custom background styles to add image, color, pattern or video backgrounds to your sections.

+
+ +
+ +
+ +
+ +
+
+ @@include('docs/_sidebar.html', {"page": "elements-background"}) + + +
+
+

Image Background

+
+
+
+
+

Content goes here

+
+ +
+ +

.image-wrapper class enables background-attachment: fixed; to disable image from scrolling with the page; along with background-size: cover; which scales the image as large as possible to fill the container. You can use the following classes along with .image-wrapper to change these behaviors:

+
    +
  • .bg-auto Disables fixed background, changes background-size to auto.
  • +
  • .bg-full Disables fixed background, changes background-size to 100%.
  • +
  • .bg-cover Disables fixed background, but keeps background-size as cover.
  • +
+

To add overlay on the background images use .bg-overlay class:

+
    +
  • .bg-overlay Adds 50% overlay.
  • +
  • .bg-overlay.bg-overlay-300 Adds 30% overlay.
  • +
  • .bg-overlay.bg-overlay-400 Adds 40% overlay.
  • +
+
+ + + + + +
+ +
+
+

Dark Background

+
+
+
+
+

Content goes here

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

Gradient Background

+

Available options:

+

.gradient-1, .gradient-2, .gradient-3, .gradient-4, .gradient-5, .gradient-6, .gradient-7,

bg-gradient-primary, bg-gradient-aqua, bg-gradient-green, bg-gradient-leaf, bg-gradient-navy, bg-gradient-orange, bg-gradient-pink, bg-gradient-purple, bg-gradient-red, bg-gradient-violet, bg-gradient-yellow, bg-gradient-fuchsia, bg-gradient-sky, bg-gradient-grape, bg-gradient-reverse-primary, bg-gradient-reverse-aqua, bg-gradient-reverse-green, bg-gradient-reverse-leaf, bg-gradient-reverse-navy, bg-gradient-reverse-orange, bg-gradient-reverse-pink, bg-gradient-reverse-purple, bg-gradient-reverse-red, bg-gradient-reverse-violet, bg-gradient-reverse-yellow, bg-gradient-reverse-fuchsia, bg-gradient-reverse-sky, bg-gradient-reverse-grape.

+
+
+
+
+

Content goes here

+
+ +
+ +
+
+

Content goes here

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

Color Background

+

Available options:

+

bg-white, bg-primary, bg-aqua, bg-green, bg-leaf, bg-navy, bg-orange, bg-pink, bg-purple, bg-red, bg-violet, bg-yellow, bg-fuchsia, bg-sky, bg-grape.

+
+
+
+
+

Content goes here

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

Soft Background

+

Available options:

+

bg-soft-primary, bg-soft-aqua, bg-soft-green, bg-soft-leaf, bg-soft-navy, bg-soft-orange, bg-soft-pink, bg-soft-purple, bg-soft-red, bg-soft-violet, bg-soft-yellow, bg-soft-fuchsia, bg-soft-sky, bg-soft-grape.

+
+
+
+
+

Content goes here

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

Pale Background

+

Available options:

+

bg-pale-primary, bg-pale-aqua, bg-pale-green, bg-pale-leaf, bg-pale-navy, bg-pale-orange, bg-pale-pink, bg-pale-purple, bg-pale-red, bg-pale-violet, bg-pale-yellow, bg-pale-fuchsia, bg-pale-sky, bg-pale-grape.

+
+
+
+
+

Content goes here

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

Pattern Background

+
+
+
+
+

Content goes here

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

Video Background

+
+
+
+ +
+
+

Content goes here

+
+ +
+ +
+
+ + + + + +
+ +
+
+ +
+ +
+ +
+ + @@include('docs/_footer.html') + @@include('_page-progress.html') + @@include('_scripts.html') + + \ No newline at end of file diff --git a/sandbox310/src/docs/elements/badges.html b/sandbox310/src/docs/elements/badges.html new file mode 100644 index 0000000..fcd4e98 --- /dev/null +++ b/sandbox310/src/docs/elements/badges.html @@ -0,0 +1,217 @@ + + + + @@include('_head.html') + + +
+
+ @@include('_navbar.html', { + "classList": "center-nav transparent navbar-light", + "otherClassList": "w-100 d-flex ms-auto", + "otherLanguageSelect": true, + "otherBtn": true, + "otherBtnClassList": "btn-sm btn-primary rounded-pill", + "otherBtnText": "Contact", + "otherBtnLink": "@@webRoot/contact.html" + }) +
+ +
+
+
+
+

Badges

+

Use our custom badge styles to add a label compontent on your website. Bootstrap docs

+
+ +
+ +
+ +
+ +
+
+ @@include('docs/_sidebar.html', {"page": "elements-badges"}) + + +
+
+

Colors

+
+
+ Badge + Badge + Badge + Badge + Badge + Badge + Badge + Badge + Badge + Badge + Badge + Badge + Badge + Badge + Badge +
+ Badge + Badge + Badge + Badge + Badge + Badge + Badge + Badge + Badge + Badge + Badge + Badge + Badge + Badge + Badge +
+ + + + + +
+ +
+
+

Gradients

+
+
+ Badge + Badge + Badge + Badge + Badge + Badge + Badge +
+ + + + + +
+ +
+
+

Shapes

+
+
+ Square + Rounded + Pill +
+ + + + + +
+ +
+
+ +
+ +
+ +
+ + @@include('docs/_footer.html') + @@include('_page-progress.html') + @@include('_scripts.html') + + \ No newline at end of file diff --git a/sandbox310/src/docs/elements/breadcrumb.html b/sandbox310/src/docs/elements/breadcrumb.html new file mode 100644 index 0000000..86c8916 --- /dev/null +++ b/sandbox310/src/docs/elements/breadcrumb.html @@ -0,0 +1,125 @@ + + + + @@include('_head.html') + + +
+
+ @@include('_navbar.html', { + "classList": "center-nav transparent navbar-light", + "otherClassList": "w-100 d-flex ms-auto", + "otherLanguageSelect": true, + "otherBtn": true, + "otherBtnClassList": "btn-sm btn-primary rounded-pill", + "otherBtnText": "Contact", + "otherBtnLink": "@@webRoot/contact.html" + }) +
+ +
+
+
+
+

Breadcrumb

+

Indicate the current page’s location within a navigational hierarchy that automatically adds separators via CSS. Bootstrap docs

+
+ +
+ +
+ +
+ +
+
+ @@include('docs/_sidebar.html', {"page": "elements-breadcrumb"}) +
+
+

Examples

+
+
+ + + + +
+ + + + + +
+ +
+
+ +
+ +
+ +
+ + @@include('docs/_footer.html') + @@include('_page-progress.html') + @@include('_scripts.html') + + \ No newline at end of file diff --git a/sandbox310/src/docs/elements/buttons.html b/sandbox310/src/docs/elements/buttons.html new file mode 100644 index 0000000..0bf135d --- /dev/null +++ b/sandbox310/src/docs/elements/buttons.html @@ -0,0 +1,527 @@ + + + + @@include('_head.html') + + +
+
+ @@include('_navbar.html', { + "classList": "center-nav transparent navbar-light", + "otherClassList": "w-100 d-flex ms-auto", + "otherLanguageSelect": true, + "otherBtn": true, + "otherBtnClassList": "btn-sm btn-primary rounded-pill", + "otherBtnText": "Contact", + "otherBtnLink": "@@webRoot/contact.html" + }) +
+ +
+
+
+
+

Buttons

+

Use our custom button styles for actions in forms, dialogs, with support for multiple sizes, states, etc. Bootstrap docs

+
+ +
+ +
+ +
+ +
+
+ @@include('docs/_sidebar.html', {"page": "elements-buttons"}) + + +
+
+

Colors

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

Gradients

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

Sizes

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

Shapes

+
+
+ Square + Rounded + Pill +
+ + + + + +
+ +
+ +
+

Style

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

Circle

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

Social

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

Icon

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

Expand

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

Play

+
+
+ + +
+ + + + + +
+ +
+
+ +
+ +
+ +
+ + @@include('docs/_footer.html') + @@include('_page-progress.html') + @@include('_scripts.html') + + \ No newline at end of file diff --git a/sandbox310/src/docs/elements/card.html b/sandbox310/src/docs/elements/card.html new file mode 100644 index 0000000..aa2d9ba --- /dev/null +++ b/sandbox310/src/docs/elements/card.html @@ -0,0 +1,376 @@ + + + + @@include('_head.html') + + +
+
+ @@include('_navbar.html', { + "classList": "center-nav transparent navbar-light", + "otherClassList": "w-100 d-flex ms-auto", + "otherLanguageSelect": true, + "otherBtn": true, + "otherBtnClassList": "btn-sm btn-primary rounded-pill", + "otherBtnText": "Contact", + "otherBtnLink": "@@webRoot/contact.html" + }) +
+ +
+
+
+
+

Card

+

Cards provide a flexible and extensible content container with multiple variants and options. For further instructions on Bootstrap cards please visit Bootstrap docs

+
+ +
+ +
+ +
+ +
+
+ @@include('docs/_sidebar.html', {"page": "elements-card"}) + + +
+
+

Basic

+
+
+
+
+
+
+
Default
+

Etiam porta sem malesuada magna mollis euismod. Maecenas sed diam eget risus varius blandit sit amet non magna. Vivamus sagittis lacus augue.

+
+ +
+ +
+ +
+
+
+
Shadow
+

Etiam porta sem malesuada magna mollis euismod. Maecenas sed diam eget risus varius blandit sit amet non magna. Vivamus sagittis lacus augue.

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

Color

+
+
+
+
+
+
+
Solid
+

Sed posuere consectetur est at lobortis. Duis mollis, commodo luctus.

+
+ +
+ +
+ +
+
+
+
Pale
+

Sed posuere consectetur est at lobortis. Duis mollis, commodo luctus.

+
+ +
+ +
+ +
+
+
+
Soft
+

Sed posuere consectetur est at lobortis. Duis mollis, commodo luctus.

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

Border

+

Available options:

+

border-primary, border-aqua, border-green, border-leaf, border-navy, border-orange, border-pink, border-purple, border-red, border-violet, border-yellow, border-fuchsia, border-sky, border-grape, border-soft-primary, border-soft-aqua, border-soft-green, border-soft-leaf, border-soft-navy, border-soft-orange, border-soft-pink, border-soft-purple, border-soft-red, border-soft-violet, border-soft-yellow, border-soft-fuchsia, border-soft-sky, border-soft-grape.

+
+
+
+
+
+
+
Start
+

Sed posuere consectetur est at lobortis. Duis mollis, commodo luctus, nisi erat porttitor ligula, eget lacinia.

+
+ +
+ +
+ +
+
+
+
Top
+

Sed posuere consectetur est at lobortis. Duis mollis, commodo luctus, nisi erat porttitor ligula, eget lacinia.

+
+ +
+ +
+ +
+
+
+
Bottom
+

Sed posuere consectetur est at lobortis. Duis mollis, commodo luctus, nisi erat porttitor ligula, eget lacinia.

+
+ +
+ +
+ +
+
+
+
End
+

Sed posuere consectetur est at lobortis. Duis mollis, commodo luctus, nisi erat porttitor ligula, eget lacinia.

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

Image

+
+
+
+
+
+ +
+
Image Cap Top
+

Etiam porta sem malesuada magna mollis euismod. Maecenas sed diam eget risus varius blandit sit amet non magna. Vivamus sagittis lacus augue.

+
+ +
+ +
+ +
+
+
+
Image Cap Bottom
+

Etiam porta sem malesuada magna mollis euismod. Maecenas sed diam eget risus varius blandit sit amet non magna. Vivamus sagittis lacus augue.

+
+ + +
+ +
+ +
+ +
+ + + + + +
+ +
+
+ +
+ +
+ +
+ + @@include('docs/_footer.html') + @@include('_page-progress.html') + @@include('_scripts.html') + + \ No newline at end of file diff --git a/sandbox310/src/docs/elements/carousel.html b/sandbox310/src/docs/elements/carousel.html new file mode 100644 index 0000000..9c91f2d --- /dev/null +++ b/sandbox310/src/docs/elements/carousel.html @@ -0,0 +1,742 @@ + + + + @@include('_head.html') + + +
+
+ @@include('_navbar.html', { + "classList": "center-nav transparent navbar-light", + "otherClassList": "w-100 d-flex ms-auto", + "otherLanguageSelect": true, + "otherBtn": true, + "otherBtnClassList": "btn-sm btn-primary rounded-pill", + "otherBtnText": "Contact", + "otherBtnLink": "@@webRoot/contact.html" + }) +
+ +
+
+
+
+

Carousel

+

Here you can find simple carousel examples and usage instructions. For further carousel documentation please visit Swiper docs

+
+ +
+ +
+ +
+ +
+
+ @@include('docs/_sidebar.html', {"page": "elements-carousel"}) + + +
+
+

Simple Carousel

+
+
+
+
+
+
+
+
+
Read More
+
+
+
+ +
+
+
+
Read More
+
+
+
+ +
+
+
+
Read More
+
+
+
+ +
+
+
+
Read More
+
+
+
+ +
+
+
+
Read More
+
+
+
+ +
+ +
+ +
+ +
+ + + + + +
+ +
+
+

Card Carousel

+
+
+
+
+
+
+
+
+
+
+

Duis mollis est non commodo luctu, nisi erat porttitor ligula, eget lacinia odio sem nec elit. Nullam quis risus eget urna mollis ornare vel. Nulla vitae elit libero, a pharetra augue. Praesent commodo cursus magna vel scelerisque nisl consectetur et.

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

Duis mollis est non commodo luctu, nisi erat porttitor ligula, eget lacinia odio sem nec elit. Nullam quis risus eget urna mollis ornare vel. Nulla vitae elit libero, a pharetra augue. Praesent commodo cursus magna vel scelerisque nisl consectetur et.

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

Duis mollis est non commodo luctu, nisi erat porttitor ligula, eget lacinia odio sem nec elit. Nullam quis risus eget urna mollis ornare vel. Nulla vitae elit libero, a pharetra augue. Praesent commodo cursus magna vel scelerisque nisl consectetur et.

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

Duis mollis est non commodo luctu, nisi erat porttitor ligula, eget lacinia odio sem nec elit. Nullam quis risus eget urna mollis ornare vel. Nulla vitae elit libero, a pharetra augue. Praesent commodo cursus magna vel scelerisque nisl consectetur et.

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

Text Slider

+
+
+
+
+
+
+

Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Cras mattis consectetur purus sit amet fermentum. Maecenas faucibus mollis interdum.

+
+ +
+

Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Cras mattis consectetur purus sit amet fermentum. Maecenas faucibus mollis interdum.

+
+ +
+

Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Cras mattis consectetur purus sit amet fermentum. Maecenas faucibus mollis interdum.

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

Image Slider

+

Remove .dots-over class to move bullets below the images.

+

Use any available .m-*, .p-*, .bg-* and .text-* helper class to style and place the captions. You can change their placement with the help of flex classes as well.

+

Use animate.css animation and utility classes to add animations and delays to captions.

+

For hero slider (slider with fixed height and background cover images) with captions example check out Demo 15

+
+
+
+
+
+
+ +
+
Vivamus sagittis lacus augue
+ +
+ +
+ +
+ +
+
Vivamus sagittis lacus augue
+ +
+ +
+ +
+
+ +
+ +
+ +
+ + + + + +
+ +
+
+

Thumbnail Slider

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

Instructions

+
+
+

Data Attributes

+

Specifically created for the template to be used on HTML. Apply any attribute to .swiper-container to set swiper options.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AttributeDefaultOptionsDescription
data-effectslideslide | fadeSlide transition effect.
data-items3numberNumber of items per view in all devices.
data-items-xs1numberNumber of items on screen width 0 - 575px
data-items-smitems-xsnumberNumber of items on screen width 576px - 767px
data-items-mditems-smnumberNumber of items on screen width 768px - 991px
data-items-lgitems-mdnumberNumber of items on screen width 992px - 1199px
data-items-xlitems-lgnumberNumber of items on screen width 1200px - 1400px
data-items-xxlitems-xlnumberNumber of items on screen width 1400px and above
data-speed500numberDuration of transition between slides (in ms).
data-autoplayfalsetrue | falseEnable/disable autoplay.
data-autoplaytime5000number

Delay between transitions (in ms).

+

If you need to specify different delay for specific slides you can do it by using data-swiper-autoplay (in ms) attribute on slide.

data-autoheightfalsetrue | falseSet to true and slider wrapper will adapt its height to the height of the currently active slide.
data-margin30numberDistance between slides in px.
data-loopfalsetrue | falseSet to true to enable continuous loop mode.
data-navfalsetrue | falseEnable/disable navigation arrows.
data-dotsfalsetrue | falseEnable/disable pagination bullets.
+

Alternative styles for controls

+

Use the following classes with .swiper-container to change navigation styles.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ClassDescription
.swiper-heroEnables hero slider. Example: Demo 15
.nav-darkChanges arrow background to primary color.
.nav-bottomMoves arrows below the slider.
.nav-startMoves arrows from center to left. To be used with .nav-bottom.
.dots-lightChanges bullet colors to white.
.dots-startMoves bullets from center to left.
.dots-overMoves bullets on the slider.
.dots-closerMoves bullets closer below the slider.
+

Full examples

+ Blog Blocks, Testimonials Blocks, Portfolio Blocks, Client Blocks

+
+ +
+ +
+
+ +
+ +
+ +
+ + @@include('docs/_footer.html') + @@include('_page-progress.html') + @@include('_scripts.html') + + \ No newline at end of file diff --git a/sandbox310/src/docs/elements/dividers.html b/sandbox310/src/docs/elements/dividers.html new file mode 100644 index 0000000..e6d0c84 --- /dev/null +++ b/sandbox310/src/docs/elements/dividers.html @@ -0,0 +1,240 @@ + + + + @@include('_head.html') + + +
+
+ @@include('_navbar.html', { + "classList": "center-nav transparent navbar-light", + "otherClassList": "w-100 d-flex ms-auto", + "otherLanguageSelect": true, + "otherBtn": true, + "otherBtnClassList": "btn-sm btn-primary rounded-pill", + "otherBtnText": "Contact", + "otherBtnLink": "@@webRoot/contact.html" + }) +
+ +
+
+
+
+

Dividers

+

Use our custom dividers to divide sections or elements.

+
+ +
+ +
+ +
+ +
+
+ @@include('docs/_sidebar.html', {"page": "elements-dividers"}) + + +
+
+

Borders

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

Angles

+
+
+
Lower Start
+
Lower End
+
Upper Start
+
Upper End
+
Upper End & Lower Start
+
Upper Start & Lower End
+
Upper Start & Lower Start
+
Upper End & Lower End
+
+ + + + + +
+ +
+
+

Waves

+
+
+
+

Wave 1

+
+
+ +
+

Wave 2

+
+
+ +
+

Wave 3

+
+
+ +
+

Wave 4

+
+
+ +
+

Wave 5

+
+
+ +
+ + + + + +
+ +
+
+ +
+ +
+ +
+ + @@include('docs/_footer.html') + @@include('_page-progress.html') + @@include('_scripts.html') + + \ No newline at end of file diff --git a/sandbox310/src/docs/elements/form-elements.html b/sandbox310/src/docs/elements/form-elements.html new file mode 100644 index 0000000..a4ad4d2 --- /dev/null +++ b/sandbox310/src/docs/elements/form-elements.html @@ -0,0 +1,284 @@ + + + + @@include('_head.html') + + +
+
+ @@include('_navbar.html', { + "classList": "center-nav transparent navbar-light", + "otherClassList": "w-100 d-flex ms-auto", + "otherLanguageSelect": true, + "otherBtn": true, + "otherBtnClassList": "btn-sm btn-primary rounded-pill", + "otherBtnText": "Contact", + "otherBtnLink": "@@webRoot/contact.html" + }) +
+ +
+
+
+
+

Form Elements

+

Some examples for form control styles. For more detailed examples and guidelines please visit Bootstrap docs

+
+ +
+ +
+ +
+ +
+
+ @@include('docs/_sidebar.html', {"page": "elements-form-elements"}) + + +
+
+

Input

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

Textarea

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

Checks

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

Radios

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

Disabled

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

Select

+
+
+
+ +
+
+ + + + + +
+ +
+
+ +
+ +
+ +
+ + @@include('docs/_footer.html') + @@include('_page-progress.html') + @@include('_scripts.html') + + \ No newline at end of file diff --git a/sandbox310/src/docs/elements/image-hover.html b/sandbox310/src/docs/elements/image-hover.html new file mode 100644 index 0000000..b066c98 --- /dev/null +++ b/sandbox310/src/docs/elements/image-hover.html @@ -0,0 +1,359 @@ + + + + @@include('_head.html') + + +
+
+ @@include('_navbar.html', { + "classList": "center-nav transparent navbar-light", + "otherClassList": "w-100 d-flex ms-auto", + "otherLanguageSelect": true, + "otherBtn": true, + "otherBtnClassList": "btn-sm btn-primary rounded-pill", + "otherBtnText": "Contact", + "otherBtnLink": "@@webRoot/contact.html" + }) +
+ +
+
+
+
+

Image Hover

+

Use our custom hover styles to add hover state to your images and elements.

+
+ +
+ +
+ +
+ +
+
+ @@include('docs/_sidebar.html', {"page": "elements-hover"}) + + +
+
+

Tooltip

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

Overlay

+
+
+
+
+
+
+
Some Title
+
+
+
+ +
+
+
+
Some Title
+

Some Description

+
+
+
+ +
+
+
+
Some Title
+

Some Description

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

Simple

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

Cursor

+
+
+
+
+
+
+ +
+
+
+ +
+
+
+ +
+ +
+ + + + + +
+ +
+
+ +
+ +
+ +
+ + @@include('docs/_footer.html') + @@include('_page-progress.html') + @@include('_scripts.html') + + \ No newline at end of file diff --git a/sandbox310/src/docs/elements/image-mask.html b/sandbox310/src/docs/elements/image-mask.html new file mode 100644 index 0000000..c2a9939 --- /dev/null +++ b/sandbox310/src/docs/elements/image-mask.html @@ -0,0 +1,124 @@ + + + + @@include('_head.html') + + +
+
+ @@include('_navbar.html', { + "classList": "center-nav transparent navbar-light", + "otherClassList": "w-100 d-flex ms-auto", + "otherLanguageSelect": true, + "otherBtn": true, + "otherBtnClassList": "btn-sm btn-primary rounded-pill", + "otherBtnText": "Contact", + "otherBtnLink": "@@webRoot/contact.html" + }) +
+ +
+
+
+
+

Image Mask

+

Apply custom SVG shapes to your images.

+
+ +
+ +
+ +
+ +
+
+ @@include('docs/_sidebar.html', {"page": "elements-mask"}) + + +
+
+

Mask 1

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

Mask 2

+
+
+
+
+
+
+ +
+ +
+ + + + + +
+ +
+
+ +
+ +
+ +
+ + @@include('docs/_footer.html') + @@include('_page-progress.html') + @@include('_scripts.html') + + \ No newline at end of file diff --git a/sandbox310/src/docs/elements/lightbox.html b/sandbox310/src/docs/elements/lightbox.html new file mode 100644 index 0000000..9bf056f --- /dev/null +++ b/sandbox310/src/docs/elements/lightbox.html @@ -0,0 +1,202 @@ + + + + @@include('_head.html') + + +
+
+ @@include('_navbar.html', { + "classList": "center-nav transparent navbar-light", + "otherClassList": "w-100 d-flex ms-auto", + "otherLanguageSelect": true, + "otherBtn": true, + "otherBtnClassList": "btn-sm btn-primary rounded-pill", + "otherBtnText": "Contact", + "otherBtnLink": "@@webRoot/contact.html" + }) +
+ +
+
+
+
+

Lightbox

+

Examples and instructions on how to add lightbox functionality to your image or video links.

+
+ +
+ +
+ +
+ +
+
+ @@include('docs/_sidebar.html', {"page": "elements-lightbox"}) + + +
+
+

Instructions

+
+
+

Use data-glightbox attribute to enable lightbox functionality on your image and video links.

+

To group images together, use data-gallery="group-name" attribute. This will enable navigation between images that have the same attribute value.

+
+ +
+ +
+
+

Image & Caption

+
+
+
+
+
+ +
+
Image
+
+
+
+ +
+
+ +
+
Simple Caption
+
+
+
+ +
+
+ +
+
Advanced Caption
+
+
+
+

This div will be used as the image description. HTML is supported.

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

Video

+
+
+
+
+
+ +
+
Vimeo
+
+
+
+ +
+
+ +
+
YouTube
+
+
+
+ +
+
+ +
+
HTML5
+
+
+
+ +
+ +
+ + + + + +
+ +
+
+ +
+ +
+ +
+ + @@include('docs/_footer.html') + @@include('_page-progress.html') + @@include('_scripts.html') + + \ No newline at end of file diff --git a/sandbox310/src/docs/elements/modal.html b/sandbox310/src/docs/elements/modal.html new file mode 100644 index 0000000..517786c --- /dev/null +++ b/sandbox310/src/docs/elements/modal.html @@ -0,0 +1,423 @@ + + + + @@include('_head.html') + + +
+
+ @@include('_navbar.html', { + "classList": "center-nav transparent navbar-light", + "otherClassList": "w-100 d-flex ms-auto", + "otherLanguageSelect": true, + "otherBtn": true, + "otherBtnClassList": "btn-sm btn-primary rounded-pill", + "otherBtnText": "Contact", + "otherBtnLink": "@@webRoot/contact.html" + }) +
+ +
+
+
+
+

Modal

+

Use Bootstrap’s modal plugin with our custom styles to add dialogs to your site for notifications or completely custom content. Bootstrap docs

+
+ +
+ +
+ +
+ +
+
+ @@include('docs/_sidebar.html', {"page": "elements-modal"}) + + +
+
+

Cookie

+
+
+ Cookie + + +
+ + + + + +
+ +
+
+

Subscription

+
+
+ Subscription + + +
+ + + + + +
+ +
+
+

Sign In

+
+
+ Sign In + @@include('_menu-others-modal.html') +
+ + + + + +
+ +
+
+

Sign Up

+
+
+ Sign Up +
+ + + + + +
+ +
+
+

Popup

+

To display any modal as a popup on your page, add .modal-popup class to your .modal.

+

Check out a live example: Demo 12.

+
+ + + + +
+ +
+
+ +
+ +
+ +
+ + @@include('docs/_footer.html') + @@include('_page-progress.html') + @@include('_scripts.html') + + \ No newline at end of file diff --git a/sandbox310/src/docs/elements/player.html b/sandbox310/src/docs/elements/player.html new file mode 100644 index 0000000..9d66d8b --- /dev/null +++ b/sandbox310/src/docs/elements/player.html @@ -0,0 +1,172 @@ + + + + @@include('_head.html') + + +
+
+ @@include('_navbar.html', { + "classList": "center-nav transparent navbar-light", + "otherClassList": "w-100 d-flex ms-auto", + "otherLanguageSelect": true, + "otherBtn": true, + "otherBtnClassList": "btn-sm btn-primary rounded-pill", + "otherBtnText": "Contact", + "otherBtnLink": "@@webRoot/contact.html" + }) +
+ +
+
+
+
+

Media Player

+

Examples on how to add videos with the included responsive media player. For further instructions on the plugin please visit Plyr docs

+
+ +
+ +
+ +
+ +
+
+ @@include('docs/_sidebar.html', {"page": "elements-player"}) + + +
+
+

HTML5 Video - plyr

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

Vimeo - plyr

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

YouTube - plyr

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

Responsive Embed

+
+
+
+ +
+ +
+ + + + + +
+ +
+
+ +
+ +
+ +
+ + @@include('docs/_footer.html') + @@include('_page-progress.html') + @@include('_scripts.html') + + \ No newline at end of file diff --git a/sandbox310/src/docs/elements/progressbar.html b/sandbox310/src/docs/elements/progressbar.html new file mode 100644 index 0000000..1a80494 --- /dev/null +++ b/sandbox310/src/docs/elements/progressbar.html @@ -0,0 +1,201 @@ + + + + @@include('_head.html') + + +
+
+ @@include('_navbar.html', { + "classList": "center-nav transparent navbar-light", + "otherClassList": "w-100 d-flex ms-auto", + "otherLanguageSelect": true, + "otherBtn": true, + "otherBtnClassList": "btn-sm btn-primary rounded-pill", + "otherBtnText": "Contact", + "otherBtnLink": "@@webRoot/contact.html" + }) +
+ +
+
+
+
+

Progressbar

+

Examples and instructions on how to add colorful progressbars on your website.

+
+ +
+ +
+ +
+ +
+
+ @@include('docs/_sidebar.html', {"page": "elements-progressbar"}) + + +
+
+

Line

+

Available color options:

+

primary, aqua, green, leaf, navy, orange, pink, purple, red, violet, yellow, fuchsia, sky, grape, soft-primary, soft-aqua, soft-green, soft-leaf, soft-navy, soft-orange, soft-pink, soft-purple, soft-red, soft-violet, soft-yellow, soft-fuchsia, soft-sky, soft-grape

+
+
+
+
+
    +
  • +

    Marketing

    +
    +
  • +
  • +

    Strategy

    +
    +
  • +
  • +

    Development

    +
    +
  • +
  • +

    Stabilization

    +
    +
  • +
+ +
    +
  • +

    Marketing

    +
    +
  • +
  • +

    Strategy

    +
    +
  • +
  • +

    Development

    +
    +
  • +
  • +

    Stabilization

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

Semi Circle

+

Available color options:

+

primary, aqua, green, leaf, navy, orange, pink, purple, red, violet, yellow, fuchsia, sky, grape, soft-primary, soft-aqua, soft-green, soft-leaf, soft-navy, soft-orange, soft-pink, soft-purple, soft-red, soft-violet, soft-yellow, soft-fuchsia, soft-sky, soft-grape

+
+
+
+
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+ +
+ + + + + +
+ +
+
+ +
+ +
+ +
+ + @@include('docs/_footer.html') + @@include('_page-progress.html') + @@include('_scripts.html') + + \ No newline at end of file diff --git a/sandbox310/src/docs/elements/shadows.html b/sandbox310/src/docs/elements/shadows.html new file mode 100644 index 0000000..ea802f7 --- /dev/null +++ b/sandbox310/src/docs/elements/shadows.html @@ -0,0 +1,81 @@ + + + + @@include('_head.html') + + +
+
+ @@include('_navbar.html', { + "classList": "center-nav transparent navbar-light", + "otherClassList": "w-100 d-flex ms-auto", + "otherLanguageSelect": true, + "otherBtn": true, + "otherBtnClassList": "btn-sm btn-primary rounded-pill", + "otherBtnText": "Contact", + "otherBtnLink": "@@webRoot/contact.html" + }) +
+ +
+
+
+
+

Shadows

+

Add or remove shadows to elements with box-shadow utilities. Bootstrap docs

+
+ +
+ +
+ +
+ +
+
+ @@include('docs/_sidebar.html', {"page": "elements-shadows"}) + +
+
+

Examples

+
+
+
No shadow
+
Small shadow
+
Regular shadow
+
Larger shadow
+
+ + + + + +
+ +
+
+ +
+ +
+ +
+ + @@include('docs/_footer.html') + @@include('_page-progress.html') + @@include('_scripts.html') + + \ No newline at end of file diff --git a/sandbox310/src/docs/elements/shapes.html b/sandbox310/src/docs/elements/shapes.html new file mode 100644 index 0000000..874b16f --- /dev/null +++ b/sandbox310/src/docs/elements/shapes.html @@ -0,0 +1,357 @@ + + + + @@include('_head.html') + + +
+
+ @@include('_navbar.html', { + "classList": "center-nav transparent navbar-light", + "otherClassList": "w-100 d-flex ms-auto", + "otherLanguageSelect": true, + "otherBtn": true, + "otherBtnClassList": "btn-sm btn-primary rounded-pill", + "otherBtnText": "Contact", + "otherBtnLink": "@@webRoot/contact.html" + }) +
+ +
+
+
+
+

Shapes

+

Use our custom shapes to add on your pages.

+
+ +
+ +
+ +
+ +
+
+ @@include('docs/_sidebar.html', {"page": "elements-shapes"}) + + +
+
+

Dot

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

Line

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

Solid

+

All background color options (solid, soft, pale) are available to use.

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

SVG

+

Available color options:

+

primary, aqua, green, leaf, navy, orange, pink, purple, red, violet, yellow, fuchsia, sky, grape, pale-primary, pale-aqua, pale-green, pale-leaf, pale-navy, pale-orange, pale-pink, pale-purple, pale-red, pale-violet, pale-yellow, pale-fuchsia, pale-sky, pale-grape, soft-primary, soft-aqua, soft-green, soft-leaf, soft-navy, soft-orange, soft-pink, soft-purple, soft-red, soft-violet, soft-yellow, soft-fuchsia, soft-sky, soft-grape.

+
+
+
+
+
+
+ +
+
+
+ +
+
+
+ +
+ +
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+ +
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+ +
+ +
+ +
+ + + + + +
+ +
+
+ +
+ +
+ +
+ + @@include('docs/_footer.html') + @@include('_page-progress.html') + @@include('_scripts.html') + + \ No newline at end of file diff --git a/sandbox310/src/docs/elements/tables.html b/sandbox310/src/docs/elements/tables.html new file mode 100644 index 0000000..6782a65 --- /dev/null +++ b/sandbox310/src/docs/elements/tables.html @@ -0,0 +1,477 @@ + + + + @@include('_head.html') + + +
+
+ @@include('_navbar.html', { + "classList": "center-nav transparent navbar-light", + "otherClassList": "w-100 d-flex ms-auto", + "otherLanguageSelect": true, + "otherBtn": true, + "otherBtnClassList": "btn-sm btn-primary rounded-pill", + "otherBtnText": "Contact", + "otherBtnLink": "@@webRoot/contact.html" + }) +
+ +
+
+
+
+

Tables

+

Some examples for displaying tables. For more detailed examples and guidelines please visit Bootstrap docs

+
+ +
+ +
+ +
+ +
+
+ @@include('docs/_sidebar.html', {"page": "elements-tables"}) + + +
+
+

Simple

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
#FirstLastHandle
1MarkOtto@mdo
2JacobThornton@fat
3Larry the Bird@twitter
+
+ + + + + +
+ +
+
+

Simple Dark

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
#FirstLastHandle
1MarkOtto@mdo
2JacobThornton@fat
3Larry the Bird@twitter
+
+ + + + + +
+ +
+
+

Striped

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
#FirstLastHandle
1MarkOtto@mdo
2JacobThornton@fat
3Larry the Bird@twitter
+
+ + + + + +
+ +
+
+

Bordered

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
#FirstLastHandle
1MarkOtto@mdo
2JacobThornton@fat
3Larry the Bird@twitter
+
+ + + + + +
+ +
+
+

Borderless

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
#FirstLastHandle
1MarkOtto@mdo
2JacobThornton@fat
3Larry the Bird@twitter
+
+ + + + + +
+ +
+
+

Hoverable Rows

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
#FirstLastHandle
1MarkOtto@mdo
2JacobThornton@fat
3Larry the Bird@twitter
+
+ + + + + +
+ +
+
+

Responsive

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
#FirstLastHandle
1MarkOtto@mdo
2JacobThornton@fat
3Larry the Bird@twitter
+
+
+ + + + + +
+ +
+
+ +
+ +
+ +
+ + @@include('docs/_footer.html') + @@include('_page-progress.html') + @@include('_scripts.html') + + \ No newline at end of file diff --git a/sandbox310/src/docs/elements/tabs.html b/sandbox310/src/docs/elements/tabs.html new file mode 100644 index 0000000..6d6b6fb --- /dev/null +++ b/sandbox310/src/docs/elements/tabs.html @@ -0,0 +1,312 @@ + + + + @@include('_head.html') + + +
+
+ @@include('_navbar.html', { + "classList": "center-nav transparent navbar-light", + "otherClassList": "w-100 d-flex ms-auto", + "otherLanguageSelect": true, + "otherBtn": true, + "otherBtnClassList": "btn-sm btn-primary rounded-pill", + "otherBtnText": "Contact", + "otherBtnLink": "@@webRoot/contact.html" + }) +
+ +
+
+
+
+

Tabs

+

Use our custom tabs to add tabbed interfaces on your website. Bootstrap docs

+
+ +
+ +
+ +
+ +
+
+ @@include('docs/_sidebar.html', {"page": "elements-tabs"}) + + +
+
+

Basic

+
+
+ + +
+
+

Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Vestibulum id ligula porta felis euismod semper. Lorem ipsum dolor sit amet, consectetur adipiscing elit.

+

Donec sed odio dui. Donec sed odio dui. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Maecenas faucibus mollis interdum.

+
    +
  • Aenean eu leo quam. Pellentesque ornare.
  • +
  • Nullam quis risus eget urna mollis ornare.
  • +
  • Donec id elit non mi porta gravida at eget.
  • +
  • Fusce dapibus, tellus ac cursus commodo.
  • +
+
+ +
+

Sed posuere consectetur est at lobortis. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Maecenas faucibus mollis interdum. Maecenas faucibus mollis interdum. Sed posuere consectetur est at lobortis. Vestibulum id ligula porta felis euismod.

+

Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor vel scelerisque nisl.

+

Maecenas faucibus mollis interdum. Sed posuere consectetur est at lobortis. Maecenas sed diam eget risus varius blandit sit amet non magna. Donec id elit non mi porta gravida at eget metus. Curabitur blandit tempus porttitor. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus.

+
+ +
+

Vestibulum id ligula porta felis euismod semper. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus.

+

Morbi leo risus, porta ac consectetur ac, vestibulum at eros. Nullam id dolor id nibh ultricies vehicula ut id elit. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Maecenas sed diam eget risus varius blandit sit amet non magna.

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

Pills

+
+
+ + +
+
+

Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Vestibulum id ligula porta felis euismod semper. Lorem ipsum dolor sit amet, consectetur adipiscing elit.

+

Donec sed odio dui. Donec sed odio dui. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Maecenas faucibus mollis interdum.

+
    +
  • Aenean eu leo quam. Pellentesque ornare.
  • +
  • Nullam quis risus eget urna mollis ornare.
  • +
  • Donec id elit non mi porta gravida at eget.
  • +
  • Fusce dapibus, tellus ac cursus commodo.
  • +
+
+ +
+

Sed posuere consectetur est at lobortis. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Maecenas faucibus mollis interdum. Maecenas faucibus mollis interdum. Sed posuere consectetur est at lobortis. Vestibulum id ligula porta felis euismod.

+

Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor vel scelerisque nisl.

+

Maecenas faucibus mollis interdum. Sed posuere consectetur est at lobortis. Maecenas sed diam eget risus varius blandit sit amet non magna. Donec id elit non mi porta gravida at eget metus. Curabitur blandit tempus porttitor. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus.

+
+ +
+

Vestibulum id ligula porta felis euismod semper. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus.

+

Morbi leo risus, porta ac consectetur ac, vestibulum at eros. Nullam id dolor id nibh ultricies vehicula ut id elit. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Maecenas sed diam eget risus varius blandit sit amet non magna.

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

Justified

+

Check out a live example: Demo 9.

+
+
+ + +
+
+

Etiam porta sem malesuada magna mollis euismod. Donec ullamcorper nulla non metus auctor fringilla. Morbi leo risus, porta ac consectetur ac, vestibulum at eros. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam quis risus eget urna. Curabitur blandit tempus porttitor. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Maecenas faucibus mollis interdum. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum.

+
+ +
+

Etiam porta sem malesuada magna mollis euismod. Donec ullamcorper nulla non metus auctor fringilla. Morbi leo risus, porta ac consectetur ac, vestibulum at eros. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam quis risus eget urna. Curabitur blandit tempus porttitor. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Maecenas faucibus mollis interdum. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum.

+
+ +
+ +
+ + + + + +
+ +
+
+ +
+ +
+ +
+ + @@include('docs/_footer.html') + @@include('_page-progress.html') + @@include('_scripts.html') + + \ No newline at end of file diff --git a/sandbox310/src/docs/elements/text-animations.html b/sandbox310/src/docs/elements/text-animations.html new file mode 100644 index 0000000..fbbd98b --- /dev/null +++ b/sandbox310/src/docs/elements/text-animations.html @@ -0,0 +1,165 @@ + + + + @@include('_head.html') + + +
+
+ @@include('_navbar.html', { + "classList": "center-nav transparent navbar-light", + "otherClassList": "w-100 d-flex ms-auto", + "otherLanguageSelect": true, + "otherBtn": true, + "otherBtnClassList": "btn-sm btn-primary rounded-pill", + "otherBtnText": "Contact", + "otherBtnLink": "@@webRoot/contact.html" + }) +
+ +
+
+
+
+

Text Animations

+

Add animations to text easily with pure HTML interface. For further plugin documentation please visit Typer.js docs or ReplaceMe.js docs

+
+ +
+ +
+ +
+ +
+
+ @@include('docs/_sidebar.html', {"page": "elements-text-animations"}) + + +
+
+

Typer

+
+
+
+
+

Sandbox is effortless and powerful with

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

Typer with Loop

+
+
+
+
+

Sandbox focuses on

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

Rotator

+
+
+
+
+

Sandbox is effortless and powerful with easy usage,fast transactions,secure payments

+
+ +
+ +
+ + + + + +
+ +
+
+ +
+ +
+ +
+ + @@include('docs/_footer.html') + @@include('_page-progress.html') + @@include('_scripts.html') + + \ No newline at end of file diff --git a/sandbox310/src/docs/elements/text-highlight.html b/sandbox310/src/docs/elements/text-highlight.html new file mode 100644 index 0000000..2c35eef --- /dev/null +++ b/sandbox310/src/docs/elements/text-highlight.html @@ -0,0 +1,250 @@ + + + + @@include('_head.html') + + +
+
+ @@include('_navbar.html', { + "classList": "center-nav transparent navbar-light", + "otherClassList": "w-100 d-flex ms-auto", + "otherLanguageSelect": true, + "otherBtn": true, + "otherBtnClassList": "btn-sm btn-primary rounded-pill", + "otherBtnText": "Contact", + "otherBtnLink": "@@webRoot/contact.html" + }) +
+ +
+
+
+
+

Text Highlight

+

Use our custom text highlight styles to mark important text on your website.

+
+ +
+ +
+ +
+ +
+
+ @@include('docs/_sidebar.html', {"page": "elements-text-highlight"}) + + + +
+
+

Underline

+
+
+

Build and manage an impressive website with Sandbox in no time.

+
+ + + + + +
+ +
+
+

Underline 2

+
+
+

Build and manage an impressive website with Sandbox in no time.

+

Build and manage an impressive website with Sandbox in no time.

+
+ + + + + +
+ +
+
+

Underline 3

+
+
+

Build and manage an impressive website with Sandbox in no time.

+

Build and manage an impressive website with Sandbox in no time.

+

Build and manage an impressive website with Sandbox in no time.

+
+ + + + + +
+ +
+
+

Mark

+
+
+

We bring rapid solutions for your business.

+
+ + + + + +
+ +
+
+ +
+ +
+ +
+ + @@include('docs/_footer.html') + @@include('_page-progress.html') + @@include('_scripts.html') + + \ No newline at end of file diff --git a/sandbox310/src/docs/elements/tiles.html b/sandbox310/src/docs/elements/tiles.html new file mode 100644 index 0000000..c0c2007 --- /dev/null +++ b/sandbox310/src/docs/elements/tiles.html @@ -0,0 +1,660 @@ + + + + @@include('_head.html') + + +
+
+ @@include('_navbar.html', { + "classList": "center-nav transparent navbar-light", + "otherClassList": "w-100 d-flex ms-auto", + "otherLanguageSelect": true, + "otherBtn": true, + "otherBtnClassList": "btn-sm btn-primary rounded-pill", + "otherBtnText": "Contact", + "otherBtnLink": "@@webRoot/contact.html" + }) +
+ +
+
+
+
+

Tiles

+

Use our tile options to arrange images with appealing styles.

+
+ +
+ +
+ +
+ +
+
+ @@include('docs/_sidebar.html', {"page": "elements-tiles"}) + + +
+
+

Tiles 1

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

Tiles 2

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

Tiles 3

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

Tiles 4

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

Tiles 5

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

Tiles 6

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

Tiles 7

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

Tiles 8

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

Tiles 9

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

Tiles 10

+
+
+
+
+
+
+ +
+
+
+ +
+
+
+ +
+ +
+ + + + + +
+ +
+
+ +
+ +
+ +
+ + @@include('docs/_footer.html') + @@include('_page-progress.html') + @@include('_scripts.html') + + diff --git a/sandbox310/src/docs/elements/tooltips-popovers.html b/sandbox310/src/docs/elements/tooltips-popovers.html new file mode 100644 index 0000000..07a98db --- /dev/null +++ b/sandbox310/src/docs/elements/tooltips-popovers.html @@ -0,0 +1,176 @@ + + + + @@include('_head.html') + + +
+
+ @@include('_navbar.html', { + "classList": "center-nav transparent navbar-light", + "otherClassList": "w-100 d-flex ms-auto", + "otherLanguageSelect": true, + "otherBtn": true, + "otherBtnClassList": "btn-sm btn-primary rounded-pill", + "otherBtnText": "Contact", + "otherBtnLink": "@@webRoot/contact.html" + }) +
+ +
+
+
+
+

Tooltips & Popovers

+

Use Bootstrap Tooltips and Popovers with our custom styles to add tooltips and popovers to any element on your website.

+
+ +
+ +
+ +
+ +
+
+ @@include('docs/_sidebar.html', {"page": "elements-tooltips-popovers"}) + + +
+
+

Tooltips

+
+
+ Tooltip on top + Tooltip on right + Tooltip on bottom + Tooltip on left +
+ + + + +
+ + + + + +
+ +
+
+

Popovers

+
+ + + + + + +
+ +
+
+ +
+ +
+ +
+ + @@include('docs/_footer.html') + @@include('_page-progress.html') + @@include('_scripts.html') + + \ No newline at end of file diff --git a/sandbox310/src/docs/elements/typography.html b/sandbox310/src/docs/elements/typography.html new file mode 100644 index 0000000..fa7341c --- /dev/null +++ b/sandbox310/src/docs/elements/typography.html @@ -0,0 +1,452 @@ + + + + @@include('_head.html') + + +
+
+ @@include('_navbar.html', { + "classList": "center-nav transparent navbar-light", + "otherClassList": "w-100 d-flex ms-auto", + "otherLanguageSelect": true, + "otherBtn": true, + "otherBtnClassList": "btn-sm btn-primary rounded-pill", + "otherBtnText": "Contact", + "otherBtnLink": "@@webRoot/contact.html" + }) +
+ +
+
+
+
+

Typography

+

Use our custom typography examples for your headings, titles and other text. For further typography examples please visit Bootstrap docs

+
+ +
+ +
+ +
+ +
+
+ @@include('docs/_sidebar.html', {"page": "elements-typography"}) + + +
+
+ +
+
+

Headings

+
+
+
+
+

h1. heading

+

h2. heading

+

h3. heading

+

h4. heading

+
h5. heading
+
h6. heading
+
+ +
+

h1. heading

+

h2. heading

+

h3. heading

+

h4. heading

+
h5. heading
+
h6. heading
+
+ +
+ +
+ + + + + +
+ +
+
+

Display Headings

+
+
+

Display 1

+

Display 2

+

Display 3

+

Display 4

+

Display 5

+

Display 6

+
+ + + + + +
+ +
+
+

Tiny Headings

+
+
+
+
+

Tiny Heading

+
+ +
+

Tiny Heading with Line

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

Lead

+
+
+

Lead

+

Lead Larger

+
+ + + + + +
+ +
+
+

Lists

+
+
+
+
+
    +
  • Aenean eu leo quam.
  • +
  • Nullam quis risus eget.
  • +
  • Donec id elit non mi porta.
  • +
  • Fusce dapibus cursus.
  • +
+
+ +
+
    +
  • Aenean eu leo quam.
  • +
  • Nullam quis risus eget.
  • +
  • Donec id elit non mi porta.
  • +
  • Fusce dapibus cursus.
  • +
+
+ +
+
    +
  • Aenean eu leo quam.
  • +
  • Nullam quis risus eget.
  • +
  • Donec id elit non mi porta.
  • +
  • Fusce dapibus cursus.
  • +
+
+ +
+ +
+ + + + + +
+ +
+
+

Blockquote

+
+
+
+
+
+
+

Sed posuere consectetur est at lobortis. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis, est non commodo luctus, nisi erat porttitor ligula lacinia odio.

+
+ +
+
+ +
+
+
+
+
+

Sed posuere consectetur est at lobortis. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis mollis, est non commodo luctus.

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

Dropcap

+
+
+
+
+

Aenean non lectus sit amet est imperdiet cursus elementum vitae eros. Cras quis odio in risus euismod suscipit. Fusce viverra ligula vel justo bibendum semper amet.

+
+ +
+

Aenean non lectus sit amet est imperdiet cursus elementum vitae eros. Cras quis odio in risus euismod suscipit. Fusce viverra ligula vel justo bibendum semper amet.

+
+ +
+

Aenean non lectus sit amet est imperdiet cursus elementum vitae eros. Cras quis odio in risus euismod suscipit. Fusce viverra ligula vel justo bibendum semper amet.

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

Links

+

Available options:

+

link-body, link-aqua, link-green, link-leaf, link-navy, link-orange, link-pink, link-purple, link-red, link-violet, link-yellow, link-fuchsia, link-sky, link-grape.

+
+ + + + + + +
+ +
+
+ +
+ +
+ +
+ + @@include('docs/_footer.html') + @@include('_page-progress.html') + @@include('_scripts.html') + + \ No newline at end of file diff --git a/sandbox310/src/docs/faq.html b/sandbox310/src/docs/faq.html new file mode 100644 index 0000000..bf6d145 --- /dev/null +++ b/sandbox310/src/docs/faq.html @@ -0,0 +1,252 @@ + + + + @@include('_head.html') + + +
+
+ @@include('_navbar.html', { + "classList": "center-nav transparent navbar-light", + "otherClassList": "w-100 d-flex ms-auto", + "otherLanguageSelect": true, + "otherBtn": true, + "otherBtnClassList": "btn-sm btn-primary rounded-pill", + "otherBtnText": "Contact", + "otherBtnLink": "@@webRoot/contact.html" + }) +
+ +
+
+
+
+

FAQ

+

Find answers to some frequently asked questions here.

+
+ +
+ +
+ +
+ +
+
+ @@include('docs/_sidebar.html', {"page": "docs-faq"}) +
+
+

Frequently Asked Questions

+

If you don't see an answer to your question here, please feel free to contact us with the links below:

+ Contact Form + Discussions Page +
+
+
+ +
+ +
+
+

You can reach the v2.0.0 documentation here

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

Yes. Gulp is optional. You can use plain HTML / CSS / JS to customize Sandbox. Files you need are located in dev folder.

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

All third-party plugin JS files are located in src/assets/js/vendor and their CSS files are in src/assets/css/vendor. Just remove unwanted vendor JS / CSS files from vendor folders and then remove unwanted functions from src/assets/js/theme.js and recompile.

+

If you're not using Gulp, you can remove unwanted plugins manually from dev/assets/js/plugins.js, dev/assets/js/theme.js and their CSS from dev/assets/css/plugins.css.

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

Bootstrap SCSS imports are located in src/assets/scss/_bootstrap.scss and theme SCSS imports are in src/assets/scss/theme/_theme.scss. Remove or comment any unwanted import and recompile.

+

If you're not using Gulp, you can remove unwanted CSS manually from dev/assets/css/style.css

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

No, not currently. Although with the use of RTLCSS project you can generate RTL version of style.css, however some template specific styles won’t have support for RTL out of the box.

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

Due to the same-origin policy SVGInject does not work when run from the local file system in many browsers (Chrome, Safari). Please test on a working web server.

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

Follow the instructions here to reach the guide on configuring the contact or newsletter forms in Sandbox. If the forms don't work or if you receive any errors please keep in mind that the contact forms won't work on local environment. Please test them on a working web server.

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

No, as of v3.0.0, Sandbox no longer requires jQuery.

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

Sandbox is an HTML template, not a Wordpress theme. So it cannot be installed in Wordpress.

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

There is a known browsers-spesific issue regarding image-mask that prevents them from working on local environments. (Running from a filesystem is now restricted, so you can no longer reference one file from another.) If you upload the template on a working server image masks should work properly.

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

You can disable sourcemaps in dist/asssets/css/style.css by uncommenting lines 148 and 158 on gulpfile.js and then running gulp serve command.

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

Use the code below to add link to dropdown parent:

+
+ +
+
+
<li class="nav-item dropdown dropdown-mega parent-link">
+  <a class="nav-link" href="PARENT LINK">Dropdown</a>
+  <a class="nav-link dropdown-toggle" href="#" data-bs-toggle="dropdown"><span class="visually-hidden">Toggle Dropdown</span></a>
+  <ul class="dropdown-menu mega-menu">
+    ...
+  </ul>
+</li>
+
+ +
+ +
+
+ +
+ +
+
+

The font used in the Sandbox logo is Manrope

+
+ +
+ +
+ +
+ +
+
+ +
+ +
+ +
+ + @@include('docs/_footer.html') + @@include('_page-progress.html') + @@include('_scripts.html') + + \ No newline at end of file diff --git a/sandbox310/src/docs/forms.html b/sandbox310/src/docs/forms.html new file mode 100644 index 0000000..3b16be8 --- /dev/null +++ b/sandbox310/src/docs/forms.html @@ -0,0 +1,160 @@ + + + + @@include('_head.html') + + +
+
+ @@include('_navbar.html', { + "classList": "center-nav transparent navbar-light", + "otherClassList": "w-100 d-flex ms-auto", + "otherLanguageSelect": true, + "otherBtn": true, + "otherBtnClassList": "btn-sm btn-primary rounded-pill", + "otherBtnText": "Contact", + "otherBtnLink": "@@webRoot/contact.html" + }) +
+ +
+
+
+
+

Forms

+

Below you can find instructions on how to make contact or newsletter forms work.

+
+ +
+ +
+ +
+ +
+
+ @@include('docs/_sidebar.html', {"page": "docs-forms"}) + + +
+
+

Contact Form

+
+
+

Specify recipient e-mail addresses by filling $fromEmail and $sendToEmail options in assets/php/contact.php. These email addresses will receive all form inquires/messages.

+
+ + + + + +
+ +
+
+

Configuration

+
+
+

Other than specifying recipient addresses as shown above, you can also change email subject, fields, success and error alert messages and enable SMTP authentication if necessary in assets/php/contact.php under CONFIGURATION part. Pay attention to comments for explanations.

+
+ + + + + +
+ +
+
+

Newsletter

+
+
+

After creating your own custom newsletter form through Signup Forms - Embedded Forms in Mailchimp website, replacing the newsletter form action with the one in your generated newsletter code should be enough to personalize the existing subscription forms in Sandbox.

+
+ + + + + +
+ +
+
+ +
+ +
+ +
+ + @@include('docs/_footer.html') + @@include('_page-progress.html') + @@include('_scripts.html') + + \ No newline at end of file diff --git a/sandbox310/src/docs/index.html b/sandbox310/src/docs/index.html new file mode 100644 index 0000000..9114216 --- /dev/null +++ b/sandbox310/src/docs/index.html @@ -0,0 +1,147 @@ + + + + @@include('_head.html') + + +
+
+ @@include('_navbar.html', { + "classList": "center-nav transparent navbar-light", + "otherClassList": "w-100 d-flex ms-auto", + "otherLanguageSelect": true, + "otherBtn": true, + "otherBtnClassList": "btn-sm btn-primary rounded-pill", + "otherBtnText": "Contact", + "otherBtnLink": "@@webRoot/contact.html" + }) +
+ +
+
+
+
+

Get Started

+

Guide to get started with Sandbox Modern & Multipurpose Bootstrap 5 Template.

+
+ +
+ +
+ +
+ +
+
+ @@include('docs/_sidebar.html', {"page": "docs-index"}) + + +
+
+ +

Overview

+
+
+

This guide will help you get started with Sandbox. All the information regarding file structure, build tools, components, credits, license and FAQ can be found here.

+

If you have any questions that are beyond the scope of this help documentation, please feel free to contact us with the links below and please don't forget to provide your website URL.

+ Contact Form + Discussions Page +
+
+

Please remember...

+
    +
  • Requests sent during weekends or on holidays will be replied on business days.
  • +
  • We only provide support for the issues related to the features that are included in the template. Debugging or providing guides on how to make custom modifications are not part of our support. Thank you for understanding.
  • +
+
+ +
+ +
+ +
+ +
+
+

File Structure

+
+
+
    +
  • dev All template files with unminified CSS / JS. Use this folder if you don't wish to use Node.js / Gulp / SASS.
  • +
  • dist All template distribution files like HTML / CSS / JS that have been processed (compiled / minified) from src folder using Node.js / Gulp.
  • +
  • src All template source files like HTML / SCSS / CSS / JS that are then processed (compiled / minified) to dist folder. +
      +
    • src/assets/js Contains main theme.js and JS vendor files. If you don't wish to use all included plugins and scripts, just remove unwanted vendor JS files from src/assets/js/vendor then remove unwanted functions from src/assets/js/theme.js and recompile.
    • +
    • src/assets/css Contains CSS vendor files. If you don't wish to use all included plugins, just remove unwanted vendor CSS from src/assets/css/vendor and recompile.
    • +
    • src/assets/scss Contains all project SCSS files that are compiled and minified in dist/assets/css folder.
    • +
    +
  • +
  • dev/docs & dist/docs Contain all documentation files (installation, blocks, elements, etc.) regarding the template. You can also reach the documentation from the live demo as well.
  • +
  • package.json Includes the list of dependencies to install from npm.
  • +
  • gulpfile.js Configuration file for Gulp library. It contains all tasks to perform with Gulp. Learn more about it from official Gulp documentation.
  • +
+
+ +
+ +
+
+

Installation

+ +
+
+

If you'd like to speed up development process with Node.js / Gulp / SASS, then follow these steps:

+
    +
  1. Install Node.js if you don’t have it yet.
  2. +
  3. Run npm install gulp-cli -g command, if you haven't already installed Gulp CLI previously.
  4. +
  5. Unzip the template package and in the root project folder sandbox, go to your command line and run npm install. This will install the npm packages listed in the package.json file.
  6. +
  7. You should now have the project files set up and all the npm packages installed.
  8. +
+
+ +
+ +
+
+

Gulp Commands

+
+
+
    +
  • gulp This command will fire default gulp task which includes: creating dist folder, launching BrowserSync, merging vendor libraries, JS minification, SASS and HTML compilation and starting watch task.
  • +
  • gulp serve This command will launch watch task and BrowserSync. It will watch changes of your HTML / SCSS / CSS / JS files and automatically compile them.
  • +
  • gulp build:dist This will create dist which includes all template files with minified CSS / JS.
  • +
  • gulp build:dev This will create dev which includes all template files with unminified CSS / JS.
  • +
+

When you want to kill the server just hit Control + C

+
+ +
+ +
+
+ +
+ +
+ +
+ + @@include('docs/_footer.html') + @@include('_page-progress.html') + @@include('_scripts.html') + + \ No newline at end of file diff --git a/sandbox310/src/docs/styleguide/backgrounds.html b/sandbox310/src/docs/styleguide/backgrounds.html new file mode 100644 index 0000000..5432f05 --- /dev/null +++ b/sandbox310/src/docs/styleguide/backgrounds.html @@ -0,0 +1,218 @@ + + + + @@include('_head.html') + + +
+
+ @@include('_navbar.html', { + "classList": "center-nav transparent navbar-light", + "otherClassList": "w-100 d-flex ms-auto", + "otherLanguageSelect": true, + "otherBtn": true, + "otherBtnClassList": "btn-sm btn-primary rounded-pill", + "otherBtnText": "Contact", + "otherBtnLink": "@@webRoot/contact.html" + }) +
+ +
+
+
+
+

Backgrounds

+

Below you can find the list of abstract and gradient background images that come bundled with Sandbox.

+
+ +
+ +
+ +
+ +
+
+ @@include('docs/_sidebar.html', {"page": "styleguide-backgrounds"}) + + +
+
+

Abstract

+
    +
  • +
    +
    +
    + bg2.jpg +
    + +
    +
  • +
  • +
    +
    +
    + bg3.jpg +
    + +
    +
  • +
  • +
    +
    +
    + bg4.jpg +
    + +
    +
  • +
  • +
    +
    +
    + bg13.jpg +
    + +
    +
  • +
+
+
+

Gradient

+
    +
  • +
    +
    +
    + bg14.png +
    + +
    +
  • +
  • +
    +
    +
    + bg15.png +
    + +
    +
  • +
  • +
    +
    +
    + bg16.png +
    + +
    +
  • +
  • +
    +
    +
    + bg17.png +
    + +
    +
  • +
  • +
    +
    +
    + bg18.png +
    + +
    +
  • +
  • +
    +
    +
    + bg19.png +
    + +
    +
  • +
  • +
    +
    +
    + bg20.png +
    + +
    +
  • +
  • +
    +
    +
    + bg21.png +
    + +
    +
  • +
  • +
    +
    +
    + bg22.png +
    + +
    +
  • +
  • +
    +
    +
    + bg23.png +
    + +
    +
  • +
  • +
    +
    +
    + bg24.png +
    + +
    +
  • +
  • +
    +
    +
    + bg25.png +
    + +
    +
  • +
+
+
+ +
+ +
+ +
+ + @@include('docs/_footer.html') + @@include('_page-progress.html') + @@include('_scripts.html') + + \ No newline at end of file diff --git a/sandbox310/src/docs/styleguide/colors.html b/sandbox310/src/docs/styleguide/colors.html new file mode 100644 index 0000000..2d31932 --- /dev/null +++ b/sandbox310/src/docs/styleguide/colors.html @@ -0,0 +1,478 @@ + + + + @@include('_head.html') + + +
+
+ @@include('_navbar.html', { + "classList": "center-nav transparent navbar-light", + "otherClassList": "w-100 d-flex ms-auto", + "otherLanguageSelect": true, + "otherBtn": true, + "otherBtnClassList": "btn-sm btn-primary rounded-pill", + "otherBtnText": "Contact", + "otherBtnLink": "@@webRoot/contact.html" + }) +
+ +
+
+
+
+

Colors

+

Use our custom color options to add color to your backgrounds, text or to change the theme color scheme.

+
+ +
+ +
+ +
+ +
+
+ @@include('docs/_sidebar.html', {"page": "styleguide-colors"}) + + +
+
+

Theme Colors

+
+
+

To change the theme color, add color CSS file you wish to use inside the <head> tag, right after style.css link, in all your HTML pages. Available color options: aqua.css, green.css, leaf.css, navy.css, orange.css, pink.css, purple.css, red.css, violet.css, yellow.css, fuchsia.css, sky.css, grape.css.

+
+ + + + + +
+ +
+
+

Changing Primary Color

+
+
+

To change the primary color to a custom color, open src/assets/scss/user-variables.scss and assign your custom color value to $primary and recompile.

+
+ + + + + +
+ +
+
+

Background Colors

+
+
+
+
+
+
.bg-yellow
+
.bg-pale-yellow
+ +
+
+ +
+
+
.bg-orange
+
.bg-pale-orange
+ +
+
+ +
+
+
.bg-red
+
.bg-pale-red
+ +
+
+ +
+
+
.bg-pink
+
.bg-pale-pink
+ +
+
+ +
+
+
.bg-violet
+
.bg-pale-violet
+ +
+
+ +
+
+
.bg-purple
+
.bg-pale-purple
+ +
+
+ +
+
+
.bg-blue
+
.bg-pale-blue
+ +
+
+ +
+
+
.bg-aqua
+
.bg-pale-aqua
+ +
+
+ +
+
+
.bg-green
+
.bg-pale-green
+ +
+
+ +
+
+
.bg-leaf
+
.bg-pale-leaf
+ +
+
+ +
+
+
.bg-ash
+
.bg-pale-ash
+ +
+
+ +
+
+
.bg-navy
+
.bg-pale-navy
+ +
+
+ +
+
+
.bg-fuchsia
+
.bg-pale-fuchsia
+ +
+
+ +
+
+
.bg-sky
+
.bg-pale-sky
+ +
+
+ +
+
+
.bg-grape
+
.bg-pale-grape
+ +
+
+ +
+
+
.gradient-1
+
+
+ +
+
+
.gradient-2
+
+
+ +
+
+
.gradient-3
+
+
+ +
+
+
.gradient-4
+
+
+ +
+
+
.gradient-5
+
+
+ +
+
+
.gradient-6
+
+
+ +
+
+
.gradient-7
+
+
+ +
+ +
+ + + + + +
+ +
+
+

Text Colors

+
+
+
+
+

.text-yellow

+

.text-orange

+

.text-red

+

.text-pink

+

.text-fuchsia

+
+ +
+

.text-violet

+

.text-purple

+

.text-blue

+

.text-aqua

+

.text-sky

+
+ +
+

.text-green

+

.text-leaf

+

.text-ash

+

.text-navy

+

.text-grape

+
+ +
+

.text-primary

+
+ +
+

.text-muted

+
+ +
+

.text-white

+
+ +
+

.gradient-1

+
+

.gradient-2

+
+

.gradient-3

+
+ +
+

.gradient-4

+
+

.gradient-5

+
+ +
+

.gradient-6

+
+

.gradient-7

+
+ +
+ +
+ + + + + +
+ +
+
+ +
+ +
+ +
+ + @@include('docs/_footer.html') + @@include('_page-progress.html') + @@include('_scripts.html') + + \ No newline at end of file diff --git a/sandbox310/src/docs/styleguide/fonts.html b/sandbox310/src/docs/styleguide/fonts.html new file mode 100644 index 0000000..202f2ab --- /dev/null +++ b/sandbox310/src/docs/styleguide/fonts.html @@ -0,0 +1,146 @@ + + + + @@include('_head.html') + + +
+
+ @@include('_navbar.html', { + "classList": "center-nav transparent navbar-light", + "otherClassList": "w-100 d-flex ms-auto", + "otherLanguageSelect": true, + "otherBtn": true, + "otherBtnClassList": "btn-sm btn-primary rounded-pill", + "otherBtnText": "Contact", + "otherBtnLink": "@@webRoot/contact.html" + }) +
+ +
+
+
+
+

Fonts

+

Use one of the existing font options or a custom font of your choice to change the overall font in Sandbox.

+
+ +
+ +
+ +
+ +
+
+ @@include('docs/_sidebar.html', {"page": "styleguide-fonts"}) + + +
+
+

Font Options

+
+
+ +

Manrope is the default font in Sandbox. If you wish to use one of the other available font options, add the link of the font CSS file you wish to use inside the <head> tag, right after style.css link, in all your HTML pages.

+
+ + + + + +
+ +
+
+

Google Fonts

+
+
+

To use a custom Google Font, open src/assets/scss/user-variables.scss, and use the example code below to add @import link and name of your font.

+
+ + + + + +
+ +
+
+

@font-face

+
+
+

To use a custom font with @font-face, first add the font files inside folder src/assets/fonts/ Then use the example below to import your custom font.

+
+ + + + + +
+ +
+
+ +
+ +
+ +
+ + @@include('docs/_footer.html') + @@include('_page-progress.html') + @@include('_scripts.html') + + \ No newline at end of file diff --git a/sandbox310/src/docs/styleguide/icons-font.html b/sandbox310/src/docs/styleguide/icons-font.html new file mode 100644 index 0000000..71b7fa2 --- /dev/null +++ b/sandbox310/src/docs/styleguide/icons-font.html @@ -0,0 +1,11061 @@ + + + + @@include('_head.html') + + +
+
+ @@include('_navbar.html', { + "classList": "center-nav transparent navbar-light", + "otherClassList": "w-100 d-flex ms-auto", + "otherLanguageSelect": true, + "otherBtn": true, + "otherBtnClassList": "btn-sm btn-primary rounded-pill", + "otherBtnText": "Contact", + "otherBtnLink": "@@webRoot/contact.html" + }) +
+ +
+
+
+
+

Unicons

+

Below you can find the list of 1110+ solid font icons. All these retina-ready icons can easily be styled by color, size, shadow, and anything possible with CSS. For more information on the icons please visit Unicons website

+
+ +
+ +
+ +
+ +
+
+ @@include('docs/_sidebar.html', {"page": "styleguide-unicons"}) + + +
+
+

Arrows

+
    +
  • +
    +
    + + align-center-h +
    + +
    +
  • +
  • +
    +
    + + align-center-v +
    + +
    +
  • +
  • +
    +
    + + angle-double-down +
    + +
    +
  • +
  • +
    +
    + + angle-double-left +
    + +
    +
  • +
  • +
    +
    + + angle-double-right +
    + +
    +
  • +
  • +
    +
    + + angle-double-up +
    + +
    +
  • +
  • +
    +
    + + angle-down +
    + +
    +
  • +
  • +
    +
    + + angle-left +
    + +
    +
  • +
  • +
    +
    + + angle-left-b +
    + +
    +
  • +
  • +
    +
    + + angle-right +
    + +
    +
  • +
  • +
    +
    + + angle-right-b +
    + +
    +
  • +
  • +
    +
    + + angle-up +
    + +
    +
  • +
  • +
    +
    + + arrow +
    + +
    +
  • +
  • +
    +
    + + arrow-break +
    + +
    +
  • +
  • +
    +
    + + arrow-circle-down +
    + +
    +
  • +
  • +
    +
    + + arrow-circle-left +
    + +
    +
  • +
  • +
    +
    + + arrow-circle-right +
    + +
    +
  • +
  • +
    +
    + + arrow-circle-up +
    + +
    +
  • +
  • +
    +
    + + arrow-compress-h +
    + +
    +
  • +
  • +
    +
    + + arrow-down +
    + +
    +
  • +
  • +
    +
    + + arrow-down-left +
    + +
    +
  • +
  • +
    +
    + + arrow-down-right +
    + +
    +
  • +
  • +
    +
    + + arrow-from-right +
    + +
    +
  • +
  • +
    +
    + + arrow-from-top +
    + +
    +
  • +
  • +
    +
    + + arrow-growth +
    + +
    +
  • +
  • +
    +
    + + arrow-left +
    + +
    +
  • +
  • +
    +
    + + arrow-random +
    + +
    +
  • +
  • +
    +
    + + arrow-resize-diagonal +
    + +
    +
  • +
  • +
    +
    + + arrow-right +
    + +
    +
  • +
  • +
    +
    + + arrow-to-bottom +
    + +
    +
  • +
  • +
    +
    + + arrow-to-right +
    + +
    +
  • +
  • +
    +
    + + arrow-up +
    + +
    +
  • +
  • +
    +
    + + arrow-up-left +
    + +
    +
  • +
  • +
    +
    + + arrow-up-right +
    + +
    +
  • +
  • +
    +
    + + arrows-h +
    + +
    +
  • +
  • +
    +
    + + arrows-h-alt +
    + +
    +
  • +
  • +
    +
    + + arrows-left-down +
    + +
    +
  • +
  • +
    +
    + + arrows-maximize +
    + +
    +
  • +
  • +
    +
    + + arrows-merge +
    + +
    +
  • +
  • +
    +
    + + arrows-resize +
    + +
    +
  • +
  • +
    +
    + + arrows-resize-h +
    + +
    +
  • +
  • +
    +
    + + arrows-resize-v +
    + +
    +
  • +
  • +
    +
    + + arrows-right-down +
    + +
    +
  • +
  • +
    +
    + + arrows-shrink-h +
    + +
    +
  • +
  • +
    +
    + + arrows-shrink-v +
    + +
    +
  • +
  • +
    +
    + + arrows-up-right +
    + +
    +
  • +
  • +
    +
    + + arrows-v +
    + +
    +
  • +
  • +
    +
    + + arrows-v-alt +
    + +
    +
  • +
  • +
    +
    + + caret-right +
    + +
    +
  • +
  • +
    +
    + + chart-down +
    + +
    +
  • +
  • +
    +
    + + compress-alt +
    + +
    +
  • +
  • +
    +
    + + compress-alt-left +
    + +
    +
  • +
  • +
    +
    + + compress-arrows +
    + +
    +
  • +
  • +
    +
    + + compress-point +
    + +
    +
  • +
  • +
    +
    + + corner-down-left +
    + +
    +
  • +
  • +
    +
    + + corner-down-right +
    + +
    +
  • +
  • +
    +
    + + corner-down-right-alt +
    + +
    +
  • +
  • +
    +
    + + corner-left-down +
    + +
    +
  • +
  • +
    +
    + + corner-right-down +
    + +
    +
  • +
  • +
    +
    + + corner-up-left +
    + +
    +
  • +
  • +
    +
    + + corner-up-left-alt +
    + +
    +
  • +
  • +
    +
    + + corner-up-right +
    + +
    +
  • +
  • +
    +
    + + corner-up-right-alt +
    + +
    +
  • +
  • +
    +
    + + direction +
    + +
    +
  • +
  • +
    +
    + + download-alt +
    + +
    +
  • +
  • +
    +
    + + enter +
    + +
    +
  • +
  • +
    +
    + + exchange +
    + +
    +
  • +
  • +
    +
    + + exchange-alt +
    + +
    +
  • +
  • +
    +
    + + expand-alt +
    + +
    +
  • +
  • +
    +
    + + expand-arrows +
    + +
    +
  • +
  • +
    +
    + + expand-arrows-alt +
    + +
    +
  • +
  • +
    +
    + + expand-from-corner +
    + +
    +
  • +
  • +
    +
    + + expand-left +
    + +
    +
  • +
  • +
    +
    + + expand-right +
    + +
    +
  • +
  • +
    +
    + + export +
    + +
    +
  • +
  • +
    +
    + + import +
    + +
    +
  • +
  • +
    +
    + + left-arrow-from-left +
    + +
    +
  • +
  • +
    +
    + + left-arrow-to-left +
    + +
    +
  • +
  • +
    +
    + + maximize-left +
    + +
    +
  • +
  • +
    +
    + + scaling-left +
    + +
    +
  • +
  • +
    +
    + + scaling-right +
    + +
    +
  • +
  • +
    +
    + + scroll +
    + +
    +
  • +
  • +
    +
    + + scroll-h +
    + +
    +
  • +
  • +
    +
    + + shuffle +
    + +
    +
  • +
  • +
    +
    + + sort +
    + +
    +
  • +
  • +
    +
    + + sorting +
    + +
    +
  • +
  • +
    +
    + + top-arrow-from-top +
    + +
    +
  • +
  • +
    +
    + + top-arrow-to-top +
    + +
    +
  • +
  • +
    +
    + + upload-alt +
    + +
    +
  • +
+
+
+

Brand Logos

+
    +
  • +
    +
    + + 500px +
    + +
    +
  • +
  • +
    +
    + + adobe +
    + +
    +
  • +
  • +
    +
    + + adobe-alt +
    + +
    +
  • +
  • +
    +
    + + amazon +
    + +
    +
  • +
  • +
    +
    + + android +
    + +
    +
  • +
  • +
    +
    + + android-alt +
    + +
    +
  • +
  • +
    +
    + + apple +
    + +
    +
  • +
  • +
    +
    + + apple-alt +
    + +
    +
  • +
  • +
    +
    + + behance +
    + +
    +
  • +
  • +
    +
    + + behance-alt +
    + +
    +
  • +
  • +
    +
    + + bing +
    + +
    +
  • +
  • +
    +
    + + bitcoin +
    + +
    +
  • +
  • +
    +
    + + bitcoin-alt +
    + +
    +
  • +
  • +
    +
    + + black-berry +
    + +
    +
  • +
  • +
    +
    + + blogger +
    + +
    +
  • +
  • +
    +
    + + blogger-alt +
    + +
    +
  • +
  • +
    +
    + + css3-simple +
    + +
    +
  • +
  • +
    +
    + + discord +
    + +
    +
  • +
  • +
    +
    + + docker +
    + +
    +
  • +
  • +
    +
    + + dribbble +
    + +
    +
  • +
  • +
    +
    + + dropbox +
    + +
    +
  • +
  • +
    +
    + + facebook +
    + +
    +
  • +
  • +
    +
    + + facebook-f +
    + +
    +
  • +
  • +
    +
    + + facebook-messenger +
    + +
    +
  • +
  • +
    +
    + + facebook-messenger-alt +
    + +
    +
  • +
  • +
    +
    + + github +
    + +
    +
  • +
  • +
    +
    + + github-alt +
    + +
    +
  • +
  • +
    +
    + + gitlab +
    + +
    +
  • +
  • +
    +
    + + google +
    + +
    +
  • +
  • +
    +
    + + google-drive +
    + +
    +
  • +
  • +
    +
    + + google-drive-alt +
    + +
    +
  • +
  • +
    +
    + + google-hangouts +
    + +
    +
  • +
  • +
    +
    + + google-hangouts-alt +
    + +
    +
  • +
  • +
    +
    + + google-play +
    + +
    +
  • +
  • +
    +
    + + hipchat +
    + +
    +
  • +
  • +
    +
    + + html3 +
    + +
    +
  • +
  • +
    +
    + + html3-alt +
    + +
    +
  • +
  • +
    +
    + + html5 +
    + +
    +
  • +
  • +
    +
    + + html5-alt +
    + +
    +
  • +
  • +
    +
    + + instagram +
    + +
    +
  • +
  • +
    +
    + + instagram-alt +
    + +
    +
  • +
  • +
    +
    + + intercom +
    + +
    +
  • +
  • +
    +
    + + intercom-alt +
    + +
    +
  • +
  • +
    +
    + + java-script +
    + +
    +
  • +
  • +
    +
    + + line +
    + +
    +
  • +
  • +
    +
    + + linkedin +
    + +
    +
  • +
  • +
    +
    + + linkedin-alt +
    + +
    +
  • +
  • +
    +
    + + linux +
    + +
    +
  • +
  • +
    +
    + + lottiefiles +
    + +
    +
  • +
  • +
    +
    + + lottiefiles-alt +
    + +
    +
  • +
  • +
    +
    + + master-card +
    + +
    +
  • +
  • +
    +
    + + medium-m +
    + +
    +
  • +
  • +
    +
    + + microsoft +
    + +
    +
  • +
  • +
    +
    + + okta +
    + +
    +
  • +
  • +
    +
    + + opera +
    + +
    +
  • +
  • +
    +
    + + opera-alt +
    + +
    +
  • +
  • +
    +
    + + pagelines +
    + +
    +
  • +
  • +
    +
    + + pagerduty +
    + +
    +
  • +
  • +
    +
    + + paypal +
    + +
    +
  • +
  • +
    +
    + + programming-language +
    + +
    +
  • +
  • +
    +
    + + react +
    + +
    +
  • +
  • +
    +
    + + reddit-alien-alt +
    + +
    +
  • +
  • +
    +
    + + skype +
    + +
    +
  • +
  • +
    +
    + + skype-alt +
    + +
    +
  • +
  • +
    +
    + + slack +
    + +
    +
  • +
  • +
    +
    + + slack-alt +
    + +
    +
  • +
  • +
    +
    + + snapchat-alt +
    + +
    +
  • +
  • +
    +
    + + snapchat-ghost +
    + +
    +
  • +
  • +
    +
    + + snapchat-square +
    + +
    +
  • +
  • +
    +
    + + swiggy +
    + +
    +
  • +
  • +
    +
    + + telegram +
    + +
    +
  • +
  • +
    +
    + + telegram-alt +
    + +
    +
  • +
  • +
    +
    + + tumblr +
    + +
    +
  • +
  • +
    +
    + + tumblr-alt +
    + +
    +
  • +
  • +
    +
    + + tumblr-square +
    + +
    +
  • +
  • +
    +
    + + twitter +
    + +
    +
  • +
  • +
    +
    + + twitter-alt +
    + +
    +
  • +
  • +
    +
    + + visual-studio +
    + +
    +
  • +
  • +
    +
    + + vk +
    + +
    +
  • +
  • +
    +
    + + vk-alt +
    + +
    +
  • +
  • +
    +
    + + vuejs +
    + +
    +
  • +
  • +
    +
    + + vuejs-alt +
    + +
    +
  • +
  • +
    +
    + + whatsapp +
    + +
    +
  • +
  • +
    +
    + + whatsapp-alt +
    + +
    +
  • +
  • +
    +
    + + windows +
    + +
    +
  • +
  • +
    +
    + + wordpress +
    + +
    +
  • +
  • +
    +
    + + wordpress-simple +
    + +
    +
  • +
  • +
    +
    + + youtube +
    + +
    +
  • +
+
+
+

Business

+
    +
  • +
    +
    + + analysis +
    + +
    +
  • +
  • +
    +
    + + analytics +
    + +
    +
  • +
  • +
    +
    + + bag +
    + +
    +
  • +
  • +
    +
    + + bag-alt +
    + +
    +
  • +
  • +
    +
    + + bill +
    + +
    +
  • +
  • +
    +
    + + bitcoin-circle +
    + +
    +
  • +
  • +
    +
    + + bitcoin-sign +
    + +
    +
  • +
  • +
    +
    + + briefcase +
    + +
    +
  • +
  • +
    +
    + + briefcase-alt +
    + +
    +
  • +
  • +
    +
    + + calculator-alt +
    + +
    +
  • +
  • +
    +
    + + calendar-alt +
    + +
    +
  • +
  • +
    +
    + + chart +
    + +
    +
  • +
  • +
    +
    + + chart-bar +
    + +
    +
  • +
  • +
    +
    + + chart-bar-alt +
    + +
    +
  • +
  • +
    +
    + + chart-growth +
    + +
    +
  • +
  • +
    +
    + + chart-growth-alt +
    + +
    +
  • +
  • +
    +
    + + chart-line +
    + +
    +
  • +
  • +
    +
    + + chart-pie +
    + +
    +
  • +
  • +
    +
    + + chart-pie-alt +
    + +
    +
  • +
  • +
    +
    + + coins +
    + +
    +
  • +
  • +
    +
    + + comparison +
    + +
    +
  • +
  • +
    +
    + + credit-card +
    + +
    +
  • +
  • +
    +
    + + crosshair +
    + +
    +
  • +
  • +
    +
    + + crosshair-alt +
    + +
    +
  • +
  • +
    +
    + + crosshairs +
    + +
    +
  • +
  • +
    +
    + + dollar-alt +
    + +
    +
  • +
  • +
    +
    + + dollar-sign +
    + +
    +
  • +
  • +
    +
    + + dollar-sign-alt +
    + +
    +
  • +
  • +
    +
    + + euro +
    + +
    +
  • +
  • +
    +
    + + euro-circle +
    + +
    +
  • +
  • +
    +
    + + gold +
    + +
    +
  • +
  • +
    +
    + + graph-bar +
    + +
    +
  • +
  • +
    +
    + + hunting +
    + +
    +
  • +
  • +
    +
    + + invoice +
    + +
    +
  • +
  • +
    +
    + + lightbulb +
    + +
    +
  • +
  • +
    +
    + + lightbulb-alt +
    + +
    +
  • +
  • +
    +
    + + lira-sign +
    + +
    +
  • +
  • +
    +
    + + money-bill +
    + +
    +
  • +
  • +
    +
    + + money-bill-stack +
    + +
    +
  • +
  • +
    +
    + + money-insert +
    + +
    +
  • +
  • +
    +
    + + money-stack +
    + +
    +
  • +
  • +
    +
    + + money-withdraw +
    + +
    +
  • +
  • +
    +
    + + money-withdrawal +
    + +
    +
  • +
  • +
    +
    + + moneybag +
    + +
    +
  • +
  • +
    +
    + + moneybag-alt +
    + +
    +
  • +
  • +
    +
    + + panel-add +
    + +
    +
  • +
  • +
    +
    + + percentage +
    + +
    +
  • +
  • +
    +
    + + pound +
    + +
    +
  • +
  • +
    +
    + + pound-circle +
    + +
    +
  • +
  • +
    +
    + + presentation-line +
    + +
    +
  • +
  • +
    +
    + + puzzle-piece +
    + +
    +
  • +
  • +
    +
    + + receipt +
    + +
    +
  • +
  • +
    +
    + + receipt-alt +
    + +
    +
  • +
  • +
    +
    + + rupee-sign +
    + +
    +
  • +
  • +
    +
    + + schedule +
    + +
    +
  • +
  • +
    +
    + + signal-alt-3 +
    + +
    +
  • +
  • +
    +
    + + sitemap +
    + +
    +
  • +
  • +
    +
    + + suitcase +
    + +
    +
  • +
  • +
    +
    + + suitcase-alt +
    + +
    +
  • +
  • +
    +
    + + university +
    + +
    +
  • +
  • +
    +
    + + usd-circle +
    + +
    +
  • +
  • +
    +
    + + usd-square +
    + +
    +
  • +
  • +
    +
    + + yen +
    + +
    +
  • +
  • +
    +
    + + yen-circle +
    + +
    +
  • +
+
+
+

Chat

+
    +
  • +
    +
    + + chat +
    + +
    +
  • +
  • +
    +
    + + chat-bubble-user +
    + +
    +
  • +
  • +
    +
    + + chat-info +
    + +
    +
  • +
  • +
    +
    + + comment +
    + +
    +
  • +
  • +
    +
    + + comment-add +
    + +
    +
  • +
  • +
    +
    + + comment-alt +
    + +
    +
  • +
  • +
    +
    + + comment-alt-block +
    + +
    +
  • +
  • +
    +
    + + comment-alt-chart-lines +
    + +
    +
  • +
  • +
    +
    + + comment-alt-check +
    + +
    +
  • +
  • +
    +
    + + comment-alt-dots +
    + +
    +
  • +
  • +
    +
    + + comment-alt-download +
    + +
    +
  • +
  • +
    +
    + + comment-alt-edit +
    + +
    +
  • +
  • +
    +
    + + comment-alt-exclamation +
    + +
    +
  • +
  • +
    +
    + + comment-alt-heart +
    + +
    +
  • +
  • +
    +
    + + comment-alt-image +
    + +
    +
  • +
  • +
    +
    + + comment-alt-info +
    + +
    +
  • +
  • +
    +
    + + comment-alt-lines +
    + +
    +
  • +
  • +
    +
    + + comment-alt-lock +
    + +
    +
  • +
  • +
    +
    + + comment-alt-medical +
    + +
    +
  • +
  • +
    +
    + + comment-alt-message +
    + +
    +
  • +
  • +
    +
    + + comment-alt-notes +
    + +
    +
  • +
  • +
    +
    + + comment-alt-plus +
    + +
    +
  • +
  • +
    +
    + + comment-alt-question +
    + +
    +
  • +
  • +
    +
    + + comment-alt-redo +
    + +
    +
  • +
  • +
    +
    + + comment-alt-search +
    + +
    +
  • +
  • +
    +
    + + comment-alt-share +
    + +
    +
  • +
  • +
    +
    + + comment-alt-shield +
    + +
    +
  • +
  • +
    +
    + + comment-alt-upload +
    + +
    +
  • +
  • +
    +
    + + comment-alt-verify +
    + +
    +
  • +
  • +
    +
    + + comment-block +
    + +
    +
  • +
  • +
    +
    + + comment-chart-line +
    + +
    +
  • +
  • +
    +
    + + comment-check +
    + +
    +
  • +
  • +
    +
    + + comment-dots +
    + +
    +
  • +
  • +
    +
    + + comment-download +
    + +
    +
  • +
  • +
    +
    + + comment-edit +
    + +
    +
  • +
  • +
    +
    + + comment-exclamation +
    + +
    +
  • +
  • +
    +
    + + comment-heart +
    + +
    +
  • +
  • +
    +
    + + comment-image +
    + +
    +
  • +
  • +
    +
    + + comment-info +
    + +
    +
  • +
  • +
    +
    + + comment-info-alt +
    + +
    +
  • +
  • +
    +
    + + comment-lines +
    + +
    +
  • +
  • +
    +
    + + comment-lock +
    + +
    +
  • +
  • +
    +
    + + comment-medical +
    + +
    +
  • +
  • +
    +
    + + comment-message +
    + +
    +
  • +
  • +
    +
    + + comment-notes +
    + +
    +
  • +
  • +
    +
    + + comment-plus +
    + +
    +
  • +
  • +
    +
    + + comment-question +
    + +
    +
  • +
  • +
    +
    + + comment-redo +
    + +
    +
  • +
  • +
    +
    + + comment-search +
    + +
    +
  • +
  • +
    +
    + + comment-share +
    + +
    +
  • +
  • +
    +
    + + comment-shield +
    + +
    +
  • +
  • +
    +
    + + comment-upload +
    + +
    +
  • +
  • +
    +
    + + comment-verify +
    + +
    +
  • +
  • +
    +
    + + comments +
    + +
    +
  • +
  • +
    +
    + + comments-alt +
    + +
    +
  • +
  • +
    +
    + + share +
    + +
    +
  • +
+
+
+

Cloud and Web

+
    +
  • +
    +
    + + brackets-curly +
    + +
    +
  • +
  • +
    +
    + + browser +
    + +
    +
  • +
  • +
    +
    + + bug +
    + +
    +
  • +
  • +
    +
    + + channel +
    + +
    +
  • +
  • +
    +
    + + channel-add +
    + +
    +
  • +
  • +
    +
    + + cloud-block +
    + +
    +
  • +
  • +
    +
    + + cloud-bookmark +
    + +
    +
  • +
  • +
    +
    + + cloud-check +
    + +
    +
  • +
  • +
    +
    + + cloud-computing +
    + +
    +
  • +
  • +
    +
    + + cloud-data-connection +
    + +
    +
  • +
  • +
    +
    + + cloud-database-tree +
    + +
    +
  • +
  • +
    +
    + + cloud-download +
    + +
    +
  • +
  • +
    +
    + + cloud-exclamation +
    + +
    +
  • +
  • +
    +
    + + cloud-heart +
    + +
    +
  • +
  • +
    +
    + + cloud-info +
    + +
    +
  • +
  • +
    +
    + + cloud-lock +
    + +
    +
  • +
  • +
    +
    + + cloud-question +
    + +
    +
  • +
  • +
    +
    + + cloud-redo +
    + +
    +
  • +
  • +
    +
    + + cloud-share +
    + +
    +
  • +
  • +
    +
    + + cloud-shield +
    + +
    +
  • +
  • +
    +
    + + cloud-slash +
    + +
    +
  • +
  • +
    +
    + + cloud-times +
    + +
    +
  • +
  • +
    +
    + + cloud-unlock +
    + +
    +
  • +
  • +
    +
    + + cloud-upload +
    + +
    +
  • +
  • +
    +
    + + cloud-wifi +
    + +
    +
  • +
  • +
    +
    + + code-branch +
    + +
    +
  • +
  • +
    +
    + + columns +
    + +
    +
  • +
  • +
    +
    + + data-sharing +
    + +
    +
  • +
  • +
    +
    + + database +
    + +
    +
  • +
  • +
    +
    + + database-alt +
    + +
    +
  • +
  • +
    +
    + + grid +
    + +
    +
  • +
  • +
    +
    + + server +
    + +
    +
  • +
  • +
    +
    + + server-alt +
    + +
    +
  • +
  • +
    +
    + + server-connection +
    + +
    +
  • +
  • +
    +
    + + server-network +
    + +
    +
  • +
  • +
    +
    + + server-network-alt +
    + +
    +
  • +
  • +
    +
    + + servers +
    + +
    +
  • +
  • +
    +
    + + web-grid +
    + +
    +
  • +
  • +
    +
    + + web-grid-alt +
    + +
    +
  • +
  • +
    +
    + + web-section +
    + +
    +
  • +
  • +
    +
    + + web-section-alt +
    + +
    +
  • +
  • +
    +
    + + window +
    + +
    +
  • +
  • +
    +
    + + window-grid +
    + +
    +
  • +
  • +
    +
    + + window-maximize +
    + +
    +
  • +
  • +
    +
    + + window-section +
    + +
    +
  • +
+
+
+

Communication

+
    +
  • +
    +
    + + calling +
    + +
    +
  • +
  • +
    +
    + + desktop-cloud-alt +
    + +
    +
  • +
  • +
    +
    + + envelope +
    + +
    +
  • +
  • +
    +
    + + envelope-add +
    + +
    +
  • +
  • +
    +
    + + envelope-alt +
    + +
    +
  • +
  • +
    +
    + + envelope-block +
    + +
    +
  • +
  • +
    +
    + + envelope-bookmark +
    + +
    +
  • +
  • +
    +
    + + envelope-check +
    + +
    +
  • +
  • +
    +
    + + envelope-download +
    + +
    +
  • +
  • +
    +
    + + envelope-download-alt +
    + +
    +
  • +
  • +
    +
    + + envelope-edit +
    + +
    +
  • +
  • +
    +
    + + envelope-exclamation +
    + +
    +
  • +
  • +
    +
    + + envelope-heart +
    + +
    +
  • +
  • +
    +
    + + envelope-info +
    + +
    +
  • +
  • +
    +
    + + envelope-lock +
    + +
    +
  • +
  • +
    +
    + + envelope-minus +
    + +
    +
  • +
  • +
    +
    + + envelope-open +
    + +
    +
  • +
  • +
    +
    + + envelope-question +
    + +
    +
  • +
  • +
    +
    + + envelope-receive +
    + +
    +
  • +
  • +
    +
    + + envelope-redo +
    + +
    +
  • +
  • +
    +
    + + envelope-search +
    + +
    +
  • +
  • +
    +
    + + envelope-send +
    + +
    +
  • +
  • +
    +
    + + envelope-share +
    + +
    +
  • +
  • +
    +
    + + envelope-shield +
    + +
    +
  • +
  • +
    +
    + + envelope-star +
    + +
    +
  • +
  • +
    +
    + + envelope-times +
    + +
    +
  • +
  • +
    +
    + + envelope-upload +
    + +
    +
  • +
  • +
    +
    + + envelope-upload-alt +
    + +
    +
  • +
  • +
    +
    + + envelopes +
    + +
    +
  • +
  • +
    +
    + + fast-mail +
    + +
    +
  • +
  • +
    +
    + + fast-mail-alt +
    + +
    +
  • +
  • +
    +
    + + forwaded-call +
    + +
    +
  • +
  • +
    +
    + + incoming-call +
    + +
    +
  • +
  • +
    +
    + + laptop-cloud +
    + +
    +
  • +
  • +
    +
    + + laptop-connection +
    + +
    +
  • +
  • +
    +
    + + mailbox +
    + +
    +
  • +
  • +
    +
    + + mailbox-alt +
    + +
    +
  • +
  • +
    +
    + + missed-call +
    + +
    +
  • +
  • +
    +
    + + outgoing-call +
    + +
    +
  • +
  • +
    +
    + + phone +
    + +
    +
  • +
  • +
    +
    + + phone-alt +
    + +
    +
  • +
  • +
    +
    + + phone-pause +
    + +
    +
  • +
  • +
    +
    + + phone-slash +
    + +
    +
  • +
  • +
    +
    + + phone-times +
    + +
    +
  • +
  • +
    +
    + + phone-volume +
    + +
    +
  • +
  • +
    +
    + + post-stamp +
    + +
    +
  • +
  • +
    +
    + + postcard +
    + +
    +
  • +
  • +
    +
    + + rss-alt +
    + +
    +
  • +
+
+
+

Construction

+
    +
  • +
    +
    + + constructor +
    + +
    +
  • +
  • +
    +
    + + drill +
    + +
    +
  • +
  • +
    +
    + + hard-hat +
    + +
    +
  • +
  • +
    +
    + + jackhammer +
    + +
    +
  • +
  • +
    +
    + + no-entry +
    + +
    +
  • +
  • +
    +
    + + paint-tool +
    + +
    +
  • +
  • +
    +
    + + screw +
    + +
    +
  • +
  • +
    +
    + + shovel +
    + +
    +
  • +
  • +
    +
    + + tape +
    + +
    +
  • +
  • +
    +
    + + traffic-barrier +
    + +
    +
  • +
  • +
    +
    + + trowel +
    + +
    +
  • +
  • +
    +
    + + wall +
    + +
    +
  • +
  • +
    +
    + + wheel-barrow +
    + +
    +
  • +
+
+
+

Content

+
    + +
  • +
    +
    + + align +
    + +
    +
  • +
  • +
    +
    + + align-alt +
    + +
    +
  • +
  • +
    +
    + + align-center +
    + +
    +
  • +
  • +
    +
    + + align-center-alt +
    + +
    +
  • +
  • +
    +
    + + align-center-justify +
    + +
    +
  • +
  • +
    +
    + + align-justify +
    + +
    +
  • +
  • +
    +
    + + align-left +
    + +
    +
  • +
  • +
    +
    + + align-left-justify +
    + +
    +
  • +
  • +
    +
    + + align-letter-right +
    + +
    +
  • +
  • +
    +
    + + align-right +
    + +
    +
  • +
  • +
    +
    + + align-right-justify +
    + +
    +
  • +
  • +
    +
    + + bars +
    + +
    +
  • +
  • +
    +
    + + bold +
    + +
    +
  • +
  • +
    +
    + + border-alt +
    + +
    +
  • +
  • +
    +
    + + border-bottom +
    + +
    +
  • +
  • +
    +
    + + border-clear +
    + +
    +
  • +
  • +
    +
    + + border-horizontal +
    + +
    +
  • +
  • +
    +
    + + border-inner +
    + +
    +
  • +
  • +
    +
    + + border-left +
    + +
    +
  • +
  • +
    +
    + + border-right +
    + +
    +
  • +
  • +
    +
    + + border-top +
    + +
    +
  • +
  • +
    +
    + + border-vertical +
    + +
    +
  • +
  • +
    +
    + + dialpad +
    + +
    +
  • +
  • +
    +
    + + dialpad-alt +
    + +
    +
  • +
  • +
    +
    + + document-layout-center +
    + +
    +
  • +
  • +
    +
    + + document-layout-left +
    + +
    +
  • +
  • +
    +
    + + document-layout-right +
    + +
    +
  • +
  • +
    +
    + + english-to-chinese +
    + +
    +
  • +
  • +
    +
    + + font +
    + +
    +
  • +
  • +
    +
    + + grip-horizontal-line +
    + +
    +
  • +
  • +
    +
    + + hindi-to-chinese +
    + +
    +
  • +
  • +
    +
    + + italic +
    + +
    +
  • +
  • +
    +
    + + language +
    + +
    +
  • +
  • +
    +
    + + left-indent +
    + +
    +
  • +
  • +
    +
    + + left-indent-alt +
    + +
    +
  • +
  • +
    +
    + + left-to-right-text-direction +
    + +
    +
  • +
  • +
    +
    + + letter-chinese-a +
    + +
    +
  • +
  • +
    +
    + + letter-english-a +
    + +
    +
  • +
  • +
    +
    + + letter-hindi-a +
    + +
    +
  • +
  • +
    +
    + + letter-japanese-a +
    + +
    +
  • +
  • +
    +
    + + list-ui-alt +
    + +
    +
  • +
  • +
    +
    + + list-ul +
    + +
    +
  • +
  • +
    +
    + + paragraph +
    + +
    +
  • +
  • +
    +
    + + right-indent-alt +
    + +
    +
  • +
  • +
    +
    + + right-to-left-text-direction +
    + +
    +
  • +
  • +
    +
    + + sigma +
    + +
    +
  • +
  • +
    +
    + + sort-amount-down +
    + +
    +
  • +
  • +
    +
    + + sort-amount-up +
    + +
    +
  • +
  • +
    +
    + + subject +
    + +
    +
  • +
  • +
    +
    + + text +
    + +
    +
  • +
  • +
    +
    + + text-fields +
    + +
    +
  • +
  • +
    +
    + + text-size +
    + +
    +
  • +
  • +
    +
    + + text-strike-through +
    + +
    +
  • +
  • +
    +
    + + underline +
    + +
    +
  • +
  • +
    +
    + + wrap-text +
    + +
    +
  • +
+
+
+

Design Tools

+
    +
  • +
    +
    + + apps +
    + +
    +
  • +
  • +
    +
    + + border-out +
    + +
    +
  • +
  • +
    +
    + + bring-bottom +
    + +
    +
  • +
  • +
    +
    + + bring-front +
    + +
    +
  • +
  • +
    +
    + + brush-alt +
    + +
    +
  • +
  • +
    +
    + + circle-layer +
    + +
    +
  • +
  • +
    +
    + + compress +
    + +
    +
  • +
  • +
    +
    + + compress-lines +
    + +
    +
  • +
  • +
    +
    + + compress-v +
    + +
    +
  • +
  • +
    +
    + + crop-alt +
    + +
    +
  • +
  • +
    +
    + + crop-alt-rotate-left +
    + +
    +
  • +
  • +
    +
    + + crop-alt-rotate-right +
    + +
    +
  • +
  • +
    +
    + + exclude +
    + +
    +
  • +
  • +
    +
    + + flip-h +
    + +
    +
  • +
  • +
    +
    + + flip-h-alt +
    + +
    +
  • +
  • +
    +
    + + flip-v +
    + +
    +
  • +
  • +
    +
    + + flip-v-alt +
    + +
    +
  • +
  • +
    +
    + + grids +
    + +
    +
  • +
  • +
    +
    + + horizontal-align-center +
    + +
    +
  • +
  • +
    +
    + + horizontal-align-left +
    + +
    +
  • +
  • +
    +
    + + horizontal-align-right +
    + +
    +
  • +
  • +
    +
    + + horizontal-distribution-center +
    + +
    +
  • +
  • +
    +
    + + horizontal-distribution-left +
    + +
    +
  • +
  • +
    +
    + + horizontal-distribution-right +
    + +
    +
  • +
  • +
    +
    + + icons +
    + +
    +
  • +
  • +
    +
    + + illustration +
    + +
    +
  • +
  • +
    +
    + + image-resize-landscape +
    + +
    +
  • +
  • +
    +
    + + image-resize-square +
    + +
    +
  • +
  • +
    +
    + + layers-alt +
    + +
    +
  • +
  • +
    +
    + + line-alt +
    + +
    +
  • +
  • +
    +
    + + line-spacing +
    + +
    +
  • +
  • +
    +
    + + minus-path +
    + +
    +
  • +
  • +
    +
    + + object-group +
    + +
    +
  • +
  • +
    +
    + + object-ungroup +
    + +
    +
  • +
  • +
    +
    + + palette +
    + +
    +
  • +
  • +
    +
    + + panorama-h +
    + +
    +
  • +
  • +
    +
    + + panorama-h-alt +
    + +
    +
  • +
  • +
    +
    + + panorama-v +
    + +
    +
  • +
  • +
    +
    + + pathfinder +
    + +
    +
  • +
  • +
    +
    + + pathfinder-unite +
    + +
    +
  • +
  • +
    +
    + + repeat +
    + +
    +
  • +
  • +
    +
    + + ruler +
    + +
    +
  • +
  • +
    +
    + + ruler-combined +
    + +
    +
  • +
  • +
    +
    + + shrink +
    + +
    +
  • +
  • +
    +
    + + spin +
    + +
    +
  • +
  • +
    +
    + + square-full +
    + +
    +
  • +
  • +
    +
    + + table +
    + +
    +
  • +
  • +
    +
    + + th +
    + +
    +
  • +
  • +
    +
    + + th-large +
    + +
    +
  • +
  • +
    +
    + + th-slash +
    + +
    +
  • +
  • +
    +
    + + vector-square +
    + +
    +
  • +
  • +
    +
    + + vector-square-alt +
    + +
    +
  • +
  • +
    +
    + + vertical-align-bottom +
    + +
    +
  • +
  • +
    +
    + + vertical-align-center +
    + +
    +
  • +
  • +
    +
    + + vertical-align-top +
    + +
    +
  • +
  • +
    +
    + + vertical-distribute-bottom +
    + +
    +
  • +
  • +
    +
    + + vertical-distribution-center +
    + +
    +
  • +
  • +
    +
    + + vertical-distribution-top +
    + +
    +
  • +
+
+
+

Devices

+
    +
  • +
    +
    + + circuit +
    + +
    +
  • +
  • +
    +
    + + desktop +
    + +
    +
  • +
  • +
    +
    + + desktop-alt +
    + +
    +
  • +
  • +
    +
    + + hdd +
    + +
    +
  • +
  • +
    +
    + + laptop +
    + +
    +
  • +
  • +
    +
    + + mobile-android +
    + +
    +
  • +
  • +
    +
    + + mobile-android-alt +
    + +
    +
  • +
  • +
    +
    + + modem +
    + +
    +
  • +
  • +
    +
    + + monitor +
    + +
    +
  • +
  • +
    +
    + + mouse +
    + +
    +
  • +
  • +
    +
    + + mouse-alt +
    + +
    +
  • +
  • +
    +
    + + mouse-alt-2 +
    + +
    +
  • +
  • +
    +
    + + print +
    + +
    +
  • +
  • +
    +
    + + processor +
    + +
    +
  • +
  • +
    +
    + + tablet +
    + +
    +
  • +
  • +
    +
    + + webcam +
    + +
    +
  • +
  • +
    +
    + + weight +
    + +
    +
  • +
  • +
    +
    + + wifi-router +
    + +
    +
  • +
+
+
+

Education

+
    +
  • +
    +
    + + abacus +
    + +
    +
  • +
  • +
    +
    + + atom +
    + +
    +
  • +
  • +
    +
    + + award +
    + +
    +
  • +
  • +
    +
    + + award-alt +
    + +
    +
  • +
  • +
    +
    + + backpack +
    + +
    +
  • +
  • +
    +
    + + bell-school +
    + +
    +
  • +
  • +
    +
    + + book +
    + +
    +
  • +
  • +
    +
    + + book-alt +
    + +
    +
  • +
  • +
    +
    + + book-open +
    + +
    +
  • +
  • +
    +
    + + brain +
    + +
    +
  • +
  • +
    +
    + + cell +
    + +
    +
  • +
  • +
    +
    + + diary +
    + +
    +
  • +
  • +
    +
    + + diary-alt +
    + +
    +
  • +
  • +
    +
    + + dna +
    + +
    +
  • +
  • +
    +
    + + flask +
    + +
    +
  • +
  • +
    +
    + + flask-potion +
    + +
    +
  • +
  • +
    +
    + + game-structure +
    + +
    +
  • +
  • +
    +
    + + graduation-cap +
    + +
    +
  • +
  • +
    +
    + + medal +
    + +
    +
  • +
  • +
    +
    + + meeting-board +
    + +
    +
  • +
  • +
    +
    + + notebooks +
    + +
    +
  • +
  • +
    +
    + + notes +
    + +
    +
  • +
  • +
    +
    + + podium +
    + +
    +
  • +
  • +
    +
    + + presentation +
    + +
    +
  • +
  • +
    +
    + + presentation-check +
    + +
    +
  • +
  • +
    +
    + + presentation-edit +
    + +
    +
  • +
  • +
    +
    + + presentation-lines-alt +
    + +
    +
  • +
  • +
    +
    + + presentation-minus +
    + +
    +
  • +
  • +
    +
    + + presentation-play +
    + +
    +
  • +
  • +
    +
    + + presentation-plus +
    + +
    +
  • +
  • +
    +
    + + presentation-times +
    + +
    +
  • +
  • +
    +
    + + robot +
    + +
    +
  • +
  • +
    +
    + + sperms +
    + +
    +
  • +
  • +
    +
    + + telescope +
    + +
    +
  • +
+
+
+

Emoji

+
    +
  • +
    +
    + + angry +
    + +
    +
  • +
  • +
    +
    + + annoyed +
    + +
    +
  • +
  • +
    +
    + + annoyed-alt +
    + +
    +
  • +
  • +
    +
    + + confused +
    + +
    +
  • +
  • +
    +
    + + dizzy-meh +
    + +
    +
  • +
  • +
    +
    + + emoji +
    + +
    +
  • +
  • +
    +
    + + frown +
    + +
    +
  • +
  • +
    +
    + + grin +
    + +
    +
  • +
  • +
    +
    + + grin-tongue-wink +
    + +
    +
  • +
  • +
    +
    + + grin-tongue-wink-alt +
    + +
    +
  • +
  • +
    +
    + + kid +
    + +
    +
  • +
  • +
    +
    + + laughing +
    + +
    +
  • +
  • +
    +
    + + meh +
    + +
    +
  • +
  • +
    +
    + + meh-alt +
    + +
    +
  • +
  • +
    +
    + + meh-closed-eye +
    + +
    +
  • +
  • +
    +
    + + nerd +
    + +
    +
  • +
  • +
    +
    + + ninja +
    + +
    +
  • +
  • +
    +
    + + sad +
    + +
    +
  • +
  • +
    +
    + + sad-cry +
    + +
    +
  • +
  • +
    +
    + + sad-crying +
    + +
    +
  • +
  • +
    +
    + + sad-dizzy +
    + +
    +
  • +
  • +
    +
    + + sad-squint +
    + +
    +
  • +
  • +
    +
    + + sick +
    + +
    +
  • +
  • +
    +
    + + silence +
    + +
    +
  • +
  • +
    +
    + + silent-squint +
    + +
    +
  • +
  • +
    +
    + + smile +
    + +
    +
  • +
  • +
    +
    + + smile-beam +
    + +
    +
  • +
  • +
    +
    + + smile-dizzy +
    + +
    +
  • +
  • +
    +
    + + smile-squint-wink +
    + +
    +
  • +
  • +
    +
    + + smile-squint-wink-alt +
    + +
    +
  • +
  • +
    +
    + + smile-wink +
    + +
    +
  • +
  • +
    +
    + + smile-wink-alt +
    + +
    +
  • +
  • +
    +
    + + squint +
    + +
    +
  • +
  • +
    +
    + + surprise +
    + +
    +
  • +
  • +
    +
    + + unamused +
    + +
    +
  • +
+
+
+

File and Folder

+
    +
  • +
    +
    + + books +
    + +
    +
  • +
  • +
    +
    + + clipboard +
    + +
    +
  • +
  • +
    +
    + + clipboard-alt +
    + +
    +
  • +
  • +
    +
    + + clipboard-blank +
    + +
    +
  • +
  • +
    +
    + + clipboard-notes +
    + +
    +
  • +
  • +
    +
    + + copy +
    + +
    +
  • +
  • +
    +
    + + copy-alt +
    + +
    +
  • +
  • +
    +
    + + copy-landscape +
    + +
    +
  • +
  • +
    +
    + + document-info +
    + +
    +
  • +
  • +
    +
    + + file +
    + +
    +
  • +
  • +
    +
    + + file-alt +
    + +
    +
  • +
  • +
    +
    + + file-blank +
    + +
    +
  • +
  • +
    +
    + + file-block-alt +
    + +
    +
  • +
  • +
    +
    + + file-bookmark-alt +
    + +
    +
  • +
  • +
    +
    + + file-check +
    + +
    +
  • +
  • +
    +
    + + file-check-alt +
    + +
    +
  • +
  • +
    +
    + + file-contract +
    + +
    +
  • +
  • +
    +
    + + file-contract-dollar +
    + +
    +
  • +
  • +
    +
    + + file-copy-alt +
    + +
    +
  • +
  • +
    +
    + + file-download +
    + +
    +
  • +
  • +
    +
    + + file-download-alt +
    + +
    +
  • +
  • +
    +
    + + file-edit-alt +
    + +
    +
  • +
  • +
    +
    + + file-exclamation +
    + +
    +
  • +
  • +
    +
    + + file-exclamation-alt +
    + +
    +
  • +
  • +
    +
    + + file-export +
    + +
    +
  • +
  • +
    +
    + + file-graph +
    + +
    +
  • +
  • +
    +
    + + file-heart +
    + +
    +
  • +
  • +
    +
    + + file-import +
    + +
    +
  • +
  • +
    +
    + + file-info-alt +
    + +
    +
  • +
  • +
    +
    + + file-landscape +
    + +
    +
  • +
  • +
    +
    + + file-landscape-alt +
    + +
    +
  • +
  • +
    +
    + + file-lock-alt +
    + +
    +
  • +
  • +
    +
    + + file-medical +
    + +
    +
  • +
  • +
    +
    + + file-minus +
    + +
    +
  • +
  • +
    +
    + + file-minus-alt +
    + +
    +
  • +
  • +
    +
    + + file-network +
    + +
    +
  • +
  • +
    +
    + + file-plus +
    + +
    +
  • +
  • +
    +
    + + file-plus-alt +
    + +
    +
  • +
  • +
    +
    + + file-question +
    + +
    +
  • +
  • +
    +
    + + file-question-alt +
    + +
    +
  • +
  • +
    +
    + + file-redo-alt +
    + +
    +
  • +
  • +
    +
    + + file-search-alt +
    + +
    +
  • +
  • +
    +
    + + file-share-alt +
    + +
    +
  • +
  • +
    +
    + + file-shield-alt +
    + +
    +
  • +
  • +
    +
    + + file-times +
    + +
    +
  • +
  • +
    +
    + + file-times-alt +
    + +
    +
  • +
  • +
    +
    + + file-upload +
    + +
    +
  • +
  • +
    +
    + + file-upload-alt +
    + +
    +
  • +
  • +
    +
    + + files-landscapes +
    + +
    +
  • +
  • +
    +
    + + files-landscapes-alt +
    + +
    +
  • +
  • +
    +
    + + folder +
    + +
    +
  • +
  • +
    +
    + + folder-check +
    + +
    +
  • +
  • +
    +
    + + folder-download +
    + +
    +
  • +
  • +
    +
    + + folder-exclamation +
    + +
    +
  • +
  • +
    +
    + + folder-heart +
    + +
    +
  • +
  • +
    +
    + + folder-info +
    + +
    +
  • +
  • +
    +
    + + folder-lock +
    + +
    +
  • +
  • +
    +
    + + folder-medical +
    + +
    +
  • +
  • +
    +
    + + folder-minus +
    + +
    +
  • +
  • +
    +
    + + folder-network +
    + +
    +
  • +
  • +
    +
    + + folder-open +
    + +
    +
  • +
  • +
    +
    + + folder-plus +
    + +
    +
  • +
  • +
    +
    + + folder-question +
    + +
    +
  • +
  • +
    +
    + + folder-times +
    + +
    +
  • +
  • +
    +
    + + folder-upload +
    + +
    +
  • +
+
+
+

Location and Map

+
    +
  • +
    +
    + + compass +
    + +
    +
  • +
  • +
    +
    + + directions +
    + +
    +
  • +
  • +
    +
    + + location-arrow +
    + +
    +
  • +
  • +
    +
    + + location-arrow-alt +
    + +
    +
  • +
  • +
    +
    + + location-pin-alt +
    + +
    +
  • +
  • +
    +
    + + location-point +
    + +
    +
  • +
  • +
    +
    + + map +
    + +
    +
  • +
  • +
    +
    + + map-marker +
    + +
    +
  • +
  • +
    +
    + + map-marker-alt +
    + +
    +
  • +
  • +
    +
    + + map-marker-edit +
    + +
    +
  • +
  • +
    +
    + + map-marker-info +
    + +
    +
  • +
  • +
    +
    + + map-marker-minus +
    + +
    +
  • +
  • +
    +
    + + map-marker-plus +
    + +
    +
  • +
  • +
    +
    + + map-marker-question +
    + +
    +
  • +
  • +
    +
    + + map-marker-shield +
    + +
    +
  • +
  • +
    +
    + + map-pin +
    + +
    +
  • +
  • +
    +
    + + map-pin-alt +
    + +
    +
  • +
  • +
    +
    + + navigator +
    + +
    +
  • +
  • +
    +
    + + sign-alt +
    + +
    +
  • +
  • +
    +
    + + sign-left +
    + +
    +
  • +
  • +
    +
    + + sign-right +
    + +
    +
  • +
+
+
+

Medical

+
    +
  • +
    +
    + + ambulance +
    + +
    +
  • +
  • +
    +
    + + assistive-listening-systems +
    + +
    +
  • +
  • +
    +
    + + band-aid +
    + +
    +
  • +
  • +
    +
    + + book-medical +
    + +
    +
  • +
  • +
    +
    + + capsule +
    + +
    +
  • +
  • +
    +
    + + clinic-medical +
    + +
    +
  • +
  • +
    +
    + + coronavirus +
    + +
    +
  • +
  • +
    +
    + + ear +
    + +
    +
  • +
  • +
    +
    + + file-medical-alt +
    + +
    +
  • +
  • +
    +
    + + head-side +
    + +
    +
  • +
  • +
    +
    + + head-side-cough +
    + +
    +
  • +
  • +
    +
    + + head-side-mask +
    + +
    +
  • +
  • +
    +
    + + heart-medical +
    + +
    +
  • +
  • +
    +
    + + heart-rate +
    + +
    +
  • +
  • +
    +
    + + heartbeat +
    + +
    +
  • +
  • +
    +
    + + hospital +
    + +
    +
  • +
  • +
    +
    + + hospital-square-sign +
    + +
    +
  • +
  • +
    +
    + + hospital-symbol +
    + +
    +
  • +
  • +
    +
    + + house-user +
    + +
    +
  • +
  • +
    +
    + + medical-drip +
    + +
    +
  • +
  • +
    +
    + + medical-square +
    + +
    +
  • +
  • +
    +
    + + medical-square-full +
    + +
    +
  • +
  • +
    +
    + + medkit +
    + +
    +
  • +
  • +
    +
    + + microscope +
    + +
    +
  • +
  • +
    +
    + + monitor-heart-rate +
    + +
    +
  • +
  • +
    +
    + + prescription-bottle +
    + +
    +
  • +
  • +
    +
    + + sanitizer +
    + +
    +
  • +
  • +
    +
    + + sanitizer-alt +
    + +
    +
  • +
  • +
    +
    + + shield-plus +
    + +
    +
  • +
  • +
    +
    + + social-distancing +
    + +
    +
  • +
  • +
    +
    + + stethoscope +
    + +
    +
  • +
  • +
    +
    + + stethoscope-alt +
    + +
    +
  • +
  • +
    +
    + + store-slash +
    + +
    +
  • +
  • +
    +
    + + stretcher +
    + +
    +
  • +
  • +
    +
    + + syringe +
    + +
    +
  • +
  • +
    +
    + + tablets +
    + +
    +
  • +
  • +
    +
    + + thermometer +
    + +
    +
  • +
  • +
    +
    + + toilet-paper +
    + +
    +
  • +
  • +
    +
    + + user-arrows +
    + +
    +
  • +
  • +
    +
    + + user-md +
    + +
    +
  • +
  • +
    +
    + + user-nurse +
    + +
    +
  • +
  • +
    +
    + + virus-slash +
    + +
    +
  • +
  • +
    +
    + + wheelchair-alt +
    + +
    +
  • +
+
+
+

Multimedia

+
    +
  • +
    +
    + + airplay +
    + +
    +
  • +
  • +
    +
    + + backward +
    + +
    +
  • +
  • +
    +
    + + bolt-slash +
    + +
    +
  • +
  • +
    +
    + + boombox +
    + +
    +
  • +
  • +
    +
    + + camera +
    + +
    +
  • +
  • +
    +
    + + camera-change +
    + +
    +
  • +
  • +
    +
    + + camera-plus +
    + +
    +
  • +
  • +
    +
    + + clapper-board +
    + +
    +
  • +
  • +
    +
    + + compact-disc +
    + +
    +
  • +
  • +
    +
    + + equal-circle +
    + +
    +
  • +
  • +
    +
    + + film +
    + +
    +
  • +
  • +
    +
    + + flower +
    + +
    +
  • +
  • +
    +
    + + forward +
    + +
    +
  • +
  • +
    +
    + + headphone-slash +
    + +
    +
  • +
  • +
    +
    + + headphones +
    + +
    +
  • +
  • +
    +
    + + headphones-alt +
    + +
    +
  • +
  • +
    +
    + + image +
    + +
    +
  • +
  • +
    +
    + + image-block +
    + +
    +
  • +
  • +
    +
    + + image-broken +
    + +
    +
  • +
  • +
    +
    + + image-check +
    + +
    +
  • +
  • +
    +
    + + image-download +
    + +
    +
  • +
  • +
    +
    + + image-edit +
    + +
    +
  • +
  • +
    +
    + + image-lock +
    + +
    +
  • +
  • +
    +
    + + image-minus +
    + +
    +
  • +
  • +
    +
    + + image-plus +
    + +
    +
  • +
  • +
    +
    + + image-question +
    + +
    +
  • +
  • +
    +
    + + image-redo +
    + +
    +
  • +
  • +
    +
    + + image-search +
    + +
    +
  • +
  • +
    +
    + + image-share +
    + +
    +
  • +
  • +
    +
    + + image-shield +
    + +
    +
  • +
  • +
    +
    + + image-times +
    + +
    +
  • +
  • +
    +
    + + image-upload +
    + +
    +
  • +
  • +
    +
    + + image-v +
    + +
    +
  • +
  • +
    +
    + + images +
    + +
    +
  • +
  • +
    +
    + + microphone-slash +
    + +
    +
  • +
  • +
    +
    + + mountains +
    + +
    +
  • +
  • +
    +
    + + music +
    + +
    +
  • +
  • +
    +
    + + music-note +
    + +
    +
  • +
  • +
    +
    + + music-tune-slash +
    + +
    +
  • +
  • +
    +
    + + pause +
    + +
    +
  • +
  • +
    +
    + + pause-circle +
    + +
    +
  • +
  • +
    +
    + + picture +
    + +
    +
  • +
  • +
    +
    + + play +
    + +
    +
  • +
  • +
    +
    + + play-circle +
    + +
    +
  • +
  • +
    +
    + + previous +
    + +
    +
  • +
  • +
    +
    + + record-audio +
    + +
    +
  • +
  • +
    +
    + + rss-interface +
    + +
    +
  • +
  • +
    +
    + + scenery +
    + +
    +
  • +
  • +
    +
    + + selfie +
    + +
    +
  • +
  • +
    +
    + + shutter +
    + +
    +
  • +
  • +
    +
    + + shutter-alt +
    + +
    +
  • +
  • +
    +
    + + skip-forward +
    + +
    +
  • +
  • +
    +
    + + skip-forward-alt +
    + +
    +
  • +
  • +
    +
    + + skip-forward-circle +
    + +
    +
  • +
  • +
    +
    + + slider-h +
    + +
    +
  • +
  • +
    +
    + + slider-h-range +
    + +
    +
  • +
  • +
    +
    + + sliders-v +
    + +
    +
  • +
  • +
    +
    + + sliders-v-alt +
    + +
    +
  • +
  • +
    +
    + + step-backward +
    + +
    +
  • +
  • +
    +
    + + step-backward-alt +
    + +
    +
  • +
  • +
    +
    + + step-backward-circle +
    + +
    +
  • +
  • +
    +
    + + step-forward +
    + +
    +
  • +
  • +
    +
    + + stop-circle +
    + +
    +
  • +
  • +
    +
    + + ticket +
    + +
    +
  • +
  • +
    +
    + + video +
    + +
    +
  • +
  • +
    +
    + + video-question +
    + +
    +
  • +
+
+
+

Photography Tools

+
    +
  • +
    +
    + + bright +
    + +
    +
  • +
  • +
    +
    + + capture +
    + +
    +
  • +
  • +
    +
    + + exposure-alt +
    + +
    +
  • +
  • +
    +
    + + exposure-increase +
    + +
    +
  • +
  • +
    +
    + + eye +
    + +
    +
  • +
  • +
    +
    + + focus +
    + +
    +
  • +
  • +
    +
    + + focus-add +
    + +
    +
  • +
  • +
    +
    + + focus-target +
    + +
    +
  • +
+
+
+

Security

+
    +
  • +
    +
    + + keyhole-circle +
    + +
    +
  • +
  • +
    +
    + + keyhole-square +
    + +
    +
  • +
  • +
    +
    + + keyhole-square-full +
    + +
    +
  • +
  • +
    +
    + + lock +
    + +
    +
  • +
  • +
    +
    + + lock-access +
    + +
    +
  • +
  • +
    +
    + + lock-alt +
    + +
    +
  • +
  • +
    +
    + + lock-open-alt +
    + +
    +
  • +
  • +
    +
    + + padlock +
    + +
    +
  • +
  • +
    +
    + + shield +
    + +
    +
  • +
  • +
    +
    + + shield-check +
    + +
    +
  • +
  • +
    +
    + + shield-exclamation +
    + +
    +
  • +
  • +
    +
    + + shield-question +
    + +
    +
  • +
  • +
    +
    + + shield-slash +
    + +
    +
  • +
  • +
    +
    + + unlock +
    + +
    +
  • +
  • +
    +
    + + unlock-alt +
    + +
    +
  • +
+
+
+

Shape

+
    +
  • +
    +
    + + circle +
    + +
    +
  • +
  • +
    +
    + + heart +
    + +
    +
  • +
  • +
    +
    + + heart-alt +
    + +
    +
  • +
  • +
    +
    + + octagon +
    + +
    +
  • +
  • +
    +
    + + pentagon +
    + +
    +
  • +
  • +
    +
    + + polygon +
    + +
    +
  • +
  • +
    +
    + + square +
    + +
    +
  • +
  • +
    +
    + + square-shape +
    + +
    +
  • +
  • +
    +
    + + star +
    + +
    +
  • +
  • +
    +
    + + triangle +
    + +
    +
  • +
+
+
+

Shopping

+
    +
  • +
    +
    + + archive +
    + +
    +
  • +
  • +
    +
    + + credit-card-search +
    + +
    +
  • +
  • +
    +
    + + gift +
    + +
    +
  • +
  • +
    +
    + + label +
    + +
    +
  • +
  • +
    +
    + + label-alt +
    + +
    +
  • +
  • +
    +
    + + pricetag-alt +
    + +
    +
  • +
  • +
    +
    + + qrcode-scan +
    + +
    +
  • +
  • +
    +
    + + shop +
    + +
    +
  • +
  • +
    +
    + + shopping-bag +
    + +
    +
  • +
  • +
    +
    + + shopping-basket +
    + +
    +
  • +
  • +
    +
    + + shopping-cart +
    + +
    +
  • +
  • +
    +
    + + shopping-cart-alt +
    + +
    +
  • +
  • +
    +
    + + store +
    + +
    +
  • +
  • +
    +
    + + store-alt +
    + +
    +
  • +
  • +
    +
    + + tag +
    + +
    +
  • +
  • +
    +
    + + tag-alt +
    + +
    +
  • +
  • +
    +
    + + transaction +
    + +
    +
  • +
+
+
+

Sign and Symbol

+
    +
  • +
    +
    + + accessible-icon-alt +
    + +
    +
  • +
  • +
    +
    + + ban +
    + +
    +
  • +
  • +
    +
    + + closed-captioning +
    + +
    +
  • +
  • +
    +
    + + closed-captioning-slash +
    + +
    +
  • +
  • +
    +
    + + copyright +
    + +
    +
  • +
  • +
    +
    + + creative-commons-pd +
    + +
    +
  • +
  • +
    +
    + + mars +
    + +
    +
  • +
  • +
    +
    + + parking-circle +
    + +
    +
  • +
  • +
    +
    + + parking-square +
    + +
    +
  • +
  • +
    +
    + + registered +
    + +
    +
  • +
  • +
    +
    + + servicemark +
    + +
    +
  • +
  • +
    +
    + + trademark +
    + +
    +
  • +
  • +
    +
    + + trademark-circle +
    + +
    +
  • +
  • +
    +
    + + venus +
    + +
    +
  • +
  • +
    +
    + + wheelchair +
    + +
    +
  • +
+
+
+

Sports

+
    +
  • +
    +
    + + baseball-ball +
    + +
    +
  • +
  • +
    +
    + + basketball +
    + +
    +
  • +
  • +
    +
    + + basketball-hoop +
    + +
    +
  • +
  • +
    +
    + + bowling-ball +
    + +
    +
  • +
  • +
    +
    + + club +
    + +
    +
  • +
  • +
    +
    + + diamond +
    + +
    +
  • +
  • +
    +
    + + dice-five +
    + +
    +
  • +
  • +
    +
    + + dice-four +
    + +
    +
  • +
  • +
    +
    + + dice-one +
    + +
    +
  • +
  • +
    +
    + + dice-six +
    + +
    +
  • +
  • +
    +
    + + dice-three +
    + +
    +
  • +
  • +
    +
    + + dice-two +
    + +
    +
  • +
  • +
    +
    + + dumbbell +
    + +
    +
  • +
  • +
    +
    + + football +
    + +
    +
  • +
  • +
    +
    + + football-ball +
    + +
    +
  • +
  • +
    +
    + + golf-ball +
    + +
    +
  • +
  • +
    +
    + + heart-sign +
    + +
    +
  • +
  • +
    +
    + + kayak +
    + +
    +
  • +
  • +
    +
    + + spade +
    + +
    +
  • +
  • +
    +
    + + table-tennis +
    + +
    +
  • +
  • +
    +
    + + tennis-ball +
    + +
    +
  • +
  • +
    +
    + + trophy +
    + +
    +
  • +
  • +
    +
    + + volleyball +
    + +
    +
  • +
+
+
+

Time

+
    +
  • +
    +
    + + clock +
    + +
    +
  • +
  • +
    +
    + + clock-eight +
    + +
    +
  • +
  • +
    +
    + + clock-five +
    + +
    +
  • +
  • +
    +
    + + clock-nine +
    + +
    +
  • +
  • +
    +
    + + clock-seven +
    + +
    +
  • +
  • +
    +
    + + clock-ten +
    + +
    +
  • +
  • +
    +
    + + clock-three +
    + +
    +
  • +
  • +
    +
    + + clock-two +
    + +
    +
  • +
  • +
    +
    + + stopwatch +
    + +
    +
  • +
  • +
    +
    + + stopwatch-slash +
    + +
    +
  • +
  • +
    +
    + + watch +
    + +
    +
  • +
  • +
    +
    + + watch-alt +
    + +
    +
  • +
+
+
+

Transport

+
    +
  • +
    +
    + + bus +
    + +
    +
  • +
  • +
    +
    + + bus-alt +
    + +
    +
  • +
  • +
    +
    + + bus-school +
    + +
    +
  • +
  • +
    +
    + + car-sideview +
    + +
    +
  • +
  • +
    +
    + + car-wash +
    + +
    +
  • +
  • +
    +
    + + luggage-cart +
    + +
    +
  • +
  • +
    +
    + + metro +
    + +
    +
  • +
  • +
    +
    + + parcel +
    + +
    +
  • +
  • +
    +
    + + ship +
    + +
    +
  • +
  • +
    +
    + + subway +
    + +
    +
  • +
  • +
    +
    + + subway-alt +
    + +
    +
  • +
  • +
    +
    + + taxi +
    + +
    +
  • +
  • +
    +
    + + truck +
    + +
    +
  • +
  • +
    +
    + + truck-loading +
    + +
    +
  • +
+
+
+

User Interface

+
    +
  • +
    +
    + + plus-0 +
    + +
    +
  • +
  • +
    +
    + + plus-3 +
    + +
    +
  • +
  • +
    +
    + + plus-6 +
    + +
    +
  • +
  • +
    +
    + + plus-10 +
    + +
    +
  • +
  • +
    +
    + + plus-12 +
    + +
    +
  • +
  • +
    +
    + + plus-13 +
    + +
    +
  • +
  • +
    +
    + + plus-16 +
    + +
    +
  • +
  • +
    +
    + + plus-17 +
    + +
    +
  • +
  • +
    +
    + + plus-18 +
    + +
    +
  • +
  • +
    +
    + + plus-21 +
    + +
    +
  • +
  • +
    +
    + + adjust +
    + +
    +
  • +
  • +
    +
    + + adjust-alt +
    + +
    +
  • +
  • +
    +
    + + adjust-circle +
    + +
    +
  • +
  • +
    +
    + + adjust-half +
    + +
    +
  • +
  • +
    +
    + + anchor +
    + +
    +
  • +
  • +
    +
    + + android-phone-slash +
    + +
    +
  • +
  • +
    +
    + + ankh +
    + +
    +
  • +
  • +
    +
    + + archive-alt +
    + +
    +
  • +
  • +
    +
    + + archway +
    + +
    +
  • +
  • +
    +
    + + asterisk +
    + +
    +
  • +
  • +
    +
    + + at +
    + +
    +
  • +
  • +
    +
    + + auto-flash +
    + +
    +
  • +
  • +
    +
    + + baby-carriage +
    + +
    +
  • +
  • +
    +
    + + backspace +
    + +
    +
  • +
  • +
    +
    + + bag-slash +
    + +
    +
  • +
  • +
    +
    + + balance-scale +
    + +
    +
  • +
  • +
    +
    + + bath +
    + +
    +
  • +
  • +
    +
    + + battery-bolt +
    + +
    +
  • +
  • +
    +
    + + battery-empty +
    + +
    +
  • +
  • +
    +
    + + bed +
    + +
    +
  • +
  • +
    +
    + + bed-double +
    + +
    +
  • +
  • +
    +
    + + bell +
    + +
    +
  • +
  • +
    +
    + + bell-slash +
    + +
    +
  • +
  • +
    +
    + + bluetooth-b +
    + +
    +
  • +
  • +
    +
    + + bolt +
    + +
    +
  • +
  • +
    +
    + + bolt-alt +
    + +
    +
  • +
  • +
    +
    + + bookmark +
    + +
    +
  • +
  • +
    +
    + + bookmark-full +
    + +
    +
  • +
  • +
    +
    + + box +
    + +
    +
  • +
  • +
    +
    + + brightness +
    + +
    +
  • +
  • +
    +
    + + brightness-empty +
    + +
    +
  • +
  • +
    +
    + + brightness-half +
    + +
    +
  • +
  • +
    +
    + + brightness-low +
    + +
    +
  • +
  • +
    +
    + + brightness-minus +
    + +
    +
  • +
  • +
    +
    + + brightness-plus +
    + +
    +
  • +
  • +
    +
    + + building +
    + +
    +
  • +
  • +
    +
    + + bullseye +
    + +
    +
  • +
  • +
    +
    + + calculator +
    + +
    +
  • +
  • +
    +
    + + calendar-slash +
    + +
    +
  • +
  • +
    +
    + + calender +
    + +
    +
  • +
  • +
    +
    + + camera-slash +
    + +
    +
  • +
  • +
    +
    + + cancel +
    + +
    +
  • +
  • +
    +
    + + car +
    + +
    +
  • +
  • +
    +
    + + car-slash +
    + +
    +
  • +
  • +
    +
    + + card-atm +
    + +
    +
  • +
  • +
    +
    + + check +
    + +
    +
  • +
  • +
    +
    + + check-circle +
    + +
    +
  • +
  • +
    +
    + + check-square +
    + +
    +
  • +
  • +
    +
    + + coffee +
    + +
    +
  • +
  • +
    +
    + + cog +
    + +
    +
  • +
  • +
    +
    + + comment-alt-slash +
    + +
    +
  • +
  • +
    +
    + + comment-slash +
    + +
    +
  • +
  • +
    +
    + + create-dashboard +
    + +
    +
  • +
  • +
    +
    + + crockery +
    + +
    +
  • +
  • +
    +
    + + cube +
    + +
    +
  • +
  • +
    +
    + + dashboard +
    + +
    +
  • +
  • +
    +
    + + desktop-alt-slash +
    + +
    +
  • +
  • +
    +
    + + desktop-slash +
    + +
    +
  • +
  • +
    +
    + + draggabledots +
    + +
    +
  • +
  • +
    +
    + + edit +
    + +
    +
  • +
  • +
    +
    + + edit-alt +
    + +
    +
  • +
  • +
    +
    + + elipsis-double-v-alt +
    + +
    +
  • +
  • +
    +
    + + ellipsis-h +
    + +
    +
  • +
  • +
    +
    + + ellipsis-v +
    + +
    +
  • +
  • +
    +
    + + estate +
    + +
    +
  • +
  • +
    +
    + + exclamation +
    + +
    +
  • +
  • +
    +
    + + exclamation-circle +
    + +
    +
  • +
  • +
    +
    + + exclamation-octagon +
    + +
    +
  • +
  • +
    +
    + + exclamation-triangle +
    + +
    +
  • +
  • +
    +
    + + external-link-alt +
    + +
    +
  • +
  • +
    +
    + + eye-slash +
    + +
    +
  • +
  • +
    +
    + + favorite +
    + +
    +
  • +
  • +
    +
    + + feedback +
    + +
    +
  • +
  • +
    +
    + + fidget-spinner +
    + +
    +
  • +
  • +
    +
    + + file-lanscape-slash +
    + +
    +
  • +
  • +
    +
    + + file-slash +
    + +
    +
  • +
  • +
    +
    + + filter +
    + +
    +
  • +
  • +
    +
    + + filter-slash +
    + +
    +
  • +
  • +
    +
    + + fire +
    + +
    +
  • +
  • +
    +
    + + folder-slash +
    + +
    +
  • +
  • +
    +
    + + football-american +
    + +
    +
  • +
  • +
    +
    + + glass +
    + +
    +
  • +
  • +
    +
    + + glass-martini +
    + +
    +
  • +
  • +
    +
    + + glass-martini-alt +
    + +
    +
  • +
  • +
    +
    + + glass-martini-alt-slash +
    + +
    +
  • +
  • +
    +
    + + glass-tea +
    + +
    +
  • +
  • +
    +
    + + globe +
    + +
    +
  • +
  • +
    +
    + + heart-break +
    + +
    +
  • +
  • +
    +
    + + history +
    + +
    +
  • +
  • +
    +
    + + history-alt +
    + +
    +
  • +
  • +
    +
    + + home +
    + +
    +
  • +
  • +
    +
    + + hourglass +
    + +
    +
  • +
  • +
    +
    + + image-alt-slash +
    + +
    +
  • +
  • +
    +
    + + image-slash +
    + +
    +
  • +
  • +
    +
    + + inbox +
    + +
    +
  • +
  • +
    +
    + + info +
    + +
    +
  • +
  • +
    +
    + + info-circle +
    + +
    +
  • +
  • +
    +
    + + key-skeleton +
    + +
    +
  • +
  • +
    +
    + + key-skeleton-alt +
    + +
    +
  • +
  • +
    +
    + + keyboard +
    + +
    +
  • +
  • +
    +
    + + keyboard-alt +
    + +
    +
  • +
  • +
    +
    + + keyboard-hide +
    + +
    +
  • +
  • +
    +
    + + keyboard-show +
    + +
    +
  • +
  • +
    +
    + + lamp +
    + +
    +
  • +
  • +
    +
    + + layer-group +
    + +
    +
  • +
  • +
    +
    + + layer-group-slash +
    + +
    +
  • +
  • +
    +
    + + layers +
    + +
    +
  • +
  • +
    +
    + + layers-slash +
    + +
    +
  • +
  • +
    +
    + + life-ring +
    + +
    +
  • +
  • +
    +
    + + link +
    + +
    +
  • +
  • +
    +
    + + link-add +
    + +
    +
  • +
  • +
    +
    + + link-alt +
    + +
    +
  • +
  • +
    +
    + + link-broken +
    + +
    +
  • +
  • +
    +
    + + link-h +
    + +
    +
  • +
  • +
    +
    + + list-ol +
    + +
    +
  • +
  • +
    +
    + + list-ol-alt +
    + +
    +
  • +
  • +
    +
    + + lock-slash +
    + +
    +
  • +
  • +
    +
    + + map-marker-slash +
    + +
    +
  • +
  • +
    +
    + + megaphone +
    + +
    +
  • +
  • +
    +
    + + message +
    + +
    +
  • +
  • +
    +
    + + microphone +
    + +
    +
  • +
  • +
    +
    + + minus +
    + +
    +
  • +
  • +
    +
    + + minus-circle +
    + +
    +
  • +
  • +
    +
    + + minus-square +
    + +
    +
  • +
  • +
    +
    + + minus-square-full +
    + +
    +
  • +
  • +
    +
    + + mobile-vibrate +
    + +
    +
  • +
  • +
    +
    + + money-bill-slash +
    + +
    +
  • +
  • +
    +
    + + multiply +
    + +
    +
  • +
  • +
    +
    + + newspaper +
    + +
    +
  • +
  • +
    +
    + + package +
    + +
    +
  • +
  • +
    +
    + + paperclip +
    + +
    +
  • +
  • +
    +
    + + pen +
    + +
    +
  • +
  • +
    +
    + + pizza-slice +
    + +
    +
  • +
  • +
    +
    + + plane +
    + +
    +
  • +
  • +
    +
    + + plane-arrival +
    + +
    +
  • +
  • +
    +
    + + plane-departure +
    + +
    +
  • +
  • +
    +
    + + plane-fly +
    + +
    +
  • +
  • +
    +
    + + plug +
    + +
    +
  • +
  • +
    +
    + + plus +
    + +
    +
  • +
  • +
    +
    + + plus-circle +
    + +
    +
  • +
  • +
    +
    + + plus-square +
    + +
    +
  • +
  • +
    +
    + + power +
    + +
    +
  • +
  • +
    +
    + + print-slash +
    + +
    +
  • +
  • +
    +
    + + process +
    + +
    +
  • +
  • +
    +
    + + pump +
    + +
    +
  • +
  • +
    +
    + + question +
    + +
    +
  • +
  • +
    +
    + + question-circle +
    + +
    +
  • +
  • +
    +
    + + redo +
    + +
    +
  • +
  • +
    +
    + + refresh +
    + +
    +
  • +
  • +
    +
    + + restaurant +
    + +
    +
  • +
  • +
    +
    + + rocket +
    + +
    +
  • +
  • +
    +
    + + rope-way +
    + +
    +
  • +
  • +
    +
    + + rotate-360 +
    + +
    +
  • +
  • +
    +
    + + rss +
    + +
    +
  • +
  • +
    +
    + + save +
    + +
    +
  • +
  • +
    +
    + + search +
    + +
    +
  • +
  • +
    +
    + + search-alt +
    + +
    +
  • +
  • +
    +
    + + search-minus +
    + +
    +
  • +
  • +
    +
    + + search-plus +
    + +
    +
  • +
  • +
    +
    + + setting +
    + +
    +
  • +
  • +
    +
    + + share-alt +
    + +
    +
  • +
  • +
    +
    + + sign-in-alt +
    + +
    +
  • +
  • +
    +
    + + sign-out-alt +
    + +
    +
  • +
  • +
    +
    + + signal +
    + +
    +
  • +
  • +
    +
    + + signal-alt +
    + +
    +
  • +
  • +
    +
    + + signin +
    + +
    +
  • +
  • +
    +
    + + signout +
    + +
    +
  • +
  • +
    +
    + + sim-card +
    + +
    +
  • +
  • +
    +
    + + space-key +
    + +
    +
  • +
  • +
    +
    + + spinner +
    + +
    +
  • +
  • +
    +
    + + spinner-alt +
    + +
    +
  • +
  • +
    +
    + + star-half-alt +
    + +
    +
  • +
  • +
    +
    + + streering +
    + +
    +
  • +
  • +
    +
    + + sun +
    + +
    +
  • +
  • +
    +
    + + swatchbook +
    + +
    +
  • +
  • +
    +
    + + swimmer +
    + +
    +
  • +
  • +
    +
    + + sync +
    + +
    +
  • +
  • +
    +
    + + sync-exclamation +
    + +
    +
  • +
  • +
    +
    + + sync-slash +
    + +
    +
  • +
  • +
    +
    + + tachometer-fast +
    + +
    +
  • +
  • +
    +
    + + tachometer-fast-alt +
    + +
    +
  • +
  • +
    +
    + + tear +
    + +
    +
  • +
  • +
    +
    + + thumbs-down +
    + +
    +
  • +
  • +
    +
    + + thumbs-up +
    + +
    +
  • +
  • +
    +
    + + times +
    + +
    +
  • +
  • +
    +
    + + times-circle +
    + +
    +
  • +
  • +
    +
    + + times-square +
    + +
    +
  • +
  • +
    +
    + + toggle-off +
    + +
    +
  • +
  • +
    +
    + + toggle-on +
    + +
    +
  • +
  • +
    +
    + + traffic-light +
    + +
    +
  • +
  • +
    +
    + + trash +
    + +
    +
  • +
  • +
    +
    + + trash-alt +
    + +
    +
  • +
  • +
    +
    + + trees +
    + +
    +
  • +
  • +
    +
    + + tv-retro +
    + +
    +
  • +
  • +
    +
    + + tv-retro-slash +
    + +
    +
  • +
  • +
    +
    + + umbrella +
    + +
    +
  • +
  • +
    +
    + + upload +
    + +
    +
  • +
  • +
    +
    + + utensils +
    + +
    +
  • +
  • +
    +
    + + utensils-alt +
    + +
    +
  • +
  • +
    +
    + + video-slash +
    + +
    +
  • +
  • +
    +
    + + voicemail +
    + +
    +
  • +
  • +
    +
    + + voicemail-rectangle +
    + +
    +
  • +
  • +
    +
    + + volume +
    + +
    +
  • +
  • +
    +
    + + volume-down +
    + +
    +
  • +
  • +
    +
    + + volume-mute +
    + +
    +
  • +
  • +
    +
    + + volume-off +
    + +
    +
  • +
  • +
    +
    + + volume-up +
    + +
    +
  • +
  • +
    +
    + + wallet +
    + +
    +
  • +
  • +
    +
    + + water-drop-slash +
    + +
    +
  • +
  • +
    +
    + + water-glass +
    + +
    +
  • +
  • +
    +
    + + wifi +
    + +
    +
  • +
  • +
    +
    + + wifi-slash +
    + +
    +
  • +
  • +
    +
    + + wrench +
    + +
    +
  • +
  • +
    +
    + + x +
    + +
    +
  • +
  • +
    +
    + + x-add +
    + +
    +
  • +
  • +
    +
    + + yin-yang +
    + +
    +
  • +
+
+
+

Users

+
    +
  • +
    +
    + + book-reader +
    + +
    +
  • +
  • +
    +
    + + user +
    + +
    +
  • +
  • +
    +
    + + user-check +
    + +
    +
  • +
  • +
    +
    + + user-circle +
    + +
    +
  • +
  • +
    +
    + + user-exclamation +
    + +
    +
  • +
  • +
    +
    + + user-location +
    + +
    +
  • +
  • +
    +
    + + user-minus +
    + +
    +
  • +
  • +
    +
    + + user-plus +
    + +
    +
  • +
  • +
    +
    + + user-square +
    + +
    +
  • +
  • +
    +
    + + user-times +
    + +
    +
  • +
  • +
    +
    + + users-alt +
    + +
    +
  • +
+
+
+

Weather

+
    +
  • +
    +
    + + celsius +
    + +
    +
  • +
  • +
    +
    + + cloud +
    + +
    +
  • +
  • +
    +
    + + cloud-drizzle +
    + +
    +
  • +
  • +
    +
    + + cloud-hail +
    + +
    +
  • +
  • +
    +
    + + cloud-meatball +
    + +
    +
  • +
  • +
    +
    + + cloud-moon +
    + +
    +
  • +
  • +
    +
    + + cloud-moon-hail +
    + +
    +
  • +
  • +
    +
    + + cloud-moon-meatball +
    + +
    +
  • +
  • +
    +
    + + cloud-moon-rain +
    + +
    +
  • +
  • +
    +
    + + cloud-moon-showers +
    + +
    +
  • +
  • +
    +
    + + cloud-rain +
    + +
    +
  • +
  • +
    +
    + + cloud-rain-sun +
    + +
    +
  • +
  • +
    +
    + + cloud-showers +
    + +
    +
  • +
  • +
    +
    + + cloud-showers-alt +
    + +
    +
  • +
  • +
    +
    + + cloud-showers-heavy +
    + +
    +
  • +
  • +
    +
    + + cloud-sun +
    + +
    +
  • +
  • +
    +
    + + cloud-sun-hail +
    + +
    +
  • +
  • +
    +
    + + cloud-sun-meatball +
    + +
    +
  • +
  • +
    +
    + + cloud-sun-rain +
    + +
    +
  • +
  • +
    +
    + + cloud-sun-rain-alt +
    + +
    +
  • +
  • +
    +
    + + cloud-sun-tear +
    + +
    +
  • +
  • +
    +
    + + cloud-wind +
    + +
    +
  • +
  • +
    +
    + + clouds +
    + +
    +
  • +
  • +
    +
    + + desert +
    + +
    +
  • +
  • +
    +
    + + fahrenheit +
    + +
    +
  • +
  • +
    +
    + + forecastcloud-moon-tear +
    + +
    +
  • +
  • +
    +
    + + moon +
    + +
    +
  • +
  • +
    +
    + + moon-eclipse +
    + +
    +
  • +
  • +
    +
    + + moonset +
    + +
    +
  • +
  • +
    +
    + + mountains-sun +
    + +
    +
  • +
  • +
    +
    + + n-a +
    + +
    +
  • +
  • +
    +
    + + rainbow +
    + +
    +
  • +
  • +
    +
    + + raindrops +
    + +
    +
  • +
  • +
    +
    + + raindrops-alt +
    + +
    +
  • +
  • +
    +
    + + snow-flake +
    + +
    +
  • +
  • +
    +
    + + snowflake +
    + +
    +
  • +
  • +
    +
    + + snowflake-alt +
    + +
    +
  • +
  • +
    +
    + + sunset +
    + +
    +
  • +
  • +
    +
    + + temperature +
    + +
    +
  • +
  • +
    +
    + + temperature-empty +
    + +
    +
  • +
  • +
    +
    + + temperature-half +
    + +
    +
  • +
  • +
    +
    + + temperature-minus +
    + +
    +
  • +
  • +
    +
    + + temperature-plus +
    + +
    +
  • +
  • +
    +
    + + temperature-quarter +
    + +
    +
  • +
  • +
    +
    + + temperature-three-quarter +
    + +
    +
  • +
  • +
    +
    + + thunderstorm +
    + +
    +
  • +
  • +
    +
    + + thunderstorm-moon +
    + +
    +
  • +
  • +
    +
    + + thunderstorm-sun +
    + +
    +
  • +
  • +
    +
    + + tornado +
    + +
    +
  • +
  • +
    +
    + + water +
    + +
    +
  • +
  • +
    +
    + + wind +
    + +
    +
  • +
  • +
    +
    + + wind-moon +
    + +
    +
  • +
  • +
    +
    + + wind-sun +
    + +
    +
  • +
  • +
    +
    + + windsock +
    + +
    +
  • +
  • +
    +
    + + windy +
    + +
    +
  • +
+
+
+ +
+ +
+ +
+ + @@include('docs/_footer.html') + @@include('_page-progress.html') + @@include('_scripts.html') + + \ No newline at end of file diff --git a/sandbox310/src/docs/styleguide/icons-svg.html b/sandbox310/src/docs/styleguide/icons-svg.html new file mode 100644 index 0000000..0ab7253 --- /dev/null +++ b/sandbox310/src/docs/styleguide/icons-svg.html @@ -0,0 +1,4314 @@ + + + + @@include('_head.html') + + +
+
+ @@include('_navbar.html', { + "classList": "center-nav transparent navbar-light", + "otherClassList": "w-100 d-flex ms-auto", + "otherLanguageSelect": true, + "otherBtn": true, + "otherBtnClassList": "btn-sm btn-primary rounded-pill", + "otherBtnText": "Contact", + "otherBtnLink": "@@webRoot/contact.html" + }) +
+ +
+
+
+
+

SVG Icons

+

Below you can find the list of all SVG icons included in Sandbox. Copy their codes easily with the copy buttons.

+
+ +
+ +
+ +
+ +
+
+ @@include('docs/_sidebar.html', {"page": "styleguide-svg"}) + + +
+
+

Lineal

+

Below you can find the list of all lineal SVG icons with their code snippets. All these retina-ready icons can easily be styled by color and size. To reach the resource of this set visit Flaticon

+

Colors

+
+
+
+
+
+ + +
+ text-primary +
+ +
+
+ + +
+ text-aqua +
+ +
+
+ + +
+ text-green +
+ +
+
+ + +
+ text-leaf +
+ +
+
+ + +
+ text-navy +
+ +
+
+ + +
+ text-orange +
+ +
+
+ + +
+ text-pink +
+ +
+
+ + +
+ text-purple +
+ +
+
+ + +
+ text-red +
+ +
+
+ + +
+ text-violet +
+ +
+
+ + +
+ text-yellow +
+ +
+
+ + +
+ text-blue +
+ +
+
+ + +
+ text-fuchsia +
+ +
+
+ + +
+ text-sky +
+ +
+
+ + +
+ text-grape +
+ +
+ +
+ +
+ +

Sizes

+
+
+
+
+
+ + +
+ icon-svg-lg +
+ +
+
+ + +
+ icon-svg-md +
+ +
+
+ + +
+ icon-svg-sm +
+ +
+
+ + +
+ icon-svg-xs +
+ +
+ +
+ +
+ +

Icons

+
    +
  • +
    +
    + + adjust +
    + +
    +
  • +
  • +
    +
    + + agenda +
    + +
    +
  • +
  • +
    +
    + + analytics +
    + +
    +
  • +
  • +
    +
    + + award +
    + +
    +
  • +
  • +
    +
    + + award-2 +
    + +
    +
  • +
  • +
    +
    + + badge +
    + +
    +
  • +
  • +
    +
    + + balance +
    + +
    +
  • +
  • +
    +
    + + bar-chart +
    + +
    +
  • +
  • +
    +
    + + barcode +
    + +
    +
  • +
  • +
    +
    + + bell +
    + +
    +
  • +
  • +
    +
    + + box +
    + +
    +
  • +
  • +
    +
    + + briefcase +
    + +
    +
  • +
  • +
    +
    + + briefcase-2 +
    + +
    +
  • +
  • +
    +
    + + browser +
    + +
    +
  • +
  • +
    +
    + + browser-2 +
    + +
    +
  • +
  • +
    +
    + + brush +
    + +
    +
  • +
  • +
    +
    + + bucket +
    + +
    +
  • +
  • +
    +
    + + cake +
    + +
    +
  • +
  • +
    +
    + + calculator +
    + +
    +
  • +
  • +
    +
    + + calendar +
    + +
    +
  • +
  • +
    +
    + + certificate +
    + +
    +
  • +
  • +
    +
    + + chat +
    + +
    +
  • +
  • +
    +
    + + chat-2 +
    + +
    +
  • +
  • +
    +
    + + check +
    + +
    +
  • +
  • +
    +
    + + check-2 +
    + +
    +
  • +
  • +
    +
    + + check-list +
    + +
    +
  • +
  • +
    +
    + + clipboard +
    + +
    +
  • +
  • +
    +
    + + clock +
    + +
    +
  • +
  • +
    +
    + + clock-2 +
    + +
    +
  • +
  • +
    +
    + + clock-3 +
    + +
    +
  • +
  • +
    +
    + + cloud-computing +
    + +
    +
  • +
  • +
    +
    + + cloud-computing-2 +
    + +
    +
  • +
  • +
    +
    + + cloud-computing-3 +
    + +
    +
  • +
  • +
    +
    + + coffee-cup +
    + +
    +
  • +
  • +
    +
    + + coin +
    + +
    +
  • +
  • +
    +
    + + compass +
    + +
    +
  • +
  • +
    +
    + + computer +
    + +
    +
  • +
  • +
    +
    + + controller +
    + +
    +
  • +
  • +
    +
    + + controller-2 +
    + +
    +
  • +
  • +
    +
    + + crayons +
    + +
    +
  • +
  • +
    +
    + + crop +
    + +
    +
  • +
  • +
    +
    + + design +
    + +
    +
  • +
  • +
    +
    + + directions +
    + +
    +
  • +
  • +
    +
    + + discount-tag +
    + +
    +
  • +
  • +
    +
    + + download +
    + +
    +
  • +
  • +
    +
    + + earth +
    + +
    +
  • +
  • +
    +
    + + edit-text +
    + +
    +
  • +
  • +
    +
    + + email +
    + +
    +
  • +
  • +
    +
    + + email-2 +
    + +
    +
  • +
  • +
    +
    + + email-3 +
    + +
    +
  • +
  • +
    +
    + + exchange +
    + +
    +
  • +
  • +
    +
    + + expand +
    + +
    +
  • +
  • +
    +
    + + fax +
    + +
    +
  • +
  • +
    +
    + + files +
    + +
    +
  • +
  • +
    +
    + + fullscreen +
    + +
    +
  • +
  • +
    +
    + + geolocalization +
    + +
    +
  • +
  • +
    +
    + + gift +
    + +
    +
  • +
  • +
    +
    + + group-2 +
    + +
    +
  • +
  • +
    +
    + + growth +
    + +
    +
  • +
  • +
    +
    + + handshake +
    + +
    +
  • +
  • +
    +
    + + headphone +
    + +
    +
  • +
  • +
    +
    + + headphone-2 +
    + +
    +
  • +
  • +
    +
    + + heart +
    + +
    +
  • +
  • +
    +
    + + home +
    + +
    +
  • +
  • +
    +
    + + hourglass +
    + +
    +
  • +
  • +
    +
    + + house +
    + +
    +
  • +
  • +
    +
    + + id-card +
    + +
    +
  • +
  • +
    +
    + + insurance +
    + +
    +
  • +
  • +
    +
    + + invoice +
    + +
    +
  • +
  • +
    +
    + + laptop +
    + +
    +
  • +
  • +
    +
    + + levels +
    + +
    +
  • +
  • +
    +
    + + light-bulb +
    + +
    +
  • +
  • +
    +
    + + link +
    + +
    +
  • +
  • +
    +
    + + list +
    + +
    +
  • +
  • +
    +
    + + loading +
    + +
    +
  • +
  • +
    +
    + + lock +
    + +
    +
  • +
  • +
    +
    + + login +
    + +
    +
  • +
  • +
    +
    + + logout +
    + +
    +
  • +
  • +
    +
    + + loss +
    + +
    +
  • +
  • +
    +
    + + loyalty +
    + +
    +
  • +
  • +
    +
    + + map +
    + +
    +
  • +
  • +
    +
    + + maximize +
    + +
    +
  • +
  • +
    +
    + + medal +
    + +
    +
  • +
  • +
    +
    + + meeting +
    + +
    +
  • +
  • +
    +
    + + megaphone +
    + +
    +
  • +
  • +
    +
    + + menu +
    + +
    +
  • +
  • +
    +
    + + microphone +
    + +
    +
  • +
  • +
    +
    + + minimize +
    + +
    +
  • +
  • +
    +
    + + money +
    + +
    +
  • +
  • +
    +
    + + music +
    + +
    +
  • +
  • +
    +
    + + networking +
    + +
    +
  • +
  • +
    +
    + + networking-2 +
    + +
    +
  • +
  • +
    +
    + + open +
    + +
    +
  • +
  • +
    +
    + + padlock +
    + +
    +
  • +
  • +
    +
    + + paint-roller +
    + +
    +
  • +
  • +
    +
    + + paper-plane +
    + +
    +
  • +
  • +
    +
    + + paper +
    + +
    +
  • +
  • +
    +
    + + password +
    + +
    +
  • +
  • +
    +
    + + photo-camera +
    + +
    +
  • +
  • +
    +
    + + picture +
    + +
    +
  • +
  • +
    +
    + + pictures +
    + +
    +
  • +
  • +
    +
    + + pie-chart +
    + +
    +
  • +
  • +
    +
    + + pie-chart-2 +
    + +
    +
  • +
  • +
    +
    + + pin +
    + +
    +
  • +
  • +
    +
    + + pin-2 +
    + +
    +
  • +
  • +
    +
    + + plan +
    + +
    +
  • +
  • +
    +
    + + price-tag +
    + +
    +
  • +
  • +
    +
    + + printer +
    + +
    +
  • +
  • +
    +
    + + profits +
    + +
    +
  • +
  • +
    +
    + + puzzle +
    + +
    +
  • +
  • +
    +
    + + puzzle-2 +
    + +
    +
  • +
  • +
    +
    + + ranking +
    + +
    +
  • +
  • +
    +
    + + refresh +
    + +
    +
  • +
  • +
    +
    + + rocket +
    + +
    +
  • +
  • +
    +
    + + savings +
    + +
    +
  • +
  • +
    +
    + + scale +
    + +
    +
  • +
  • +
    +
    + + scroll +
    + +
    +
  • +
  • +
    +
    + + scroll-2 +
    + +
    +
  • +
  • +
    +
    + + search +
    + +
    +
  • +
  • +
    +
    + + search-2 +
    + +
    +
  • +
  • +
    +
    + + server +
    + +
    +
  • +
  • +
    +
    + + settings +
    + +
    +
  • +
  • +
    +
    + + settings-2 +
    + +
    +
  • +
  • +
    +
    + + settings-3 +
    + +
    +
  • +
  • +
    +
    + + shield +
    + +
    +
  • +
  • +
    +
    + + shield-2 +
    + +
    +
  • +
  • +
    +
    + + shop +
    + +
    +
  • +
  • +
    +
    + + shop-2 +
    + +
    +
  • +
  • +
    +
    + + shope-3 +
    + +
    +
  • +
  • +
    +
    + + shopping-basket +
    + +
    +
  • +
  • +
    +
    + + shopping-cart +
    + +
    +
  • +
  • +
    +
    + + show +
    + +
    +
  • +
  • +
    +
    + + sitemap +
    + +
    +
  • +
  • +
    +
    + + smartphone +
    + +
    +
  • +
  • +
    +
    + + smartphone-2 +
    + +
    +
  • +
  • +
    +
    + + smartphone-3 +
    + +
    +
  • +
  • +
    +
    + + smartphone-4 +
    + +
    +
  • +
  • +
    +
    + + smartwatch +
    + +
    +
  • +
  • +
    +
    + + speedometer +
    + +
    +
  • +
  • +
    +
    + + square +
    + +
    +
  • +
  • +
    +
    + + stars +
    + +
    +
  • +
  • +
    +
    + + startup +
    + +
    +
  • +
  • +
    +
    + + statistics +
    + +
    +
  • +
  • +
    +
    + + sticker +
    + +
    +
  • +
  • +
    +
    + + target +
    + +
    +
  • +
  • +
    +
    + + target-2 +
    + +
    +
  • +
  • +
    +
    + + team +
    + +
    +
  • +
  • +
    +
    + + telemarketer +
    + +
    +
  • +
  • +
    +
    + + telephone +
    + +
    +
  • +
  • +
    +
    + + telephone-2 +
    + +
    +
  • +
  • +
    +
    + + telephone-3 +
    + +
    +
  • +
  • +
    +
    + + television +
    + +
    +
  • +
  • +
    +
    + + tie +
    + +
    +
  • +
  • +
    +
    + + tools +
    + +
    +
  • +
  • +
    +
    + + touch-screen +
    + +
    +
  • +
  • +
    +
    + + truck +
    + +
    +
  • +
  • +
    +
    + + upload +
    + +
    +
  • +
  • +
    +
    + + user +
    + +
    +
  • +
  • +
    +
    + + video +
    + +
    +
  • +
  • +
    +
    + + video-2 +
    + +
    +
  • +
  • +
    +
    + + video-camera +
    + +
    +
  • +
  • +
    +
    + + video-editing +
    + +
    +
  • +
  • +
    +
    + + wallet +
    + +
    +
  • +
  • +
    +
    + + watercolor +
    + +
    +
  • +
  • +
    +
    + + web +
    + +
    +
  • +
  • +
    +
    + + workflow +
    + +
    +
  • +
+
+
+

Solid Mono

+

Below you can find the list of all solid mono SVG icons with their code snippets. All these retina-ready icons can easily be styled by color and size. To reach the resource of this set visit Flaticon

+

Colors

+
+
+
+
+
+ + +
+ text-primary +
+ +
+
+ + +
+ text-aqua +
+ +
+
+ + +
+ text-green +
+ +
+
+ + +
+ text-leaf +
+ +
+
+ + +
+ text-navy +
+ +
+
+ + +
+ text-orange +
+ +
+
+ + +
+ text-pink +
+ +
+
+ + +
+ text-purple +
+ +
+
+ + +
+ text-red +
+ +
+
+ + +
+ text-violet +
+ +
+
+ + +
+ text-yellow +
+ +
+
+ + +
+ text-blue +
+ +
+
+ + +
+ text-fuchsia +
+ +
+
+ + +
+ text-sky +
+ +
+
+ + +
+ text-grape +
+ +
+ +
+ +
+ +

Sizes

+
+
+
+
+
+ +
+ icon-svg-lg +
+ +
+
+ +
+ icon-svg-md +
+ +
+
+ +
+ icon-svg-sm +
+ +
+
+ +
+ icon-svg-xs +
+ +
+ +
+ +
+ +

Icons

+
    +
  • +
    +
    + + 3d +
    + +
    +
  • +
  • +
    +
    + + alarm +
    + +
    +
  • +
  • +
    +
    + + audience +
    + +
    +
  • +
  • +
    +
    + + badge +
    + +
    +
  • +
  • +
    +
    + + bar-chart +
    + +
    +
  • +
  • +
    +
    + + bar-chart-2 +
    + +
    +
  • +
  • +
    +
    + + bell +
    + +
    +
  • +
  • +
    +
    + + briefcase +
    + +
    +
  • +
  • +
    +
    + + bucket +
    + +
    +
  • +
  • +
    +
    + + building +
    + +
    +
  • +
  • +
    +
    + + bulb +
    + +
    +
  • +
  • +
    +
    + + bullhorn +
    + +
    +
  • +
  • +
    +
    + + calendar +
    + +
    +
  • +
  • +
    +
    + + camera +
    + +
    +
  • +
  • +
    +
    + + chatting +
    + +
    +
  • +
  • +
    +
    + + chatting-2 +
    + +
    +
  • +
  • +
    +
    + + checked +
    + +
    +
  • +
  • +
    +
    + + clipboard +
    + +
    +
  • +
  • +
    +
    + + cloud-download +
    + +
    +
  • +
  • +
    +
    + + cloud-group +
    + +
    +
  • +
  • +
    +
    + + cloud-network +
    + +
    +
  • +
  • +
    +
    + + cloud-network-2 +
    + +
    +
  • +
  • +
    +
    + + cloud-transfer +
    + +
    +
  • +
  • +
    +
    + + code +
    + +
    +
  • +
  • +
    +
    + + coffee-cup +
    + +
    +
  • +
  • +
    +
    + + coin +
    + +
    +
  • +
  • +
    +
    + + coin-decrease +
    + +
    +
  • +
  • +
    +
    + + coin-lock +
    + +
    +
  • +
  • +
    +
    + + coin-reload +
    + +
    +
  • +
  • +
    +
    + + coin-rise +
    + +
    +
  • +
  • +
    +
    + + compare +
    + +
    +
  • +
  • +
    +
    + + computer +
    + +
    +
  • +
  • +
    +
    + + conference +
    + +
    +
  • +
  • +
    +
    + + content +
    + +
    +
  • +
  • +
    +
    + + controls-2 +
    + +
    +
  • +
  • +
    +
    + + controls +
    + +
    +
  • +
  • +
    +
    + + crop +
    + +
    +
  • +
  • +
    +
    + + crosshair +
    + +
    +
  • +
  • +
    +
    + + deal +
    + +
    +
  • +
  • +
    +
    + + delivery-box +
    + +
    +
  • +
  • +
    +
    + + devices +
    + +
    +
  • +
  • +
    +
    + + director +
    + +
    +
  • +
  • +
    +
    + + discussion +
    + +
    +
  • +
  • +
    +
    + + dot +
    + +
    +
  • +
  • +
    +
    + + double-click +
    + +
    +
  • +
  • +
    +
    + + e-commerce +
    + +
    +
  • +
  • +
    +
    + + edit +
    + +
    +
  • +
  • +
    +
    + + edit-2 +
    + +
    +
  • +
  • +
    +
    + + email-2 +
    + +
    +
  • +
  • +
    +
    + + emails +
    + +
    +
  • +
  • +
    +
    + + employees +
    + +
    +
  • +
  • +
    +
    + + feather +
    + +
    +
  • +
  • +
    +
    + + gamepad +
    + +
    +
  • +
  • +
    +
    + + gears +
    + +
    +
  • +
  • +
    +
    + + globe-2 +
    + +
    +
  • +
  • +
    +
    + + headphone +
    + +
    +
  • +
  • +
    +
    + + health-insurance +
    + +
    +
  • +
  • +
    +
    + + image +
    + +
    +
  • +
  • +
    +
    + + images +
    + +
    +
  • +
  • +
    +
    + + infographic +
    + +
    +
  • +
  • +
    +
    + + lamp +
    + +
    +
  • +
  • +
    +
    + + layers +
    + +
    +
  • +
  • +
    +
    + + layout-2 +
    + +
    +
  • +
  • +
    +
    + + layout-3 +
    + +
    +
  • +
  • +
    +
    + + layout +
    + +
    +
  • +
  • +
    +
    + + like +
    + +
    +
  • +
  • +
    +
    + + link +
    + +
    +
  • +
  • +
    +
    + + list +
    + +
    +
  • +
  • +
    +
    + + lock +
    + +
    +
  • +
  • +
    +
    + + love +
    + +
    +
  • +
  • +
    +
    + + marker +
    + +
    +
  • +
  • +
    +
    + + mask +
    + +
    +
  • +
  • +
    +
    + + medal +
    + +
    +
  • +
  • +
    +
    + + monitor +
    + +
    +
  • +
  • +
    +
    + + navigation +
    + +
    +
  • +
  • +
    +
    + + network +
    + +
    +
  • +
  • +
    +
    + + note +
    + +
    +
  • +
  • +
    +
    + + paint +
    + +
    +
  • +
  • +
    +
    + + paper-plane +
    + +
    +
  • +
  • +
    +
    + + partnership +
    + +
    +
  • +
  • +
    +
    + + pen-tool +
    + +
    +
  • +
  • +
    +
    + + pie-chart +
    + +
    +
  • +
  • +
    +
    + + pin +
    + +
    +
  • +
  • +
    +
    + + plane +
    + +
    +
  • +
  • +
    +
    + + price-tag +
    + +
    +
  • +
  • +
    +
    + + printer +
    + +
    +
  • +
  • +
    +
    + + push-cart +
    + +
    +
  • +
  • +
    +
    + + puzzle +
    + +
    +
  • +
  • +
    +
    + + rocket +
    + +
    +
  • +
  • +
    +
    + + roller +
    + +
    +
  • +
  • +
    +
    + + rotary +
    + +
    +
  • +
  • +
    +
    + + safe +
    + +
    +
  • +
  • +
    +
    + + script +
    + +
    +
  • +
  • +
    +
    + + search +
    + +
    +
  • +
  • +
    +
    + + secure +
    + +
    +
  • +
  • +
    +
    + + selected +
    + +
    +
  • +
  • +
    +
    + + seo-2 +
    + +
    +
  • +
  • +
    +
    + + seo +
    + +
    +
  • +
  • +
    +
    + + server +
    + +
    +
  • +
  • +
    +
    + + setting +
    + +
    +
  • +
  • +
    +
    + + share +
    + +
    +
  • +
  • +
    +
    + + sharing +
    + +
    +
  • +
  • +
    +
    + + shipment +
    + +
    +
  • +
  • +
    +
    + + shopping-bag +
    + +
    +
  • +
  • +
    +
    + + shopping-basket +
    + +
    +
  • +
  • +
    +
    + + shopping-cart +
    + +
    +
  • +
  • +
    +
    + + smartphone +
    + +
    +
  • +
  • +
    +
    + + supermarket +
    + +
    +
  • +
  • +
    +
    + + synchronize +
    + +
    +
  • +
  • +
    +
    + + team +
    + +
    +
  • +
  • +
    +
    + + target +
    + +
    +
  • +
  • +
    +
    + + toggle +
    + +
    +
  • +
  • +
    +
    + + touchscreen +
    + +
    +
  • +
  • +
    +
    + + transfer +
    + +
    +
  • +
  • +
    +
    + + travel-insurance +
    + +
    +
  • +
  • +
    +
    + + tv-screen +
    + +
    +
  • +
  • +
    +
    + + verify +
    + +
    +
  • +
  • +
    +
    + + video-chat +
    + +
    +
  • +
  • +
    +
    + + video-player +
    + +
    +
  • +
  • +
    +
    + + videocall +
    + +
    +
  • +
  • +
    +
    + + videocall-2 +
    + +
    +
  • +
  • +
    +
    + + wallet +
    + +
    +
  • +
  • +
    +
    + + web-browser +
    + +
    +
  • +
  • +
    +
    + + web-programming +
    + +
    +
  • +
+
+
+

Solid Duo

+

Below you can find the list of all solid duo SVG icons with their code snippets. All these retina-ready icons can easily be styled by color and size. To reach the resource of this set visit Flaticon

+

Colors

+
+
+
+
+
+ + +
+ text-green-fuchsia +
+ +
+
+ + +
+ text-purple-aqua +
+ +
+
+ + +
+ text-blue-pink +
+ +
+
+ + +
+ text-navy-green +
+ +
+
+ + +
+ text-grape-green +
+ +
+
+ + +
+ text-green-red +
+ +
+
+ + +
+ text-grape-yellow +
+ +
+
+ + +
+ text-purple-pink +
+ +
+
+ + +
+ text-red-yellow +
+ +
+
+ + +
+ text-grape-fuchsia +
+ +
+
+ + +
+ text-sky-pink +
+ +
+
+ + +
+ text-navy-sky +
+ +
+ +
+ +
+ +

Sizes

+
+
+
+
+
+ +
+ icon-svg-lg +
+ +
+
+ +
+ icon-svg-md +
+ +
+
+ +
+ icon-svg-sm +
+ +
+
+ +
+ icon-svg-xs +
+ +
+ +
+ +
+ +

Icons

+
    +
  • +
    +
    + + 3d +
    + +
    +
  • +
  • +
    +
    + + alarm +
    + +
    +
  • +
  • +
    +
    + + audience +
    + +
    +
  • +
  • +
    +
    + + badge +
    + +
    +
  • +
  • +
    +
    + + bar-chart +
    + +
    +
  • +
  • +
    +
    + + bar-chart-2 +
    + +
    +
  • +
  • +
    +
    + + bell +
    + +
    +
  • +
  • +
    +
    + + briefcase +
    + +
    +
  • +
  • +
    +
    + + bucket +
    + +
    +
  • +
  • +
    +
    + + building +
    + +
    +
  • +
  • +
    +
    + + bulb +
    + +
    +
  • +
  • +
    +
    + + bullhorn +
    + +
    +
  • +
  • +
    +
    + + calendar +
    + +
    +
  • +
  • +
    +
    + + camera +
    + +
    +
  • +
  • +
    +
    + + chatting +
    + +
    +
  • +
  • +
    +
    + + chatting-2 +
    + +
    +
  • +
  • +
    +
    + + checked +
    + +
    +
  • +
  • +
    +
    + + clipboard +
    + +
    +
  • +
  • +
    +
    + + cloud-download +
    + +
    +
  • +
  • +
    +
    + + cloud-group +
    + +
    +
  • +
  • +
    +
    + + cloud-network +
    + +
    +
  • +
  • +
    +
    + + cloud-network-2 +
    + +
    +
  • +
  • +
    +
    + + cloud-transfer +
    + +
    +
  • +
  • +
    +
    + + code +
    + +
    +
  • +
  • +
    +
    + + coffee-cup +
    + +
    +
  • +
  • +
    +
    + + coin +
    + +
    +
  • +
  • +
    +
    + + coin-decrease +
    + +
    +
  • +
  • +
    +
    + + coin-lock +
    + +
    +
  • +
  • +
    +
    + + coin-reload +
    + +
    +
  • +
  • +
    +
    + + coin-rise +
    + +
    +
  • +
  • +
    +
    + + compare +
    + +
    +
  • +
  • +
    +
    + + computer +
    + +
    +
  • +
  • +
    +
    + + conference +
    + +
    +
  • +
  • +
    +
    + + content +
    + +
    +
  • +
  • +
    +
    + + controls-2 +
    + +
    +
  • +
  • +
    +
    + + controls +
    + +
    +
  • +
  • +
    +
    + + crop +
    + +
    +
  • +
  • +
    +
    + + crosshair +
    + +
    +
  • +
  • +
    +
    + + deal +
    + +
    +
  • +
  • +
    +
    + + delivery-box +
    + +
    +
  • +
  • +
    +
    + + devices +
    + +
    +
  • +
  • +
    +
    + + director +
    + +
    +
  • +
  • +
    +
    + + discussion +
    + +
    +
  • +
  • +
    +
    + + dot +
    + +
    +
  • +
  • +
    +
    + + double-click +
    + +
    +
  • +
  • +
    +
    + + e-commerce +
    + +
    +
  • +
  • +
    +
    + + edit +
    + +
    +
  • +
  • +
    +
    + + edit-2 +
    + +
    +
  • +
  • +
    +
    + + email-2 +
    + +
    +
  • +
  • +
    +
    + + emails +
    + +
    +
  • +
  • +
    +
    + + employees +
    + +
    +
  • +
  • +
    +
    + + feather +
    + +
    +
  • +
  • +
    +
    + + gamepad +
    + +
    +
  • +
  • +
    +
    + + gears +
    + +
    +
  • +
  • +
    +
    + + globe-2 +
    + +
    +
  • +
  • +
    +
    + + headphone +
    + +
    +
  • +
  • +
    +
    + + health-insurance +
    + +
    +
  • +
  • +
    +
    + + image +
    + +
    +
  • +
  • +
    +
    + + images +
    + +
    +
  • +
  • +
    +
    + + infographic +
    + +
    +
  • +
  • +
    +
    + + lamp +
    + +
    +
  • +
  • +
    +
    + + layers +
    + +
    +
  • +
  • +
    +
    + + layout-2 +
    + +
    +
  • +
  • +
    +
    + + layout-3 +
    + +
    +
  • +
  • +
    +
    + + layout +
    + +
    +
  • +
  • +
    +
    + + like +
    + +
    +
  • +
  • +
    +
    + + link +
    + +
    +
  • +
  • +
    +
    + + list +
    + +
    +
  • +
  • +
    +
    + + lock +
    + +
    +
  • +
  • +
    +
    + + love +
    + +
    +
  • +
  • +
    +
    + + marker +
    + +
    +
  • +
  • +
    +
    + + mask +
    + +
    +
  • +
  • +
    +
    + + medal +
    + +
    +
  • +
  • +
    +
    + + monitor +
    + +
    +
  • +
  • +
    +
    + + navigation +
    + +
    +
  • +
  • +
    +
    + + network +
    + +
    +
  • +
  • +
    +
    + + note +
    + +
    +
  • +
  • +
    +
    + + paint +
    + +
    +
  • +
  • +
    +
    + + paper-plane +
    + +
    +
  • +
  • +
    +
    + + partnership +
    + +
    +
  • +
  • +
    +
    + + pen-tool +
    + +
    +
  • +
  • +
    +
    + + pie-chart +
    + +
    +
  • +
  • +
    +
    + + pin +
    + +
    +
  • +
  • +
    +
    + + plane +
    + +
    +
  • +
  • +
    +
    + + price-tag +
    + +
    +
  • +
  • +
    +
    + + printer +
    + +
    +
  • +
  • +
    +
    + + push-cart +
    + +
    +
  • +
  • +
    +
    + + puzzle +
    + +
    +
  • +
  • +
    +
    + + rocket +
    + +
    +
  • +
  • +
    +
    + + roller +
    + +
    +
  • +
  • +
    +
    + + rotary +
    + +
    +
  • +
  • +
    +
    + + safe +
    + +
    +
  • +
  • +
    +
    + + script +
    + +
    +
  • +
  • +
    +
    + + search +
    + +
    +
  • +
  • +
    +
    + + secure +
    + +
    +
  • +
  • +
    +
    + + selected +
    + +
    +
  • +
  • +
    +
    + + seo-2 +
    + +
    +
  • +
  • +
    +
    + + seo +
    + +
    +
  • +
  • +
    +
    + + server +
    + +
    +
  • +
  • +
    +
    + + setting +
    + +
    +
  • +
  • +
    +
    + + share +
    + +
    +
  • +
  • +
    +
    + + sharing +
    + +
    +
  • +
  • +
    +
    + + shipment +
    + +
    +
  • +
  • +
    +
    + + shopping-bag +
    + +
    +
  • +
  • +
    +
    + + shopping-basket +
    + +
    +
  • +
  • +
    +
    + + shopping-cart +
    + +
    +
  • +
  • +
    +
    + + smartphone +
    + +
    +
  • +
  • +
    +
    + + supermarket +
    + +
    +
  • +
  • +
    +
    + + synchronize +
    + +
    +
  • +
  • +
    +
    + + target +
    + +
    +
  • +
  • +
    +
    + + team +
    + +
    +
  • +
  • +
    +
    + + toggle +
    + +
    +
  • +
  • +
    +
    + + touchscreen +
    + +
    +
  • +
  • +
    +
    + + transfer +
    + +
    +
  • +
  • +
    +
    + + travel-insurance +
    + +
    +
  • +
  • +
    +
    + + tv-screen +
    + +
    +
  • +
  • +
    +
    + + verify +
    + +
    +
  • +
  • +
    +
    + + video-chat +
    + +
    +
  • +
  • +
    +
    + + video-player +
    + +
    +
  • +
  • +
    +
    + + videocall +
    + +
    +
  • +
  • +
    +
    + + videocall-2 +
    + +
    +
  • +
  • +
    +
    + + wallet +
    + +
    +
  • +
  • +
    +
    + + web-browser +
    + +
    +
  • +
  • +
    +
    + + web-programming +
    + +
    +
  • +
+
+
+ +
+ +
+ +
+ + @@include('docs/_footer.html') + @@include('_page-progress.html') + @@include('_scripts.html') + + \ No newline at end of file diff --git a/sandbox310/src/docs/styleguide/illustrations.html b/sandbox310/src/docs/styleguide/illustrations.html new file mode 100644 index 0000000..f1b7636 --- /dev/null +++ b/sandbox310/src/docs/styleguide/illustrations.html @@ -0,0 +1,488 @@ + + + + @@include('_head.html') + + +
+
+ @@include('_navbar.html', { + "classList": "center-nav transparent navbar-light", + "otherClassList": "w-100 d-flex ms-auto", + "otherLanguageSelect": true, + "otherBtn": true, + "otherBtnClassList": "btn-sm btn-primary rounded-pill", + "otherBtnText": "Contact", + "otherBtnLink": "@@webRoot/contact.html" + }) +
+ +
+
+
+
+

Illustrations

+

Below you can find the list of illustrations that come bundled with Sandbox.

+
+ +
+ +
+ +
+ +
+
+ @@include('docs/_sidebar.html', {"page": "styleguide-illustrations"}) + + +
+
+

Set 1

+ +
+
+

Set 2

+ +
+
+

Set 3

+ +
+
+

Set 4

+ +
+
+

Set 5

+ +
+
+ +
+ +
+ +
+ + @@include('docs/_footer.html') + @@include('_page-progress.html') + @@include('_scripts.html') + + \ No newline at end of file diff --git a/sandbox310/src/docs/styleguide/misc.html b/sandbox310/src/docs/styleguide/misc.html new file mode 100644 index 0000000..5158fc6 --- /dev/null +++ b/sandbox310/src/docs/styleguide/misc.html @@ -0,0 +1,198 @@ + + + + @@include('_head.html') + + +
+
+ @@include('_navbar.html', { + "classList": "center-nav transparent navbar-light", + "otherClassList": "w-100 d-flex ms-auto", + "otherLanguageSelect": true, + "otherBtn": true, + "otherBtnClassList": "btn-sm btn-primary rounded-pill", + "otherBtnText": "Contact", + "otherBtnLink": "@@webRoot/contact.html" + }) +
+ +
+
+
+
+

Misc

+

Learn more about some miscellaneous styling features used in Sandbox.

+
+ +
+ +
+ +
+ +
+
+ @@include('docs/_sidebar.html', {"page": "styleguide-misc"}) + + +
+
+

Spacing

+
+
+

Sandbox adds additional spacing variables to existing Bootstrap spacing ranging between values 0 and 25

+
+ +
+ +
+
+

Font Size

+
+
+

Quickly change the font-size of text using .fs-* classes ranging between 1 and 200, while sm, and lg also apply.

+
+ + + + + +
+ +
+
+

Line Height

+
+
+

Change the line height with .lh-* utilities.

+
+ + + + + +
+ +
+
+

Letter Spacing

+
+
+

Change the letter spacing with .ls-* utilities.

+
+ + + + + +
+ +
+
+

Gutters

+
+
+

Spacing variables mentioned above can also be used for column gutters. More information regarding Bootstrap gutters can be found on Bootstrap docs

+
+ +
+ +
+
+

Retina Images

+
+
+

In order to display a high resolution image on devices with retina display, you need two versions of the image. One with regular size and another with twice its size. The high resolution one should have the exact same name with @2x at the end.

+
+ + + + + +
+ +
+
+ +
+ +
+ +
+ + @@include('docs/_footer.html') + @@include('_page-progress.html') + @@include('_scripts.html') + + \ No newline at end of file diff --git a/sandbox310/src/index.html b/sandbox310/src/index.html new file mode 100644 index 0000000..d7f4686 --- /dev/null +++ b/sandbox310/src/index.html @@ -0,0 +1,1124 @@ + + + + @@include('_head.html') + + + + +
+
+ + + @@include('_navbar.html', { + "classList": "center-nav transparent navbar-light", + "logoAlt": "logo-purple", + "otherClassList": "w-100 d-flex ms-auto", + "otherBtn": true, + "otherBtnClassList": "btn-primary rounded-pill", + "otherBtnText": "Purchase Now", + "otherBtnLink": "https://1.envato.market/NKGrx2", + "otherLinksNewTab": true + }) +
+ +
+
+
+
+

Create a powerful but effortless website for

+

Build your website in minutes with the help of countless amazing features of Sandbox.

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

NO

+

jQuery

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

21

+
+

Functional, impressive and rich demos to start with

+
+ +
+ +
+

New Demos

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

Demo Layout XVIII

+
    +
  • Network, Marketing
  • +
  • SVG icons
  • +
  • 3D illustrations
  • +
  • Gradient image
  • +
+ See Demo +
+ +
+ +
+ +
+ +
+ +
+
+
+
+
+
+
+
+
+ +
+
+
+ +
+ +
+ +
+

Demo Layout XIX

+
    +
  • Agency, Startup
  • +
  • Gradient image
  • +
  • SVG icons
  • +
  • Colorful design
  • +
+ See Demo +
+ +
+ +
+ +
+ +
+ +
+
+
+
+
+
+
+
+
+ +
+
+
+ +
+ +
+ +
+

Demo Layout XX

+
    +
  • Agency, Startup
  • +
  • Framed layout
  • +
  • Illustrations
  • +
  • Video background
  • +
+ See Demo +
+ +
+ +
+ +
+ +
+ +
+
+
+
+
+
+
+
+
+ +
+
+
+ +
+ +
+ +
+

Demo Layout XXI

+
    +
  • Studio, Startup
  • +
  • Illustrations
  • +
  • Wave dividers
  • +
  • Colorful design
  • +
+ See Demo +
+ +
+ +
+ +
+ +
+ +

Previous Demos

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

Demo Layout I

+
    +
  • SEO, Marketing
  • +
  • Colorful design
  • +
  • Illustrations
  • +
  • Pricing table
  • +
+ See Demo +
+ +
+ +
+ +
+ +
+ +
+
+
+
+
+
+
+
+
+ +
+
+
+ +
+ +
+ +
+

Demo Layout II

+
    +
  • Business, Marketing
  • +
  • Serif headings
  • +
  • Solid colors
  • +
  • Video lightbox
  • +
+ See Demo +
+ +
+ +
+ +
+ +
+ +
+
+
+
+
+
+
+
+
+ +
+
+
+ +
+ +
+ +
+

Demo Layout III

+
    +
  • Service, Marketing
  • +
  • Angled sections
  • +
  • Soft colors
  • +
  • Animations
  • +
+ See Demo +
+ +
+ +
+ +
+ +
+ +
+
+
+
+
+
+
+
+
+ +
+
+
+ +
+ +
+ +
+

Demo Layout IV

+
    +
  • Corporate, Startup
  • +
  • Serif headings
  • +
  • Tiled images
  • +
  • Video lightbox
  • +
+ See Demo +
+ +
+ +
+ +
+ +
+ +
+
+
+
+
+
+
+
+
+ +
+
+
+ +
+ +
+ +
+

Demo Layout V

+
    +
  • SaaS, Software
  • +
  • Tiled images
  • +
  • Animations
  • +
  • Pricing table
  • +
+ See Demo +
+ +
+ +
+ +
+ +
+ +
+
+
+
+
+
+
+
+
+ +
+
+
+ +
+ +
+ +
+

Demo Layout VI

+
    +
  • Landing, Product
  • +
  • SVG icons
  • +
  • Animations
  • +
  • Soft colors
  • +
+ See Demo +
+ +
+ +
+ +
+ +
+ +
+
+
+
+
+
+
+
+
+ +
+
+
+ +
+ +
+ +
+

Demo Layout VII

+
    +
  • Agency, Startup
  • +
  • Illustrations
  • +
  • Soft colors
  • +
  • Project display
  • +
+ See Demo +
+ +
+ +
+ +
+ +
+ +
+
+
+
+
+
+
+
+
+ +
+
+
+ +
+ +
+ +
+

Demo Layout VIII

+
    +
  • Corporate, Business
  • +
  • Animated header
  • +
  • SVG icons
  • +
  • Soft colors
  • +
+ See Demo +
+ +
+ +
+ +
+ +
+ +
+
+
+
+
+
+
+
+
+ +
+
+
+ +
+ +
+ +
+

Demo Layout IX

+
    +
  • SaaS, Software
  • +
  • SVG icons
  • +
  • Serif headings
  • +
  • Testimonials
  • +
+ See Demo +
+ +
+ +
+ +
+ +
+ +
+
+
+
+
+
+
+
+
+ +
+
+
+ +
+ +
+ +
+

Demo Layout X

+
    +
  • Business, Marketing
  • +
  • Animations
  • +
  • Simple testimonials
  • +
  • Tiled images
  • +
+ See Demo +
+ +
+ +
+ +
+ +
+ +
+
+
+
+
+
+
+
+
+ +
+
+
+ +
+ +
+ +
+

Demo Layout XI

+
    +
  • Marketing, Service
  • +
  • Animated header
  • +
  • Tiled images
  • +
  • Soft colors
  • +
+ See Demo +
+ +
+ +
+ +
+ +
+ +
+
+
+
+
+
+
+
+
+ +
+
+
+ +
+ +
+ +
+

Demo Layout XII

+
    +
  • Agency, Studio
  • +
  • SVG icons
  • +
  • Masonry portfolio
  • +
  • Soft colors
  • +
+ See Demo +
+ +
+ +
+ +
+ +
+ +
+
+
+
+
+
+
+
+
+ +
+
+
+ +
+ +
+ +
+

Demo Layout XIII

+
    +
  • Agency, Startup
  • +
  • Animations
  • +
  • Parallax testimonials
  • +
  • Angled sections
  • +
+ See Demo +
+ +
+ +
+ +
+ +
+ +
+
+
+
+
+
+
+
+
+ +
+
+
+ +
+ +
+ +
+

Demo Layout XIV

+
    +
  • Startup, Creative
  • +
  • Image section
  • +
  • Background shapes
  • +
  • Detailed footer
  • +
+ See Demo +
+ +
+ +
+ +
+ +
+ +
+
+
+
+
+
+
+
+
+ +
+
+
+ +
+ +
+ +
+

Demo Layout XV

+
    +
  • Business, Service
  • +
  • Video lightbox
  • +
  • Background shapes
  • +
  • Newsletter
  • +
+ See Demo +
+ +
+ +
+ +
+ +
+ +
+
+
+
+
+
+
+
+
+ +
+
+
+ +
+ +
+ +
+

Demo Layout XVI

+
    +
  • Personal, Portfolio
  • +
  • Shape mask
  • +
  • Detailed portfolio
  • +
  • Contact form
  • +
+ See Demo +
+ +
+ +
+ +
+ +
+ +
+
+
+
+
+
+
+
+
+ +
+
+
+ +
+ +
+ +
+

Demo Layout XVII

+
    +
  • Business, Corporate
  • +
  • Soft colors
  • +
  • Animated header
  • +
  • Content in box
  • +
+ See Demo +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+
+ +
+
+ +
+ +
+
+
+
+ +

Save your time and money by choosing Sandbox for your website.

+
+ +
+ +
+
+
+
+

250+

+

UI elements

+
+ +
+

130+

+

Pre-made blocks

+
+ +
+

100+

+

Neatly coded pages

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

Modern Portfolio Layouts

+

Build and manage an eye-catching and impressive portfolio fast and without effort.

+
+
+
+
+
+
+
+

Useful Blog Layouts

+

Create an attractive and stunning journal to tell the world your wonderful stories.

+
+
+
+
+
+
+
+

Cool Features & Elements

+

Sandbox includes amazing features and elements to create rich and attractive pages.

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

13 Headers & 5 Footers

+

Choose from various gorgeous header and footer styles to serve you best for your needs.

+
+
+
+
+
+
+
+

Color & Font Options

+

You can either use the included color and fonts or easily add your own choices.

+
+
+
+
+
+
+
+

Fully Responsive Layout

+

Sandbox adapts to different screen sizes therefore it is compatible with any device.

+
+
+
+ +
+ +
+ +
+
+ +
+
+ +
+ +
+
+
+
+ + + + +
+ +
+ +
+
+ +

Built with Sass
& Bootstrap 5

+
+ +
+ +

SEO-friendly
Coding

+
+ +
+ +

Valid W3C
HTML5 & CSS3

+
+ +
+ +

Retina-ready
Graphics

+
+ +
+ +

One-page
Layout Option

+
+ +
+ +

Isotope
Filterable Gallery

+
+ +
+ +

Mailchimp
Compatible

+
+ +
+ +

Contact Form
w/o Page Refresh

+
+ +
+ +

Animations
on Page Scroll

+
+ +
+ +

Top-Notch Support
& Free Updates

+
+ +
+ +
+ +
+ +
+
+
+
+ +

Think unique and be creative. Make a difference with Sandbox.

+

Everything you need to create your next unique and professional website, including impressive and ready-made blocks and pages.

+ Buy Sandbox +
+ +
+ + +
+ +
+ +
+ + @@include('_page-progress.html') + @@include('_scripts.html') + + \ No newline at end of file diff --git a/sandbox310/src/onepage.html b/sandbox310/src/onepage.html new file mode 100644 index 0000000..00cc14c --- /dev/null +++ b/sandbox310/src/onepage.html @@ -0,0 +1,467 @@ + + + + @@include('_head.html') + + +
+
+ @@include('_navbar.html', { + "classList": "center-logo transparent navbar-light", + "onePage": true, + "otherClassList": "w-100 d-flex ms-auto", + "otherLanguageSelect": true, + "otherBtn": true, + "otherBtnClassList": "btn-sm btn-primary rounded-pill", + "otherBtnText": "Contact", + "otherBtnLink": "@@webRoot/contact.html" + }) +
+ +
+
+
+
+
+

Creative. Smart. Awesome.

+

We are an award winning web & mobile design agency that strongly believes in the power of creative ideas.

+
+ +
+ +
+
+
+
+ +
+ +
+ +
+ +
+ +
+
+
+
+
+
    +
  • +

    Marketing

    +
    +
  • +
  • +

    Strategy

    +
    +
  • +
  • +

    Development

    +
    +
  • +
  • +

    Data Analysis

    +
    +
  • +
+ +
+ +
+

The full service we are offering is specifically designed to meet your business needs and projects.

+

Integer posuere erat a ante venenatis dapibus posuere velit aliquet. Morbi leo risus, porta ac consectetur ac, vestibulum at eros. Praesent commodo cursus magna, vel scelerisque nisl consectetur duis mollis commodo.

+
+ +
+ +
+
+ +

Marketing

+

Nulla vitae elit libero, a pharetra augue. Donec id elit non mi porta gravida at eget metus. Cras justo cum sociis natoque magnis.

+
+ +
+ +

Strategy

+

Nulla vitae elit libero, a pharetra augue. Donec id elit non mi porta gravida at eget metus. Cras justo cum sociis natoque magnis.

+
+ +
+ +

Development

+

Nulla vitae elit libero, a pharetra augue. Donec id elit non mi porta gravida at eget metus. Cras justo cum sociis natoque magnis.

+
+ +
+ +

Data Analysis

+

Nulla vitae elit libero, a pharetra augue. Donec id elit non mi porta gravida at eget metus. Cras justo cum sociis natoque magnis.

+
+ +
+ +
+ +
+ +
+ +
+
+
+
+
+
+
+ +
+

How It Works?

+

Everything you need on creating a business process.

+
+
+ +
+
+

Collect Ideas

+

Nulla vitae elit libero pharetra augue dapibus.

+
+
+
+
+ +
+
+

Data Analysis

+

Vivamus sagittis lacus augue laoreet vel.

+
+
+
+
+ +
+
+

Magic Touch

+

Cras mattis consectetur purus sit amet.

+
+
+
+ +
+ +
+
+
+
+ +
+

Why Choose Us?

+

A few reasons why our valued customers choose us.

+
+
+
+ +
+ +
+
+

Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Praesent commodo cursus magna, vel.

+
+ +
+ +
+ +
+
+ +
+ +
+
+

Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Praesent commodo cursus magna, vel.

+
+ +
+ +
+ +
+
+ +
+ +
+
+

Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Praesent commodo cursus magna, vel.

+
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+
+
+
+
+

Meet the Team

+

Save your time and money by choosing our professional team.

+

Donec id elit non mi porta gravida at eget metus. Morbi leo risus, porta ac consectetur ac, vestibulum at eros tempus porttitor.

+ See All Members +
+ +
+
+
+
+
+ +

Cory Zamora

+
Marketing Specialist
+

Etiam porta sem magna malesuada mollis.

+ + +
+ +
+ +

Coriss Ambady

+
Financial Analyst
+

Aenean eu leo quam. Pellentesque ornare lacinia.

+ + +
+ +
+ +

Nikolas Brooten

+
Sales Manager
+

Donec ornare elit quam porta gravida at eget.

+ + +
+ +
+ +

Jackie Sanders

+
Investment Planner
+

Nullam risus eget urna mollis ornare vel eu leo.

+ + +
+ +
+ +

Tina Geller

+
Assistant Buyer
+

Vivamus sagittis lacus vel augue laoreet rutrum.

+ + +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+
+
+
+
+
+
+ +
+
+
+
+
+
+

ā€œVivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Vestibulum ligula porta felis euismod semper. Cras justo odio consectetur.ā€

+
+
+
Coriss Ambady
+

Financial Analyst

+
+
+
+
+ +
+
+

ā€œVivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Vestibulum ligula porta felis euismod semper. Cras justo odio consectetur.ā€

+
+
+
Cory Zamora
+

Marketing Specialist

+
+
+
+
+ +
+
+

ā€œVivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Vestibulum ligula porta felis euismod semper. Cras justo odio consectetur.ā€

+
+
+
Nikolas Brooten
+

Sales Manager

+
+
+
+
+ +
+ +
+ +
+ +
+ +
+ +
+
+
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+ +
+ +
+ +
+ +
+ +
+
+
+
+
+
+
+ +
+

Get In Touch

+

Got any questions? Don't hesitate to get in touch.

+
+
+
+
+
+
Address
+
Moonshine St. 14/05 Light City, London
+
+
+
+
+
+
+
+
Phone
+

00 (123) 456 78 90

+
+
+
+
+
+
+
+
E-mail
+

sandbox@email.com

+
+
+
+ +
+ +
+ +
+ +
+ +
+ +
+
+ @@include('_footer-widgets.html', { + "lightText": true + }) +
+ +
+ @@include('_page-progress.html') + @@include('_scripts.html') + + \ No newline at end of file diff --git a/sandbox310/src/page-loader.html b/sandbox310/src/page-loader.html new file mode 100644 index 0000000..34ff255 --- /dev/null +++ b/sandbox310/src/page-loader.html @@ -0,0 +1,338 @@ + + + + @@include('_head.html') + + +
+
+
+ @@include('_navbar.html', { + "classList": "center-nav transparent navbar-light", + "otherClassList": "w-100 d-flex ms-auto", + "otherLanguageSelect": true, + "otherBtn": true, + "otherBtnClassList": "btn-sm btn-primary rounded-pill", + "otherBtnText": "Contact", + "otherBtnLink": "@@webRoot/contact.html" + }) +
+ +
+
+
+
+

Page Loader

+

To enable page loader, after body tag, add:

+ <div class="page-loader"></div> +
+ +
+ +
+ +
+ +
+
+
+
+
+
+
+
+
+
+
+

7518

+

Completed Projects

+
+ +
+

3472

+

Satisfied Customers

+
+ +
+

2184

+

Expert Employees

+
+ +
+

4523

+

Awards Won

+
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+
+
+
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+ +
+ +
+

What We Do?

+

The full service we are offering is specifically designed to meet your business needs and projects.

+
+
+
+
+
+
+
+

24/7 Support

+

Nulla vitae elit libero pharetra augue dapibus.

+
+
+
+ +
+
+
+
+
+
+

Secure Payments

+

Vivamus sagittis lacus augue laoreet vel.

+
+
+
+ +
+
+
+
+
+
+

Daily Updates

+

Cras mattis consectetur purus sit amet.

+
+
+
+ +
+
+
+
+
+
+

Market Research

+

Aenean lacinia bibendum nulla sed consectetur.

+
+
+
+ +
+ +
+ +
+ +

How We Do It?

+

We make your spending stress-free for you to have the perfect control.

+
+
01 +

Concept

+

Nulla vitae elit libero elit non porta gravida eget metus cras. Aenean eu leo quam. Pellentesque ornare.

+
+ +
02 +

Prepare

+

Vestibulum id ligula porta felis euismod semper. Sed posuere consectetur est at lobortis.

+
+ +
03 +

Retouch

+

Integer posuere erat a ante venenatis dapibus posuere velit aliquet. Nulla vitae elit libero.

+
+ +
04 +

Finalize

+

Integer posuere erat, consectetur adipiscing elit. Fusce dapibus, tellus ac cursus commodo.

+
+ +
+ +
+ +
+ +
+
+
+
+ +

Find out everything you need to know about creating a business process model.

+
+ +
+ +
+ +
+ +
+
+
+
+

Our Pricing

+

We offer great prices, premium and quality products for your business.

+

Enjoy a free 30-day trial and experience the full service. No credit card required!

+ See All Prices +
+ +
+
+

Monthly

+
+
+
+
+
+

Yearly (Save 30%)

+
+
+
+
+
+
+
+
+
$19 month
+
$199 year
+
+ +

Premium Plan

+
    +
  • 5 Projects
  • +
  • 100K API Access
  • +
  • 200MB Storage
  • +
  • Weekly Reports
  • +
  • 7/24 Support
  • +
+ Choose Plan +
+ +
+ +
+ + + +
+ +
+ +
+ +
+
+
+
+
+
+
+ +
+
+
+
+
+ +
+
+
+

5000+

+

Satisfied Customers

+
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+

Let’s Talk

+

Let's make something great together. We are trusted by over 5000+ clients. Join them by using our services and grow your business.

+

Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Maecenas faucibus mollis interdum. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus.

+ Join Us +
+ +
+ +
+ +
+ +
+ +
+
+ @@include('_footer-widgets.html', { + "lightText": true + }) +
+ +
+ @@include('_page-progress.html') + @@include('_scripts.html') + + \ No newline at end of file diff --git a/sandbox310/src/partials/_dummy-content.html b/sandbox310/src/partials/_dummy-content.html new file mode 100644 index 0000000..1ad577c --- /dev/null +++ b/sandbox310/src/partials/_dummy-content.html @@ -0,0 +1,65 @@ +
+
+
+
+
+
+ +
+

We bring rapid solutions to make the life of our customers easier.

+
    +
  • +

    Marketing

    +
    +
  • +
  • +

    Strategy

    +
    +
  • +
  • +

    Development

    +
    +
  • +
  • +

    Data Analysis

    +
    +
  • +
+ +
+ +
+ +
+
+
+
+ +
+

We make your spending stress-free for you to have the perfect control.

+

Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Praesent commodo cursus magna, vel scelerisque nisl consectetur et.

+
+
+
    +
  • Aenean quam ornare. Curabitur blandit.
  • +
  • Nullam quis risus eget urna mollis ornare.
  • +
+
+ +
+
    +
  • Etiam porta euismod malesuada mollis.
  • +
  • Vivamus sagittis lacus vel augue rutrum.
  • +
+
+ +
+ +
+ +
+ +
+ +
+ \ No newline at end of file diff --git a/sandbox310/src/partials/_footer-widgets.html b/sandbox310/src/partials/_footer-widgets.html new file mode 100644 index 0000000..e3c227c --- /dev/null +++ b/sandbox310/src/partials/_footer-widgets.html @@ -0,0 +1,77 @@ +
+
+
+ @@if (!context.lightText) { + + } + @@if (context.lightText) { + + } +

Ā© 2021 Sandbox.
All rights reserved.

+ + +
+ +
+ +
+
+

Get in Touch

+
Moonshine St. 14/05 Light City, London, United Kingdom
+ info@email.com
00 (123) 456 78 90 +
+ +
+ +
+
+

Learn More

+ +
+ +
+ +
+
+

Our Newsletter

+

Subscribe to our newsletter to get our news & deals delivered to you.

+ + +
+ +
+ +
+ \ No newline at end of file diff --git a/sandbox310/src/partials/_footer2-widgets.html b/sandbox310/src/partials/_footer2-widgets.html new file mode 100644 index 0000000..58823e3 --- /dev/null +++ b/sandbox310/src/partials/_footer2-widgets.html @@ -0,0 +1,45 @@ +
+
+
+
+
+
+

Address

+
Moonshine St. 14/05
Light City, London, UK
+
+ +
+ +
+
+

Phone

+

00 (123) 456 78 90
00 (987) 654 32 10

+
+ +
+ +
+ + +
+ +
+ +

Ā© 2021 Sandbox. All rights reserved.

+ + +
+ +
+ +
+ \ No newline at end of file diff --git a/sandbox310/src/partials/_footer3-alt-widgets.html b/sandbox310/src/partials/_footer3-alt-widgets.html new file mode 100644 index 0000000..da9ac2e --- /dev/null +++ b/sandbox310/src/partials/_footer3-alt-widgets.html @@ -0,0 +1,55 @@ +
+
+
+ +

Ā© 2021 Sandbox. All rights reserved.

+ + +
+ +
+ +
+
+

Need Help?

+ +
+ +
+ +
+
+

Learn More

+ +
+ +
+ +
+
+

Get in Touch

+
Moonshine St. 14/05 Light City, London, United Kingdom
+ info@email.com
00 (123) 456 78 90 +
+ +
+ +
+ \ No newline at end of file diff --git a/sandbox310/src/partials/_footer3-widgets.html b/sandbox310/src/partials/_footer3-widgets.html new file mode 100644 index 0000000..bf8e1c1 --- /dev/null +++ b/sandbox310/src/partials/_footer3-widgets.html @@ -0,0 +1,61 @@ +
+
+
+

Join the Community

+

Let's make something great together. We are trusted by over 5000+ clients. Join them by using our services and grow your business.

+ Join Us +
+ +
+ +
+
+

Need Help?

+ +
+ +
+ +
+
+

Learn More

+ +
+ +
+ +
+
+

Get in Touch

+
Moonshine St. 14/05 Light City, London, United Kingdom
+ info@email.com
00 (123) 456 78 90 +
+ +
+ +
+ +
+
+

Ā© 2021 Sandbox. All rights reserved.

+ + +
+ \ No newline at end of file diff --git a/sandbox310/src/partials/_footer4-widgets.html b/sandbox310/src/partials/_footer4-widgets.html new file mode 100644 index 0000000..cc7cb2d --- /dev/null +++ b/sandbox310/src/partials/_footer4-widgets.html @@ -0,0 +1,55 @@ +
+
+
+ +

We are trusted by over 5000+ clients. Join them by using our services and grow your business.

+
+ +
+ +
+
+
+
+
+
+
+
Phone
+

00 (123) 456 78 90
00 (987) 654 32 10

+
+
+ +
+ +
+ +
+
+
+
+
+
+
+
Address
+
Moonshine St. 14/05 Light City, London, United Kingdom
+
+
+ +
+ +
+ +
+ +
+
+

Ā© 2021 Sandbox. All rights reserved.

+ + +
\ No newline at end of file diff --git a/sandbox310/src/partials/_footer6-widgets.html b/sandbox310/src/partials/_footer6-widgets.html new file mode 100644 index 0000000..56ec997 --- /dev/null +++ b/sandbox310/src/partials/_footer6-widgets.html @@ -0,0 +1,11 @@ +
+

Ā© 2021 Sandbox. All rights reserved.

+ + +
\ No newline at end of file diff --git a/sandbox310/src/partials/_head.html b/sandbox310/src/partials/_head.html new file mode 100644 index 0000000..0b3b3e1 --- /dev/null +++ b/sandbox310/src/partials/_head.html @@ -0,0 +1,9 @@ + + + + + +Sandbox - Modern & Multipurpose Bootstrap 5 Template + + + \ No newline at end of file diff --git a/sandbox310/src/partials/_menu-links-onepage.html b/sandbox310/src/partials/_menu-links-onepage.html new file mode 100644 index 0000000..5a00aed --- /dev/null +++ b/sandbox310/src/partials/_menu-links-onepage.html @@ -0,0 +1,29 @@ +@@if (!context.centerLogo) { + + +} \ No newline at end of file diff --git a/sandbox310/src/partials/_menu-links.html b/sandbox310/src/partials/_menu-links.html new file mode 100644 index 0000000..ed9d979 --- /dev/null +++ b/sandbox310/src/partials/_menu-links.html @@ -0,0 +1,360 @@ +@@if (!context.centerLogo) { + + +} \ No newline at end of file diff --git a/sandbox310/src/partials/_menu-offcanvas-footer.html b/sandbox310/src/partials/_menu-offcanvas-footer.html new file mode 100644 index 0000000..0021f56 --- /dev/null +++ b/sandbox310/src/partials/_menu-offcanvas-footer.html @@ -0,0 +1,14 @@ +
+ info@email.com +
+ 00 (123) 456 78 90 +
+ + +
\ No newline at end of file diff --git a/sandbox310/src/partials/_menu-others-cart.html b/sandbox310/src/partials/_menu-others-cart.html new file mode 100644 index 0000000..85dc27a --- /dev/null +++ b/sandbox310/src/partials/_menu-others-cart.html @@ -0,0 +1,85 @@ +
+
+

Your Cart

+ +
+
+
+
+
+
+
+

Nike Air Sneakers

+

$55.00 $45.99

+
+ +
+ +
+
+
+
+ +
+
+
+
+

Colorful Sneakers

+

$45.00

+
+ +
+ +
+
+
+
+ +
+
+
+
+

Polaroid Camera

+

$45.00

+
+ +
+ +
+
+
+
+ +
+ + + +
+ +
+ \ No newline at end of file diff --git a/sandbox310/src/partials/_menu-others-lang.html b/sandbox310/src/partials/_menu-others-lang.html new file mode 100644 index 0000000..b98d050 --- /dev/null +++ b/sandbox310/src/partials/_menu-others-lang.html @@ -0,0 +1,8 @@ + \ No newline at end of file diff --git a/sandbox310/src/partials/_menu-others-modal.html b/sandbox310/src/partials/_menu-others-modal.html new file mode 100644 index 0000000..efc32d4 --- /dev/null +++ b/sandbox310/src/partials/_menu-others-modal.html @@ -0,0 +1,82 @@ + + + + \ No newline at end of file diff --git a/sandbox310/src/partials/_menu-others-offcanvas-info.html b/sandbox310/src/partials/_menu-others-offcanvas-info.html new file mode 100644 index 0000000..0cab97c --- /dev/null +++ b/sandbox310/src/partials/_menu-others-offcanvas-info.html @@ -0,0 +1,42 @@ +
+
+

Sandbox

+ +
+
+
+

Sandbox is a multipurpose HTML5 template with various layouts which will be a great solution for your business.

+
+ +
+

Contact Info

+
Moonshine St. 14/05
Light City, London
+ info@email.com
00 (123) 456 78 90 +
+ +
+

Learn More

+ +
+ +
+

Follow Us

+ + +
+ +
+ +
+ \ No newline at end of file diff --git a/sandbox310/src/partials/_menu-others-search.html b/sandbox310/src/partials/_menu-others-search.html new file mode 100644 index 0000000..0f6c7cd --- /dev/null +++ b/sandbox310/src/partials/_menu-others-search.html @@ -0,0 +1,11 @@ + + \ No newline at end of file diff --git a/sandbox310/src/partials/_menu-others.html b/sandbox310/src/partials/_menu-others.html new file mode 100644 index 0000000..3ebb9bc --- /dev/null +++ b/sandbox310/src/partials/_menu-others.html @@ -0,0 +1,47 @@ + + diff --git a/sandbox310/src/partials/_navbar-center-logo.html b/sandbox310/src/partials/_navbar-center-logo.html new file mode 100644 index 0000000..e16dafd --- /dev/null +++ b/sandbox310/src/partials/_navbar-center-logo.html @@ -0,0 +1,92 @@ + + \ No newline at end of file diff --git a/sandbox310/src/partials/_navbar-extended.html b/sandbox310/src/partials/_navbar-extended.html new file mode 100644 index 0000000..e10ce6e --- /dev/null +++ b/sandbox310/src/partials/_navbar-extended.html @@ -0,0 +1,59 @@ + + +@@include('_menu-others-offcanvas-info.html') \ No newline at end of file diff --git a/sandbox310/src/partials/_navbar.html b/sandbox310/src/partials/_navbar.html new file mode 100644 index 0000000..5b71d1e --- /dev/null +++ b/sandbox310/src/partials/_navbar.html @@ -0,0 +1,91 @@ + + +@@if (context.otherBtnModal || context.otherLinkModal) { + @@include('_menu-others-modal.html') +} +@@if (context.otherInfo) { + @@include('_menu-others-offcanvas-info.html') +} +@@if (context.otherShop) { + @@include('_menu-others-cart.html') +} +@@if (context.otherSearch) { + @@include('_menu-others-search.html') +} \ No newline at end of file diff --git a/sandbox310/src/partials/_page-progress.html b/sandbox310/src/partials/_page-progress.html new file mode 100644 index 0000000..58a0322 --- /dev/null +++ b/sandbox310/src/partials/_page-progress.html @@ -0,0 +1,5 @@ +
+ + + +
\ No newline at end of file diff --git a/sandbox310/src/partials/_scripts.html b/sandbox310/src/partials/_scripts.html new file mode 100644 index 0000000..f9d1ccb --- /dev/null +++ b/sandbox310/src/partials/_scripts.html @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/sandbox310/src/partials/_sidebar-widgets.html b/sandbox310/src/partials/_sidebar-widgets.html new file mode 100644 index 0000000..d10b5e4 --- /dev/null +++ b/sandbox310/src/partials/_sidebar-widgets.html @@ -0,0 +1,90 @@ +
+

About Us

+

Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum. Nulla vitae elit libero, a pharetra augue. Donec id elit non mi porta gravida at eget metus.

+ + +
+ +
+

Popular Posts

+ + +
+ + + + + + + \ No newline at end of file diff --git a/sandbox310/src/partials/docs/_blocks-menu.html b/sandbox310/src/partials/docs/_blocks-menu.html new file mode 100644 index 0000000..523474e --- /dev/null +++ b/sandbox310/src/partials/docs/_blocks-menu.html @@ -0,0 +1,26 @@ +
+
+

Filter Blocks:

+ +
+ +
+ \ No newline at end of file diff --git a/sandbox310/src/partials/docs/_footer.html b/sandbox310/src/partials/docs/_footer.html new file mode 100644 index 0000000..f601fe7 --- /dev/null +++ b/sandbox310/src/partials/docs/_footer.html @@ -0,0 +1,16 @@ +
+
+
+
+

Think unique and be creative. Make a difference with Sandbox.

+

Everything you need to create your next unique and professional website, including impressive and ready-made blocks and pages.

+ Buy Sandbox +
+ +
+ + +
+ +
+ \ No newline at end of file diff --git a/sandbox310/src/partials/docs/_menu-links.html b/sandbox310/src/partials/docs/_menu-links.html new file mode 100644 index 0000000..633603e --- /dev/null +++ b/sandbox310/src/partials/docs/_menu-links.html @@ -0,0 +1,120 @@ +@@if (!context.centerLogo) { + + +} \ No newline at end of file diff --git a/sandbox310/src/partials/docs/_sidebar.html b/sandbox310/src/partials/docs/_sidebar.html new file mode 100644 index 0000000..e8d959f --- /dev/null +++ b/sandbox310/src/partials/docs/_sidebar.html @@ -0,0 +1,69 @@ + + \ No newline at end of file diff --git a/sandbox310/src/pricing.html b/sandbox310/src/pricing.html new file mode 100644 index 0000000..e44d705 --- /dev/null +++ b/sandbox310/src/pricing.html @@ -0,0 +1,476 @@ + + + + @@include('_head.html') + + +
+
+ @@include('_navbar.html', { + "classList": "center-nav transparent navbar-light", + "otherClassList": "w-100 d-flex ms-auto", + "otherLanguageSelect": true, + "otherBtn": true, + "otherBtnClassList": "btn-sm btn-primary rounded-pill", + "otherBtnText": "Contact", + "otherBtnLink": "@@webRoot/contact.html" + }) +
+ +
+
+
+
+

Our Pricing

+

We offer great prices, premium products and quality service for your business.

+
+ +
+ +
+ +
+ +
+
+
+
+
+
+

Monthly

+
+
+
+
+
+

Yearly

+
+
+
+
+
+ +

Basic Plan

+
+
$9 month
+
$99 year
+
+ +
    +
  • 1 Project
  • +
  • 100K API Access
  • +
  • 100MB Storage
  • +
  • Weekly Reports
  • +
  • 7/24 Support
  • +
+ Choose Plan +
+ +
+ +
+ + + +
+
+
+ +

Corporate Plan

+
+
$49 month
+
$499 year
+
+ +
    +
  • 20 Projects
  • +
  • 300K API Access
  • +
  • 500MB Storage
  • +
  • Weekly Reports
  • +
  • 7/24 Support
  • +
+ Choose Plan +
+ +
+ +
+ +
+ +
+ +
+
+
+
+
+
+
+

24/7 Support

+

Nulla vitae elit libero, a pharetra augue. Donec id elit non mi porta gravida at eget. Fusce dapibus tellus.

+ Learn More +
+
+
+ +
+
+
+
+
+
+

Daily Updates

+

Maecenas faucibus mollis interdum. Vivamus sagittis lacus vel augue laoreet. Sed posuere consectetur.

+ Learn More +
+
+
+ +
+
+
+
+
+
+

Market Research

+

Cras justo odio, dapibus ac facilisis in, egestas eget quam. Praesent commodo cursus magna scelerisque.

+ Learn More +
+
+
+ +
+ +

Pricing FAQ

+

If you don't see an answer to your question, you can send us an email from our contact form.

+
+
+
+
+
+ +
+ +
+
+

Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec sed odio dui. Cras justo odio, dapibus ac facilisis.

+
+ +
+ +
+ +
+
+ +
+ +
+
+

Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec sed odio dui. Cras justo odio, dapibus ac facilisis.

+
+ +
+ +
+ +
+
+ +
+ +
+
+

Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec sed odio dui. Cras justo odio, dapibus ac facilisis.

+
+ +
+ +
+ +
+
+ +
+ +
+
+

Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec sed odio dui. Cras justo odio, dapibus ac facilisis.

+
+ +
+ +
+ +
+ +
+ +
+
+
+
+ +
+ +
+
+

Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec sed odio dui. Cras justo odio, dapibus ac facilisis.

+
+ +
+ +
+ +
+
+ +
+ +
+
+

Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec sed odio dui. Cras justo odio, dapibus ac facilisis.

+
+ +
+ +
+ +
+
+ +
+ +
+
+

Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec sed odio dui. Cras justo odio, dapibus ac facilisis.

+
+ +
+ +
+ +
+
+ +
+ +
+
+

Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Cras mattis consectetur purus sit amet fermentum. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec sed odio dui. Cras justo odio, dapibus ac facilisis.

+
+ +
+ +
+ +
+ +
+ +
+ +

Happy Customers

+

Customer satisfaction is our major goal. See what our customers are saying about us.

+
+
+
+
+
+
+
+
+
+
+
+

ā€œVivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Vestibulum id ligula porta felis euismod semper. Cras justo odio dapibus facilisis sociis natoque penatibus.ā€

+
+ +
+
Coriss Ambady
+

Financial Analyst

+
+
+
+
+ +
+ +
+ +
+ +
+
+
+
+
+

ā€œVivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Vestibulum id ligula porta felis euismod semper. Cras justo odio dapibus facilisis sociis natoque penatibus.ā€

+
+ +
+
Cory Zamora
+

Marketing Specialist

+
+
+
+
+ +
+ +
+ +
+ +
+
+
+
+
+

ā€œVivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Vestibulum id ligula porta felis euismod semper. Cras justo odio dapibus facilisis sociis natoque penatibus.ā€

+
+ +
+
Nikolas Brooten
+

Sales Manager

+
+
+
+
+ +
+ +
+ +
+ +
+
+
+
+
+

ā€œVivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Vestibulum id ligula porta felis euismod semper. Cras justo odio dapibus facilisis sociis natoque penatibus.ā€

+
+ +
+
Coriss Ambady
+

Financial Analyst

+
+
+
+
+ +
+ +
+ +
+ +
+
+
+
+
+

ā€œVivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Vestibulum id ligula porta felis euismod semper. Cras justo odio dapibus facilisis sociis natoque penatibus.ā€

+
+ +
+
Jackie Sanders
+

Investment Planner

+
+
+
+
+ +
+ +
+ +
+ +
+
+
+
+
+

ā€œVivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Vestibulum id ligula porta felis euismod semper. Cras justo odio dapibus facilisis sociis natoque penatibus.ā€

+
+ +
+
Laura Widerski
+

Sales Specialist

+
+
+
+
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+
+
+
+

Join Our Community

+

We are trusted by over 5000+ clients. Join them by using our services and grow your business.

+ Join Us +
+ +
+ +
+ +
+ +
+ +
+
+ @@include('_footer-widgets.html', { + "lightText": true + }) +
+ +
+ @@include('_page-progress.html') + @@include('_scripts.html') + + \ No newline at end of file diff --git a/sandbox310/src/projects.html b/sandbox310/src/projects.html new file mode 100644 index 0000000..bf8dddd --- /dev/null +++ b/sandbox310/src/projects.html @@ -0,0 +1,246 @@ + + + + @@include('_head.html') + + +
+
+ @@include('_navbar.html', { + "classList": "center-nav navbar-light navbar-bg-light", + "otherClassList": "w-100 d-flex ms-auto", + "otherLanguageSelect": true, + "otherBtn": true, + "otherBtnClassList": "btn-sm btn-primary rounded-pill", + "otherBtnText": "Contact", + "otherBtnLink": "@@webRoot/contact.html" + }) +
+ +
+
+
+
+

Check out some of our awesome projects with creative ideas.

+
+ +
+ +
+ +
+ +
+
+
+
+
+
+
+
+
+
+ +

Cras Fermentum Sem

+
+ +
+

Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit.

+ See Project +
+ +
+ +
+ +
+
+
+
+ +
+
+
+
+ +
+
+
+
+ +
+ +
+ +
+
+
+
+
+ +

Vulputate Sollicitudin

+
+ +
+

Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit.

+ See Project +
+ +
+ +
+ +
+
+
+
+ +
+
+
+
+ +
+
+
+
+ +
+ +
+ +
+
+
+
+
+ +

Vulputate Sollicitudin

+
+ +
+

Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit.

+ See Project +
+ +
+ +
+ +
+
+
+
+ +
+
+
+
+ +
+
+
+
+ +
+ +
+ +
+
+
+
+
+ +

Ornare Commodo Mollis

+
+ +
+

Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit.

+ See Project +
+ +
+ +
+ +
+
+
+
+ +
+
+
+
+ +
+
+
+
+ +
+ +
+ +
+
+
+
+
+ +

Porta Tortor Vulputate

+
+ +
+

Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit.

+ See Project +
+ +
+ +
+ +
+
+
+
+ +
+
+
+
+ +
+
+
+
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+
+ @@include('_footer-widgets.html', { + "lightText": true + }) +
+ +
+ @@include('_page-progress.html') + @@include('_scripts.html') + + \ No newline at end of file diff --git a/sandbox310/src/projects2.html b/sandbox310/src/projects2.html new file mode 100644 index 0000000..308e354 --- /dev/null +++ b/sandbox310/src/projects2.html @@ -0,0 +1,257 @@ + + + + @@include('_head.html') + + +
+
+ @@include('_navbar.html', { + "classList": "center-nav transparent navbar-light", + "otherClassList": "w-100 d-flex ms-auto", + "otherLanguageSelect": true, + "otherBtn": true, + "otherBtnClassList": "btn-sm btn-primary rounded-pill", + "otherBtnText": "Contact", + "otherBtnLink": "@@webRoot/contact.html" + }) +
+ +
+
+
+
+

Projects

+

Check out some of our awesome projects with creative ideas and great design.

+
+ +
+ +
+ +
+ +
+
+
+
+
+
+
+
+
+
+ +

Cras Fermentum Sem

+
+ +
+

Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit.

+ See Project +
+ +
+ +
+ +
+ +
+ +
+ +
+
+
+
+
+
+
+ +

Mollis Ipsum Mattis

+
+ +
+

Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit. Nullam id dolor id nibh ultricies vehicula.

+ See Project +
+ +
+ +
+ +
+ +
+ +
+ +
+
+
+
+
+
+
+ +

Ipsum Ultricies Cursus

+
+ +
+

Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit.

+ See Project +
+ +
+ +
+ +
+ +
+ +
+ +
+
+
+
+
+
+
+ +

Sollicitudin Ornare Porta

+
+ +
+

Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit.

+ See Project +
+ +
+ +
+ +
+ +
+ +
+ +
+
+
+
+
+
+
+ +

Inceptos Euismod Egestas

+
+ +
+

Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit. Nullam id dolor id nibh ultricies vehicula.

+ See Project +
+ +
+ +
+ +
+ +
+ +
+ +
+
+
+
+
+
+
+ +

Ipsum Mollis Vulputate

+
+ +
+

Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit.

+ See Project +
+ +
+ +
+ +
+ +
+ +
+ +
+
+
+
+
+
+
+ +

Porta Ornare Cras

+
+ +
+

Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit.

+ See Project +
+ +
+ +
+ +
+ +
+ +
+ +
+ + + +
+ +
+ +
+ +
+
+ @@include('_footer-widgets.html', { + "lightText": true + }) +
+ +
+ @@include('_page-progress.html') + @@include('_scripts.html') + + \ No newline at end of file diff --git a/sandbox310/src/projects3.html b/sandbox310/src/projects3.html new file mode 100644 index 0000000..d24236a --- /dev/null +++ b/sandbox310/src/projects3.html @@ -0,0 +1,188 @@ + + + + @@include('_head.html') + + +
+
+ @@include('_navbar.html', { + "classList": "center-nav transparent navbar-light", + "otherClassList": "w-100 d-flex ms-auto", + "otherLanguageSelect": true, + "otherBtn": true, + "otherBtnClassList": "btn-sm btn-primary rounded-pill", + "otherBtnText": "Contact", + "otherBtnLink": "@@webRoot/contact.html" + }) +
+ +
+
+
+
+

Check out some of our awesome projects with creative ideas.

+
+ +
+ +
+ +
+ +
+
+
+
+

Filter:

+ +
+
+
+
+
+
+ +

Cras Fermentum Sem

+
+ +
+ +
+ +
+
+
+
+ +

Mollis Ipsum Mattis

+
+ +
+ +
+ +
+
+
+
+ +

Ipsum Ultricies Cursus

+
+ +
+ +
+ +
+
+
+
+ +

Sollicitudin Ornare Porta

+
+ +
+ +
+ +
+
+
+
+ +

Inceptos Euismod Egestas

+
+ +
+ +
+ +
+
+
+
+ +

Ipsum Mollis Vulputate

+
+ +
+ +
+ +
+
+
+
+ +

Porta Ornare Cras

+
+ +
+ +
+ +
+
+
+
+ +

Vulputate Sollicitudin

+
+ +
+ +
+ +
+
+
+
+ +

Magna Tristique Inceptos

+
+ +
+ +
+ +
+
+
+
+ +

Ridiculus Elit

+
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+
+ @@include('_footer-widgets.html', { + "lightText": true + }) +
+ +
+ @@include('_page-progress.html') + @@include('_scripts.html') + + \ No newline at end of file diff --git a/sandbox310/src/projects4.html b/sandbox310/src/projects4.html new file mode 100644 index 0000000..72048d1 --- /dev/null +++ b/sandbox310/src/projects4.html @@ -0,0 +1,177 @@ + + + + @@include('_head.html') + + +
+
+ @@include('_navbar.html', { + "classList": "center-nav transparent navbar-light", + "otherClassList": "w-100 d-flex ms-auto", + "otherLanguageSelect": true, + "otherBtn": true, + "otherBtnClassList": "btn-sm btn-primary rounded-pill", + "otherBtnText": "Contact", + "otherBtnLink": "@@webRoot/contact.html" + }) +
+ +
+
+
+
+

Projects

+

Check out some of our awesome projects with creative ideas and great design.

+
+ +
+ +
+ +
+ +
+
+
+
+

Filter:

+ +
+
+
+
+
+
+ +

Cras Fermentum Sem

+
+ +
+ +
+ +
+
+
+
+ +

Mollis Ipsum Mattis

+
+ +
+ +
+ +
+
+
+
+ +

Ipsum Ultricies Cursus

+
+ +
+ +
+ +
+
+
+
+ +

Inceptos Euismod Egestas

+
+ +
+ +
+ +
+
+
+
+ +

Sollicitudin Ornare Porta

+
+ +
+ +
+ +
+
+
+
+ +

Ipsum Mollis Vulputate

+
+ +
+ +
+ +
+
+
+
+ +

Porta Ornare Cras

+
+ +
+ +
+ +
+
+
+
+ +

Vulputate Sollicitudin

+
+ +
+ +
+ +
+
+
+
+ +

Magna Tristique Inceptos

+
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+
+ @@include('_footer-widgets.html', { + "lightText": true + }) +
+ +
+ @@include('_page-progress.html') + @@include('_scripts.html') + + \ No newline at end of file diff --git a/sandbox310/src/services.html b/sandbox310/src/services.html new file mode 100644 index 0000000..db13f74 --- /dev/null +++ b/sandbox310/src/services.html @@ -0,0 +1,336 @@ + + + + @@include('_head.html') + + +
+
+ @@include('_navbar.html', { + "classList": "center-nav transparent navbar-light", + "otherClassList": "w-100 d-flex ms-auto", + "otherLanguageSelect": true, + "otherBtn": true, + "otherBtnClassList": "btn-sm btn-primary rounded-pill", + "otherBtnText": "Contact", + "otherBtnLink": "@@webRoot/contact.html" + }) +
+ +
+
+
+
+

Our Services

+

We are a creative company that focuses on establishing long-term relationships with customers.

+
+ +
+ +
+ +
+ +
+
+
+
+
+
+
+
+
+
+
+

7518

+

Completed Projects

+
+ +
+

3472

+

Satisfied Customers

+
+ +
+

2184

+

Expert Employees

+
+ +
+

4523

+

Awards Won

+
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+
+
+
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+ +
+ +
+

What We Do?

+

The full service we are offering is specifically designed to meet your business needs and projects.

+
+
+
+
+
+
+
+

24/7 Support

+

Nulla vitae elit libero pharetra augue dapibus.

+
+
+
+ +
+
+
+
+
+
+

Secure Payments

+

Vivamus sagittis lacus augue laoreet vel.

+
+
+
+ +
+
+
+
+
+
+

Daily Updates

+

Cras mattis consectetur purus sit amet.

+
+
+
+ +
+
+
+
+
+
+

Market Research

+

Aenean lacinia bibendum nulla sed consectetur.

+
+
+
+ +
+ +
+ +
+ +

How We Do It?

+

We make your spending stress-free for you to have the perfect control.

+
+
01 +

Concept

+

Nulla vitae elit libero elit non porta gravida eget metus cras. Aenean eu leo quam. Pellentesque ornare.

+
+ +
02 +

Prepare

+

Vestibulum id ligula porta felis euismod semper. Sed posuere consectetur est at lobortis.

+
+ +
03 +

Retouch

+

Integer posuere erat a ante venenatis dapibus posuere velit aliquet. Nulla vitae elit libero.

+
+ +
04 +

Finalize

+

Integer posuere erat, consectetur adipiscing elit. Fusce dapibus, tellus ac cursus commodo.

+
+ +
+ +
+ +
+ +
+
+
+
+ +

Find out everything you need to know about creating a business process model.

+
+ +
+ +
+ +
+ +
+
+
+
+

Our Pricing

+

We offer great prices, premium and quality products for your business.

+

Enjoy a free 30-day trial and experience the full service. No credit card required!

+ See All Prices +
+ +
+
+

Monthly

+
+
+
+
+
+

Yearly (Save 30%)

+
+
+
+
+
+
+
+
+
$19 month
+
$199 year
+
+ +

Premium Plan

+
    +
  • 5 Projects
  • +
  • 100K API Access
  • +
  • 200MB Storage
  • +
  • Weekly Reports
  • +
  • 7/24 Support
  • +
+ Choose Plan +
+ +
+ +
+ + + +
+ +
+ +
+ +
+
+
+
+
+
+
+ +
+
+
+
+
+ +
+
+
+

5000+

+

Satisfied Customers

+
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+

Let’s Talk

+

Let's make something great together. We are trusted by over 5000+ clients. Join them by using our services and grow your business.

+

Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Maecenas faucibus mollis interdum. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus.

+ Join Us +
+ +
+ +
+ +
+ +
+ +
+
+ @@include('_footer-widgets.html', { + "lightText": true + }) +
+ +
+ @@include('_page-progress.html') + @@include('_scripts.html') + + \ No newline at end of file diff --git a/sandbox310/src/services2.html b/sandbox310/src/services2.html new file mode 100644 index 0000000..1769232 --- /dev/null +++ b/sandbox310/src/services2.html @@ -0,0 +1,312 @@ + + + + @@include('_head.html') + + +
+
+ @@include('_navbar.html', { + "classList": "center-nav transparent position-absolute navbar-dark", + "logoBoth": true, + "otherClassList": "w-100 d-flex ms-auto", + "otherLanguageSelect": true, + "otherBtn": true, + "otherBtnClassList": "btn-sm btn-white rounded-pill", + "otherBtnText": "Contact", + "otherBtnLink": "@@webRoot/contact.html" + }) +
+ +
+
+
+
+

Our Services

+

We are a creative company that focuses on establishing long-term relationships with customers.

+
+ +
+ +
+ +
+ +
+
+
+
+
+
+
+
+ +

24/7 Support

+

Nulla vitae elit libero, a pharetra augue. Donec id elit non mi porta.

+
+ +
+ +
+ +
+
+
+ +

Secure Payments

+

Nulla vitae elit libero, a pharetra augue. Donec id elit non mi porta.

+
+ +
+ +
+ +
+
+
+ +

Daily Updates

+

Nulla vitae elit libero, a pharetra augue.

+
+ +
+ +
+ +
+
+
+ +

Market Research

+

Nulla vitae elit libero, a pharetra augue. Donec id elit non mi porta gravida at eget.

+
+ +
+ +
+ +
+ +
+ +
+

What We Do?

+

The service we offer is specifically designed to meet your needs.

+

Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Maecenas sed diam eget risus varius blandit sit amet non magna. Maecenas faucibus mollis interdum. Praesent commodo cursus magna, vel scelerisque nisl consectetur et.

+ More Details +
+ +
+ +
+ +
+ +
+
+
+
+
+
+
+ +
+
+ +
+ +
+
+

Our Process

+

Find out everything you need to know about creating a business process model

+
+
+

1. Concept

+

Nulla vitae elit libero elit non porta gravida eget metus cras.

+
+ +
+

2. Prepare

+

Nulla vitae elit libero elit non porta gravida eget metus cras.

+
+ +
+

3. Retouch

+

Nulla vitae elit libero elit non porta gravida eget metus cras.

+
+ +
+ +
+ +
+ +
+ +
+ + @@include('_dummy-content.html') +
+
+
+
+

Our Pricing

+

We offer great prices, premium products and quality service for your business.

+
+ +
+ +
+ +
+ +
+
+
+
+
+
+

Monthly

+
+
+
+
+
+

Yearly

+
+
+
+
+
+ +

Basic Plan

+
+
$9 month
+
$99 year
+
+ +
    +
  • 1 Project
  • +
  • 100K API Access
  • +
  • 100MB Storage
  • +
  • Weekly Reports
  • +
  • 7/24 Support
  • +
+ Choose Plan +
+ +
+ +
+ + + +
+
+
+ +

Corporate Plan

+
+
$49 month
+
$499 year
+
+ +
    +
  • 20 Projects
  • +
  • 300K API Access
  • +
  • 500MB Storage
  • +
  • Weekly Reports
  • +
  • 7/24 Support
  • +
+ Choose Plan +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+
+
+
+

Join Our Community

+

We are trusted by over 5000+ clients. Join them now and grow your business.

+
+ +
+ +
+
+
+
+

7518

+

Completed Projects

+
+ +
+

5472

+

Satisfied Customers

+
+ +
+

2184

+

Expert Employees

+
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+
+ @@include('_footer-widgets.html', { + "lightText": true + }) +
+ +
+ @@include('_page-progress.html') + @@include('_scripts.html') + + \ No newline at end of file diff --git a/sandbox310/src/shop-cart.html b/sandbox310/src/shop-cart.html new file mode 100644 index 0000000..211f1ec --- /dev/null +++ b/sandbox310/src/shop-cart.html @@ -0,0 +1,260 @@ + + + + @@include('_head.html') + + +
+
+ @@include('_navbar.html', { + "classList": "center-nav navbar-light navbar-bg-light", + "otherClassList": "w-100 d-flex ms-auto", + "otherShop": true, + "otherSearch": true + }) +
+ +
+
+ + +
+ +
+ +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
Product
+
+
Price
+
+
Quantity
+
+
Total
+
+
+
+

Nike Air Sneakers

+
Color: Black
+
Size: 43
+
+
+

$55.00 $45.99

+
+
+ +
+ +
+

$45.99

+
+ +
+
+
+

Colorful Sneakers

+
Color: Misc
+
Size: 43
+
+
+

$45.00

+
+
+ +
+ +
+

$45.00

+
+ +
+
+
+

Polaroid Camera

+
Color: Black
+
+
+

$45.00

+
+
+ +
+ +
+

$45.00

+
+ +
+
+ +
+
+
+ + + +
+ +
+ + + +
+ +
+ +
+

Order Summary

+
+ + + + + + + + + + + + + + + + + + + +
Subtotal

$135.99

Discount (5%)

-$6.8

Shipping

$10

Grand Total

$152.79

+
+ Proceed to Checkout +
+ +
+ +
+ +
+ +
+
+
+
+
+
+ +
+
+

Free Shipping

+

Duis mollis gravida commodo id luctus erat porttitor ligula, eget lacinia odio sem.

+
+
+
+ +
+
+
+ +
+
+

30 Days Return

+

Duis mollis gravida commodo id luctus erat porttitor ligula, eget lacinia odio sem.

+
+
+
+ +
+
+
+ +
+
+

2-Years Warranty

+

Duis mollis gravida commodo id luctus erat porttitor ligula, eget lacinia odio sem.

+
+
+
+ +
+ +
+ +
+ +
+ +
+
+ @@include('_footer-widgets.html', { + "lightText": true + }) +
+ +
+ @@include('_page-progress.html') + @@include('_scripts.html') + + \ No newline at end of file diff --git a/sandbox310/src/shop-checkout.html b/sandbox310/src/shop-checkout.html new file mode 100644 index 0000000..52c3a9c --- /dev/null +++ b/sandbox310/src/shop-checkout.html @@ -0,0 +1,336 @@ + + + + @@include('_head.html') + + +
+
+ @@include('_navbar.html', { + "classList": "center-nav navbar-light navbar-bg-light", + "otherClassList": "w-100 d-flex ms-auto", + "otherShop": true, + "otherSearch": true + }) +
+ +
+
+ + +
+ +
+ +
+
+
+
+ +

Billing address

+
+
+
+
+ + +
+ Valid first name is required. +
+
+
+
+
+ + +
+ Valid last name is required. +
+
+
+
+
+ + +
+ Please enter a valid email address for shipping updates. +
+
+
+
+
+ + +
+ Please enter your shipping address. +
+
+
+
+
+ + +
+
+
+
+ +
+ Please select a valid country. +
+
+
+
+
+ +
+ Please provide a valid state. +
+
+
+
+
+ + +
+ Zip code required. +
+
+
+
+
+
+ + +
+
+ + +
+
+

Payment

+
+
+ + +
+
+ + +
+
+ + +
+
+
+
+
+
+
+ + +
+ Credit card number is required +
+
+
+
+
+ + +
+ Name on card is required +
+
+
+
+
+ + +
+ Expiration date required +
+
+
+
+
+ + +
+ Security code required +
+
+
+
+
+
+
+
+ +
+

Order Summary

+
+
+
+
+
+

Nike Air Sneakers

+
Color: Black
+
Size: 43
+
+
+
+

$45.99

+
+
+ +
+
+
+
+

Colorful Sneakers

+
Color: Misc
+
Size: 43
+
+
+
+

$45.00

+
+
+ +
+
+
+
+

Polaroid Camera

+
Color: Black
+
+
+
+

$45.00

+
+
+ +
+ +
+

Shipping

+
+
+ + + Shipment may take 5-6 business days +
+
+ + + Shipment may take 2-3 business days +
+
+
+ + + + + + + + + + + + + + + + + + + +
Subtotal

$135.99

Discount (5%)

-$6.8

Shipping

$10

Grand Total

$152.79

+
+ Place Order +
+ +
+ +
+ +
+ + @@include('_menu-others-modal.html') +
+
+
+
+
+
+ +
+
+

Free Shipping

+

Duis mollis gravida commodo id luctus erat porttitor ligula, eget lacinia odio sem.

+
+
+
+ +
+
+
+ +
+
+

30 Days Return

+

Duis mollis gravida commodo id luctus erat porttitor ligula, eget lacinia odio sem.

+
+
+
+ +
+
+
+ +
+
+

2-Years Warranty

+

Duis mollis gravida commodo id luctus erat porttitor ligula, eget lacinia odio sem.

+
+
+
+ +
+ +
+ +
+ +
+ +
+
+ @@include('_footer-widgets.html', { + "lightText": true + }) +
+ +
+ @@include('_page-progress.html') + @@include('_scripts.html') + + \ No newline at end of file diff --git a/sandbox310/src/shop-product.html b/sandbox310/src/shop-product.html new file mode 100644 index 0000000..e95dc33 --- /dev/null +++ b/sandbox310/src/shop-product.html @@ -0,0 +1,579 @@ + + + + @@include('_head.html') + + +
+
+ @@include('_navbar.html', { + "classList": "center-nav navbar-light navbar-bg-light", + "otherClassList": "w-100 d-flex ms-auto", + "otherShop": true, + "otherSearch": true + }) +
+ +
+
+ + +
+ +
+ +
+
+
+
+
+
+
+
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+ +
+ +
+
+
+
+
+
+
+ +
+ +
+ +
+ +
+
+

Curology Skincare Set

+

$55.00

+ (3 Reviews) +
+ +

Cum sociis natoque penatibus et magnis dis parturient montes nascetur ridiculus mus. Duis mollis, est non commodo luctus. Nulla vitae elit libero pharetra augue. Donec id elit non mi porta gravida at eget metus.

+
+
+ Choose a size + + + + + +
+
+ Choose a color + + + + + +
+
+
+
+
+ +
+ +
+
+ +
+
+ +
+
+ +
+ +
+ +
+ +
+ + + +
+
+

Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Morbi leo risus, porta ac consectetur ac, vestibulum at eros. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Sed posuere consectetur est at lobortis. Sed posuere consectetur est at lobortis. Nulla vitae elit libero, a pharetra augue. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Nullam id dolor id nibh ultricies vehicula ut id elit. Maecenas sed diam eget risus varius blandit sit amet non magna. Integer posuere erat a ante venenatis dapibus posuere velit aliquet. Nullam quis risus eget urna mollis ornare vel eu leo. Vestibulum id ligula porta felis euismod semper.

+

Vestibulum id ligula porta felis euismod semper. Nullam id dolor id nibh ultricies vehicula ut id elit. Maecenas faucibus mollis interdum. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.

+
+ +
+

Integer posuere erat a ante venenatis dapibus posuere velit aliquet. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Morbi leo risus, porta ac consectetur ac, vestibulum at eros. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Lorem ipsum dolor sit amet, consectetur adipiscing elit.

+
+ +
+

Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Integer posuere erat a ante venenatis dapibus posuere velit aliquet. Cras mattis consectetur purus sit amet fermentum. Maecenas sed diam eget risus varius blandit sit amet non magna. + + Sed posuere consectetur est at lobortis. Curabitur blandit tempus porttitor. Aenean lacinia bibendum nulla sed consectetur. Nulla vitae elit libero, a pharetra augue. Morbi leo risus, porta ac consectetur ac, vestibulum at eros. Praesent commodo cursus magna, vel scelerisque nisl consectetur et.

+
+ +
+ +
+ +
+ +
+
+

You Might Also Like

+
+
+
+
+
+ + + + Add to Cart + Sale! +
+
+
+ + +
+

Nike Air Sneakers

+

$55.00 $45.00

+
+ +
+ +
+
+ + + + Add to Cart +
+
+
+ + +
+

Apple Watch

+

$55.00

+
+ +
+ +
+
+ + + + Add to Cart + New! +
+
+
+ +
+

Headphones

+

$55.00

+
+ +
+ +
+
+ + + + Add to Cart +
+
+
+ + +
+

Colorful Sneakers

+

$55.00

+
+ +
+ +
+
+ + + + Add to Cart +
+
+
+ + +
+

Polaroid Camera

+

$55.00

+
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+
+
+ + +
+
+
+

Ratings & Reviews

+
+ +
+
+ +
+ +
+ +
+ +
+
    +
  1. +
    +
    +
    +
    Connor Gibson
    + + +
    + +
    + +
    + +
    Highly recommended!
    +
    +

    Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit. Sed posuere consectetur est at lobortis integer posuere erat ante.

    +
    +

    Was this review helpful?

    +
    + 5 + 5 +
    +
    +
  2. +
  3. +
    +
    +
    +
    Nikolas Brooten
    + + +
    + +
    + +
    + +
    Great product
    +
    +

    Quisque tristique tincidunt metus non aliquam. Quisque ac risus sit amet quam sollicitudin vestibulum vitae malesuada libero. Mauris magna elit, suscipit non ornare et, blandit a tellus. Pellentesque dignissim ornare faucibus mollis.

    +
    +

    Was this review helpful?

    +
    + 5 + 5 +
    +
    +
  4. +
  5. +
    +
    +
    +
    Pearce Frye
    + + +
    + +
    + +
    + +
    Could be better
    +
    +

    Cras mattis consectetur purus sit amet fermentum. Integer posuere erat a ante venenatis dapibus posuere velit aliquet. Etiam porta sem malesuada magna mollis.

    +
    +

    Was this review helpful?

    +
    + 5 + 5 +
    +
    +
  6. +
  7. +
    +
    +
    +
    Nikolas Brooten
    + + +
    + +
    + +
    + +
    I'm going to return it
    +
    +

    Nullam id dolor id nibh ultricies vehicula ut id. Cras mattis consectetur purus sit amet fermentum. Aenean eu leo quam. Pellentesque ornare sem lacinia aenean bibendum nulla consectetur.

    +
    +

    Was this review helpful?

    +
    + 5 + 5 +
    +
    +
  8. +
  9. +
    +
    +
    +
    Lou Bloxham
    + + +
    + +
    + +
    + +
    +

    Sed posuere consectetur est at lobortis. Vestibulum id ligula porta felis euismod semper. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.

    +
    +

    Was this review helpful?

    +
    + 5 + 5 +
    +
    +
  10. +
+
+ + + +
+ +
+ +
+ +
+ +
+
+
+
+
+
+ +
+
+

Free Shipping

+

Duis mollis gravida commodo id luctus erat porttitor ligula, eget lacinia odio sem.

+
+
+
+ +
+
+
+ +
+
+

30 Days Return

+

Duis mollis gravida commodo id luctus erat porttitor ligula, eget lacinia odio sem.

+
+
+
+ +
+
+
+ +
+
+

2-Years Warranty

+

Duis mollis gravida commodo id luctus erat porttitor ligula, eget lacinia odio sem.

+
+
+
+ +
+ +
+ +
+ +
+ +
+
+ @@include('_footer-widgets.html', { + "lightText": true + }) +
+ +
+ @@include('_page-progress.html') + @@include('_scripts.html') + + \ No newline at end of file diff --git a/sandbox310/src/shop.html b/sandbox310/src/shop.html new file mode 100644 index 0000000..f16bffe --- /dev/null +++ b/sandbox310/src/shop.html @@ -0,0 +1,309 @@ + + + + @@include('_head.html') + + +
+
+ @@include('_navbar.html', { + "classList": "center-nav navbar-light navbar-bg-light", + "otherClassList": "w-100 d-flex ms-auto", + "otherShop": true, + "otherSearch": true + }) +
+ +
+
+
+
+

Shop Layout

+

Integer posuere erat a ante venenatis dapibus.

+
+ +
+ +
+ +
+ +
+
+
+
+

New Arrivals

+ + +
+ +
+
+ +
+ +
+ +
+ +
+
+
+
+ + + + Add to Cart + Sale! +
+
+
+ + +
+

Nike Air Sneakers

+

$55.00 $45.00

+
+ +
+ +
+
+ + + + Add to Cart +
+
+
+ + +
+

Apple Watch

+

$55.00

+
+ +
+ +
+
+ + + + Add to Cart + New! +
+
+
+ +
+

Headphones

+

$55.00

+
+ +
+ +
+
+ + + + Add to Cart +
+
+
+ + +
+

Colorful Sneakers

+

$55.00

+
+ +
+ +
+
+ + + + Add to Cart +
+
+
+ + +
+

Polaroid Camera

+

$55.00

+
+ +
+ +
+
+ + + + Add to Cart +
+
+
+ + +
+

Curology Cleanser

+

$55.00

+
+ +
+ +
+
+ + + + Add to Cart +
+
+
+ + +
+

Q&Q Wall Clock

+

$55.00

+
+ +
+ +
+
+ + + + Add to Cart +
+
+
+ +
+

Earphones

+

$55.00

+
+ +
+ +
+
+ + + + Add to Cart +
+
+
+ + +
+

Apple Watch Milano Loop

+

$55.00

+
+ +
+ +
+ +
+ + + +
+ +
+ +
+
+
+
+
+
+ +
+
+

Free Shipping

+

Duis mollis gravida commodo id luctus erat porttitor ligula, eget lacinia odio sem.

+
+
+
+ +
+
+
+ +
+
+

30 Days Return

+

Duis mollis gravida commodo id luctus erat porttitor ligula, eget lacinia odio sem.

+
+
+
+ +
+
+
+ +
+
+

2-Years Warranty

+

Duis mollis gravida commodo id luctus erat porttitor ligula, eget lacinia odio sem.

+
+
+
+ +
+ +
+ +
+ +
+ +
+
+ @@include('_footer-widgets.html', { + "lightText": true + }) +
+ +
+ @@include('_page-progress.html') + @@include('_scripts.html') + + \ No newline at end of file diff --git a/sandbox310/src/shop2.html b/sandbox310/src/shop2.html new file mode 100644 index 0000000..0c5d0b3 --- /dev/null +++ b/sandbox310/src/shop2.html @@ -0,0 +1,472 @@ + + + + @@include('_head.html') + + +
+
+ @@include('_navbar.html', { + "classList": "center-nav navbar-light navbar-bg-light", + "otherClassList": "w-100 d-flex ms-auto", + "otherShop": true, + "otherSearch": true + }) +
+ +
+
+ + +
+ +
+ +
+
+
+
+
+
+

New Arrivals

+

Showing 1–9 of 30 results

+
+ +
+
+ +
+ +
+ +
+ +
+
+
+
+ + + + Add to Cart + Sale! +
+
+
+ + +
+

Nike Air Sneakers

+

$55.00 $45.00

+
+ +
+ +
+
+ + + + Add to Cart +
+
+
+ + +
+

Apple Watch

+

$55.00

+
+ +
+ +
+
+ + + + Add to Cart + New! +
+
+
+ +
+

Headphones

+

$55.00

+
+ +
+ +
+
+ + + + Add to Cart +
+
+
+ + +
+

Colorful Sneakers

+

$55.00

+
+ +
+ +
+
+ + + + Add to Cart +
+
+
+ + +
+

Polaroid Camera

+

$55.00

+
+ +
+ +
+
+ + + + Add to Cart +
+
+
+ + +
+

Curology Cleanser

+

$55.00

+
+ +
+ +
+
+ + + + Add to Cart +
+
+
+ + +
+

Q&Q Wall Clock

+

$55.00

+
+ +
+ +
+
+ + + + Add to Cart +
+
+
+ +
+

Earphones

+

$55.00

+
+ +
+ +
+
+ + + + Add to Cart +
+
+
+ + +
+

Apple Watch Milano Loop

+

$55.00

+
+ +
+ +
+ +
+ + + +
+ + + +
+ +
+ +
+ +
+
+
+
+
+
+ +
+
+

Free Shipping

+

Duis mollis gravida commodo id luctus erat porttitor ligula, eget lacinia odio sem.

+
+
+
+ +
+
+
+ +
+
+

30 Days Return

+

Duis mollis gravida commodo id luctus erat porttitor ligula, eget lacinia odio sem.

+
+
+
+ +
+
+
+ +
+
+

2-Years Warranty

+

Duis mollis gravida commodo id luctus erat porttitor ligula, eget lacinia odio sem.

+
+
+
+ +
+ +
+ +
+ +
+ +
+
+ @@include('_footer-widgets.html', { + "lightText": true + }) +
+ +
+ @@include('_page-progress.html') + @@include('_scripts.html') + + \ No newline at end of file diff --git a/sandbox310/src/signin.html b/sandbox310/src/signin.html new file mode 100644 index 0000000..6758325 --- /dev/null +++ b/sandbox310/src/signin.html @@ -0,0 +1,95 @@ + + + + @@include('_head.html') + + +
+
+ @@include('_navbar.html', { + "classList": "center-nav transparent position-absolute navbar-light", + "otherClassList": "w-100 d-flex ms-auto", + "otherLanguageSelect": true, + "otherBtn": true, + "otherBtnClassList": "btn-sm btn-primary rounded-pill", + "otherBtnText": "Contact", + "otherBtnLink": "@@webRoot/contact.html" + }) +
+ +
+
+
+
+

Sign In

+ + +
+ +
+ +
+ +
+ +
+
+
+
+
+
+

Welcome Back

+

Fill your email and password to sign in.

+
+
+ + +
+
+ + + +
+ +
+ +

Forgot Password?

+

Don't have an account? Sign up

+
or
+ + +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+
+ @@include('_footer-widgets.html', { + "lightText": true + }) +
+ +
+ @@include('_page-progress.html') + @@include('_scripts.html') + + \ No newline at end of file diff --git a/sandbox310/src/signin2.html b/sandbox310/src/signin2.html new file mode 100644 index 0000000..f31c4ec --- /dev/null +++ b/sandbox310/src/signin2.html @@ -0,0 +1,105 @@ + + + + @@include('_head.html') + + +
+
+ @@include('_navbar.html', { + "classList": "center-nav transparent position-absolute navbar-dark", + "logoBoth": true, + "otherClassList": "w-100 d-flex ms-auto", + "otherLanguageSelect": true, + "otherBtn": true, + "otherBtnClassList": "btn-sm btn-white rounded-pill", + "otherBtnText": "Contact", + "otherBtnLink": "@@webRoot/contact.html" + }) +
+ +
+
+
+
+

Sign In

+ + +
+ +
+ +
+ +
+ +
+
+
+
+
+
+
+
+ +
+
+

Welcome Back

+

Fill your email and password to sign in.

+
+
+ + +
+
+ + + +
+ +
+ +

Forgot Password?

+

Don't have an account? Sign up

+
or
+ + +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+
+ @@include('_footer-widgets.html', { + "lightText": true + }) +
+ +
+ @@include('_page-progress.html') + @@include('_scripts.html') + + \ No newline at end of file diff --git a/sandbox310/src/signup.html b/sandbox310/src/signup.html new file mode 100644 index 0000000..f475058 --- /dev/null +++ b/sandbox310/src/signup.html @@ -0,0 +1,103 @@ + + + + @@include('_head.html') + + +
+
+ @@include('_navbar.html', { + "classList": "center-nav transparent position-absolute navbar-light", + "otherClassList": "w-100 d-flex ms-auto", + "otherLanguageSelect": true, + "otherBtn": true, + "otherBtnClassList": "btn-sm btn-primary rounded-pill", + "otherBtnText": "Contact", + "otherBtnLink": "@@webRoot/contact.html" + }) +
+ +
+
+
+
+

Sign Up

+ + +
+ +
+ +
+ +
+ +
+
+
+
+
+
+

Sign up to Sandbox

+

Registration takes less than a minute.

+
+
+ + +
+
+ + +
+
+ + + +
+
+ + + +
+ +
+ +

Already have an account? Sign in

+
or
+ + +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+
+ @@include('_footer-widgets.html', { + "lightText": true + }) +
+ +
+ @@include('_page-progress.html') + @@include('_scripts.html') + + \ No newline at end of file diff --git a/sandbox310/src/signup2.html b/sandbox310/src/signup2.html new file mode 100644 index 0000000..c7b2d53 --- /dev/null +++ b/sandbox310/src/signup2.html @@ -0,0 +1,113 @@ + + + + @@include('_head.html') + + +
+
+ @@include('_navbar.html', { + "classList": "center-nav transparent position-absolute navbar-dark", + "logoBoth": true, + "otherClassList": "w-100 d-flex ms-auto", + "otherLanguageSelect": true, + "otherBtn": true, + "otherBtnClassList": "btn-sm btn-white rounded-pill", + "otherBtnText": "Contact", + "otherBtnLink": "@@webRoot/contact.html" + }) +
+ +
+
+
+
+

Sign Up

+ + +
+ +
+ +
+ +
+ +
+
+
+
+
+
+
+
+ +
+
+

Sign up to Sandbox

+

Registration takes less than a minute.

+
+
+ + +
+
+ + +
+
+ + + +
+
+ + + +
+ +
+ +

Already have an account? Sign in

+
or
+ + +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+
+ @@include('_footer-widgets.html', { + "lightText": true + }) +
+ +
+ @@include('_page-progress.html') + @@include('_scripts.html') + + \ No newline at end of file diff --git a/sandbox310/src/single-project.html b/sandbox310/src/single-project.html new file mode 100644 index 0000000..ca12a99 --- /dev/null +++ b/sandbox310/src/single-project.html @@ -0,0 +1,155 @@ + + + + @@include('_head.html') + + +
+
+ @@include('_navbar.html', { + "classList": "center-nav transparent navbar-light", + "otherClassList": "w-100 d-flex ms-auto", + "otherLanguageSelect": true, + "otherBtn": true, + "otherBtnClassList": "btn-sm btn-primary rounded-pill", + "otherBtnText": "Contact", + "otherBtnLink": "@@webRoot/contact.html" + }) +
+ +
+
+
+
+
+ + +

Commodo Dolor Bibendum Parturient Cursus Mollis

+

Integer posuere erat a ante venenatis dapibus posuere. Maecenas faucibus mollis interdum.

+
+ +
+ +
+ +
+ +
+ +
+
+
+
+
+
+
+
+

About the Project

+
+
+

Cras mattis consectetur purus sit amet fermentum. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Integer posuere erat a ante venenatis. Etiam porta sem malesuada magna mollis euismod. Aenean lacinia bibendum.

+

Donec id elit non mi porta gravida at eget metus. Cras mattis consectetur purus sit amet fermentum. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Donec sed odio dui. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Sed posuere consectetur est at lobortis. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor.

+
+ +
+
    +
  • +
    Date
    +

    17 May 2018

    +
  • +
  • +
    Client Name
    +

    Cool House

    +
  • +
+ See Project +
+ +
+ +
+ +
+ +
+
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+ +
+
+

Quam Mollis Bibendum

+

Maecenas sed diam eget risus varius blandit sit amet non magna. Donec ullamcorper nulla non metus auctor fringilla. Cras mattis consectetur purus sit amet fermentum. Aenean lacinia bibendum nulla sed consectetur. Curabitur blandit tempus porttitor. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Donec id elit non mi porta gravida at eget metus. Donec id elit non mi porta gravida at eget metus. Cras mattis consectetur purus sit amet fermentum.

+

Aenean lacinia bibendum nulla sed consectetur. Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit. Maecenas faucibus mollis interdum. Maecenas sed diam eget risus varius blandit sit amet non magna. Morbi leo risus, porta ac consectetur ac, vestibulum at eros. Nulla vitae elit libero, a pharetra augue. Maecenas faucibus mollis interdum etiam porta.

+
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+
+
+ + + + +
+ +
+ +
+ +
+ +
+
+ @@include('_footer-widgets.html', { + "lightText": true + }) +
+ +
+ @@include('_page-progress.html') + @@include('_scripts.html') + + \ No newline at end of file diff --git a/sandbox310/src/single-project2.html b/sandbox310/src/single-project2.html new file mode 100644 index 0000000..8f9fd87 --- /dev/null +++ b/sandbox310/src/single-project2.html @@ -0,0 +1,159 @@ + + + + @@include('_head.html') + + +
+
+ @@include('_navbar.html', { + "classList": "center-nav transparent navbar-light", + "otherClassList": "w-100 d-flex ms-auto", + "otherLanguageSelect": true, + "otherBtn": true, + "otherBtnClassList": "btn-sm btn-primary rounded-pill", + "otherBtnText": "Contact", + "otherBtnLink": "@@webRoot/contact.html" + }) +
+ +
+
+
+
+
+ + +

Commodo Dolor Bibendum Parturient Cursus Mollis

+

Integer posuere erat a ante venenatis dapibus posuere. Maecenas faucibus mollis interdum.

+
+ +
+ +
+ +
+ +
+ +
+
+
+
+
+
+
+
+ +
+
Vivamus sagittis lacus augue
+ +
+ +
+ +
+ +
+
Vivamus sagittis lacus augue
+ +
+ +
+ +
+ +
+
Vivamus sagittis lacus augue
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+
+

About the Project

+
+
+

Cras mattis consectetur purus sit amet fermentum. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Integer posuere erat a ante venenatis. Etiam porta sem malesuada magna mollis euismod. Aenean lacinia bibendum.

+

Donec id elit non mi porta gravida at eget metus. Cras mattis consectetur purus sit amet fermentum. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Donec sed odio dui. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Sed posuere consectetur est at lobortis. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor.

+
+ +
+
    +
  • +
    Date
    +

    17 May 2018

    +
  • +
  • +
    Client Name
    +

    Cool House

    +
  • +
+ See Project +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+
+
+ + + + +
+ +
+ +
+ +
+ +
+
+ @@include('_footer-widgets.html', { + "lightText": true + }) +
+ +
+ @@include('_page-progress.html') + @@include('_scripts.html') + + \ No newline at end of file diff --git a/sandbox310/src/single-project3.html b/sandbox310/src/single-project3.html new file mode 100644 index 0000000..3db78b4 --- /dev/null +++ b/sandbox310/src/single-project3.html @@ -0,0 +1,161 @@ + + + + @@include('_head.html') + + +
+
+ @@include('_navbar.html', { + "classList": "center-nav transparent position-absolute navbar-dark", + "logoBoth": true, + "otherClassList": "w-100 d-flex ms-auto", + "otherLanguageSelect": true, + "otherBtn": true, + "otherBtnClassList": "btn-sm btn-white rounded-pill", + "otherBtnText": "Contact", + "otherBtnLink": "@@webRoot/contact.html" + }) +
+ +
+
+
+
+
+ + +

Commodo Dolor Bibendum Parturient Cursus Mollis

+

Integer posuere erat a ante venenatis dapibus posuere. Maecenas faucibus mollis interdum.

+
+ +
+ +
+ +
+ +
+ +
+
+
+
+
+

About the Project

+
+
+

Cras mattis consectetur purus sit amet fermentum. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Integer posuere erat a ante venenatis. Etiam porta sem malesuada magna mollis euismod. Aenean lacinia bibendum.

+

Donec id elit non mi porta gravida at eget metus. Cras mattis consectetur purus sit amet fermentum. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Donec sed odio dui. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Sed posuere consectetur est at lobortis. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor.

+
+ +
+
    +
  • +
    Date
    +

    17 May 2018

    +
  • +
  • +
    Client Name
    +

    Cool House

    +
  • +
+ See Project +
+ +
+ +
+ +
+ +
+ +
+ +
+
+
+
+
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+ +
+ +
+ +
+ +
+ +
+
+
+ + + + +
+ +
+ +
+ +
+ +
+
+ @@include('_footer-widgets.html', { + "lightText": true + }) +
+ +
+ @@include('_page-progress.html') + @@include('_scripts.html') + + \ No newline at end of file diff --git a/sandbox310/src/terms.html b/sandbox310/src/terms.html new file mode 100644 index 0000000..af811ae --- /dev/null +++ b/sandbox310/src/terms.html @@ -0,0 +1,169 @@ + + + + @@include('_head.html') + + +
+
+ @@include('_navbar.html', { + "classList": "center-nav transparent navbar-light", + "otherClassList": "w-100 d-flex ms-auto", + "otherLanguageSelect": true, + "otherBtn": true, + "otherBtnClassList": "btn-sm btn-primary rounded-pill", + "otherBtnText": "Contact", + "otherBtnLink": "@@webRoot/contact.html" + }) +
+ +
+
+
+
+

Terms and Conditions

+ + +
+ +
+ +
+ +
+ +
+
+ + +
+
+
+
+

1. Terms and Conditions

+

Donec id elit non mi porta gravida at eget metus. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Cras mattis consectetur purus sit amet fermentum. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla vitae elit libero, a pharetra augue. Nullam quis risus eget urna mollis ornare vel eu leo. Cras justo odio, dapibus ac facilisis in, egestas eget quam.

+

Sed posuere consectetur est at lobortis. Maecenas faucibus mollis interdum. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec id elit non mi porta gravida at eget metus. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.

+

Nullam quis risus eget urna mollis ornare vel eu leo. Maecenas sed diam eget risus varius blandit sit amet non magna. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Nullam id dolor id nibh ultricies vehicula ut id elit. Donec ullamcorper nulla non metus auctor fringilla. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam porta sem malesuada magna mollis euismod. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Nulla vitae elit libero, a pharetra augue. Curabitur blandit tempus porttitor. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Aenean eu leo quam. Pellentesque ornare sem.

+
    +
  • Aenean eu leo quam ornare curabitur blandit tempus.
  • +
  • Nullam quis risus eget urna mollis ornare donec elit.
  • +
  • Etiam porta sem malesuada magna mollis euismod.
  • +
  • Fermentum massa vivamus faucibus amet euismod.
  • +
+
+ +
+ +
+
+
+
+

2. Privacy Policy

+

Donec id elit non mi porta gravida at eget metus. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Cras mattis consectetur purus sit amet fermentum. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla vitae elit libero, a pharetra augue. Nullam quis risus eget urna mollis ornare vel eu leo. Cras justo odio, dapibus ac facilisis in, egestas eget quam.

+

Sed posuere consectetur est at lobortis. Maecenas faucibus mollis interdum. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec id elit non mi porta gravida at eget metus. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.

+
    +
  • Aenean eu leo quam ornare curabitur blandit tempus.
  • +
  • Nullam quis risus eget urna mollis ornare donec elit.
  • +
  • Etiam porta sem malesuada magna mollis euismod.
  • +
  • Fermentum massa vivamus faucibus amet euismod.
  • +
+

Nullam quis risus eget urna mollis ornare vel eu leo. Maecenas sed diam eget risus varius blandit sit amet non magna. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Nullam id dolor id nibh ultricies vehicula ut id elit. Donec ullamcorper nulla non metus auctor fringilla. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam porta sem malesuada magna mollis euismod. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Nulla vitae elit libero, a pharetra augue. Curabitur blandit tempus porttitor. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Aenean eu leo quam. Pellentesque ornare sem.

+
+ +
+ +
+
+
+
+

3. User Policy

+

Donec id elit non mi porta gravida at eget metus. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Cras mattis consectetur purus sit amet fermentum. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla vitae elit libero, a pharetra augue. Nullam quis risus eget urna mollis ornare vel eu leo. Cras justo odio, dapibus ac facilisis in, egestas eget quam.

+

Sed posuere consectetur est at lobortis. Maecenas faucibus mollis interdum. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec id elit non mi porta gravida at eget metus. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.

+

Nullam quis risus eget urna mollis ornare vel eu leo. Maecenas sed diam eget risus varius blandit sit amet non magna. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Nullam id dolor id nibh ultricies vehicula ut id elit. Donec ullamcorper nulla non metus auctor fringilla. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam porta sem malesuada magna mollis euismod. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Nulla vitae elit libero, a pharetra augue. Curabitur blandit tempus porttitor. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Aenean eu leo quam. Pellentesque ornare sem.

+
+ +
+ +
+
+
+
+

4. Copyrights

+

Donec id elit non mi porta gravida at eget metus. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Cras mattis consectetur purus sit amet fermentum. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla vitae elit libero, a pharetra augue. Nullam quis risus eget urna mollis ornare vel eu leo. Cras justo odio, dapibus ac facilisis in, egestas eget quam.

+

Sed posuere consectetur est at lobortis. Maecenas faucibus mollis interdum. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec id elit non mi porta gravida at eget metus. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.

+
    +
  • Aenean eu leo quam ornare curabitur blandit tempus.
  • +
  • Nullam quis risus eget urna mollis ornare donec elit.
  • +
  • Etiam porta sem malesuada magna mollis euismod.
  • +
  • Fermentum massa vivamus faucibus amet euismod.
  • +
+

Nullam quis risus eget urna mollis ornare vel eu leo. Maecenas sed diam eget risus varius blandit sit amet non magna. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Nullam id dolor id nibh ultricies vehicula ut id elit. Donec ullamcorper nulla non metus auctor fringilla. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam porta sem malesuada magna mollis euismod. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Nulla vitae elit libero, a pharetra augue. Curabitur blandit tempus porttitor. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Aenean eu leo quam. Pellentesque ornare sem.

+
+ +
+ +
+
+
+
+

5. Cookies

+

Donec id elit non mi porta gravida at eget metus. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Cras mattis consectetur purus sit amet fermentum. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla vitae elit libero, a pharetra augue. Nullam quis risus eget urna mollis ornare vel eu leo. Cras justo odio, dapibus ac facilisis in, egestas eget quam.

+

Sed posuere consectetur est at lobortis. Maecenas faucibus mollis interdum. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec id elit non mi porta gravida at eget metus. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.

+

Nullam quis risus eget urna mollis ornare vel eu leo. Maecenas sed diam eget risus varius blandit sit amet non magna. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Nullam id dolor id nibh ultricies vehicula ut id elit. Donec ullamcorper nulla non metus auctor fringilla. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam porta sem malesuada magna mollis euismod. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Nulla vitae elit libero, a pharetra augue. Curabitur blandit tempus porttitor. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Aenean eu leo quam. Pellentesque ornare sem.

+
+ +
+ +
+
+
+
+

6. Account & Billing

+

Donec id elit non mi porta gravida at eget metus. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Cras mattis consectetur purus sit amet fermentum. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla vitae elit libero, a pharetra augue. Nullam quis risus eget urna mollis ornare vel eu leo. Cras justo odio, dapibus ac facilisis in, egestas eget quam.

+

Sed posuere consectetur est at lobortis. Maecenas faucibus mollis interdum. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec id elit non mi porta gravida at eget metus. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.

+

Nullam quis risus eget urna mollis ornare vel eu leo. Maecenas sed diam eget risus varius blandit sit amet non magna. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Nullam id dolor id nibh ultricies vehicula ut id elit. Donec ullamcorper nulla non metus auctor fringilla. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam porta sem malesuada magna mollis euismod. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Nulla vitae elit libero, a pharetra augue. Curabitur blandit tempus porttitor. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Aenean eu leo quam. Pellentesque ornare sem.

+
+ +
+ +
+
+ +
+ +
+ +
+ +
+
+ @@include('_footer-widgets.html', { + "lightText": true + }) +
+ +
+ @@include('_page-progress.html') + @@include('_scripts.html') + + \ No newline at end of file diff --git a/spark b/spark new file mode 100644 index 0000000..9a5a5db --- /dev/null +++ b/spark @@ -0,0 +1,67 @@ +#!/usr/bin/env php +systemDirectory, '\\/ ') . DIRECTORY_SEPARATOR . 'bootstrap.php'; +$app = require realpath($bootstrap) ?: $bootstrap; + +// Grab our Console +$console = new CodeIgniter\CLI\Console($app); + +// We want errors to be shown when using it from the CLI. +error_reporting(-1); +ini_set('display_errors', '1'); + +// Show basic information before we do anything else. +if (is_int($suppress = array_search('--no-header', $_SERVER['argv'], true))) { + unset($_SERVER['argv'][$suppress]); // @codeCoverageIgnore + $suppress = true; +} + +$console->showHeader($suppress); + +// fire off the command in the main framework. +$response = $console->run(); + +if ($response->getStatusCode() >= 300) { + exit($response->getStatusCode()); +} diff --git a/system/.htaccess b/system/.htaccess new file mode 100644 index 0000000..3462048 --- /dev/null +++ b/system/.htaccess @@ -0,0 +1,6 @@ + + Require all denied + + + Deny from all + diff --git a/system/API/ResponseTrait.php b/system/API/ResponseTrait.php new file mode 100644 index 0000000..9ee722b --- /dev/null +++ b/system/API/ResponseTrait.php @@ -0,0 +1,355 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\API; + +use CodeIgniter\Format\FormatterInterface; +use CodeIgniter\HTTP\IncomingRequest; +use CodeIgniter\HTTP\Response; +use Config\Services; + +/** + * Provides common, more readable, methods to provide + * consistent HTTP responses under a variety of common + * situations when working as an API. + * + * @property IncomingRequest $request + * @property Response $response + */ +trait ResponseTrait +{ + /** + * Allows child classes to override the + * status code that is used in their API. + * + * @var array + */ + protected $codes = [ + 'created' => 201, + 'deleted' => 200, + 'updated' => 200, + 'no_content' => 204, + 'invalid_request' => 400, + 'unsupported_response_type' => 400, + 'invalid_scope' => 400, + 'temporarily_unavailable' => 400, + 'invalid_grant' => 400, + 'invalid_credentials' => 400, + 'invalid_refresh' => 400, + 'no_data' => 400, + 'invalid_data' => 400, + 'access_denied' => 401, + 'unauthorized' => 401, + 'invalid_client' => 401, + 'forbidden' => 403, + 'resource_not_found' => 404, + 'not_acceptable' => 406, + 'resource_exists' => 409, + 'conflict' => 409, + 'resource_gone' => 410, + 'payload_too_large' => 413, + 'unsupported_media_type' => 415, + 'too_many_requests' => 429, + 'server_error' => 500, + 'unsupported_grant_type' => 501, + 'not_implemented' => 501, + ]; + + /** + * How to format the response data. + * Either 'json' or 'xml'. If blank will be + * determine through content negotiation. + * + * @var string + */ + protected $format = 'json'; + + /** + * Current Formatter instance. This is usually set by ResponseTrait::format + * + * @var FormatterInterface + */ + protected $formatter; + + /** + * Provides a single, simple method to return an API response, formatted + * to match the requested format, with proper content-type and status code. + * + * @param array|string|null $data + * + * @return Response + */ + protected function respond($data = null, ?int $status = null, string $message = '') + { + if ($data === null && $status === null) { + $status = 404; + $output = null; + } elseif ($data === null && is_numeric($status)) { + $output = null; + } else { + $status = empty($status) ? 200 : $status; + $output = $this->format($data); + } + + if ($output !== null) { + if ($this->format === 'json') { + return $this->response->setJSON($output)->setStatusCode($status, $message); + } + + if ($this->format === 'xml') { + return $this->response->setXML($output)->setStatusCode($status, $message); + } + } + + return $this->response->setBody($output)->setStatusCode($status, $message); + } + + /** + * Used for generic failures that no custom methods exist for. + * + * @param array|string $messages + * @param int $status HTTP status code + * @param string|null $code Custom, API-specific, error code + * + * @return Response + */ + protected function fail($messages, int $status = 400, ?string $code = null, string $customMessage = '') + { + if (! is_array($messages)) { + $messages = ['error' => $messages]; + } + + $response = [ + 'status' => $status, + 'error' => $code ?? $status, + 'messages' => $messages, + ]; + + return $this->respond($response, $status, $customMessage); + } + + //-------------------------------------------------------------------- + // Response Helpers + //-------------------------------------------------------------------- + + /** + * Used after successfully creating a new resource. + * + * @param mixed $data + * + * @return Response + */ + protected function respondCreated($data = null, string $message = '') + { + return $this->respond($data, $this->codes['created'], $message); + } + + /** + * Used after a resource has been successfully deleted. + * + * @param mixed $data + * + * @return Response + */ + protected function respondDeleted($data = null, string $message = '') + { + return $this->respond($data, $this->codes['deleted'], $message); + } + + /** + * Used after a resource has been successfully updated. + * + * @param mixed $data + * + * @return Response + */ + protected function respondUpdated($data = null, string $message = '') + { + return $this->respond($data, $this->codes['updated'], $message); + } + + /** + * Used after a command has been successfully executed but there is no + * meaningful reply to send back to the client. + * + * @return Response + */ + protected function respondNoContent(string $message = 'No Content') + { + return $this->respond(null, $this->codes['no_content'], $message); + } + + /** + * Used when the client is either didn't send authorization information, + * or had bad authorization credentials. User is encouraged to try again + * with the proper information. + * + * @return Response + */ + protected function failUnauthorized(string $description = 'Unauthorized', ?string $code = null, string $message = '') + { + return $this->fail($description, $this->codes['unauthorized'], $code, $message); + } + + /** + * Used when access is always denied to this resource and no amount + * of trying again will help. + * + * @return Response + */ + protected function failForbidden(string $description = 'Forbidden', ?string $code = null, string $message = '') + { + return $this->fail($description, $this->codes['forbidden'], $code, $message); + } + + /** + * Used when a specified resource cannot be found. + * + * @return Response + */ + protected function failNotFound(string $description = 'Not Found', ?string $code = null, string $message = '') + { + return $this->fail($description, $this->codes['resource_not_found'], $code, $message); + } + + /** + * Used when the data provided by the client cannot be validated. + * + * @return Response + * + * @deprecated Use failValidationErrors instead + */ + protected function failValidationError(string $description = 'Bad Request', ?string $code = null, string $message = '') + { + return $this->fail($description, $this->codes['invalid_data'], $code, $message); + } + + /** + * Used when the data provided by the client cannot be validated on one or more fields. + * + * @param string|string[] $errors + * + * @return Response + */ + protected function failValidationErrors($errors, ?string $code = null, string $message = '') + { + return $this->fail($errors, $this->codes['invalid_data'], $code, $message); + } + + /** + * Use when trying to create a new resource and it already exists. + * + * @return Response + */ + protected function failResourceExists(string $description = 'Conflict', ?string $code = null, string $message = '') + { + return $this->fail($description, $this->codes['resource_exists'], $code, $message); + } + + /** + * Use when a resource was previously deleted. This is different than + * Not Found, because here we know the data previously existed, but is now gone, + * where Not Found means we simply cannot find any information about it. + * + * @return Response + */ + protected function failResourceGone(string $description = 'Gone', ?string $code = null, string $message = '') + { + return $this->fail($description, $this->codes['resource_gone'], $code, $message); + } + + /** + * Used when the user has made too many requests for the resource recently. + * + * @return Response + */ + protected function failTooManyRequests(string $description = 'Too Many Requests', ?string $code = null, string $message = '') + { + return $this->fail($description, $this->codes['too_many_requests'], $code, $message); + } + + /** + * Used when there is a server error. + * + * @param string $description The error message to show the user. + * @param string|null $code A custom, API-specific, error code. + * @param string $message A custom "reason" message to return. + * + * @return Response The value of the Response's send() method. + */ + protected function failServerError(string $description = 'Internal Server Error', ?string $code = null, string $message = ''): Response + { + return $this->fail($description, $this->codes['server_error'], $code, $message); + } + + //-------------------------------------------------------------------- + // Utility Methods + //-------------------------------------------------------------------- + + /** + * Handles formatting a response. Currently makes some heavy assumptions + * and needs updating! :) + * + * @param array|string|null $data + * + * @return string|null + */ + protected function format($data = null) + { + // If the data is a string, there's not much we can do to it... + if (is_string($data)) { + // The content type should be text/... and not application/... + $contentType = $this->response->getHeaderLine('Content-Type'); + $contentType = str_replace('application/json', 'text/html', $contentType); + $contentType = str_replace('application/', 'text/', $contentType); + $this->response->setContentType($contentType); + $this->format = 'html'; + + return $data; + } + + $format = Services::format(); + $mime = "application/{$this->format}"; + + // Determine correct response type through content negotiation if not explicitly declared + if (empty($this->format) || ! in_array($this->format, ['json', 'xml'], true)) { + $mime = $this->request->negotiate('media', $format->getConfig()->supportedResponseFormats, false); + } + + $this->response->setContentType($mime); + + // if we don't have a formatter, make one + if (! isset($this->formatter)) { + // if no formatter, use the default + $this->formatter = $format->getFormatter($mime); + } + + if ($mime !== 'application/json') { + // Recursively convert objects into associative arrays + // Conversion not required for JSONFormatter + $data = json_decode(json_encode($data), true); + } + + return $this->formatter->format($data); + } + + /** + * Sets the format the response should be in. + * + * @return $this + */ + protected function setResponseFormat(?string $format = null) + { + $this->format = strtolower($format); + + return $this; + } +} diff --git a/system/Autoloader/Autoloader.php b/system/Autoloader/Autoloader.php new file mode 100644 index 0000000..492fb09 --- /dev/null +++ b/system/Autoloader/Autoloader.php @@ -0,0 +1,328 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Autoloader; + +use Composer\Autoload\ClassLoader; +use Config\Autoload; +use Config\Modules; +use InvalidArgumentException; + +/** + * An autoloader that uses both PSR4 autoloading, and traditional classmaps. + * + * Given a foo-bar package of classes in the file system at the following paths: + * ``` + * /path/to/packages/foo-bar/ + * /src + * Baz.php # Foo\Bar\Baz + * Qux/ + * Quux.php # Foo\Bar\Qux\Quux + * ``` + * you can add the path to the configuration array that is passed in the constructor. + * The Config array consists of 2 primary keys, both of which are associative arrays: + * 'psr4', and 'classmap'. + * ``` + * $Config = [ + * 'psr4' => [ + * 'Foo\Bar' => '/path/to/packages/foo-bar' + * ], + * 'classmap' => [ + * 'MyClass' => '/path/to/class/file.php' + * ] + * ]; + * ``` + * Example: + * ``` + * register(); + * ``` + */ +class Autoloader +{ + /** + * Stores namespaces as key, and path as values. + * + * @var array> + */ + protected $prefixes = []; + + /** + * Stores class name as key, and path as values. + * + * @var array + */ + protected $classmap = []; + + /** + * Stores files as a list. + * + * @var array + */ + protected $files = []; + + /** + * Reads in the configuration array (described above) and stores + * the valid parts that we'll need. + * + * @return $this + */ + public function initialize(Autoload $config, Modules $modules) + { + // We have to have one or the other, though we don't enforce the need + // to have both present in order to work. + if (empty($config->psr4) && empty($config->classmap)) { + throw new InvalidArgumentException('Config array must contain either the \'psr4\' key or the \'classmap\' key.'); + } + + if (isset($config->psr4)) { + $this->addNamespace($config->psr4); + } + + if (isset($config->classmap)) { + $this->classmap = $config->classmap; + } + + if (isset($config->files)) { + $this->files = $config->files; + } + + // Should we load through Composer's namespaces, also? + if ($modules->discoverInComposer) { + $this->discoverComposerNamespaces(); + } + + return $this; + } + + /** + * Register the loader with the SPL autoloader stack. + */ + public function register() + { + // Prepend the PSR4 autoloader for maximum performance. + spl_autoload_register([$this, 'loadClass'], true, true); + + // Now prepend another loader for the files in our class map. + spl_autoload_register([$this, 'loadClassmap'], true, true); + + // Load our non-class files + foreach ($this->files as $file) { + if (is_string($file)) { + $this->includeFile($file); + } + } + } + + /** + * Registers namespaces with the autoloader. + * + * @param array|string $namespace + * + * @return $this + */ + public function addNamespace($namespace, ?string $path = null) + { + if (is_array($namespace)) { + foreach ($namespace as $prefix => $namespacedPath) { + $prefix = trim($prefix, '\\'); + + if (is_array($namespacedPath)) { + foreach ($namespacedPath as $dir) { + $this->prefixes[$prefix][] = rtrim($dir, '\\/') . DIRECTORY_SEPARATOR; + } + + continue; + } + + $this->prefixes[$prefix][] = rtrim($namespacedPath, '\\/') . DIRECTORY_SEPARATOR; + } + } else { + $this->prefixes[trim($namespace, '\\')][] = rtrim($path, '\\/') . DIRECTORY_SEPARATOR; + } + + return $this; + } + + /** + * Get namespaces with prefixes as keys and paths as values. + * + * If a prefix param is set, returns only paths to the given prefix. + * + * @return array + */ + public function getNamespace(?string $prefix = null) + { + if ($prefix === null) { + return $this->prefixes; + } + + return $this->prefixes[trim($prefix, '\\')] ?? []; + } + + /** + * Removes a single namespace from the psr4 settings. + * + * @return $this + */ + public function removeNamespace(string $namespace) + { + if (isset($this->prefixes[trim($namespace, '\\')])) { + unset($this->prefixes[trim($namespace, '\\')]); + } + + return $this; + } + + /** + * Load a class using available class mapping. + * + * @return false|string + */ + public function loadClassmap(string $class) + { + $file = $this->classmap[$class] ?? ''; + + if (is_string($file) && $file !== '') { + return $this->includeFile($file); + } + + return false; + } + + /** + * Loads the class file for a given class name. + * + * @param string $class The fully qualified class name. + * + * @return false|string The mapped file on success, or boolean false + * on failure. + */ + public function loadClass(string $class) + { + $class = trim($class, '\\'); + $class = str_ireplace('.php', '', $class); + + return $this->loadInNamespace($class); + } + + /** + * Loads the class file for a given class name. + * + * @param string $class The fully-qualified class name + * + * @return false|string The mapped file name on success, or boolean false on fail + */ + protected function loadInNamespace(string $class) + { + if (strpos($class, '\\') === false) { + return false; + } + + foreach ($this->prefixes as $namespace => $directories) { + foreach ($directories as $directory) { + $directory = rtrim($directory, '\\/'); + + if (strpos($class, $namespace) === 0) { + $filePath = $directory . str_replace('\\', DIRECTORY_SEPARATOR, substr($class, strlen($namespace))) . '.php'; + $filename = $this->includeFile($filePath); + + if ($filename) { + return $filename; + } + } + } + } + + // never found a mapped file + return false; + } + + /** + * A central way to include a file. Split out primarily for testing purposes. + * + * @return false|string The filename on success, false if the file is not loaded + */ + protected function includeFile(string $file) + { + $file = $this->sanitizeFilename($file); + + if (is_file($file)) { + include_once $file; + + return $file; + } + + return false; + } + + /** + * Sanitizes a filename, replacing spaces with dashes. + * + * Removes special characters that are illegal in filenames on certain + * operating systems and special characters requiring special escaping + * to manipulate at the command line. Replaces spaces and consecutive + * dashes with a single dash. Trim period, dash and underscore from beginning + * and end of filename. + * + * @return string The sanitized filename + */ + public function sanitizeFilename(string $filename): string + { + // Only allow characters deemed safe for POSIX portable filenames. + // Plus the forward slash for directory separators since this might be a path. + // http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html#tag_03_278 + // Modified to allow backslash and colons for on Windows machines. + $filename = preg_replace('/[^0-9\p{L}\s\/\-\_\.\:\\\\]/u', '', $filename); + + // Clean up our filename edges. + return trim($filename, '.-_'); + } + + /** + * Locates autoload information from Composer, if available. + */ + protected function discoverComposerNamespaces() + { + if (! is_file(COMPOSER_PATH)) { + return; + } + + /** + * @var ClassLoader $composer + */ + $composer = include COMPOSER_PATH; + $paths = $composer->getPrefixesPsr4(); + $classes = $composer->getClassMap(); + + unset($composer); + + // Get rid of CodeIgniter so we don't have duplicates + if (isset($paths['CodeIgniter\\'])) { + unset($paths['CodeIgniter\\']); + } + + $newPaths = []; + + foreach ($paths as $key => $value) { + // Composer stores namespaces with trailing slash. We don't. + $newPaths[rtrim($key, '\\ ')] = $value; + } + + $this->prefixes = array_merge($this->prefixes, $newPaths); + $this->classmap = array_merge($this->classmap, $classes); + } +} diff --git a/system/Autoloader/FileLocator.php b/system/Autoloader/FileLocator.php new file mode 100644 index 0000000..b8bfdf6 --- /dev/null +++ b/system/Autoloader/FileLocator.php @@ -0,0 +1,369 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Autoloader; + +/** + * Allows loading non-class files in a namespaced manner. + * Works with Helpers, Views, etc. + */ +class FileLocator +{ + /** + * The Autoloader to use. + * + * @var Autoloader + */ + protected $autoloader; + + public function __construct(Autoloader $autoloader) + { + $this->autoloader = $autoloader; + } + + /** + * Attempts to locate a file by examining the name for a namespace + * and looking through the PSR-4 namespaced files that we know about. + * + * @param string $file The namespaced file to locate + * @param string|null $folder The folder within the namespace that we should look for the file. + * @param string $ext The file extension the file should have. + * + * @return false|string The path to the file, or false if not found. + */ + public function locateFile(string $file, ?string $folder = null, string $ext = 'php') + { + $file = $this->ensureExt($file, $ext); + + // Clears the folder name if it is at the beginning of the filename + if (! empty($folder) && strpos($file, $folder) === 0) { + $file = substr($file, strlen($folder . '/')); + } + + // Is not namespaced? Try the application folder. + if (strpos($file, '\\') === false) { + return $this->legacyLocate($file, $folder); + } + + // Standardize slashes to handle nested directories. + $file = strtr($file, '/', '\\'); + $file = ltrim($file, '\\'); + + $segments = explode('\\', $file); + + // The first segment will be empty if a slash started the filename. + if (empty($segments[0])) { + unset($segments[0]); + } + + $paths = []; + $filename = ''; + + // Namespaces always comes with arrays of paths + $namespaces = $this->autoloader->getNamespace(); + + foreach (array_keys($namespaces) as $namespace) { + if (substr($file, 0, strlen($namespace)) === $namespace) { + // There may be sub-namespaces of the same vendor, + // so overwrite them with namespaces found later. + $paths = $namespaces[$namespace]; + + $fileWithoutNamespace = substr($file, strlen($namespace)); + $filename = ltrim(str_replace('\\', '/', $fileWithoutNamespace), '/'); + } + } + + // if no namespaces matched then quit + if (empty($paths)) { + return false; + } + + // Check each path in the namespace + foreach ($paths as $path) { + // Ensure trailing slash + $path = rtrim($path, '/') . '/'; + + // If we have a folder name, then the calling function + // expects this file to be within that folder, like 'Views', + // or 'libraries'. + if (! empty($folder) && strpos($path . $filename, '/' . $folder . '/') === false) { + $path .= trim($folder, '/') . '/'; + } + + $path .= $filename; + if (is_file($path)) { + return $path; + } + } + + return false; + } + + /** + * Examines a file and returns the fully qualified domain name. + */ + public function getClassname(string $file): string + { + $php = file_get_contents($file); + $tokens = token_get_all($php); + $dlm = false; + $namespace = ''; + $className = ''; + + foreach ($tokens as $i => $token) { + if ($i < 2) { + continue; + } + + if ((isset($tokens[$i - 2][1]) && ($tokens[$i - 2][1] === 'phpnamespace' || $tokens[$i - 2][1] === 'namespace')) || ($dlm && $tokens[$i - 1][0] === T_NS_SEPARATOR && $token[0] === T_STRING)) { + if (! $dlm) { + $namespace = 0; + } + if (isset($token[1])) { + $namespace = $namespace ? $namespace . '\\' . $token[1] : $token[1]; + $dlm = true; + } + } elseif ($dlm && ($token[0] !== T_NS_SEPARATOR) && ($token[0] !== T_STRING)) { + $dlm = false; + } + + if (($tokens[$i - 2][0] === T_CLASS || (isset($tokens[$i - 2][1]) && $tokens[$i - 2][1] === 'phpclass')) + && $tokens[$i - 1][0] === T_WHITESPACE + && $token[0] === T_STRING) { + $className = $token[1]; + break; + } + } + + if (empty($className)) { + return ''; + } + + return $namespace . '\\' . $className; + } + + /** + * Searches through all of the defined namespaces looking for a file. + * Returns an array of all found locations for the defined file. + * + * Example: + * + * $locator->search('Config/Routes.php'); + * // Assuming PSR4 namespaces include foo and bar, might return: + * [ + * 'app/Modules/foo/Config/Routes.php', + * 'app/Modules/bar/Config/Routes.php', + * ] + */ + public function search(string $path, string $ext = 'php', bool $prioritizeApp = true): array + { + $path = $this->ensureExt($path, $ext); + + $foundPaths = []; + $appPaths = []; + + foreach ($this->getNamespaces() as $namespace) { + if (isset($namespace['path']) && is_file($namespace['path'] . $path)) { + $fullPath = $namespace['path'] . $path; + $fullPath = realpath($fullPath) ?: $fullPath; + + if ($prioritizeApp) { + $foundPaths[] = $fullPath; + } elseif (strpos($fullPath, APPPATH) === 0) { + $appPaths[] = $fullPath; + } else { + $foundPaths[] = $fullPath; + } + } + } + + if (! $prioritizeApp && ! empty($appPaths)) { + $foundPaths = array_merge($foundPaths, $appPaths); + } + + // Remove any duplicates + return array_unique($foundPaths); + } + + /** + * Ensures a extension is at the end of a filename + */ + protected function ensureExt(string $path, string $ext): string + { + if ($ext) { + $ext = '.' . $ext; + + if (substr($path, -strlen($ext)) !== $ext) { + $path .= $ext; + } + } + + return $path; + } + + /** + * Return the namespace mappings we know about. + * + * @return array|string + */ + protected function getNamespaces() + { + $namespaces = []; + + // Save system for last + $system = []; + + foreach ($this->autoloader->getNamespace() as $prefix => $paths) { + foreach ($paths as $path) { + if ($prefix === 'CodeIgniter') { + $system = [ + 'prefix' => $prefix, + 'path' => rtrim($path, '\\/') . DIRECTORY_SEPARATOR, + ]; + + continue; + } + + $namespaces[] = [ + 'prefix' => $prefix, + 'path' => rtrim($path, '\\/') . DIRECTORY_SEPARATOR, + ]; + } + } + + $namespaces[] = $system; + + return $namespaces; + } + + /** + * Find the qualified name of a file according to + * the namespace of the first matched namespace path. + * + * @return false|string The qualified name or false if the path is not found + */ + public function findQualifiedNameFromPath(string $path) + { + $path = realpath($path) ?: $path; + + if (! is_file($path)) { + return false; + } + + foreach ($this->getNamespaces() as $namespace) { + $namespace['path'] = realpath($namespace['path']) ?: $namespace['path']; + + if (empty($namespace['path'])) { + continue; + } + + if (mb_strpos($path, $namespace['path']) === 0) { + $className = '\\' . $namespace['prefix'] . '\\' . + ltrim(str_replace( + '/', + '\\', + mb_substr($path, mb_strlen($namespace['path'])) + ), '\\'); + + // Remove the file extension (.php) + $className = mb_substr($className, 0, -4); + + // Check if this exists + if (class_exists($className)) { + return $className; + } + } + } + + return false; + } + + /** + * Scans the defined namespaces, returning a list of all files + * that are contained within the subpath specified by $path. + */ + public function listFiles(string $path): array + { + if (empty($path)) { + return []; + } + + $files = []; + helper('filesystem'); + + foreach ($this->getNamespaces() as $namespace) { + $fullPath = $namespace['path'] . $path; + $fullPath = realpath($fullPath) ?: $fullPath; + + if (! is_dir($fullPath)) { + continue; + } + + $tempFiles = get_filenames($fullPath, true); + + if (! empty($tempFiles)) { + $files = array_merge($files, $tempFiles); + } + } + + return $files; + } + + /** + * Scans the provided namespace, returning a list of all files + * that are contained within the subpath specified by $path. + */ + public function listNamespaceFiles(string $prefix, string $path): array + { + if (empty($path) || empty($prefix)) { + return []; + } + + $files = []; + helper('filesystem'); + + // autoloader->getNamespace($prefix) returns an array of paths for that namespace + foreach ($this->autoloader->getNamespace($prefix) as $namespacePath) { + $fullPath = rtrim($namespacePath, '/') . '/' . $path; + $fullPath = realpath($fullPath) ?: $fullPath; + + if (! is_dir($fullPath)) { + continue; + } + + $tempFiles = get_filenames($fullPath, true); + + if (! empty($tempFiles)) { + $files = array_merge($files, $tempFiles); + } + } + + return $files; + } + + /** + * Checks the app folder to see if the file can be found. + * Only for use with filenames that DO NOT include namespacing. + * + * @return false|string The path to the file, or false if not found. + */ + protected function legacyLocate(string $file, ?string $folder = null) + { + $path = APPPATH . (empty($folder) ? $file : $folder . '/' . $file); + $path = realpath($path) ?: $path; + + if (is_file($path)) { + return $path; + } + + return false; + } +} diff --git a/system/BaseModel.php b/system/BaseModel.php new file mode 100644 index 0000000..9713036 --- /dev/null +++ b/system/BaseModel.php @@ -0,0 +1,1698 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter; + +use Closure; +use CodeIgniter\Database\BaseConnection; +use CodeIgniter\Database\BaseResult; +use CodeIgniter\Database\Exceptions\DatabaseException; +use CodeIgniter\Database\Exceptions\DataException; +use CodeIgniter\Exceptions\ModelException; +use CodeIgniter\I18n\Time; +use CodeIgniter\Pager\Pager; +use CodeIgniter\Validation\Validation; +use CodeIgniter\Validation\ValidationInterface; +use Config\Services; +use InvalidArgumentException; +use ReflectionClass; +use ReflectionException; +use ReflectionProperty; +use stdClass; + +/** + * The BaseModel class provides a number of convenient features that + * makes working with a databases less painful. Extending this class + * provide means of implementing various database systems + * + * It will: + * - simplifies pagination + * - allow specifying the return type (array, object, etc) with each call + * - automatically set and update timestamps + * - handle soft deletes + * - ensure validation is run against objects when saving items + * - process various callbacks + * - allow intermingling calls to the db connection + */ +abstract class BaseModel +{ + /** + * Pager instance. + * Populated after calling $this->paginate() + * + * @var Pager + */ + public $pager; + + /** + * Last insert ID + * + * @var int|string + */ + protected $insertID = 0; + + /** + * The Database connection group that + * should be instantiated. + * + * @var string + */ + protected $DBGroup; + + /** + * The format that the results should be returned as. + * Will be overridden if the as* methods are used. + * + * @var string + */ + protected $returnType = 'array'; + + /** + * If this model should use "softDeletes" and + * simply set a date when rows are deleted, or + * do hard deletes. + * + * @var bool + */ + protected $useSoftDeletes = false; + + /** + * An array of field names that are allowed + * to be set by the user in inserts/updates. + * + * @var array + */ + protected $allowedFields = []; + + /** + * If true, will set created_at, and updated_at + * values during insert and update routines. + * + * @var bool + */ + protected $useTimestamps = false; + + /** + * The type of column that created_at and updated_at + * are expected to. + * + * Allowed: 'datetime', 'date', 'int' + * + * @var string + */ + protected $dateFormat = 'datetime'; + + /** + * The column used for insert timestamps + * + * @var string + */ + protected $createdField = 'created_at'; + + /** + * The column used for update timestamps + * + * @var string + */ + protected $updatedField = 'updated_at'; + + /** + * Used by withDeleted to override the + * model's softDelete setting. + * + * @var bool + */ + protected $tempUseSoftDeletes; + + /** + * The column used to save soft delete state + * + * @var string + */ + protected $deletedField = 'deleted_at'; + + /** + * Used by asArray and asObject to provide + * temporary overrides of model default. + * + * @var string + */ + protected $tempReturnType; + + /** + * Whether we should limit fields in inserts + * and updates to those available in $allowedFields or not. + * + * @var bool + */ + protected $protectFields = true; + + /** + * Database Connection + * + * @var BaseConnection + */ + protected $db; + + /** + * Rules used to validate data in insert, update, and save methods. + * The array must match the format of data passed to the Validation + * library. + * + * @var array|string + */ + protected $validationRules = []; + + /** + * Contains any custom error messages to be + * used during data validation. + * + * @var array + */ + protected $validationMessages = []; + + /** + * Skip the model's validation. Used in conjunction with skipValidation() + * to skip data validation for any future calls. + * + * @var bool + */ + protected $skipValidation = false; + + /** + * Whether rules should be removed that do not exist + * in the passed in data. Used between inserts/updates. + * + * @var bool + */ + protected $cleanValidationRules = true; + + /** + * Our validator instance. + * + * @var Validation + */ + protected $validation; + + /* + * Callbacks. + * + * Each array should contain the method names (within the model) + * that should be called when those events are triggered. + * + * "Update" and "delete" methods are passed the same items that + * are given to their respective method. + * + * "Find" methods receive the ID searched for (if present), and + * 'afterFind' additionally receives the results that were found. + */ + + /** + * Whether to trigger the defined callbacks + * + * @var bool + */ + protected $allowCallbacks = true; + + /** + * Used by allowCallbacks() to override the + * model's allowCallbacks setting. + * + * @var bool + */ + protected $tempAllowCallbacks; + + /** + * Callbacks for beforeInsert + * + * @var array + */ + protected $beforeInsert = []; + + /** + * Callbacks for afterInsert + * + * @var array + */ + protected $afterInsert = []; + + /** + * Callbacks for beforeUpdate + * + * @var array + */ + protected $beforeUpdate = []; + + /** + * Callbacks for afterUpdate + * + * @var array + */ + protected $afterUpdate = []; + + /** + * Callbacks for beforeFind + * + * @var array + */ + protected $beforeFind = []; + + /** + * Callbacks for afterFind + * + * @var array + */ + protected $afterFind = []; + + /** + * Callbacks for beforeDelete + * + * @var array + */ + protected $beforeDelete = []; + + /** + * Callbacks for afterDelete + * + * @var array + */ + protected $afterDelete = []; + + public function __construct(?ValidationInterface $validation = null) + { + $this->tempReturnType = $this->returnType; + $this->tempUseSoftDeletes = $this->useSoftDeletes; + $this->tempAllowCallbacks = $this->allowCallbacks; + + /** + * @var Validation $validation + */ + $validation = $validation ?? Services::validation(null, false); + $this->validation = $validation; + + $this->initialize(); + } + + /** + * Initializes the instance with any additional steps. + * Optionally implemented by child classes. + */ + protected function initialize() + { + } + + /** + * Fetches the row of database + * This methods works only with dbCalls + * + * @param bool $singleton Single or multiple results + * @param array|int|string|null $id One primary key or an array of primary keys + * + * @return array|object|null The resulting row of data, or null. + */ + abstract protected function doFind(bool $singleton, $id = null); + + /** + * Fetches the column of database + * This methods works only with dbCalls + * + * @param string $columnName Column Name + * + * @throws DataException + * + * @return array|null The resulting row of data, or null if no data found. + */ + abstract protected function doFindColumn(string $columnName); + + /** + * Fetches all results, while optionally limiting them. + * This methods works only with dbCalls + * + * @param int $limit Limit + * @param int $offset Offset + * + * @return array + */ + abstract protected function doFindAll(int $limit = 0, int $offset = 0); + + /** + * Returns the first row of the result set. + * This methods works only with dbCalls + * + * @return array|object|null + */ + abstract protected function doFirst(); + + /** + * Inserts data into the current database + * This methods works only with dbCalls + * + * @param array $data Data + * + * @return bool|int|string + */ + abstract protected function doInsert(array $data); + + /** + * Compiles batch insert and runs the queries, validating each row prior. + * This methods works only with dbCalls + * + * @param array|null $set An associative array of insert values + * @param bool|null $escape Whether to escape values + * @param int $batchSize The size of the batch to run + * @param bool $testing True means only number of records is returned, false will execute the query + * + * @return bool|int Number of rows inserted or FALSE on failure + */ + abstract protected function doInsertBatch(?array $set = null, ?bool $escape = null, int $batchSize = 100, bool $testing = false); + + /** + * Updates a single record in the database. + * This methods works only with dbCalls + * + * @param array|int|string|null $id ID + * @param array|null $data Data + */ + abstract protected function doUpdate($id = null, $data = null): bool; + + /** + * Compiles an update and runs the query + * This methods works only with dbCalls + * + * @param array|null $set An associative array of update values + * @param string|null $index The where key + * @param int $batchSize The size of the batch to run + * @param bool $returnSQL True means SQL is returned, false will execute the query + * + * @throws DatabaseException + * + * @return mixed Number of rows affected or FALSE on failure + */ + abstract protected function doUpdateBatch(?array $set = null, ?string $index = null, int $batchSize = 100, bool $returnSQL = false); + + /** + * Deletes a single record from the database where $id matches + * This methods works only with dbCalls + * + * @param array|int|string|null $id The rows primary key(s) + * @param bool $purge Allows overriding the soft deletes setting. + * + * @throws DatabaseException + * + * @return bool|string + */ + abstract protected function doDelete($id = null, bool $purge = false); + + /** + * Permanently deletes all rows that have been marked as deleted + * through soft deletes (deleted = 1) + * This methods works only with dbCalls + * + * @return bool|mixed + */ + abstract protected function doPurgeDeleted(); + + /** + * Works with the find* methods to return only the rows that + * have been deleted. + * This methods works only with dbCalls + */ + abstract protected function doOnlyDeleted(); + + /** + * Compiles a replace and runs the query + * This methods works only with dbCalls + * + * @param array|null $data Data + * @param bool $returnSQL Set to true to return Query String + * + * @return mixed + */ + abstract protected function doReplace(?array $data = null, bool $returnSQL = false); + + /** + * Grabs the last error(s) that occurred from the Database connection. + * This methods works only with dbCalls + * + * @return array|null + */ + abstract protected function doErrors(); + + /** + * Returns the id value for the data array or object + * + * @param array|object $data Data + * + * @return array|int|string|null + * + * @deprecated Add an override on getIdValue() instead. Will be removed in version 5.0. + */ + abstract protected function idValue($data); + + /** + * Public getter to return the id value using the idValue() method + * For example with SQL this will return $data->$this->primaryKey + * + * @param array|object $data + * + * @return array|int|string|null + * + * @todo: Make abstract in version 5.0 + */ + public function getIdValue($data) + { + return $this->idValue($data); + } + + /** + * Override countAllResults to account for soft deleted accounts. + * This methods works only with dbCalls + * + * @param bool $reset Reset + * @param bool $test Test + * + * @return mixed + */ + abstract public function countAllResults(bool $reset = true, bool $test = false); + + /** + * Loops over records in batches, allowing you to operate on them. + * This methods works only with dbCalls + * + * @param int $size Size + * @param Closure $userFunc Callback Function + * + * @throws DataException + */ + abstract public function chunk(int $size, Closure $userFunc); + + /** + * Fetches the row of database + * + * @param array|int|string|null $id One primary key or an array of primary keys + * + * @return array|object|null The resulting row of data, or null. + */ + public function find($id = null) + { + $singleton = is_numeric($id) || is_string($id); + + if ($this->tempAllowCallbacks) { + // Call the before event and check for a return + $eventData = $this->trigger('beforeFind', [ + 'id' => $id, + 'method' => 'find', + 'singleton' => $singleton, + ]); + + if (! empty($eventData['returnData'])) { + return $eventData['data']; + } + } + + $eventData = [ + 'id' => $id, + 'data' => $this->doFind($singleton, $id), + 'method' => 'find', + 'singleton' => $singleton, + ]; + + if ($this->tempAllowCallbacks) { + $eventData = $this->trigger('afterFind', $eventData); + } + + $this->tempReturnType = $this->returnType; + $this->tempUseSoftDeletes = $this->useSoftDeletes; + $this->tempAllowCallbacks = $this->allowCallbacks; + + return $eventData['data']; + } + + /** + * Fetches the column of database + * + * @param string $columnName Column Name + * + * @throws DataException + * + * @return array|null The resulting row of data, or null if no data found. + */ + public function findColumn(string $columnName) + { + if (strpos($columnName, ',') !== false) { + throw DataException::forFindColumnHaveMultipleColumns(); + } + + $resultSet = $this->doFindColumn($columnName); + + return $resultSet ? array_column($resultSet, $columnName) : null; + } + + /** + * Fetches all results, while optionally limiting them. + * + * @param int $limit Limit + * @param int $offset Offset + * + * @return array + */ + public function findAll(int $limit = 0, int $offset = 0) + { + if ($this->tempAllowCallbacks) { + // Call the before event and check for a return + $eventData = $this->trigger('beforeFind', [ + 'method' => 'findAll', + 'limit' => $limit, + 'offset' => $offset, + 'singleton' => false, + ]); + + if (! empty($eventData['returnData'])) { + return $eventData['data']; + } + } + + $eventData = [ + 'data' => $this->doFindAll($limit, $offset), + 'limit' => $limit, + 'offset' => $offset, + 'method' => 'findAll', + 'singleton' => false, + ]; + + if ($this->tempAllowCallbacks) { + $eventData = $this->trigger('afterFind', $eventData); + } + + $this->tempReturnType = $this->returnType; + $this->tempUseSoftDeletes = $this->useSoftDeletes; + $this->tempAllowCallbacks = $this->allowCallbacks; + + return $eventData['data']; + } + + /** + * Returns the first row of the result set. + * + * @return array|object|null + */ + public function first() + { + if ($this->tempAllowCallbacks) { + // Call the before event and check for a return + $eventData = $this->trigger('beforeFind', [ + 'method' => 'first', + 'singleton' => true, + ]); + + if (! empty($eventData['returnData'])) { + return $eventData['data']; + } + } + + $eventData = [ + 'data' => $this->doFirst(), + 'method' => 'first', + 'singleton' => true, + ]; + + if ($this->tempAllowCallbacks) { + $eventData = $this->trigger('afterFind', $eventData); + } + + $this->tempReturnType = $this->returnType; + $this->tempUseSoftDeletes = $this->useSoftDeletes; + $this->tempAllowCallbacks = $this->allowCallbacks; + + return $eventData['data']; + } + + /** + * A convenience method that will attempt to determine whether the + * data should be inserted or updated. Will work with either + * an array or object. When using with custom class objects, + * you must ensure that the class will provide access to the class + * variables, even if through a magic method. + * + * @param array|object $data Data + * + * @throws ReflectionException + */ + public function save($data): bool + { + if (empty($data)) { + return true; + } + + if ($this->shouldUpdate($data)) { + $response = $this->update($this->getIdValue($data), $data); + } else { + $response = $this->insert($data, false); + + if ($response !== false) { + $response = true; + } + } + + return $response; + } + + /** + * This method is called on save to determine if entry have to be updated + * If this method return false insert operation will be executed + * + * @param array|object $data Data + */ + protected function shouldUpdate($data): bool + { + return ! empty($this->getIdValue($data)); + } + + /** + * Returns last insert ID or 0. + * + * @return int|string + */ + public function getInsertID() + { + return is_numeric($this->insertID) ? (int) $this->insertID : $this->insertID; + } + + /** + * Inserts data into the database. If an object is provided, + * it will attempt to convert it to an array. + * + * @param array|object|null $data Data + * @param bool $returnID Whether insert ID should be returned or not. + * + * @throws ReflectionException + * + * @return bool|int|string + */ + public function insert($data = null, bool $returnID = true) + { + $this->insertID = 0; + + $data = $this->transformDataToArray($data, 'insert'); + + // Validate data before saving. + if (! $this->skipValidation && ! $this->cleanRules()->validate($data)) { + return false; + } + + // Must be called first so we don't + // strip out created_at values. + $data = $this->doProtectFields($data); + + // doProtectFields() can further remove elements from + // $data so we need to check for empty dataset again + if (empty($data)) { + throw DataException::forEmptyDataset('insert'); + } + + // Set created_at and updated_at with same time + $date = $this->setDate(); + + if ($this->useTimestamps && $this->createdField && ! array_key_exists($this->createdField, $data)) { + $data[$this->createdField] = $date; + } + + if ($this->useTimestamps && $this->updatedField && ! array_key_exists($this->updatedField, $data)) { + $data[$this->updatedField] = $date; + } + + $eventData = ['data' => $data]; + + if ($this->tempAllowCallbacks) { + $eventData = $this->trigger('beforeInsert', $eventData); + } + + $result = $this->doInsert($eventData['data']); + + $eventData = [ + 'id' => $this->insertID, + 'data' => $eventData['data'], + 'result' => $result, + ]; + + if ($this->tempAllowCallbacks) { + // Trigger afterInsert events with the inserted data and new ID + $this->trigger('afterInsert', $eventData); + } + + $this->tempAllowCallbacks = $this->allowCallbacks; + + // If insertion failed, get out of here + if (! $result) { + return $result; + } + + // otherwise return the insertID, if requested. + return $returnID ? $this->insertID : $result; + } + + /** + * Compiles batch insert runs the queries, validating each row prior. + * + * @param array|null $set an associative array of insert values + * @param bool|null $escape Whether to escape values + * @param int $batchSize The size of the batch to run + * @param bool $testing True means only number of records is returned, false will execute the query + * + * @throws ReflectionException + * + * @return bool|int Number of rows inserted or FALSE on failure + */ + public function insertBatch(?array $set = null, ?bool $escape = null, int $batchSize = 100, bool $testing = false) + { + if (is_array($set)) { + foreach ($set as &$row) { + // If $data is using a custom class with public or protected + // properties representing the collection elements, we need to grab + // them as an array. + if (is_object($row) && ! $row instanceof stdClass) { + $row = $this->objectToArray($row, false, true); + } + + // If it's still a stdClass, go ahead and convert to + // an array so doProtectFields and other model methods + // don't have to do special checks. + if (is_object($row)) { + $row = (array) $row; + } + + // Validate every row.. + if (! $this->skipValidation && ! $this->cleanRules()->validate($row)) { + return false; + } + + // Must be called first so we don't + // strip out created_at values. + $row = $this->doProtectFields($row); + + // Set created_at and updated_at with same time + $date = $this->setDate(); + + if ($this->useTimestamps && $this->createdField && ! array_key_exists($this->createdField, $row)) { + $row[$this->createdField] = $date; + } + + if ($this->useTimestamps && $this->updatedField && ! array_key_exists($this->updatedField, $row)) { + $row[$this->updatedField] = $date; + } + } + } + + return $this->doInsertBatch($set, $escape, $batchSize, $testing); + } + + /** + * Updates a single record in the database. If an object is provided, + * it will attempt to convert it into an array. + * + * @param array|int|string|null $id + * @param array|object|null $data + * + * @throws ReflectionException + */ + public function update($id = null, $data = null): bool + { + if (is_numeric($id) || is_string($id)) { + $id = [$id]; + } + + $data = $this->transformDataToArray($data, 'update'); + + // Validate data before saving. + if (! $this->skipValidation && ! $this->cleanRules(true)->validate($data)) { + return false; + } + + // Must be called first so we don't + // strip out updated_at values. + $data = $this->doProtectFields($data); + + // doProtectFields() can further remove elements from + // $data so we need to check for empty dataset again + if (empty($data)) { + throw DataException::forEmptyDataset('update'); + } + + if ($this->useTimestamps && $this->updatedField && ! array_key_exists($this->updatedField, $data)) { + $data[$this->updatedField] = $this->setDate(); + } + + $eventData = [ + 'id' => $id, + 'data' => $data, + ]; + + if ($this->tempAllowCallbacks) { + $eventData = $this->trigger('beforeUpdate', $eventData); + } + + $eventData = [ + 'id' => $id, + 'data' => $eventData['data'], + 'result' => $this->doUpdate($id, $eventData['data']), + ]; + + if ($this->tempAllowCallbacks) { + $this->trigger('afterUpdate', $eventData); + } + + $this->tempAllowCallbacks = $this->allowCallbacks; + + return $eventData['result']; + } + + /** + * Compiles an update and runs the query + * + * @param array|null $set An associative array of update values + * @param string|null $index The where key + * @param int $batchSize The size of the batch to run + * @param bool $returnSQL True means SQL is returned, false will execute the query + * + * @throws DatabaseException + * @throws ReflectionException + * + * @return mixed Number of rows affected or FALSE on failure + */ + public function updateBatch(?array $set = null, ?string $index = null, int $batchSize = 100, bool $returnSQL = false) + { + if (is_array($set)) { + foreach ($set as &$row) { + // If $data is using a custom class with public or protected + // properties representing the collection elements, we need to grab + // them as an array. + if (is_object($row) && ! $row instanceof stdClass) { + $row = $this->objectToArray($row, true, true); + } + + // If it's still a stdClass, go ahead and convert to + // an array so doProtectFields and other model methods + // don't have to do special checks. + if (is_object($row)) { + $row = (array) $row; + } + + // Validate data before saving. + if (! $this->skipValidation && ! $this->cleanRules(true)->validate($row)) { + return false; + } + + // Save updateIndex for later + $updateIndex = $row[$index] ?? null; + + // Must be called first so we don't + // strip out updated_at values. + $row = $this->doProtectFields($row); + + // Restore updateIndex value in case it was wiped out + if ($updateIndex !== null) { + $row[$index] = $updateIndex; + } + + if ($this->useTimestamps && $this->updatedField && ! array_key_exists($this->updatedField, $row)) { + $row[$this->updatedField] = $this->setDate(); + } + } + } + + return $this->doUpdateBatch($set, $index, $batchSize, $returnSQL); + } + + /** + * Deletes a single record from the database where $id matches + * + * @param array|int|string|null $id The rows primary key(s) + * @param bool $purge Allows overriding the soft deletes setting. + * + * @throws DatabaseException + * + * @return BaseResult|bool + */ + public function delete($id = null, bool $purge = false) + { + if ($id && (is_numeric($id) || is_string($id))) { + $id = [$id]; + } + + $eventData = [ + 'id' => $id, + 'purge' => $purge, + ]; + + if ($this->tempAllowCallbacks) { + $this->trigger('beforeDelete', $eventData); + } + + $eventData = [ + 'id' => $id, + 'data' => null, + 'purge' => $purge, + 'result' => $this->doDelete($id, $purge), + ]; + + if ($this->tempAllowCallbacks) { + $this->trigger('afterDelete', $eventData); + } + + $this->tempAllowCallbacks = $this->allowCallbacks; + + return $eventData['result']; + } + + /** + * Permanently deletes all rows that have been marked as deleted + * through soft deletes (deleted = 1) + * + * @return mixed + */ + public function purgeDeleted() + { + if (! $this->useSoftDeletes) { + return true; + } + + return $this->doPurgeDeleted(); + } + + /** + * Sets $useSoftDeletes value so that we can temporarily override + * the soft deletes settings. Can be used for all find* methods. + * + * @param bool $val Value + * + * @return $this + */ + public function withDeleted(bool $val = true) + { + $this->tempUseSoftDeletes = ! $val; + + return $this; + } + + /** + * Works with the find* methods to return only the rows that + * have been deleted. + * + * @return $this + */ + public function onlyDeleted() + { + $this->tempUseSoftDeletes = false; + $this->doOnlyDeleted(); + + return $this; + } + + /** + * Compiles a replace and runs the query + * + * @param array|null $data Data + * @param bool $returnSQL Set to true to return Query String + * + * @return mixed + */ + public function replace(?array $data = null, bool $returnSQL = false) + { + // Validate data before saving. + if ($data && ! $this->skipValidation && ! $this->cleanRules(true)->validate($data)) { + return false; + } + + if ($this->useTimestamps && $this->updatedField && ! array_key_exists($this->updatedField, (array) $data)) { + $data[$this->updatedField] = $this->setDate(); + } + + return $this->doReplace($data, $returnSQL); + } + + /** + * Grabs the last error(s) that occurred. If data was validated, + * it will first check for errors there, otherwise will try to + * grab the last error from the Database connection. + * The return array should be in the following format: + * ['source' => 'message'] + * + * @param bool $forceDB Always grab the db error, not validation + * + * @return array + */ + public function errors(bool $forceDB = false) + { + // Do we have validation errors? + if (! $forceDB && ! $this->skipValidation && ($errors = $this->validation->getErrors())) { + return $errors; + } + + return $this->doErrors(); + } + + /** + * Works with Pager to get the size and offset parameters. + * Expects a GET variable (?page=2) that specifies the page of results + * to display. + * + * @param int|null $perPage Items per page + * @param string $group Will be used by the pagination library to identify a unique pagination set. + * @param int|null $page Optional page number (useful when the page number is provided in different way) + * @param int $segment Optional URI segment number (if page number is provided by URI segment) + * + * @return array|null + */ + public function paginate(?int $perPage = null, string $group = 'default', ?int $page = null, int $segment = 0) + { + $pager = Services::pager(null, null, false); + + if ($segment) { + $pager->setSegment($segment); + } + + $page = $page >= 1 ? $page : $pager->getCurrentPage($group); + // Store it in the Pager library, so it can be paginated in the views. + $this->pager = $pager->store($group, $page, $perPage, $this->countAllResults(false), $segment); + $perPage = $this->pager->getPerPage($group); + $offset = ($pager->getCurrentPage($group) - 1) * $perPage; + + return $this->findAll($perPage, $offset); + } + + /** + * It could be used when you have to change default or override current allowed fields. + * + * @param array $allowedFields Array with names of fields + * + * @return $this + */ + public function setAllowedFields(array $allowedFields) + { + $this->allowedFields = $allowedFields; + + return $this; + } + + /** + * Sets whether or not we should whitelist data set during + * updates or inserts against $this->availableFields. + * + * @param bool $protect Value + * + * @return $this + */ + public function protect(bool $protect = true) + { + $this->protectFields = $protect; + + return $this; + } + + /** + * Ensures that only the fields that are allowed to be updated + * are in the data array. + * + * Used by insert() and update() to protect against mass assignment + * vulnerabilities. + * + * @param array $data Data + * + * @throws DataException + */ + protected function doProtectFields(array $data): array + { + if (! $this->protectFields) { + return $data; + } + + if (empty($this->allowedFields)) { + throw DataException::forInvalidAllowedFields(static::class); + } + + foreach (array_keys($data) as $key) { + if (! in_array($key, $this->allowedFields, true)) { + unset($data[$key]); + } + } + + return $data; + } + + /** + * Sets the date or current date if null value is passed + * + * @param int|null $userData An optional PHP timestamp to be converted. + * + * @throws ModelException + * + * @return mixed + */ + protected function setDate(?int $userData = null) + { + $currentDate = $userData ?? time(); + + return $this->intToDate($currentDate); + } + + /** + * A utility function to allow child models to use the type of + * date/time format that they prefer. This is primarily used for + * setting created_at, updated_at and deleted_at values, but can be + * used by inheriting classes. + * + * The available time formats are: + * - 'int' - Stores the date as an integer timestamp + * - 'datetime' - Stores the data in the SQL datetime format + * - 'date' - Stores the date (only) in the SQL date format. + * + * @param int $value value + * + * @throws ModelException + * + * @return int|string + */ + protected function intToDate(int $value) + { + switch ($this->dateFormat) { + case 'int': + return $value; + + case 'datetime': + return date('Y-m-d H:i:s', $value); + + case 'date': + return date('Y-m-d', $value); + + default: + throw ModelException::forNoDateFormat(static::class); + } + } + + /** + * Converts Time value to string using $this->dateFormat + * + * The available time formats are: + * - 'int' - Stores the date as an integer timestamp + * - 'datetime' - Stores the data in the SQL datetime format + * - 'date' - Stores the date (only) in the SQL date format. + * + * @param Time $value value + * + * @return int|string + */ + protected function timeToDate(Time $value) + { + switch ($this->dateFormat) { + case 'datetime': + return $value->format('Y-m-d H:i:s'); + + case 'date': + return $value->format('Y-m-d'); + + case 'int': + return $value->getTimestamp(); + + default: + return (string) $value; + } + } + + /** + * Set the value of the skipValidation flag. + * + * @param bool $skip Value + * + * @return $this + */ + public function skipValidation(bool $skip = true) + { + $this->skipValidation = $skip; + + return $this; + } + + /** + * Allows to set validation messages. + * It could be used when you have to change default or override current validate messages. + * + * @param array $validationMessages Value + * + * @return $this + */ + public function setValidationMessages(array $validationMessages) + { + $this->validationMessages = $validationMessages; + + return $this; + } + + /** + * Allows to set field wise validation message. + * It could be used when you have to change default or override current validate messages. + * + * @param string $field Field Name + * @param array $fieldMessages Validation messages + * + * @return $this + */ + public function setValidationMessage(string $field, array $fieldMessages) + { + $this->validationMessages[$field] = $fieldMessages; + + return $this; + } + + /** + * Allows to set validation rules. + * It could be used when you have to change default or override current validate rules. + * + * @param array $validationRules Value + * + * @return $this + */ + public function setValidationRules(array $validationRules) + { + $this->validationRules = $validationRules; + + return $this; + } + + /** + * Allows to set field wise validation rules. + * It could be used when you have to change default or override current validate rules. + * + * @param string $field Field Name + * @param array|string $fieldRules Validation rules + * + * @return $this + */ + public function setValidationRule(string $field, $fieldRules) + { + $this->validationRules[$field] = $fieldRules; + + return $this; + } + + /** + * Should validation rules be removed before saving? + * Most handy when doing updates. + * + * @param bool $choice Value + * + * @return $this + */ + public function cleanRules(bool $choice = false) + { + $this->cleanValidationRules = $choice; + + return $this; + } + + /** + * Validate the data against the validation rules (or the validation group) + * specified in the class property, $validationRules. + * + * @param array|object $data Data + */ + public function validate($data): bool + { + $rules = $this->getValidationRules(); + + if ($this->skipValidation || empty($rules) || empty($data)) { + return true; + } + + // Validation requires array, so cast away. + if (is_object($data)) { + $data = (array) $data; + } + + $rules = $this->cleanValidationRules ? $this->cleanValidationRules($rules, $data) : $rules; + + // If no data existed that needs validation + // our job is done here. + if (empty($rules)) { + return true; + } + + return $this->validation->setRules($rules, $this->validationMessages)->run($data, null, $this->DBGroup); + } + + /** + * Returns the model's defined validation rules so that they + * can be used elsewhere, if needed. + * + * @param array $options Options + */ + public function getValidationRules(array $options = []): array + { + $rules = $this->validationRules; + + // ValidationRules can be either a string, which is the group name, + // or an array of rules. + if (is_string($rules)) { + $rules = $this->validation->loadRuleGroup($rules); + } + + if (isset($options['except'])) { + $rules = array_diff_key($rules, array_flip($options['except'])); + } elseif (isset($options['only'])) { + $rules = array_intersect_key($rules, array_flip($options['only'])); + } + + return $rules; + } + + /** + * Returns the model's define validation messages so they + * can be used elsewhere, if needed. + */ + public function getValidationMessages(): array + { + return $this->validationMessages; + } + + /** + * Removes any rules that apply to fields that have not been set + * currently so that rules don't block updating when only updating + * a partial row. + * + * @param array $rules Array containing field name and rule + * @param array|null $data Data + */ + protected function cleanValidationRules(array $rules, ?array $data = null): array + { + if (empty($data)) { + return []; + } + + foreach (array_keys($rules) as $field) { + if (! array_key_exists($field, $data)) { + unset($rules[$field]); + } + } + + return $rules; + } + + /** + * Sets $tempAllowCallbacks value so that we can temporarily override + * the setting. Resets after the next method that uses triggers. + * + * @param bool $val value + * + * @return $this + */ + public function allowCallbacks(bool $val = true) + { + $this->tempAllowCallbacks = $val; + + return $this; + } + + /** + * A simple event trigger for Model Events that allows additional + * data manipulation within the model. Specifically intended for + * usage by child models this can be used to format data, + * save/load related classes, etc. + * + * It is the responsibility of the callback methods to return + * the data itself. + * + * Each $eventData array MUST have a 'data' key with the relevant + * data for callback methods (like an array of key/value pairs to insert + * or update, an array of results, etc) + * + * If callbacks are not allowed then returns $eventData immediately. + * + * @param string $event Event + * @param array $eventData Event Data + * + * @throws DataException + * + * @return mixed + */ + protected function trigger(string $event, array $eventData) + { + // Ensure it's a valid event + if (! isset($this->{$event}) || empty($this->{$event})) { + return $eventData; + } + + foreach ($this->{$event} as $callback) { + if (! method_exists($this, $callback)) { + throw DataException::forInvalidMethodTriggered($callback); + } + + $eventData = $this->{$callback}($eventData); + } + + return $eventData; + } + + /** + * Sets the return type of the results to be as an associative array. + * + * @return $this + */ + public function asArray() + { + $this->tempReturnType = 'array'; + + return $this; + } + + /** + * Sets the return type to be of the specified type of object. + * Defaults to a simple object, but can be any class that has + * class vars with the same name as the collection columns, + * or at least allows them to be created. + * + * @param string $class Class Name + * + * @return $this + */ + public function asObject(string $class = 'object') + { + $this->tempReturnType = $class; + + return $this; + } + + /** + * Takes a class an returns an array of it's public and protected + * properties as an array suitable for use in creates and updates. + * This method use objectToRawArray internally and does conversion + * to string on all Time instances + * + * @param object|string $data Data + * @param bool $onlyChanged Only Changed Property + * @param bool $recursive If true, inner entities will be casted as array as well + * + * @throws ReflectionException + * + * @return array Array + */ + protected function objectToArray($data, bool $onlyChanged = true, bool $recursive = false): array + { + $properties = $this->objectToRawArray($data, $onlyChanged, $recursive); + + // Convert any Time instances to appropriate $dateFormat + if ($properties) { + $properties = array_map(function ($value) { + if ($value instanceof Time) { + return $this->timeToDate($value); + } + + return $value; + }, $properties); + } + + return $properties; + } + + /** + * Takes a class an returns an array of it's public and protected + * properties as an array with raw values. + * + * @param object|string $data Data + * @param bool $onlyChanged Only Changed Property + * @param bool $recursive If true, inner entities will be casted as array as well + * + * @throws ReflectionException + * + * @return array|null Array + */ + protected function objectToRawArray($data, bool $onlyChanged = true, bool $recursive = false): ?array + { + if (method_exists($data, 'toRawArray')) { + $properties = $data->toRawArray($onlyChanged, $recursive); + } else { + $mirror = new ReflectionClass($data); + $props = $mirror->getProperties(ReflectionProperty::IS_PUBLIC | ReflectionProperty::IS_PROTECTED); + + $properties = []; + + // Loop over each property, + // saving the name/value in a new array we can return. + foreach ($props as $prop) { + // Must make protected values accessible. + $prop->setAccessible(true); + $properties[$prop->getName()] = $prop->getValue($data); + } + } + + return $properties; + } + + /** + * Transform data to array + * + * @param array|object|null $data Data + * @param string $type Type of data (insert|update) + * + * @throws DataException + * @throws InvalidArgumentException + * @throws ReflectionException + */ + protected function transformDataToArray($data, string $type): array + { + if (! in_array($type, ['insert', 'update'], true)) { + throw new InvalidArgumentException(sprintf('Invalid type "%s" used upon transforming data to array.', $type)); + } + + if (empty($data)) { + throw DataException::forEmptyDataset($type); + } + + // If $data is using a custom class with public or protected + // properties representing the collection elements, we need to grab + // them as an array. + if (is_object($data) && ! $data instanceof stdClass) { + $data = $this->objectToArray($data, ($type === 'update'), true); + } + + // If it's still a stdClass, go ahead and convert to + // an array so doProtectFields and other model methods + // don't have to do special checks. + if (is_object($data)) { + $data = (array) $data; + } + + // If it's still empty here, means $data is no change or is empty object + if (empty($data)) { + throw DataException::forEmptyDataset($type); + } + + return $data; + } + + /** + * Provides the db connection and model's properties. + * + * @param string $name Name + * + * @return mixed + */ + public function __get(string $name) + { + if (property_exists($this, $name)) { + return $this->{$name}; + } + + return $this->db->{$name} ?? null; + } + + /** + * Checks for the existence of properties across this model, and db connection. + * + * @param string $name Name + */ + public function __isset(string $name): bool + { + if (property_exists($this, $name)) { + return true; + } + + return isset($this->db->{$name}); + } + + /** + * Provides direct access to method in the database connection. + * + * @param string $name Name + * @param array $params Params + * + * @return $this|null + */ + public function __call(string $name, array $params) + { + if (method_exists($this->db, $name)) { + return $this->db->{$name}(...$params); + } + + return null; + } + + /** + * Replace any placeholders within the rules with the values that + * match the 'key' of any properties being set. For example, if + * we had the following $data array: + * + * [ 'id' => 13 ] + * + * and the following rule: + * + * 'required|is_unique[users,email,id,{id}]' + * + * The value of {id} would be replaced with the actual id in the form data: + * + * 'required|is_unique[users,email,id,13]' + * + * @param array $rules Validation rules + * @param array $data Data + * + * @codeCoverageIgnore + * + * @deprecated use fillPlaceholders($rules, $data) from Validation instead + */ + protected function fillPlaceholders(array $rules, array $data): array + { + $replacements = []; + + foreach ($data as $key => $value) { + $replacements['{' . $key . '}'] = $value; + } + + if (! empty($replacements)) { + foreach ($rules as &$rule) { + if (is_array($rule)) { + foreach ($rule as &$row) { + // Should only be an `errors` array + // which doesn't take placeholders. + if (is_array($row)) { + continue; + } + + $row = strtr($row, $replacements); + } + + continue; + } + + $rule = strtr($rule, $replacements); + } + } + + return $rules; + } +} diff --git a/system/CLI/BaseCommand.php b/system/CLI/BaseCommand.php new file mode 100644 index 0000000..8f843c4 --- /dev/null +++ b/system/CLI/BaseCommand.php @@ -0,0 +1,219 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\CLI; + +use Psr\Log\LoggerInterface; +use ReflectionException; +use Throwable; + +/** + * BaseCommand is the base class used in creating CLI commands. + * + * @property array $arguments + * @property Commands $commands + * @property string $description + * @property string $group + * @property LoggerInterface $logger + * @property string $name + * @property array $options + * @property string $usage + */ +abstract class BaseCommand +{ + /** + * The group the command is lumped under + * when listing commands. + * + * @var string + */ + protected $group; + + /** + * The Command's name + * + * @var string + */ + protected $name; + + /** + * the Command's usage description + * + * @var string + */ + protected $usage; + + /** + * the Command's short description + * + * @var string + */ + protected $description; + + /** + * the Command's options description + * + * @var array + */ + protected $options = []; + + /** + * the Command's Arguments description + * + * @var array + */ + protected $arguments = []; + + /** + * The Logger to use for a command + * + * @var LoggerInterface + */ + protected $logger; + + /** + * Instance of Commands so + * commands can call other commands. + * + * @var Commands + */ + protected $commands; + + public function __construct(LoggerInterface $logger, Commands $commands) + { + $this->logger = $logger; + $this->commands = $commands; + } + + /** + * Actually execute a command. + * + * @param array $params + */ + abstract public function run(array $params); + + /** + * Can be used by a command to run other commands. + * + * @throws ReflectionException + * + * @return mixed + */ + protected function call(string $command, array $params = []) + { + return $this->commands->run($command, $params); + } + + /** + * A simple method to display an error with line/file, in child commands. + */ + protected function showError(Throwable $e) + { + $exception = $e; + $message = $e->getMessage(); + + require APPPATH . 'Views/errors/cli/error_exception.php'; + } + + /** + * Show Help includes (Usage, Arguments, Description, Options). + */ + public function showHelp() + { + CLI::write(lang('CLI.helpUsage'), 'yellow'); + + if (! empty($this->usage)) { + $usage = $this->usage; + } else { + $usage = $this->name; + + if (! empty($this->arguments)) { + $usage .= ' [arguments]'; + } + } + + CLI::write($this->setPad($usage, 0, 0, 2)); + + if (! empty($this->description)) { + CLI::newLine(); + CLI::write(lang('CLI.helpDescription'), 'yellow'); + CLI::write($this->setPad($this->description, 0, 0, 2)); + } + + if (! empty($this->arguments)) { + CLI::newLine(); + CLI::write(lang('CLI.helpArguments'), 'yellow'); + $length = max(array_map('strlen', array_keys($this->arguments))); + + foreach ($this->arguments as $argument => $description) { + CLI::write(CLI::color($this->setPad($argument, $length, 2, 2), 'green') . $description); + } + } + + if (! empty($this->options)) { + CLI::newLine(); + CLI::write(lang('CLI.helpOptions'), 'yellow'); + $length = max(array_map('strlen', array_keys($this->options))); + + foreach ($this->options as $option => $description) { + CLI::write(CLI::color($this->setPad($option, $length, 2, 2), 'green') . $description); + } + } + } + + /** + * Pads our string out so that all titles are the same length to nicely line up descriptions. + * + * @param int $extra How many extra spaces to add at the end + */ + public function setPad(string $item, int $max, int $extra = 2, int $indent = 0): string + { + $max += $extra + $indent; + + return str_pad(str_repeat(' ', $indent) . $item, $max); + } + + /** + * Get pad for $key => $value array output + * + * @deprecated Use setPad() instead. + * + * @codeCoverageIgnore + */ + public function getPad(array $array, int $pad): int + { + $max = 0; + + foreach (array_keys($array) as $key) { + $max = max($max, strlen($key)); + } + + return $max + $pad; + } + + /** + * Makes it simple to access our protected properties. + * + * @return mixed + */ + public function __get(string $key) + { + return $this->{$key} ?? null; + } + + /** + * Makes it simple to check our protected properties. + */ + public function __isset(string $key): bool + { + return isset($this->{$key}); + } +} diff --git a/system/CLI/CLI.php b/system/CLI/CLI.php new file mode 100644 index 0000000..347a894 --- /dev/null +++ b/system/CLI/CLI.php @@ -0,0 +1,1000 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\CLI; + +use CodeIgniter\CLI\Exceptions\CLIException; +use Config\Services; +use InvalidArgumentException; +use Throwable; + +/** + * Set of static methods useful for CLI request handling. + * + * Portions of this code were initially from the FuelPHP Framework, + * version 1.7.x, and used here under the MIT license they were + * originally made available under. Reference: http://fuelphp.com + * + * Some of the code in this class is Windows-specific, and not + * possible to test using travis-ci. It has been phpunit-annotated + * to prevent messing up code coverage. + * + * Some of the methods require keyboard input, and are not unit-testable + * as a result: input() and prompt(). + * validate() is internal, and not testable if prompt() isn't. + * The wait() method is mostly testable, as long as you don't give it + * an argument of "0". + * These have been flagged to ignore for code coverage purposes. + */ +class CLI +{ + /** + * Is the readline library on the system? + * + * @var bool + */ + public static $readline_support = false; + + /** + * The message displayed at prompts. + * + * @var string + */ + public static $wait_msg = 'Press any key to continue...'; + + /** + * Has the class already been initialized? + * + * @var bool + */ + protected static $initialized = false; + + /** + * Foreground color list + * + * @var array + */ + protected static $foreground_colors = [ + 'black' => '0;30', + 'dark_gray' => '1;30', + 'blue' => '0;34', + 'dark_blue' => '0;34', + 'light_blue' => '1;34', + 'green' => '0;32', + 'light_green' => '1;32', + 'cyan' => '0;36', + 'light_cyan' => '1;36', + 'red' => '0;31', + 'light_red' => '1;31', + 'purple' => '0;35', + 'light_purple' => '1;35', + 'yellow' => '0;33', + 'light_yellow' => '1;33', + 'light_gray' => '0;37', + 'white' => '1;37', + ]; + + /** + * Background color list + * + * @var array + */ + protected static $background_colors = [ + 'black' => '40', + 'red' => '41', + 'green' => '42', + 'yellow' => '43', + 'blue' => '44', + 'magenta' => '45', + 'cyan' => '46', + 'light_gray' => '47', + ]; + + /** + * List of array segments. + * + * @var array + */ + protected static $segments = []; + + /** + * @var array + */ + protected static $options = []; + + /** + * Helps track internally whether the last + * output was a "write" or a "print" to + * keep the output clean and as expected. + * + * @var string|null + */ + protected static $lastWrite; + + /** + * Height of the CLI window + * + * @var int|null + */ + protected static $height; + + /** + * Width of the CLI window + * + * @var int|null + */ + protected static $width; + + /** + * Whether the current stream supports colored output. + * + * @var bool + */ + protected static $isColored = false; + + /** + * Static "constructor". + */ + public static function init() + { + if (is_cli()) { + // Readline is an extension for PHP that makes interactivity with PHP + // much more bash-like. + // http://www.php.net/manual/en/readline.installation.php + static::$readline_support = extension_loaded('readline'); + + // clear segments & options to keep testing clean + static::$segments = []; + static::$options = []; + + // Check our stream resource for color support + static::$isColored = static::hasColorSupport(STDOUT); + + static::parseCommandLine(); + + static::$initialized = true; + } else { + // If the command is being called from a controller + // we need to define STDOUT ourselves + define('STDOUT', 'php://output'); // @codeCoverageIgnore + } + } + + /** + * Get input from the shell, using readline or the standard STDIN + * + * Named options must be in the following formats: + * php index.php user -v --v -name=John --name=John + * + * @param string $prefix + * + * @codeCoverageIgnore + */ + public static function input(?string $prefix = null): string + { + if (static::$readline_support) { + return readline($prefix); + } + + echo $prefix; + + return fgets(STDIN); + } + + /** + * Asks the user for input. + * + * Usage: + * + * // Takes any input + * $color = CLI::prompt('What is your favorite color?'); + * + * // Takes any input, but offers default + * $color = CLI::prompt('What is your favourite color?', 'white'); + * + * // Will validate options with the in_list rule and accept only if one of the list + * $color = CLI::prompt('What is your favourite color?', array('red','blue')); + * + * // Do not provide options but requires a valid email + * $email = CLI::prompt('What is your email?', null, 'required|valid_email'); + * + * @param string $field Output "field" question + * @param array|string $options String to a default value, array to a list of options (the first option will be the default value) + * @param array|string $validation Validation rules + * + * @return string The user input + * + * @codeCoverageIgnore + */ + public static function prompt(string $field, $options = null, $validation = null): string + { + $extraOutput = ''; + $default = ''; + + if ($validation && ! is_array($validation) && ! is_string($validation)) { + throw new InvalidArgumentException('$rules can only be of type string|array'); + } + + if (! is_array($validation)) { + $validation = $validation ? explode('|', $validation) : []; + } + + if (is_string($options)) { + $extraOutput = ' [' . static::color($options, 'green') . ']'; + $default = $options; + } + + if (is_array($options) && $options) { + $opts = $options; + $extraOutputDefault = static::color($opts[0], 'green'); + + unset($opts[0]); + + if (empty($opts)) { + $extraOutput = $extraOutputDefault; + } else { + $extraOutput = '[' . $extraOutputDefault . ', ' . implode(', ', $opts) . ']'; + $validation[] = 'in_list[' . implode(', ', $options) . ']'; + } + + $default = $options[0]; + } + + static::fwrite(STDOUT, $field . (trim($field) ? ' ' : '') . $extraOutput . ': '); + + // Read the input from keyboard. + $input = trim(static::input()) ?: $default; + + if ($validation) { + while (! static::validate(trim($field), $input, $validation)) { + $input = static::prompt($field, $options, $validation); + } + } + + return $input; + } + + /** + * prompt(), but based on the option's key + * + * @param array|string $text Output "field" text or an one or two value array where the first value is the text before listing the options + * and the second value the text before asking to select one option. Provide empty string to omit + * @param array $options A list of options (array(key => description)), the first option will be the default value + * @param array|string|null $validation Validation rules + * + * @return string The selected key of $options + * + * @codeCoverageIgnore + */ + public static function promptByKey($text, array $options, $validation = null): string + { + if (is_string($text)) { + $text = [$text]; + } elseif (! is_array($text)) { + throw new InvalidArgumentException('$text can only be of type string|array'); + } + + if (! $options) { + throw new InvalidArgumentException('No options to select from were provided'); + } + + if ($line = array_shift($text)) { + CLI::write($line); + } + + // +2 for the square brackets around the key + $keyMaxLength = max(array_map('mb_strwidth', array_keys($options))) + 2; + + foreach ($options as $key => $description) { + $name = str_pad(' [' . $key . '] ', $keyMaxLength + 4, ' '); + CLI::write(CLI::color($name, 'green') . CLI::wrap($description, 125, $keyMaxLength + 4)); + } + + return static::prompt(PHP_EOL . array_shift($text), array_keys($options), $validation); + } + + /** + * Validate one prompt "field" at a time + * + * @param string $field Prompt "field" output + * @param string $value Input value + * @param array|string $rules Validation rules + * + * @codeCoverageIgnore + */ + protected static function validate(string $field, string $value, $rules): bool + { + $label = $field; + $field = 'temp'; + $validation = Services::validation(null, false); + $validation->setRules([ + $field => [ + 'label' => $label, + 'rules' => $rules, + ], + ]); + $validation->run([$field => $value]); + + if ($validation->hasError($field)) { + static::error($validation->getError($field)); + + return false; + } + + return true; + } + + /** + * Outputs a string to the CLI without any surrounding newlines. + * Useful for showing repeating elements on a single line. + */ + public static function print(string $text = '', ?string $foreground = null, ?string $background = null) + { + if ($foreground || $background) { + $text = static::color($text, $foreground, $background); + } + + static::$lastWrite = null; + + static::fwrite(STDOUT, $text); + } + + /** + * Outputs a string to the cli on it's own line. + */ + public static function write(string $text = '', ?string $foreground = null, ?string $background = null) + { + if ($foreground || $background) { + $text = static::color($text, $foreground, $background); + } + + if (static::$lastWrite !== 'write') { + $text = PHP_EOL . $text; + static::$lastWrite = 'write'; + } + + static::fwrite(STDOUT, $text . PHP_EOL); + } + + /** + * Outputs an error to the CLI using STDERR instead of STDOUT + */ + public static function error(string $text, string $foreground = 'light_red', ?string $background = null) + { + // Check color support for STDERR + $stdout = static::$isColored; + static::$isColored = static::hasColorSupport(STDERR); + + if ($foreground || $background) { + $text = static::color($text, $foreground, $background); + } + + static::fwrite(STDERR, $text . PHP_EOL); + + // return STDOUT color support + static::$isColored = $stdout; + } + + /** + * Beeps a certain number of times. + * + * @param int $num The number of times to beep + */ + public static function beep(int $num = 1) + { + echo str_repeat("\x07", $num); + } + + /** + * Waits a certain number of seconds, optionally showing a wait message and + * waiting for a key press. + * + * @param int $seconds Number of seconds + * @param bool $countdown Show a countdown or not + */ + public static function wait(int $seconds, bool $countdown = false) + { + if ($countdown === true) { + $time = $seconds; + + while ($time > 0) { + static::fwrite(STDOUT, $time . '... '); + sleep(1); + $time--; + } + + static::write(); + } elseif ($seconds > 0) { + sleep($seconds); + } else { + // this chunk cannot be tested because of keyboard input + // @codeCoverageIgnoreStart + static::write(static::$wait_msg); + static::input(); + // @codeCoverageIgnoreEnd + } + } + + /** + * if operating system === windows + */ + public static function isWindows(): bool + { + return PHP_OS_FAMILY === 'Windows'; + } + + /** + * Enter a number of empty lines + */ + public static function newLine(int $num = 1) + { + // Do it once or more, write with empty string gives us a new line + for ($i = 0; $i < $num; $i++) { + static::write(); + } + } + + /** + * Clears the screen of output + * + * @codeCoverageIgnore + */ + public static function clearScreen() + { + // Unix systems, and Windows with VT100 Terminal support (i.e. Win10) + // can handle CSI sequences. For lower than Win10 we just shove in 40 new lines. + static::isWindows() && ! static::streamSupports('sapi_windows_vt100_support', STDOUT) + ? static::newLine(40) + : static::fwrite(STDOUT, "\033[H\033[2J"); + } + + /** + * Returns the given text with the correct color codes for a foreground and + * optionally a background color. + * + * @param string $text The text to color + * @param string $foreground The foreground color + * @param string $background The background color + * @param string $format Other formatting to apply. Currently only 'underline' is understood + * + * @return string The color coded string + */ + public static function color(string $text, string $foreground, ?string $background = null, ?string $format = null): string + { + if (! static::$isColored) { + return $text; + } + + if (! array_key_exists($foreground, static::$foreground_colors)) { + throw CLIException::forInvalidColor('foreground', $foreground); + } + + if ($background !== null && ! array_key_exists($background, static::$background_colors)) { + throw CLIException::forInvalidColor('background', $background); + } + + $string = "\033[" . static::$foreground_colors[$foreground] . 'm'; + + if ($background !== null) { + $string .= "\033[" . static::$background_colors[$background] . 'm'; + } + + if ($format === 'underline') { + $string .= "\033[4m"; + } + + // Detect if color method was already in use with this text + if (strpos($text, "\033[0m") !== false) { + // Split the text into parts so that we can see + // if any part missing the color definition + $chunks = mb_split('\\033\\[0m', $text); + // Reset text + $text = ''; + + foreach ($chunks as $chunk) { + if ($chunk === '') { + continue; + } + + // If chunk doesn't have colors defined we need to add them + if (strpos($chunk, "\033[") === false) { + $chunk = static::color($chunk, $foreground, $background, $format); + // Add color reset before chunk and clear end of the string + $text .= rtrim("\033[0m" . $chunk, "\033[0m"); + } else { + $text .= $chunk; + } + } + } + + return $string . $text . "\033[0m"; + } + + /** + * Get the number of characters in string having encoded characters + * and ignores styles set by the color() function + */ + public static function strlen(?string $string): int + { + if ($string === null) { + return 0; + } + + foreach (static::$foreground_colors as $color) { + $string = strtr($string, ["\033[" . $color . 'm' => '']); + } + + foreach (static::$background_colors as $color) { + $string = strtr($string, ["\033[" . $color . 'm' => '']); + } + + $string = strtr($string, ["\033[4m" => '', "\033[0m" => '']); + + return mb_strwidth($string); + } + + /** + * Checks whether the current stream resource supports or + * refers to a valid terminal type device. + * + * @param resource $resource + */ + public static function streamSupports(string $function, $resource): bool + { + if (ENVIRONMENT === 'testing') { + // In the current setup of the tests we cannot fully check + // if the stream supports the function since we are using + // filtered streams. + return function_exists($function); + } + + return function_exists($function) && @$function($resource); // @codeCoverageIgnore + } + + /** + * Returns true if the stream resource supports colors. + * + * This is tricky on Windows, because Cygwin, Msys2 etc. emulate pseudo + * terminals via named pipes, so we can only check the environment. + * + * Reference: https://github.com/composer/xdebug-handler/blob/master/src/Process.php + * + * @param resource $resource + */ + public static function hasColorSupport($resource): bool + { + // Follow https://no-color.org/ + if (isset($_SERVER['NO_COLOR']) || getenv('NO_COLOR') !== false) { + return false; + } + + if (getenv('TERM_PROGRAM') === 'Hyper') { + return true; + } + + if (static::isWindows()) { + // @codeCoverageIgnoreStart + return static::streamSupports('sapi_windows_vt100_support', $resource) + || isset($_SERVER['ANSICON']) + || getenv('ANSICON') !== false + || getenv('ConEmuANSI') === 'ON' + || getenv('TERM') === 'xterm'; + // @codeCoverageIgnoreEnd + } + + return static::streamSupports('stream_isatty', $resource); + } + + /** + * Attempts to determine the width of the viewable CLI window. + */ + public static function getWidth(int $default = 80): int + { + if (static::$width === null) { + static::generateDimensions(); + } + + return static::$width ?: $default; + } + + /** + * Attempts to determine the height of the viewable CLI window. + */ + public static function getHeight(int $default = 32): int + { + if (static::$height === null) { + static::generateDimensions(); + } + + return static::$height ?: $default; + } + + /** + * Populates the CLI's dimensions. + * + * @codeCoverageIgnore + */ + public static function generateDimensions() + { + try { + if (static::isWindows()) { + // Shells such as `Cygwin` and `Git bash` returns incorrect values + // when executing `mode CON`, so we use `tput` instead + if (getenv('TERM') || (($shell = getenv('SHELL')) && preg_match('/(?:bash|zsh)(?:\.exe)?$/', $shell))) { + static::$height = (int) exec('tput lines'); + static::$width = (int) exec('tput cols'); + } else { + $return = -1; + $output = []; + exec('mode CON', $output, $return); + + // Look for the next lines ending in ": " + // Searching for "Columns:" or "Lines:" will fail on non-English locales + if ($return === 0 && $output && preg_match('/:\s*(\d+)\n[^:]+:\s*(\d+)\n/', implode("\n", $output), $matches)) { + static::$height = (int) $matches[1]; + static::$width = (int) $matches[2]; + } + } + } elseif (($size = exec('stty size')) && preg_match('/(\d+)\s+(\d+)/', $size, $matches)) { + static::$height = (int) $matches[1]; + static::$width = (int) $matches[2]; + } else { + static::$height = (int) exec('tput lines'); + static::$width = (int) exec('tput cols'); + } + } catch (Throwable $e) { + // Reset the dimensions so that the default values will be returned later. + // Then let the developer know of the error. + static::$height = null; + static::$width = null; + log_message('error', $e->getMessage()); + } + } + + /** + * Displays a progress bar on the CLI. You must call it repeatedly + * to update it. Set $thisStep = false to erase the progress bar. + * + * @param bool|int $thisStep + */ + public static function showProgress($thisStep = 1, int $totalSteps = 10) + { + static $inProgress = false; + + // restore cursor position when progress is continuing. + if ($inProgress !== false && $inProgress <= $thisStep) { + static::fwrite(STDOUT, "\033[1A"); + } + $inProgress = $thisStep; + + if ($thisStep !== false) { + // Don't allow div by zero or negative numbers.... + $thisStep = abs($thisStep); + $totalSteps = $totalSteps < 1 ? 1 : $totalSteps; + + $percent = (int) (($thisStep / $totalSteps) * 100); + $step = (int) round($percent / 10); + + // Write the progress bar + static::fwrite(STDOUT, "[\033[32m" . str_repeat('#', $step) . str_repeat('.', 10 - $step) . "\033[0m]"); + // Textual representation... + static::fwrite(STDOUT, sprintf(' %3d%% Complete', $percent) . PHP_EOL); + } else { + static::fwrite(STDOUT, "\007"); + } + } + + /** + * Takes a string and writes it to the command line, wrapping to a maximum + * width. If no maximum width is specified, will wrap to the window's max + * width. + * + * If an int is passed into $pad_left, then all strings after the first + * will padded with that many spaces to the left. Useful when printing + * short descriptions that need to start on an existing line. + */ + public static function wrap(?string $string = null, int $max = 0, int $padLeft = 0): string + { + if (empty($string)) { + return ''; + } + + if ($max === 0) { + $max = self::getWidth(); + } + + if (self::getWidth() < $max) { + $max = self::getWidth(); + } + + $max = $max - $padLeft; + + $lines = wordwrap($string, $max, PHP_EOL); + + if ($padLeft > 0) { + $lines = explode(PHP_EOL, $lines); + + $first = true; + + array_walk($lines, static function (&$line) use ($padLeft, &$first) { + if (! $first) { + $line = str_repeat(' ', $padLeft) . $line; + } else { + $first = false; + } + }); + + $lines = implode(PHP_EOL, $lines); + } + + return $lines; + } + + //-------------------------------------------------------------------- + // Command-Line 'URI' support + //-------------------------------------------------------------------- + + /** + * Parses the command line it was called from and collects all + * options and valid segments. + */ + protected static function parseCommandLine() + { + $args = $_SERVER['argv'] ?? []; + array_shift($args); // scrap invoking program + $optionValue = false; + + foreach ($args as $i => $arg) { + // If there's no "-" at the beginning, then + // this is probably an argument or an option value + if (mb_strpos($arg, '-') !== 0) { + if ($optionValue) { + // We have already included this in the previous + // iteration, so reset this flag + $optionValue = false; + } else { + // Yup, it's a segment + static::$segments[] = $arg; + } + + continue; + } + + $arg = ltrim($arg, '-'); + $value = null; + + if (isset($args[$i + 1]) && mb_strpos($args[$i + 1], '-') !== 0) { + $value = $args[$i + 1]; + $optionValue = true; + } + + static::$options[$arg] = $value; + } + } + + /** + * Returns the command line string portions of the arguments, minus + * any options, as a string. This is used to pass along to the main + * CodeIgniter application. + */ + public static function getURI(): string + { + return implode('/', static::$segments); + } + + /** + * Returns an individual segment. + * + * This ignores any options that might have been dispersed between + * valid segments in the command: + * + * // segment(3) is 'three', not '-f' or 'anOption' + * > php spark one two -f anOption three + * + * **IMPORTANT:** The index here is one-based instead of zero-based. + * + * @return mixed + */ + public static function getSegment(int $index) + { + return static::$segments[$index - 1] ?? null; + } + + /** + * Returns the raw array of segments found. + */ + public static function getSegments(): array + { + return static::$segments; + } + + /** + * Gets a single command-line option. Returns TRUE if the option + * exists, but doesn't have a value, and is simply acting as a flag. + * + * @return mixed + */ + public static function getOption(string $name) + { + if (! array_key_exists($name, static::$options)) { + return null; + } + + // If the option didn't have a value, simply return TRUE + // so they know it was set, otherwise return the actual value. + $val = static::$options[$name] ?? true; + + return $val; + } + + /** + * Returns the raw array of options found. + */ + public static function getOptions(): array + { + return static::$options; + } + + /** + * Returns the options as a string, suitable for passing along on + * the CLI to other commands. + * + * @param bool $useLongOpts Use '--' for long options? + * @param bool $trim Trim final string output? + */ + public static function getOptionString(bool $useLongOpts = false, bool $trim = false): string + { + if (empty(static::$options)) { + return ''; + } + + $out = ''; + + foreach (static::$options as $name => $value) { + if ($useLongOpts && mb_strlen($name) > 1) { + $out .= "--{$name} "; + } else { + $out .= "-{$name} "; + } + + if ($value === null) { + continue; + } + + if (mb_strpos($value, ' ') !== false) { + $out .= "\"{$value}\" "; + } elseif ($value !== null) { + $out .= "{$value} "; + } + } + + return $trim ? trim($out) : $out; + } + + /** + * Returns a well formatted table + * + * @param array $tbody List of rows + * @param array $thead List of columns + */ + public static function table(array $tbody, array $thead = []) + { + // All the rows in the table will be here until the end + $tableRows = []; + + // We need only indexes and not keys + if (! empty($thead)) { + $tableRows[] = array_values($thead); + } + + foreach ($tbody as $tr) { + $tableRows[] = array_values($tr); + } + + // Yes, it really is necessary to know this count + $totalRows = count($tableRows); + + // Store all columns lengths + // $all_cols_lengths[row][column] = length + $allColsLengths = []; + + // Store maximum lengths by column + // $max_cols_lengths[column] = length + $maxColsLengths = []; + + // Read row by row and define the longest columns + for ($row = 0; $row < $totalRows; $row++) { + $column = 0; // Current column index + + foreach ($tableRows[$row] as $col) { + // Sets the size of this column in the current row + $allColsLengths[$row][$column] = static::strlen($col); + + // If the current column does not have a value among the larger ones + // or the value of this is greater than the existing one + // then, now, this assumes the maximum length + if (! isset($maxColsLengths[$column]) || $allColsLengths[$row][$column] > $maxColsLengths[$column]) { + $maxColsLengths[$column] = $allColsLengths[$row][$column]; + } + + // We can go check the size of the next column... + $column++; + } + } + + // Read row by row and add spaces at the end of the columns + // to match the exact column length + for ($row = 0; $row < $totalRows; $row++) { + $column = 0; + + foreach ($tableRows[$row] as $col) { + $diff = $maxColsLengths[$column] - static::strlen($col); + + if ($diff) { + $tableRows[$row][$column] = $tableRows[$row][$column] . str_repeat(' ', $diff); + } + + $column++; + } + } + + $table = ''; + + // Joins columns and append the well formatted rows to the table + for ($row = 0; $row < $totalRows; $row++) { + // Set the table border-top + if ($row === 0) { + $cols = '+'; + + foreach ($tableRows[$row] as $col) { + $cols .= str_repeat('-', static::strlen($col) + 2) . '+'; + } + $table .= $cols . PHP_EOL; + } + + // Set the columns borders + $table .= '| ' . implode(' | ', $tableRows[$row]) . ' |' . PHP_EOL; + + // Set the thead and table borders-bottom + if (isset($cols) && (($row === 0 && ! empty($thead)) || ($row + 1 === $totalRows))) { + $table .= $cols . PHP_EOL; + } + } + + static::write($table); + } + + /** + * While the library is intended for use on CLI commands, + * commands can be called from controllers and elsewhere + * so we need a way to allow them to still work. + * + * For now, just echo the content, but look into a better + * solution down the road. + * + * @param resource $handle + */ + protected static function fwrite($handle, string $string) + { + if (! is_cli()) { + // @codeCoverageIgnoreStart + echo $string; + + return; + // @codeCoverageIgnoreEnd + } + + fwrite($handle, $string); + } +} + +// Ensure the class is initialized. Done outside of code coverage +CLI::init(); // @codeCoverageIgnore diff --git a/system/CLI/CommandRunner.php b/system/CLI/CommandRunner.php new file mode 100644 index 0000000..a6985d0 --- /dev/null +++ b/system/CLI/CommandRunner.php @@ -0,0 +1,80 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\CLI; + +use CodeIgniter\Controller; +use Config\Services; +use ReflectionException; + +/** + * Command runner + */ +class CommandRunner extends Controller +{ + /** + * Instance of class managing the collection of commands + * + * @var Commands + */ + protected $commands; + + /** + * Constructor + */ + public function __construct() + { + $this->commands = Services::commands(); + } + + /** + * We map all un-routed CLI methods through this function + * so we have the chance to look for a Command first. + * + * @param string $method + * @param array ...$params + * + * @throws ReflectionException + * + * @return mixed + */ + public function _remap($method, ...$params) + { + // The first param is usually empty, so scrap it. + if (empty($params[0])) { + array_shift($params); + } + + return $this->index($params); + } + + /** + * Default command. + * + * @throws ReflectionException + * + * @return mixed + */ + public function index(array $params) + { + $command = array_shift($params) ?? 'list'; + + return $this->commands->run($command, $params); + } + + /** + * Allows access to the current commands that have been found. + */ + public function getCommands(): array + { + return $this->commands->getCommands(); + } +} diff --git a/system/CLI/Commands.php b/system/CLI/Commands.php new file mode 100644 index 0000000..3f84f33 --- /dev/null +++ b/system/CLI/Commands.php @@ -0,0 +1,181 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\CLI; + +use CodeIgniter\Autoloader\FileLocator; +use CodeIgniter\Log\Logger; +use ReflectionClass; +use ReflectionException; + +/** + * Core functionality for running, listing, etc commands. + */ +class Commands +{ + /** + * The found commands. + * + * @var array + */ + protected $commands = []; + + /** + * Logger instance. + * + * @var Logger + */ + protected $logger; + + /** + * Constructor + * + * @param Logger|null $logger + */ + public function __construct($logger = null) + { + $this->logger = $logger ?? service('logger'); + $this->discoverCommands(); + } + + /** + * Runs a command given + */ + public function run(string $command, array $params) + { + if (! $this->verifyCommand($command, $this->commands)) { + return; + } + + // The file would have already been loaded during the + // createCommandList function... + $className = $this->commands[$command]['class']; + $class = new $className($this->logger, $this); + + return $class->run($params); + } + + /** + * Provide access to the list of commands. + * + * @return array + */ + public function getCommands() + { + return $this->commands; + } + + /** + * Discovers all commands in the framework and within user code, + * and collects instances of them to work with. + */ + public function discoverCommands() + { + if ($this->commands !== []) { + return; + } + + /** @var FileLocator $locator */ + $locator = service('locator'); + $files = $locator->listFiles('Commands/'); + + // If no matching command files were found, bail + // This should never happen in unit testing. + if ($files === []) { + return; // @codeCoverageIgnore + } + + // Loop over each file checking to see if a command with that + // alias exists in the class. + foreach ($files as $file) { + $className = $locator->findQualifiedNameFromPath($file); + + if (empty($className) || ! class_exists($className)) { + continue; + } + + try { + $class = new ReflectionClass($className); + + if (! $class->isInstantiable() || ! $class->isSubclassOf(BaseCommand::class)) { + continue; + } + + /** @var BaseCommand $class */ + $class = new $className($this->logger, $this); + + if (isset($class->group)) { + $this->commands[$class->name] = [ + 'class' => $className, + 'file' => $file, + 'group' => $class->group, + 'description' => $class->description, + ]; + } + + unset($class); + } catch (ReflectionException $e) { + $this->logger->error($e->getMessage()); + } + } + + asort($this->commands); + } + + /** + * Verifies if the command being sought is found + * in the commands list. + */ + public function verifyCommand(string $command, array $commands): bool + { + if (isset($commands[$command])) { + return true; + } + + $message = lang('CLI.commandNotFound', [$command]); + + if ($alternatives = $this->getCommandAlternatives($command, $commands)) { + if (count($alternatives) === 1) { + $message .= "\n\n" . lang('CLI.altCommandSingular') . "\n "; + } else { + $message .= "\n\n" . lang('CLI.altCommandPlural') . "\n "; + } + + $message .= implode("\n ", $alternatives); + } + + CLI::error($message); + CLI::newLine(); + + return false; + } + + /** + * Finds alternative of `$name` among collection + * of commands. + */ + protected function getCommandAlternatives(string $name, array $collection): array + { + $alternatives = []; + + foreach (array_keys($collection) as $commandName) { + $lev = levenshtein($name, $commandName); + + if ($lev <= strlen($commandName) / 3 || strpos($commandName, $name) !== false) { + $alternatives[$commandName] = $lev; + } + } + + ksort($alternatives, SORT_NATURAL | SORT_FLAG_CASE); + + return array_keys($alternatives); + } +} diff --git a/system/CLI/Console.php b/system/CLI/Console.php new file mode 100644 index 0000000..0bf8a0f --- /dev/null +++ b/system/CLI/Console.php @@ -0,0 +1,63 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\CLI; + +use CodeIgniter\CodeIgniter; +use Exception; + +/** + * Console + */ +class Console +{ + /** + * Main CodeIgniter instance. + * + * @var CodeIgniter + */ + protected $app; + + public function __construct(CodeIgniter $app) + { + $this->app = $app; + } + + /** + * Runs the current command discovered on the CLI. + * + * @throws Exception + * + * @return mixed + */ + public function run(bool $useSafeOutput = false) + { + $path = CLI::getURI() ?: 'list'; + + // Set the path for the application to route to. + $this->app->setPath("ci{$path}"); + + return $this->app->useSafeOutput($useSafeOutput)->run(); + } + + /** + * Displays basic information about the Console. + */ + public function showHeader(bool $suppress = false) + { + if ($suppress) { + return; + } + + CLI::write(sprintf('CodeIgniter v%s Command Line Tool - Server Time: %s UTC%s', CodeIgniter::CI_VERSION, date('Y-m-d H:i:s'), date('P')), 'green'); + CLI::newLine(); + } +} diff --git a/system/CLI/Exceptions/CLIException.php b/system/CLI/Exceptions/CLIException.php new file mode 100644 index 0000000..4e07cd6 --- /dev/null +++ b/system/CLI/Exceptions/CLIException.php @@ -0,0 +1,34 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\CLI\Exceptions; + +use CodeIgniter\Exceptions\DebugTraceableTrait; +use RuntimeException; + +/** + * CLIException + */ +class CLIException extends RuntimeException +{ + use DebugTraceableTrait; + + /** + * Thrown when `$color` specified for `$type` is not within the + * allowed list of colors. + * + * @return CLIException + */ + public static function forInvalidColor(string $type, string $color) + { + return new static(lang('CLI.invalidColor', [$type, $color])); + } +} diff --git a/system/CLI/GeneratorTrait.php b/system/CLI/GeneratorTrait.php new file mode 100644 index 0000000..51706b4 --- /dev/null +++ b/system/CLI/GeneratorTrait.php @@ -0,0 +1,352 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\CLI; + +use Config\Services; +use Throwable; + +/** + * GeneratorTrait contains a collection of methods + * to build the commands that generates a file. + */ +trait GeneratorTrait +{ + /** + * Component Name + * + * @var string + */ + protected $component; + + /** + * File directory + * + * @var string + */ + protected $directory; + + /** + * View template name + * + * @var string + */ + protected $template; + + /** + * Language string key for required class names. + * + * @var string + */ + protected $classNameLang = ''; + + /** + * Whether to require class name. + * + * @internal + * + * @var bool + */ + private $hasClassName = true; + + /** + * Whether to sort class imports. + * + * @internal + * + * @var bool + */ + private $sortImports = true; + + /** + * Whether the `--suffix` option has any effect. + * + * @internal + * + * @var bool + */ + private $enabledSuffixing = true; + + /** + * The params array for easy access by other methods. + * + * @internal + * + * @var array + */ + private $params = []; + + /** + * Execute the command. + */ + protected function execute(array $params): void + { + $this->params = $params; + + if ($this->getOption('namespace') === 'CodeIgniter') { + // @codeCoverageIgnoreStart + CLI::write(lang('CLI.generator.usingCINamespace'), 'yellow'); + CLI::newLine(); + + if (CLI::prompt('Are you sure you want to continue?', ['y', 'n'], 'required') === 'n') { + CLI::newLine(); + CLI::write(lang('CLI.generator.cancelOperation'), 'yellow'); + CLI::newLine(); + + return; + } + + CLI::newLine(); + // @codeCoverageIgnoreEnd + } + + // Get the fully qualified class name from the input. + $class = $this->qualifyClassName(); + + // Get the file path from class name. + $path = $this->buildPath($class); + + // Check if path is empty. + if (empty($path)) { + return; + } + + $isFile = is_file($path); + + // Overwriting files unknowingly is a serious annoyance, So we'll check if + // we are duplicating things, If 'force' option is not supplied, we bail. + if (! $this->getOption('force') && $isFile) { + CLI::error(lang('CLI.generator.fileExist', [clean_path($path)]), 'light_gray', 'red'); + CLI::newLine(); + + return; + } + + // Check if the directory to save the file is existing. + $dir = dirname($path); + + if (! is_dir($dir)) { + mkdir($dir, 0755, true); + } + + helper('filesystem'); + + // Build the class based on the details we have, We'll be getting our file + // contents from the template, and then we'll do the necessary replacements. + if (! write_file($path, $this->buildContent($class))) { + // @codeCoverageIgnoreStart + CLI::error(lang('CLI.generator.fileError', [clean_path($path)]), 'light_gray', 'red'); + CLI::newLine(); + + return; + // @codeCoverageIgnoreEnd + } + + if ($this->getOption('force') && $isFile) { + CLI::write(lang('CLI.generator.fileOverwrite', [clean_path($path)]), 'yellow'); + CLI::newLine(); + + return; + } + + CLI::write(lang('CLI.generator.fileCreate', [clean_path($path)]), 'green'); + CLI::newLine(); + } + + /** + * Prepare options and do the necessary replacements. + */ + protected function prepare(string $class): string + { + return $this->parseTemplate($class); + } + + /** + * Change file basename before saving. + * + * Useful for components where the file name has a date. + */ + protected function basename(string $filename): string + { + return basename($filename); + } + + /** + * Parses the class name and checks if it is already qualified. + */ + protected function qualifyClassName(): string + { + // Gets the class name from input. + $class = $this->params[0] ?? CLI::getSegment(2); + + if ($class === null && $this->hasClassName) { + // @codeCoverageIgnoreStart + $nameLang = $this->classNameLang ?: 'CLI.generator.className.default'; + $class = CLI::prompt(lang($nameLang), null, 'required'); + CLI::newLine(); + // @codeCoverageIgnoreEnd + } + + helper('inflector'); + + $component = singular($this->component); + + /** + * @see https://regex101.com/r/a5KNCR/1 + */ + $pattern = sprintf('/([a-z][a-z0-9_\/\\\\]+)(%s)/i', $component); + + if (preg_match($pattern, $class, $matches) === 1) { + $class = $matches[1] . ucfirst($matches[2]); + } + + if ($this->enabledSuffixing && $this->getOption('suffix') && ! strripos($class, $component)) { + $class .= ucfirst($component); + } + + // Trims input, normalize separators, and ensure that all paths are in Pascalcase. + $class = ltrim(implode('\\', array_map('pascalize', explode('\\', str_replace('/', '\\', trim($class))))), '\\/'); + + // Gets the namespace from input. Don't forget the ending backslash! + $namespace = trim(str_replace('/', '\\', $this->getOption('namespace') ?? APP_NAMESPACE), '\\') . '\\'; + + if (strncmp($class, $namespace, strlen($namespace)) === 0) { + return $class; // @codeCoverageIgnore + } + + return $namespace . $this->directory . '\\' . str_replace('/', '\\', $class); + } + + /** + * Gets the generator view as defined in the `Config\Generators::$views`, + * with fallback to `$template` when the defined view does not exist. + */ + protected function renderTemplate(array $data = []): string + { + try { + return view(config('Generators')->views[$this->name], $data, ['debug' => false]); + } catch (Throwable $e) { + log_message('error', $e->getMessage()); + + return view("CodeIgniter\\Commands\\Generators\\Views\\{$this->template}", $data, ['debug' => false]); + } + } + + /** + * Performs pseudo-variables contained within view file. + */ + protected function parseTemplate(string $class, array $search = [], array $replace = [], array $data = []): string + { + // Retrieves the namespace part from the fully qualified class name. + $namespace = trim(implode('\\', array_slice(explode('\\', $class), 0, -1)), '\\'); + $search[] = '<@php'; + $search[] = '{namespace}'; + $search[] = '{class}'; + $replace[] = 'renderTemplate($data)); + } + + /** + * Builds the contents for class being generated, doing all + * the replacements necessary, and alphabetically sorts the + * imports for a given template. + */ + protected function buildContent(string $class): string + { + $template = $this->prepare($class); + + if ($this->sortImports && preg_match('/(?P(?:^use [^;]+;$\n?)+)/m', $template, $match)) { + $imports = explode("\n", trim($match['imports'])); + sort($imports); + + return str_replace(trim($match['imports']), implode("\n", $imports), $template); + } + + return $template; + } + + /** + * Builds the file path from the class name. + */ + protected function buildPath(string $class): string + { + $namespace = trim(str_replace('/', '\\', $this->getOption('namespace') ?? APP_NAMESPACE), '\\'); + + // Check if the namespace is actually defined and we are not just typing gibberish. + $base = Services::autoloader()->getNamespace($namespace); + + if (! $base = reset($base)) { + CLI::error(lang('CLI.namespaceNotDefined', [$namespace]), 'light_gray', 'red'); + CLI::newLine(); + + return ''; + } + + $base = realpath($base) ?: $base; + $file = $base . DIRECTORY_SEPARATOR . str_replace('\\', DIRECTORY_SEPARATOR, trim(str_replace($namespace . '\\', '', $class), '\\')) . '.php'; + + return implode(DIRECTORY_SEPARATOR, array_slice(explode(DIRECTORY_SEPARATOR, $file), 0, -1)) . DIRECTORY_SEPARATOR . $this->basename($file); + } + + /** + * Allows child generators to modify the internal `$hasClassName` flag. + * + * @return $this + */ + protected function setHasClassName(bool $hasClassName) + { + $this->hasClassName = $hasClassName; + + return $this; + } + + /** + * Allows child generators to modify the internal `$sortImports` flag. + * + * @return $this + */ + protected function setSortImports(bool $sortImports) + { + $this->sortImports = $sortImports; + + return $this; + } + + /** + * Allows child generators to modify the internal `$enabledSuffixing` flag. + * + * @return $this + */ + protected function setEnabledSuffixing(bool $enabledSuffixing) + { + $this->enabledSuffixing = $enabledSuffixing; + + return $this; + } + + /** + * Gets a single command-line option. Returns TRUE if the option exists, + * but doesn't have a value, and is simply acting as a flag. + * + * @return mixed + */ + protected function getOption(string $name) + { + if (! array_key_exists($name, $this->params)) { + return CLI::getOption($name); + } + + return $this->params[$name] ?? true; + } +} diff --git a/system/Cache/CacheFactory.php b/system/Cache/CacheFactory.php new file mode 100644 index 0000000..875dcd3 --- /dev/null +++ b/system/Cache/CacheFactory.php @@ -0,0 +1,84 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Cache; + +use CodeIgniter\Cache\Exceptions\CacheException; +use CodeIgniter\Exceptions\CriticalError; +use CodeIgniter\Test\Mock\MockCache; +use Config\Cache; + +/** + * A factory for loading the desired + */ +class CacheFactory +{ + /** + * The class to use when mocking + * + * @var string + */ + public static $mockClass = MockCache::class; + + /** + * The service to inject the mock as + * + * @var string + */ + public static $mockServiceName = 'cache'; + + /** + * Attempts to create the desired cache handler, based upon the + * + * @return CacheInterface + */ + public static function getHandler(Cache $config, ?string $handler = null, ?string $backup = null) + { + if (! isset($config->validHandlers) || ! is_array($config->validHandlers)) { + throw CacheException::forInvalidHandlers(); + } + + if (! isset($config->handler) || ! isset($config->backupHandler)) { + throw CacheException::forNoBackup(); + } + + $handler = ! empty($handler) ? $handler : $config->handler; + $backup = ! empty($backup) ? $backup : $config->backupHandler; + + if (! array_key_exists($handler, $config->validHandlers) || ! array_key_exists($backup, $config->validHandlers)) { + throw CacheException::forHandlerNotFound(); + } + + $adapter = new $config->validHandlers[$handler]($config); + + if (! $adapter->isSupported()) { + $adapter = new $config->validHandlers[$backup]($config); + + if (! $adapter->isSupported()) { + // Fall back to the dummy adapter. + $adapter = new $config->validHandlers['dummy'](); + } + } + + // If $adapter->initialization throws a CriticalError exception, we will attempt to + // use the $backup handler, if that also fails, we resort to the dummy handler. + try { + $adapter->initialize(); + } catch (CriticalError $e) { + log_message('critical', $e->getMessage() . ' Resorting to using ' . $backup . ' handler.'); + + // get the next best cache handler (or dummy if the $backup also fails) + $adapter = self::getHandler($config, $backup, 'dummy'); + } + + return $adapter; + } +} diff --git a/system/Cache/CacheInterface.php b/system/Cache/CacheInterface.php new file mode 100644 index 0000000..72b3626 --- /dev/null +++ b/system/Cache/CacheInterface.php @@ -0,0 +1,106 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Cache; + +/** + * Cache interface + */ +interface CacheInterface +{ + /** + * Takes care of any handler-specific setup that must be done. + */ + public function initialize(); + + /** + * Attempts to fetch an item from the cache store. + * + * @param string $key Cache item name + * + * @return mixed + */ + public function get(string $key); + + /** + * Saves an item to the cache store. + * + * @param string $key Cache item name + * @param mixed $value The data to save + * @param int $ttl Time To Live, in seconds (default 60) + * + * @return bool Success or failure + */ + public function save(string $key, $value, int $ttl = 60); + + /** + * Deletes a specific item from the cache store. + * + * @param string $key Cache item name + * + * @return bool Success or failure + */ + public function delete(string $key); + + /** + * Performs atomic incrementation of a raw stored value. + * + * @param string $key Cache ID + * @param int $offset Step/value to increase by + * + * @return mixed + */ + public function increment(string $key, int $offset = 1); + + /** + * Performs atomic decrementation of a raw stored value. + * + * @param string $key Cache ID + * @param int $offset Step/value to increase by + * + * @return mixed + */ + public function decrement(string $key, int $offset = 1); + + /** + * Will delete all items in the entire cache. + * + * @return bool Success or failure + */ + public function clean(); + + /** + * Returns information on the entire cache. + * + * The information returned and the structure of the data + * varies depending on the handler. + * + * @return mixed + */ + public function getCacheInfo(); + + /** + * Returns detailed information about the specific item in the cache. + * + * @param string $key Cache item name. + * + * @return array|false|null + * Returns null if the item does not exist, otherwise array + * with at least the 'expire' key for absolute epoch expiry (or null). + * Some handlers may return false when an item does not exist, which is deprecated. + */ + public function getMetaData(string $key); + + /** + * Determines if the driver is supported on this system. + */ + public function isSupported(): bool; +} diff --git a/system/Cache/Exceptions/CacheException.php b/system/Cache/Exceptions/CacheException.php new file mode 100644 index 0000000..3445590 --- /dev/null +++ b/system/Cache/Exceptions/CacheException.php @@ -0,0 +1,64 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Cache\Exceptions; + +use CodeIgniter\Exceptions\DebugTraceableTrait; +use CodeIgniter\Exceptions\ExceptionInterface; +use RuntimeException; + +/** + * CacheException + */ +class CacheException extends RuntimeException implements ExceptionInterface +{ + use DebugTraceableTrait; + + /** + * Thrown when handler has no permission to write cache. + * + * @return CacheException + */ + public static function forUnableToWrite(string $path) + { + return new static(lang('Cache.unableToWrite', [$path])); + } + + /** + * Thrown when an unrecognized handler is used. + * + * @return CacheException + */ + public static function forInvalidHandlers() + { + return new static(lang('Cache.invalidHandlers')); + } + + /** + * Thrown when no backup handler is setup in config. + * + * @return CacheException + */ + public static function forNoBackup() + { + return new static(lang('Cache.noBackup')); + } + + /** + * Thrown when specified handler was not found. + * + * @return CacheException + */ + public static function forHandlerNotFound() + { + return new static(lang('Cache.handlerNotFound')); + } +} diff --git a/system/Cache/Exceptions/ExceptionInterface.php b/system/Cache/Exceptions/ExceptionInterface.php new file mode 100644 index 0000000..067e8aa --- /dev/null +++ b/system/Cache/Exceptions/ExceptionInterface.php @@ -0,0 +1,24 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Cache\Exceptions; + +/** + * Provides a domain-level interface for broad capture + * of all framework-related exceptions. + * + * catch (\CodeIgniter\Cache\Exceptions\ExceptionInterface) { ... } + * + * @deprecated 4.1.2 + */ +interface ExceptionInterface +{ +} diff --git a/system/Cache/Handlers/BaseHandler.php b/system/Cache/Handlers/BaseHandler.php new file mode 100644 index 0000000..5712020 --- /dev/null +++ b/system/Cache/Handlers/BaseHandler.php @@ -0,0 +1,106 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Cache\Handlers; + +use Closure; +use CodeIgniter\Cache\CacheInterface; +use Exception; +use InvalidArgumentException; + +/** + * Base class for cache handling + */ +abstract class BaseHandler implements CacheInterface +{ + /** + * Reserved characters that cannot be used in a key or tag. May be overridden by the config. + * From https://github.com/symfony/cache-contracts/blob/c0446463729b89dd4fa62e9aeecc80287323615d/ItemInterface.php#L43 + * + * @deprecated in favor of the Cache config + */ + public const RESERVED_CHARACTERS = '{}()/\@:'; + + /** + * Maximum key length. + */ + public const MAX_KEY_LENGTH = PHP_INT_MAX; + + /** + * Prefix to apply to cache keys. + * May not be used by all handlers. + * + * @var string + */ + protected $prefix; + + /** + * Validates a cache key according to PSR-6. + * Keys that exceed MAX_KEY_LENGTH are hashed. + * From https://github.com/symfony/cache/blob/7b024c6726af21fd4984ac8d1eae2b9f3d90de88/CacheItem.php#L158 + * + * @param string $key The key to validate + * @param string $prefix Optional prefix to include in length calculations + * + * @throws InvalidArgumentException When $key is not valid + */ + public static function validateKey($key, $prefix = ''): string + { + if (! is_string($key)) { + throw new InvalidArgumentException('Cache key must be a string'); + } + if ($key === '') { + throw new InvalidArgumentException('Cache key cannot be empty.'); + } + + $reserved = config('Cache')->reservedCharacters ?? self::RESERVED_CHARACTERS; + if ($reserved && strpbrk($key, $reserved) !== false) { + throw new InvalidArgumentException('Cache key contains reserved characters ' . $reserved); + } + + // If the key with prefix exceeds the length then return the hashed version + return strlen($prefix . $key) > static::MAX_KEY_LENGTH ? $prefix . md5($key) : $prefix . $key; + } + + /** + * Get an item from the cache, or execute the given Closure and store the result. + * + * @param string $key Cache item name + * @param int $ttl Time to live + * @param Closure $callback Callback return value + * + * @return mixed + */ + public function remember(string $key, int $ttl, Closure $callback) + { + $value = $this->get($key); + + if ($value !== null) { + return $value; + } + + $this->save($key, $value = $callback(), $ttl); + + return $value; + } + + /** + * Deletes items from the cache store matching a given pattern. + * + * @param string $pattern Cache items glob-style pattern + * + * @throws Exception + */ + public function deleteMatching(string $pattern) + { + throw new Exception('The deleteMatching method is not implemented.'); + } +} diff --git a/system/Cache/Handlers/DummyHandler.php b/system/Cache/Handlers/DummyHandler.php new file mode 100644 index 0000000..fd4f1b5 --- /dev/null +++ b/system/Cache/Handlers/DummyHandler.php @@ -0,0 +1,115 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Cache\Handlers; + +use Closure; + +/** + * Dummy cache handler + */ +class DummyHandler extends BaseHandler +{ + /** + * {@inheritDoc} + */ + public function initialize() + { + } + + /** + * {@inheritDoc} + */ + public function get(string $key) + { + return null; + } + + /** + * {@inheritDoc} + */ + public function remember(string $key, int $ttl, Closure $callback) + { + return null; + } + + /** + * {@inheritDoc} + */ + public function save(string $key, $value, int $ttl = 60) + { + return true; + } + + /** + * {@inheritDoc} + */ + public function delete(string $key) + { + return true; + } + + /** + * {@inheritDoc} + */ + public function deleteMatching(string $pattern) + { + return 0; + } + + /** + * {@inheritDoc} + */ + public function increment(string $key, int $offset = 1) + { + return true; + } + + /** + * {@inheritDoc} + */ + public function decrement(string $key, int $offset = 1) + { + return true; + } + + /** + * {@inheritDoc} + */ + public function clean() + { + return true; + } + + /** + * {@inheritDoc} + */ + public function getCacheInfo() + { + return null; + } + + /** + * {@inheritDoc} + */ + public function getMetaData(string $key) + { + return null; + } + + /** + * {@inheritDoc} + */ + public function isSupported(): bool + { + return true; + } +} diff --git a/system/Cache/Handlers/FileHandler.php b/system/Cache/Handlers/FileHandler.php new file mode 100644 index 0000000..2517c6a --- /dev/null +++ b/system/Cache/Handlers/FileHandler.php @@ -0,0 +1,423 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Cache\Handlers; + +use CodeIgniter\Cache\Exceptions\CacheException; +use Config\Cache; +use Throwable; + +/** + * File system cache handler + */ +class FileHandler extends BaseHandler +{ + /** + * Maximum key length. + */ + public const MAX_KEY_LENGTH = 255; + + /** + * Where to store cached files on the disk. + * + * @var string + */ + protected $path; + + /** + * Mode for the stored files. + * Must be chmod-safe (octal). + * + * @var int + * + * @see https://www.php.net/manual/en/function.chmod.php + */ + protected $mode; + + /** + * @throws CacheException + */ + public function __construct(Cache $config) + { + if (! property_exists($config, 'file')) { + $config->file = [ + 'storePath' => $config->storePath ?? WRITEPATH . 'cache', + 'mode' => 0640, + ]; + } + + $this->path = ! empty($config->file['storePath']) ? $config->file['storePath'] : WRITEPATH . 'cache'; + $this->path = rtrim($this->path, '/') . '/'; + + if (! is_really_writable($this->path)) { + throw CacheException::forUnableToWrite($this->path); + } + + $this->mode = $config->file['mode'] ?? 0640; + $this->prefix = $config->prefix; + } + + /** + * {@inheritDoc} + */ + public function initialize() + { + } + + /** + * {@inheritDoc} + */ + public function get(string $key) + { + $key = static::validateKey($key, $this->prefix); + $data = $this->getItem($key); + + return is_array($data) ? $data['data'] : null; + } + + /** + * {@inheritDoc} + */ + public function save(string $key, $value, int $ttl = 60) + { + $key = static::validateKey($key, $this->prefix); + + $contents = [ + 'time' => time(), + 'ttl' => $ttl, + 'data' => $value, + ]; + + if ($this->writeFile($this->path . $key, serialize($contents))) { + try { + chmod($this->path . $key, $this->mode); + + // @codeCoverageIgnoreStart + } catch (Throwable $e) { + log_message('debug', 'Failed to set mode on cache file: ' . $e->getMessage()); + // @codeCoverageIgnoreEnd + } + + return true; + } + + return false; + } + + /** + * {@inheritDoc} + */ + public function delete(string $key) + { + $key = static::validateKey($key, $this->prefix); + + return is_file($this->path . $key) && unlink($this->path . $key); + } + + /** + * {@inheritDoc} + */ + public function deleteMatching(string $pattern) + { + $deleted = 0; + + foreach (glob($this->path . $pattern, GLOB_NOSORT) as $filename) { + if (is_file($filename) && @unlink($filename)) { + $deleted++; + } + } + + return $deleted; + } + + /** + * {@inheritDoc} + */ + public function increment(string $key, int $offset = 1) + { + $key = static::validateKey($key, $this->prefix); + $data = $this->getItem($key); + + if ($data === false) { + $data = [ + 'data' => 0, + 'ttl' => 60, + ]; + } elseif (! is_int($data['data'])) { + return false; + } + + $newValue = $data['data'] + $offset; + + return $this->save($key, $newValue, $data['ttl']) ? $newValue : false; + } + + /** + * {@inheritDoc} + */ + public function decrement(string $key, int $offset = 1) + { + $key = static::validateKey($key, $this->prefix); + $data = $this->getItem($key); + + if ($data === false) { + $data = [ + 'data' => 0, + 'ttl' => 60, + ]; + } elseif (! is_int($data['data'])) { + return false; + } + + $newValue = $data['data'] - $offset; + + return $this->save($key, $newValue, $data['ttl']) ? $newValue : false; + } + + /** + * {@inheritDoc} + */ + public function clean() + { + return $this->deleteFiles($this->path, false, true); + } + + /** + * {@inheritDoc} + */ + public function getCacheInfo() + { + return $this->getDirFileInfo($this->path); + } + + /** + * {@inheritDoc} + */ + public function getMetaData(string $key) + { + $key = static::validateKey($key, $this->prefix); + + if (false === $data = $this->getItem($key)) { + return false; // @TODO This will return null in a future release + } + + return [ + 'expire' => $data['ttl'] > 0 ? $data['time'] + $data['ttl'] : null, + 'mtime' => filemtime($this->path . $key), + 'data' => $data['data'], + ]; + } + + /** + * {@inheritDoc} + */ + public function isSupported(): bool + { + return is_writable($this->path); + } + + /** + * Does the heavy lifting of actually retrieving the file and + * verifying it's age. + * + * @return mixed + */ + protected function getItem(string $filename) + { + if (! is_file($this->path . $filename)) { + return false; + } + + $data = @unserialize(file_get_contents($this->path . $filename)); + if (! is_array($data) || ! isset($data['ttl'])) { + return false; + } + + if ($data['ttl'] > 0 && time() > $data['time'] + $data['ttl']) { + // If the file is still there then try to remove it + if (is_file($this->path . $filename)) { + @unlink($this->path . $filename); + } + + return false; + } + + return $data; + } + + /** + * Writes a file to disk, or returns false if not successful. + * + * @param string $path + * @param string $data + * @param string $mode + * + * @return bool + */ + protected function writeFile($path, $data, $mode = 'wb') + { + if (($fp = @fopen($path, $mode)) === false) { + return false; + } + + flock($fp, LOCK_EX); + + for ($result = $written = 0, $length = strlen($data); $written < $length; $written += $result) { + if (($result = fwrite($fp, substr($data, $written))) === false) { + break; + } + } + + flock($fp, LOCK_UN); + fclose($fp); + + return is_int($result); + } + + /** + * Deletes all files contained in the supplied directory path. + * Files must be writable or owned by the system in order to be deleted. + * If the second parameter is set to TRUE, any directories contained + * within the supplied base directory will be nuked as well. + * + * @param string $path File path + * @param bool $delDir Whether to delete any directories found in the path + * @param bool $htdocs Whether to skip deleting .htaccess and index page files + * @param int $_level Current directory depth level (default: 0; internal use only) + */ + protected function deleteFiles(string $path, bool $delDir = false, bool $htdocs = false, int $_level = 0): bool + { + // Trim the trailing slash + $path = rtrim($path, '/\\'); + + if (! $currentDir = @opendir($path)) { + return false; + } + + while (false !== ($filename = @readdir($currentDir))) { + if ($filename !== '.' && $filename !== '..') { + if (is_dir($path . DIRECTORY_SEPARATOR . $filename) && $filename[0] !== '.') { + $this->deleteFiles($path . DIRECTORY_SEPARATOR . $filename, $delDir, $htdocs, $_level + 1); + } elseif ($htdocs !== true || ! preg_match('/^(\.htaccess|index\.(html|htm|php)|web\.config)$/i', $filename)) { + @unlink($path . DIRECTORY_SEPARATOR . $filename); + } + } + } + + closedir($currentDir); + + return ($delDir === true && $_level > 0) ? @rmdir($path) : true; + } + + /** + * Reads the specified directory and builds an array containing the filenames, + * filesize, dates, and permissions + * + * Any sub-folders contained within the specified path are read as well. + * + * @param string $sourceDir Path to source + * @param bool $topLevelOnly Look only at the top level directory specified? + * @param bool $_recursion Internal variable to determine recursion status - do not use in calls + * + * @return array|false + */ + protected function getDirFileInfo(string $sourceDir, bool $topLevelOnly = true, bool $_recursion = false) + { + static $_filedata = []; + $relativePath = $sourceDir; + + if ($fp = @opendir($sourceDir)) { + // reset the array and make sure $source_dir has a trailing slash on the initial call + if ($_recursion === false) { + $_filedata = []; + $sourceDir = rtrim(realpath($sourceDir) ?: $sourceDir, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR; + } + + // Used to be foreach (scandir($source_dir, 1) as $file), but scandir() is simply not as fast + while (false !== ($file = readdir($fp))) { + if (is_dir($sourceDir . $file) && $file[0] !== '.' && $topLevelOnly === false) { + $this->getDirFileInfo($sourceDir . $file . DIRECTORY_SEPARATOR, $topLevelOnly, true); + } elseif ($file[0] !== '.') { + $_filedata[$file] = $this->getFileInfo($sourceDir . $file); + $_filedata[$file]['relative_path'] = $relativePath; + } + } + + closedir($fp); + + return $_filedata; + } + + return false; + } + + /** + * Given a file and path, returns the name, path, size, date modified + * Second parameter allows you to explicitly declare what information you want returned + * Options are: name, server_path, size, date, readable, writable, executable, fileperms + * Returns FALSE if the file cannot be found. + * + * @param string $file Path to file + * @param mixed $returnedValues Array or comma separated string of information returned + * + * @return array|false + */ + protected function getFileInfo(string $file, $returnedValues = ['name', 'server_path', 'size', 'date']) + { + if (! is_file($file)) { + return false; + } + + if (is_string($returnedValues)) { + $returnedValues = explode(',', $returnedValues); + } + + $fileInfo = []; + + foreach ($returnedValues as $key) { + switch ($key) { + case 'name': + $fileInfo['name'] = basename($file); + break; + + case 'server_path': + $fileInfo['server_path'] = $file; + break; + + case 'size': + $fileInfo['size'] = filesize($file); + break; + + case 'date': + $fileInfo['date'] = filemtime($file); + break; + + case 'readable': + $fileInfo['readable'] = is_readable($file); + break; + + case 'writable': + $fileInfo['writable'] = is_writable($file); + break; + + case 'executable': + $fileInfo['executable'] = is_executable($file); + break; + + case 'fileperms': + $fileInfo['fileperms'] = fileperms($file); + break; + } + } + + return $fileInfo; + } +} diff --git a/system/Cache/Handlers/MemcachedHandler.php b/system/Cache/Handlers/MemcachedHandler.php new file mode 100644 index 0000000..f240a5d --- /dev/null +++ b/system/Cache/Handlers/MemcachedHandler.php @@ -0,0 +1,271 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Cache\Handlers; + +use CodeIgniter\Exceptions\CriticalError; +use Config\Cache; +use Exception; +use Memcache; +use Memcached; + +/** + * Mamcached cache handler + */ +class MemcachedHandler extends BaseHandler +{ + /** + * The memcached object + * + * @var Memcache|Memcached + */ + protected $memcached; + + /** + * Memcached Configuration + * + * @var array + */ + protected $config = [ + 'host' => '127.0.0.1', + 'port' => 11211, + 'weight' => 1, + 'raw' => false, + ]; + + public function __construct(Cache $config) + { + $this->prefix = $config->prefix; + + if (! empty($config)) { + $this->config = array_merge($this->config, $config->memcached); + } + } + + /** + * Closes the connection to Memcache(d) if present. + */ + public function __destruct() + { + if ($this->memcached instanceof Memcached) { + $this->memcached->quit(); + } elseif ($this->memcached instanceof Memcache) { + $this->memcached->close(); + } + } + + /** + * {@inheritDoc} + */ + public function initialize() + { + try { + if (class_exists(Memcached::class)) { + // Create new instance of Memcached + $this->memcached = new Memcached(); + if ($this->config['raw']) { + $this->memcached->setOption(Memcached::OPT_BINARY_PROTOCOL, true); + } + + // Add server + $this->memcached->addServer( + $this->config['host'], + $this->config['port'], + $this->config['weight'] + ); + + // attempt to get status of servers + $stats = $this->memcached->getStats(); + + // $stats should be an associate array with a key in the format of host:port. + // If it doesn't have the key, we know the server is not working as expected. + if (! isset($stats[$this->config['host'] . ':' . $this->config['port']])) { + throw new CriticalError('Cache: Memcached connection failed.'); + } + } elseif (class_exists(Memcache::class)) { + // Create new instance of Memcache + $this->memcached = new Memcache(); + + // Check if we can connect to the server + $canConnect = $this->memcached->connect( + $this->config['host'], + $this->config['port'] + ); + + // If we can't connect, throw a CriticalError exception + if ($canConnect === false) { + throw new CriticalError('Cache: Memcache connection failed.'); + } + + // Add server, third parameter is persistence and defaults to TRUE. + $this->memcached->addServer( + $this->config['host'], + $this->config['port'], + true, + $this->config['weight'] + ); + } else { + throw new CriticalError('Cache: Not support Memcache(d) extension.'); + } + } catch (CriticalError $e) { + throw $e; + } catch (Exception $e) { + throw new CriticalError('Cache: Memcache(d) connection refused (' . $e->getMessage() . ').'); + } + } + + /** + * {@inheritDoc} + */ + public function get(string $key) + { + $key = static::validateKey($key, $this->prefix); + + if ($this->memcached instanceof Memcached) { + $data = $this->memcached->get($key); + + // check for unmatched key + if ($this->memcached->getResultCode() === Memcached::RES_NOTFOUND) { + return null; + } + } elseif ($this->memcached instanceof Memcache) { + $flags = false; + $data = $this->memcached->get($key, $flags); + + // check for unmatched key (i.e. $flags is untouched) + if ($flags === false) { + return null; + } + } + + return is_array($data) ? $data[0] : $data; + } + + /** + * {@inheritDoc} + */ + public function save(string $key, $value, int $ttl = 60) + { + $key = static::validateKey($key, $this->prefix); + + if (! $this->config['raw']) { + $value = [ + $value, + time(), + $ttl, + ]; + } + + if ($this->memcached instanceof Memcached) { + return $this->memcached->set($key, $value, $ttl); + } + + if ($this->memcached instanceof Memcache) { + return $this->memcached->set($key, $value, 0, $ttl); + } + + return false; + } + + /** + * {@inheritDoc} + */ + public function delete(string $key) + { + $key = static::validateKey($key, $this->prefix); + + return $this->memcached->delete($key); + } + + /** + * {@inheritDoc} + */ + public function deleteMatching(string $pattern) + { + throw new Exception('The deleteMatching method is not implemented for Memcached. You must select File, Redis or Predis handlers to use it.'); + } + + /** + * {@inheritDoc} + */ + public function increment(string $key, int $offset = 1) + { + if (! $this->config['raw']) { + return false; + } + + $key = static::validateKey($key, $this->prefix); + + return $this->memcached->increment($key, $offset, $offset, 60); + } + + /** + * {@inheritDoc} + */ + public function decrement(string $key, int $offset = 1) + { + if (! $this->config['raw']) { + return false; + } + + $key = static::validateKey($key, $this->prefix); + + // FIXME: third parameter isn't other handler actions. + + return $this->memcached->decrement($key, $offset, $offset, 60); + } + + /** + * {@inheritDoc} + */ + public function clean() + { + return $this->memcached->flush(); + } + + /** + * {@inheritDoc} + */ + public function getCacheInfo() + { + return $this->memcached->getStats(); + } + + /** + * {@inheritDoc} + */ + public function getMetaData(string $key) + { + $key = static::validateKey($key, $this->prefix); + $stored = $this->memcached->get($key); + + // if not an array, don't try to count for PHP7.2 + if (! is_array($stored) || count($stored) !== 3) { + return false; // @TODO This will return null in a future release + } + + [$data, $time, $limit] = $stored; + + return [ + 'expire' => $limit > 0 ? $time + $limit : null, + 'mtime' => $time, + 'data' => $data, + ]; + } + + /** + * {@inheritDoc} + */ + public function isSupported(): bool + { + return extension_loaded('memcached') || extension_loaded('memcache'); + } +} diff --git a/system/Cache/Handlers/PredisHandler.php b/system/Cache/Handlers/PredisHandler.php new file mode 100644 index 0000000..5d1f37c --- /dev/null +++ b/system/Cache/Handlers/PredisHandler.php @@ -0,0 +1,227 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Cache\Handlers; + +use CodeIgniter\Exceptions\CriticalError; +use Config\Cache; +use Exception; +use Predis\Client; +use Predis\Collection\Iterator\Keyspace; + +/** + * Predis cache handler + */ +class PredisHandler extends BaseHandler +{ + /** + * Default config + * + * @var array + */ + protected $config = [ + 'scheme' => 'tcp', + 'host' => '127.0.0.1', + 'password' => null, + 'port' => 6379, + 'timeout' => 0, + ]; + + /** + * Predis connection + * + * @var Client + */ + protected $redis; + + public function __construct(Cache $config) + { + $this->prefix = $config->prefix; + + if (isset($config->redis)) { + $this->config = array_merge($this->config, $config->redis); + } + } + + /** + * {@inheritDoc} + */ + public function initialize() + { + try { + $this->redis = new Client($this->config, ['prefix' => $this->prefix]); + $this->redis->time(); + } catch (Exception $e) { + throw new CriticalError('Cache: Predis connection refused (' . $e->getMessage() . ').'); + } + } + + /** + * {@inheritDoc} + */ + public function get(string $key) + { + $key = static::validateKey($key); + + $data = array_combine( + ['__ci_type', '__ci_value'], + $this->redis->hmget($key, ['__ci_type', '__ci_value']) + ); + + if (! isset($data['__ci_type'], $data['__ci_value']) || $data['__ci_value'] === false) { + return null; + } + + switch ($data['__ci_type']) { + case 'array': + case 'object': + return unserialize($data['__ci_value']); + + case 'boolean': + case 'integer': + case 'double': // Yes, 'double' is returned and NOT 'float' + case 'string': + case 'NULL': + return settype($data['__ci_value'], $data['__ci_type']) ? $data['__ci_value'] : null; + + case 'resource': + default: + return null; + } + } + + /** + * {@inheritDoc} + */ + public function save(string $key, $value, int $ttl = 60) + { + $key = static::validateKey($key); + + switch ($dataType = gettype($value)) { + case 'array': + case 'object': + $value = serialize($value); + break; + + case 'boolean': + case 'integer': + case 'double': // Yes, 'double' is returned and NOT 'float' + case 'string': + case 'NULL': + break; + + case 'resource': + default: + return false; + } + + if (! $this->redis->hmset($key, ['__ci_type' => $dataType, '__ci_value' => $value])) { + return false; + } + + if ($ttl) { + $this->redis->expireat($key, time() + $ttl); + } + + return true; + } + + /** + * {@inheritDoc} + */ + public function delete(string $key) + { + $key = static::validateKey($key); + + return $this->redis->del($key) === 1; + } + + /** + * {@inheritDoc} + */ + public function deleteMatching(string $pattern) + { + $matchedKeys = []; + + foreach (new Keyspace($this->redis, $pattern) as $key) { + $matchedKeys[] = $key; + } + + return $this->redis->del($matchedKeys); + } + + /** + * {@inheritDoc} + */ + public function increment(string $key, int $offset = 1) + { + $key = static::validateKey($key); + + return $this->redis->hincrby($key, 'data', $offset); + } + + /** + * {@inheritDoc} + */ + public function decrement(string $key, int $offset = 1) + { + $key = static::validateKey($key); + + return $this->redis->hincrby($key, 'data', -$offset); + } + + /** + * {@inheritDoc} + */ + public function clean() + { + return $this->redis->flushdb()->getPayload() === 'OK'; + } + + /** + * {@inheritDoc} + */ + public function getCacheInfo() + { + return $this->redis->info(); + } + + /** + * {@inheritDoc} + */ + public function getMetaData(string $key) + { + $key = static::validateKey($key); + + $data = array_combine(['__ci_value'], $this->redis->hmget($key, ['__ci_value'])); + + if (isset($data['__ci_value']) && $data['__ci_value'] !== false) { + $time = time(); + $ttl = $this->redis->ttl($key); + + return [ + 'expire' => $ttl > 0 ? time() + $ttl : null, + 'mtime' => $time, + 'data' => $data['__ci_value'], + ]; + } + + return null; + } + + /** + * {@inheritDoc} + */ + public function isSupported(): bool + { + return class_exists('Predis\Client'); + } +} diff --git a/system/Cache/Handlers/RedisHandler.php b/system/Cache/Handlers/RedisHandler.php new file mode 100644 index 0000000..553825f --- /dev/null +++ b/system/Cache/Handlers/RedisHandler.php @@ -0,0 +1,263 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Cache\Handlers; + +use CodeIgniter\Exceptions\CriticalError; +use Config\Cache; +use Redis; +use RedisException; + +/** + * Redis cache handler + */ +class RedisHandler extends BaseHandler +{ + /** + * Default config + * + * @var array + */ + protected $config = [ + 'host' => '127.0.0.1', + 'password' => null, + 'port' => 6379, + 'timeout' => 0, + 'database' => 0, + ]; + + /** + * Redis connection + * + * @var Redis + */ + protected $redis; + + public function __construct(Cache $config) + { + $this->prefix = $config->prefix; + + if (! empty($config)) { + $this->config = array_merge($this->config, $config->redis); + } + } + + /** + * Closes the connection to Redis if present. + */ + public function __destruct() + { + if (isset($this->redis)) { + $this->redis->close(); + } + } + + /** + * {@inheritDoc} + */ + public function initialize() + { + $config = $this->config; + + $this->redis = new Redis(); + + try { + // Note:: If Redis is your primary cache choice, and it is "offline", every page load will end up been delayed by the timeout duration. + // I feel like some sort of temporary flag should be set, to indicate that we think Redis is "offline", allowing us to bypass the timeout for a set period of time. + + if (! $this->redis->connect($config['host'], ($config['host'][0] === '/' ? 0 : $config['port']), $config['timeout'])) { + // Note:: I'm unsure if log_message() is necessary, however I'm not 100% comfortable removing it. + log_message('error', 'Cache: Redis connection failed. Check your configuration.'); + + throw new CriticalError('Cache: Redis connection failed. Check your configuration.'); + } + + if (isset($config['password']) && ! $this->redis->auth($config['password'])) { + log_message('error', 'Cache: Redis authentication failed.'); + + throw new CriticalError('Cache: Redis authentication failed.'); + } + + if (isset($config['database']) && ! $this->redis->select($config['database'])) { + log_message('error', 'Cache: Redis select database failed.'); + + throw new CriticalError('Cache: Redis select database failed.'); + } + } catch (RedisException $e) { + throw new CriticalError('Cache: RedisException occurred with message (' . $e->getMessage() . ').'); + } + } + + /** + * {@inheritDoc} + */ + public function get(string $key) + { + $key = static::validateKey($key, $this->prefix); + $data = $this->redis->hMGet($key, ['__ci_type', '__ci_value']); + + if (! isset($data['__ci_type'], $data['__ci_value']) || $data['__ci_value'] === false) { + return null; + } + + switch ($data['__ci_type']) { + case 'array': + case 'object': + return unserialize($data['__ci_value']); + + case 'boolean': + case 'integer': + case 'double': // Yes, 'double' is returned and NOT 'float' + case 'string': + case 'NULL': + return settype($data['__ci_value'], $data['__ci_type']) ? $data['__ci_value'] : null; + + case 'resource': + default: + return null; + } + } + + /** + * {@inheritDoc} + */ + public function save(string $key, $value, int $ttl = 60) + { + $key = static::validateKey($key, $this->prefix); + + switch ($dataType = gettype($value)) { + case 'array': + case 'object': + $value = serialize($value); + break; + + case 'boolean': + case 'integer': + case 'double': // Yes, 'double' is returned and NOT 'float' + case 'string': + case 'NULL': + break; + + case 'resource': + default: + return false; + } + + if (! $this->redis->hMSet($key, ['__ci_type' => $dataType, '__ci_value' => $value])) { + return false; + } + + if ($ttl) { + $this->redis->expireAt($key, time() + $ttl); + } + + return true; + } + + /** + * {@inheritDoc} + */ + public function delete(string $key) + { + $key = static::validateKey($key, $this->prefix); + + return $this->redis->del($key) === 1; + } + + /** + * {@inheritDoc} + */ + public function deleteMatching(string $pattern) + { + $matchedKeys = []; + $iterator = null; + + do { + // Scan for some keys + $keys = $this->redis->scan($iterator, $pattern); + + // Redis may return empty results, so protect against that + if ($keys !== false) { + foreach ($keys as $key) { + $matchedKeys[] = $key; + } + } + } while ($iterator > 0); + + return $this->redis->del($matchedKeys); + } + + /** + * {@inheritDoc} + */ + public function increment(string $key, int $offset = 1) + { + $key = static::validateKey($key, $this->prefix); + + return $this->redis->hIncrBy($key, 'data', $offset); + } + + /** + * {@inheritDoc} + */ + public function decrement(string $key, int $offset = 1) + { + $key = static::validateKey($key, $this->prefix); + + return $this->redis->hIncrBy($key, 'data', -$offset); + } + + /** + * {@inheritDoc} + */ + public function clean() + { + return $this->redis->flushDB(); + } + + /** + * {@inheritDoc} + */ + public function getCacheInfo() + { + return $this->redis->info(); + } + + /** + * {@inheritDoc} + */ + public function getMetaData(string $key) + { + $key = static::validateKey($key, $this->prefix); + $value = $this->get($key); + + if ($value !== null) { + $time = time(); + $ttl = $this->redis->ttl($key); + + return [ + 'expire' => $ttl > 0 ? time() + $ttl : null, + 'mtime' => $time, + 'data' => $value, + ]; + } + + return null; + } + + /** + * {@inheritDoc} + */ + public function isSupported(): bool + { + return extension_loaded('redis'); + } +} diff --git a/system/Cache/Handlers/WincacheHandler.php b/system/Cache/Handlers/WincacheHandler.php new file mode 100644 index 0000000..b13ee30 --- /dev/null +++ b/system/Cache/Handlers/WincacheHandler.php @@ -0,0 +1,144 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Cache\Handlers; + +use Config\Cache; +use Exception; + +/** + * Cache handler for WinCache from Microsoft & IIS. + * + * @codeCoverageIgnore + */ +class WincacheHandler extends BaseHandler +{ + public function __construct(Cache $config) + { + $this->prefix = $config->prefix; + } + + /** + * {@inheritDoc} + */ + public function initialize() + { + } + + /** + * {@inheritDoc} + */ + public function get(string $key) + { + $key = static::validateKey($key, $this->prefix); + $success = false; + + $data = wincache_ucache_get($key, $success); + + // Success returned by reference from wincache_ucache_get() + return $success ? $data : null; + } + + /** + * {@inheritDoc} + */ + public function save(string $key, $value, int $ttl = 60) + { + $key = static::validateKey($key, $this->prefix); + + return wincache_ucache_set($key, $value, $ttl); + } + + /** + * {@inheritDoc} + */ + public function delete(string $key) + { + $key = static::validateKey($key, $this->prefix); + + return wincache_ucache_delete($key); + } + + /** + * {@inheritDoc} + */ + public function deleteMatching(string $pattern) + { + throw new Exception('The deleteMatching method is not implemented for Wincache. You must select File, Redis or Predis handlers to use it.'); + } + + /** + * {@inheritDoc} + */ + public function increment(string $key, int $offset = 1) + { + $key = static::validateKey($key, $this->prefix); + + return wincache_ucache_inc($key, $offset); + } + + /** + * {@inheritDoc} + */ + public function decrement(string $key, int $offset = 1) + { + $key = static::validateKey($key, $this->prefix); + + return wincache_ucache_dec($key, $offset); + } + + /** + * {@inheritDoc} + */ + public function clean() + { + return wincache_ucache_clear(); + } + + /** + * {@inheritDoc} + */ + public function getCacheInfo() + { + return wincache_ucache_info(true); + } + + /** + * {@inheritDoc} + */ + public function getMetaData(string $key) + { + $key = static::validateKey($key, $this->prefix); + + if ($stored = wincache_ucache_info(false, $key)) { + $age = $stored['ucache_entries'][1]['age_seconds']; + $ttl = $stored['ucache_entries'][1]['ttl_seconds']; + $hitcount = $stored['ucache_entries'][1]['hitcount']; + + return [ + 'expire' => $ttl > 0 ? time() + $ttl : null, + 'hitcount' => $hitcount, + 'age' => $age, + 'ttl' => $ttl, + ]; + } + + return false; // @TODO This will return null in a future release + } + + /** + * {@inheritDoc} + */ + public function isSupported(): bool + { + return extension_loaded('wincache') && ini_get('wincache.ucenabled'); + } +} diff --git a/system/CodeIgniter.php b/system/CodeIgniter.php new file mode 100644 index 0000000..5704e57 --- /dev/null +++ b/system/CodeIgniter.php @@ -0,0 +1,1014 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter; + +use Closure; +use CodeIgniter\Debug\Kint\RichRenderer; +use CodeIgniter\Debug\Timer; +use CodeIgniter\Events\Events; +use CodeIgniter\Exceptions\FrameworkException; +use CodeIgniter\Exceptions\PageNotFoundException; +use CodeIgniter\HTTP\CLIRequest; +use CodeIgniter\HTTP\DownloadResponse; +use CodeIgniter\HTTP\IncomingRequest; +use CodeIgniter\HTTP\RedirectResponse; +use CodeIgniter\HTTP\Request; +use CodeIgniter\HTTP\RequestInterface; +use CodeIgniter\HTTP\ResponseInterface; +use CodeIgniter\HTTP\URI; +use CodeIgniter\Router\Exceptions\RedirectException; +use CodeIgniter\Router\RouteCollectionInterface; +use CodeIgniter\Router\Router; +use Config\App; +use Config\Cache; +use Config\Services; +use Exception; +use Kint; +use Kint\Renderer\CliRenderer; + +/** + * This class is the core of the framework, and will analyse the + * request, route it to a controller, and send back the response. + * Of course, there are variations to that flow, but this is the brains. + */ +class CodeIgniter +{ + /** + * The current version of CodeIgniter Framework + */ + public const CI_VERSION = '4.1.9'; + + private const MIN_PHP_VERSION = '7.3'; + + /** + * App startup time. + * + * @var mixed + */ + protected $startTime; + + /** + * Total app execution time + * + * @var float + */ + protected $totalTime; + + /** + * Main application configuration + * + * @var App + */ + protected $config; + + /** + * Timer instance. + * + * @var Timer + */ + protected $benchmark; + + /** + * Current request. + * + * @var CLIRequest|IncomingRequest|Request + */ + protected $request; + + /** + * Current response. + * + * @var ResponseInterface + */ + protected $response; + + /** + * Router to use. + * + * @var Router + */ + protected $router; + + /** + * Controller to use. + * + * @var Closure|string + */ + protected $controller; + + /** + * Controller method to invoke. + * + * @var string + */ + protected $method; + + /** + * Output handler to use. + * + * @var string + */ + protected $output; + + /** + * Cache expiration time + * + * @var int + */ + protected static $cacheTTL = 0; + + /** + * Request path to use. + * + * @var string + */ + protected $path; + + /** + * Should the Response instance "pretend" + * to keep from setting headers/cookies/etc + * + * @var bool + */ + protected $useSafeOutput = false; + + /** + * Constructor. + */ + public function __construct(App $config) + { + if (version_compare(PHP_VERSION, self::MIN_PHP_VERSION, '<')) { + // @codeCoverageIgnoreStart + $message = extension_loaded('intl') + ? lang('Core.invalidPhpVersion', [self::MIN_PHP_VERSION, PHP_VERSION]) + : sprintf('Your PHP version must be %s or higher to run CodeIgniter. Current version: %s', self::MIN_PHP_VERSION, PHP_VERSION); + + exit($message); + // @codeCoverageIgnoreEnd + } + + $this->startTime = microtime(true); + $this->config = $config; + } + + /** + * Handles some basic app and environment setup. + */ + public function initialize() + { + // Define environment variables + $this->detectEnvironment(); + $this->bootstrapEnvironment(); + + // Setup Exception Handling + Services::exceptions()->initialize(); + + // Run this check for manual installations + if (! is_file(COMPOSER_PATH)) { + $this->resolvePlatformExtensions(); // @codeCoverageIgnore + } + + // Set default locale on the server + locale_set_default($this->config->defaultLocale ?? 'en'); + + // Set default timezone on the server + date_default_timezone_set($this->config->appTimezone ?? 'UTC'); + + $this->initializeKint(); + + if (! CI_DEBUG) { + Kint::$enabled_mode = false; // @codeCoverageIgnore + } + } + + /** + * Checks system for missing required PHP extensions. + * + * @throws FrameworkException + * + * @codeCoverageIgnore + */ + protected function resolvePlatformExtensions() + { + $requiredExtensions = [ + 'curl', + 'intl', + 'json', + 'mbstring', + 'xml', + ]; + + $missingExtensions = []; + + foreach ($requiredExtensions as $extension) { + if (! extension_loaded($extension)) { + $missingExtensions[] = $extension; + } + } + + if ($missingExtensions !== []) { + throw FrameworkException::forMissingExtension(implode(', ', $missingExtensions)); + } + } + + /** + * Initializes Kint + */ + protected function initializeKint() + { + // If we have KINT_DIR it means it's already loaded via composer + if (! defined('KINT_DIR')) { + spl_autoload_register(function ($class) { + $class = explode('\\', $class); + + if (array_shift($class) !== 'Kint') { + return; + } + + $file = SYSTEMPATH . 'ThirdParty/Kint/' . implode('/', $class) . '.php'; + + if (file_exists($file)) { + require_once $file; + } + }); + + require_once SYSTEMPATH . 'ThirdParty/Kint/init.php'; + } + + /** + * Config\Kint + */ + $config = config('Config\Kint'); + + Kint::$depth_limit = $config->maxDepth; + Kint::$display_called_from = $config->displayCalledFrom; + Kint::$expanded = $config->expanded; + + if (! empty($config->plugins) && is_array($config->plugins)) { + Kint::$plugins = $config->plugins; + } + + Kint::$renderers[Kint::MODE_RICH] = RichRenderer::class; + + RichRenderer::$theme = $config->richTheme; + RichRenderer::$folder = $config->richFolder; + RichRenderer::$sort = $config->richSort; + if (! empty($config->richObjectPlugins) && is_array($config->richObjectPlugins)) { + RichRenderer::$value_plugins = $config->richObjectPlugins; + } + if (! empty($config->richTabPlugins) && is_array($config->richTabPlugins)) { + RichRenderer::$tab_plugins = $config->richTabPlugins; + } + + CliRenderer::$cli_colors = $config->cliColors; + CliRenderer::$force_utf8 = $config->cliForceUTF8; + CliRenderer::$detect_width = $config->cliDetectWidth; + CliRenderer::$min_terminal_width = $config->cliMinWidth; + } + + /** + * Launch the application! + * + * This is "the loop" if you will. The main entry point into the script + * that gets the required class instances, fires off the filters, + * tries to route the response, loads the controller and generally + * makes all of the pieces work together. + * + * @throws Exception + * @throws RedirectException + * + * @return bool|mixed|RequestInterface|ResponseInterface + */ + public function run(?RouteCollectionInterface $routes = null, bool $returnResponse = false) + { + $this->startBenchmark(); + + $this->getRequestObject(); + $this->getResponseObject(); + + $this->forceSecureAccess(); + + $this->spoofRequestMethod(); + + if ($this->request instanceof IncomingRequest && $this->request->getMethod() === 'cli') { + $this->response->setStatusCode(405)->setBody('Method Not Allowed'); + + return $this->sendResponse(); + } + + Events::trigger('pre_system'); + + // Check for a cached page. Execution will stop + // if the page has been cached. + $cacheConfig = new Cache(); + $response = $this->displayCache($cacheConfig); + if ($response instanceof ResponseInterface) { + if ($returnResponse) { + return $response; + } + + $this->response->pretend($this->useSafeOutput)->send(); + $this->callExit(EXIT_SUCCESS); + + return; + } + + try { + return $this->handleRequest($routes, $cacheConfig, $returnResponse); + } catch (RedirectException $e) { + $logger = Services::logger(); + $logger->info('REDIRECTED ROUTE at ' . $e->getMessage()); + + // If the route is a 'redirect' route, it throws + // the exception with the $to as the message + $this->response->redirect(base_url($e->getMessage()), 'auto', $e->getCode()); + $this->sendResponse(); + + $this->callExit(EXIT_SUCCESS); + + return; + } catch (PageNotFoundException $e) { + $this->display404errors($e); + } + } + + /** + * Set our Response instance to "pretend" mode so that things like + * cookies and headers are not actually sent, allowing PHP 7.2+ to + * not complain when ini_set() function is used. + * + * @return $this + */ + public function useSafeOutput(bool $safe = true) + { + $this->useSafeOutput = $safe; + + return $this; + } + + /** + * Handles the main request logic and fires the controller. + * + * @throws PageNotFoundException + * @throws RedirectException + * + * @return mixed|RequestInterface|ResponseInterface + */ + protected function handleRequest(?RouteCollectionInterface $routes, Cache $cacheConfig, bool $returnResponse = false) + { + $routeFilter = $this->tryToRouteIt($routes); + + $uri = $this->determinePath(); + + // Start up the filters + $filters = Services::filters(); + + // If any filters were specified within the routes file, + // we need to ensure it's active for the current request + if ($routeFilter !== null) { + $multipleFiltersEnabled = config('Feature')->multipleFilters ?? false; + if ($multipleFiltersEnabled) { + $filters->enableFilters($routeFilter, 'before'); + $filters->enableFilters($routeFilter, 'after'); + } else { + // for backward compatibility + $filters->enableFilter($routeFilter, 'before'); + $filters->enableFilter($routeFilter, 'after'); + } + } + + // Never run filters when running through Spark cli + if (! defined('SPARKED')) { + // Run "before" filters + $this->benchmark->start('before_filters'); + $possibleResponse = $filters->run($uri, 'before'); + $this->benchmark->stop('before_filters'); + + // If a ResponseInterface instance is returned then send it back to the client and stop + if ($possibleResponse instanceof ResponseInterface) { + return $returnResponse ? $possibleResponse : $possibleResponse->pretend($this->useSafeOutput)->send(); + } + + if ($possibleResponse instanceof Request) { + $this->request = $possibleResponse; + } + } + + $returned = $this->startController(); + + // Closure controller has run in startController(). + if (! is_callable($this->controller)) { + $controller = $this->createController(); + + if (! method_exists($controller, '_remap') && ! is_callable([$controller, $this->method], false)) { + throw PageNotFoundException::forMethodNotFound($this->method); + } + + // Is there a "post_controller_constructor" event? + Events::trigger('post_controller_constructor'); + + $returned = $this->runController($controller); + } else { + $this->benchmark->stop('controller_constructor'); + $this->benchmark->stop('controller'); + } + + // If $returned is a string, then the controller output something, + // probably a view, instead of echoing it directly. Send it along + // so it can be used with the output. + $this->gatherOutput($cacheConfig, $returned); + + // Never run filters when running through Spark cli + if (! defined('SPARKED')) { + $filters->setResponse($this->response); + + // Run "after" filters + $this->benchmark->start('after_filters'); + $response = $filters->run($uri, 'after'); + $this->benchmark->stop('after_filters'); + } else { + $response = $this->response; + + // Set response code for CLI command failures + if (is_numeric($returned) || $returned === false) { + $response->setStatusCode(400); + } + } + + if ($response instanceof ResponseInterface) { + $this->response = $response; + } + + // Save our current URI as the previous URI in the session + // for safer, more accurate use with `previous_url()` helper function. + $this->storePreviousURL(current_url(true)); + + unset($uri); + + if (! $returnResponse) { + $this->sendResponse(); + } + + // Is there a post-system event? + Events::trigger('post_system'); + + return $this->response; + } + + /** + * You can load different configurations depending on your + * current environment. Setting the environment also influences + * things like logging and error reporting. + * + * This can be set to anything, but default usage is: + * + * development + * testing + * production + * + * @codeCoverageIgnore + */ + protected function detectEnvironment() + { + // Make sure ENVIRONMENT isn't already set by other means. + if (! defined('ENVIRONMENT')) { + define('ENVIRONMENT', $_SERVER['CI_ENVIRONMENT'] ?? 'production'); + } + } + + /** + * Load any custom boot files based upon the current environment. + * + * If no boot file exists, we shouldn't continue because something + * is wrong. At the very least, they should have error reporting setup. + */ + protected function bootstrapEnvironment() + { + if (is_file(APPPATH . 'Config/Boot/' . ENVIRONMENT . '.php')) { + require_once APPPATH . 'Config/Boot/' . ENVIRONMENT . '.php'; + } else { + // @codeCoverageIgnoreStart + header('HTTP/1.1 503 Service Unavailable.', true, 503); + echo 'The application environment is not set correctly.'; + + exit(EXIT_ERROR); // EXIT_ERROR + // @codeCoverageIgnoreEnd + } + } + + /** + * Start the Benchmark + * + * The timer is used to display total script execution both in the + * debug toolbar, and potentially on the displayed page. + */ + protected function startBenchmark() + { + if ($this->startTime === null) { + $this->startTime = microtime(true); + } + + $this->benchmark = Services::timer(); + $this->benchmark->start('total_execution', $this->startTime); + $this->benchmark->start('bootstrap'); + } + + /** + * Sets a Request object to be used for this request. + * Used when running certain tests. + * + * @return $this + */ + public function setRequest(Request $request) + { + $this->request = $request; + + return $this; + } + + /** + * Get our Request object, (either IncomingRequest or CLIRequest) + * and set the server protocol based on the information provided + * by the server. + */ + protected function getRequestObject() + { + if ($this->request instanceof Request) { + return; + } + + if (is_cli() && ENVIRONMENT !== 'testing') { + // @codeCoverageIgnoreStart + $this->request = Services::clirequest($this->config); + // @codeCoverageIgnoreEnd + } else { + $this->request = Services::request($this->config); + // guess at protocol if needed + $this->request->setProtocolVersion($_SERVER['SERVER_PROTOCOL'] ?? 'HTTP/1.1'); + } + } + + /** + * Get our Response object, and set some default values, including + * the HTTP protocol version and a default successful response. + */ + protected function getResponseObject() + { + $this->response = Services::response($this->config); + + if (! is_cli() || ENVIRONMENT === 'testing') { + $this->response->setProtocolVersion($this->request->getProtocolVersion()); + } + + // Assume success until proven otherwise. + $this->response->setStatusCode(200); + } + + /** + * Force Secure Site Access? If the config value 'forceGlobalSecureRequests' + * is true, will enforce that all requests to this site are made through + * HTTPS. Will redirect the user to the current page with HTTPS, as well + * as set the HTTP Strict Transport Security header for those browsers + * that support it. + * + * @param int $duration How long the Strict Transport Security + * should be enforced for this URL. + */ + protected function forceSecureAccess($duration = 31536000) + { + if ($this->config->forceGlobalSecureRequests !== true) { + return; + } + + force_https($duration, $this->request, $this->response); + } + + /** + * Determines if a response has been cached for the given URI. + * + * @throws Exception + * + * @return bool|ResponseInterface + */ + public function displayCache(Cache $config) + { + if ($cachedResponse = cache()->get($this->generateCacheName($config))) { + $cachedResponse = unserialize($cachedResponse); + if (! is_array($cachedResponse) || ! isset($cachedResponse['output']) || ! isset($cachedResponse['headers'])) { + throw new Exception('Error unserializing page cache'); + } + + $headers = $cachedResponse['headers']; + $output = $cachedResponse['output']; + + // Clear all default headers + foreach (array_keys($this->response->headers()) as $key) { + $this->response->removeHeader($key); + } + + // Set cached headers + foreach ($headers as $name => $value) { + $this->response->setHeader($name, $value); + } + + $output = $this->displayPerformanceMetrics($output); + $this->response->setBody($output); + + return $this->response; + } + + return false; + } + + /** + * Tells the app that the final output should be cached. + */ + public static function cache(int $time) + { + static::$cacheTTL = $time; + } + + /** + * Caches the full response from the current request. Used for + * full-page caching for very high performance. + * + * @return mixed + */ + public function cachePage(Cache $config) + { + $headers = []; + + foreach ($this->response->headers() as $header) { + $headers[$header->getName()] = $header->getValueLine(); + } + + return cache()->save($this->generateCacheName($config), serialize(['headers' => $headers, 'output' => $this->output]), static::$cacheTTL); + } + + /** + * Returns an array with our basic performance stats collected. + */ + public function getPerformanceStats(): array + { + return [ + 'startTime' => $this->startTime, + 'totalTime' => $this->totalTime, + ]; + } + + /** + * Generates the cache name to use for our full-page caching. + */ + protected function generateCacheName(Cache $config): string + { + if ($this->request instanceof CLIRequest) { + return md5($this->request->getPath()); + } + + $uri = $this->request->getUri(); + + if ($config->cacheQueryString) { + $name = URI::createURIString($uri->getScheme(), $uri->getAuthority(), $uri->getPath(), $uri->getQuery()); + } else { + $name = URI::createURIString($uri->getScheme(), $uri->getAuthority(), $uri->getPath()); + } + + return md5($name); + } + + /** + * Replaces the elapsed_time tag. + */ + public function displayPerformanceMetrics(string $output): string + { + $this->totalTime = $this->benchmark->getElapsedTime('total_execution'); + + return str_replace('{elapsed_time}', (string) $this->totalTime, $output); + } + + /** + * Try to Route It - As it sounds like, works with the router to + * match a route against the current URI. If the route is a + * "redirect route", will also handle the redirect. + * + * @param RouteCollectionInterface|null $routes An collection interface to use in place + * of the config file. + * + * @throws RedirectException + * + * @return string|string[]|null + */ + protected function tryToRouteIt(?RouteCollectionInterface $routes = null) + { + if ($routes === null) { + require APPPATH . 'Config/Routes.php'; + } + + // $routes is defined in Config/Routes.php + $this->router = Services::router($routes, $this->request); + + $path = $this->determinePath(); + + $this->benchmark->stop('bootstrap'); + $this->benchmark->start('routing'); + + ob_start(); + + $this->controller = $this->router->handle($path); + $this->method = $this->router->methodName(); + + // If a {locale} segment was matched in the final route, + // then we need to set the correct locale on our Request. + if ($this->router->hasLocale()) { + $this->request->setLocale($this->router->getLocale()); + } + + $this->benchmark->stop('routing'); + + // for backward compatibility + $multipleFiltersEnabled = config('Feature')->multipleFilters ?? false; + if (! $multipleFiltersEnabled) { + return $this->router->getFilter(); + } + + return $this->router->getFilters(); + } + + /** + * Determines the path to use for us to try to route to, based + * on user input (setPath), or the CLI/IncomingRequest path. + */ + protected function determinePath() + { + if (! empty($this->path)) { + return $this->path; + } + + return method_exists($this->request, 'getPath') ? $this->request->getPath() : $this->request->getUri()->getPath(); + } + + /** + * Allows the request path to be set from outside the class, + * instead of relying on CLIRequest or IncomingRequest for the path. + * + * This is primarily used by the Console. + * + * @return $this + */ + public function setPath(string $path) + { + $this->path = $path; + + return $this; + } + + /** + * Now that everything has been setup, this method attempts to run the + * controller method and make the script go. If it's not able to, will + * show the appropriate Page Not Found error. + */ + protected function startController() + { + $this->benchmark->start('controller'); + $this->benchmark->start('controller_constructor'); + + // Is it routed to a Closure? + if (is_object($this->controller) && (get_class($this->controller) === 'Closure')) { + $controller = $this->controller; + + return $controller(...$this->router->params()); + } + + // No controller specified - we don't know what to do now. + if (empty($this->controller)) { + throw PageNotFoundException::forEmptyController(); + } + + // Try to autoload the class + if (! class_exists($this->controller, true) || $this->method[0] === '_') { + throw PageNotFoundException::forControllerNotFound($this->controller, $this->method); + } + } + + /** + * Instantiates the controller class. + * + * @return mixed + */ + protected function createController() + { + $class = new $this->controller(); + $class->initController($this->request, $this->response, Services::logger()); + + $this->benchmark->stop('controller_constructor'); + + return $class; + } + + /** + * Runs the controller, allowing for _remap methods to function. + * + * @param mixed $class + * + * @return mixed + */ + protected function runController($class) + { + // If this is a console request then use the input segments as parameters + $params = defined('SPARKED') ? $this->request->getSegments() : $this->router->params(); + + if (method_exists($class, '_remap')) { + $output = $class->_remap($this->method, ...$params); + } else { + $output = $class->{$this->method}(...$params); + } + + $this->benchmark->stop('controller'); + + return $output; + } + + /** + * Displays a 404 Page Not Found error. If set, will try to + * call the 404Override controller/method that was set in routing config. + */ + protected function display404errors(PageNotFoundException $e) + { + // Is there a 404 Override available? + if ($override = $this->router->get404Override()) { + if ($override instanceof Closure) { + echo $override($e->getMessage()); + } elseif (is_array($override)) { + $this->benchmark->start('controller'); + $this->benchmark->start('controller_constructor'); + + $this->controller = $override[0]; + $this->method = $override[1]; + + $controller = $this->createController(); + $this->runController($controller); + } + + unset($override); + + $cacheConfig = new Cache(); + $this->gatherOutput($cacheConfig); + $this->sendResponse(); + + return; + } + + // Display 404 Errors + $this->response->setStatusCode($e->getCode()); + + if (ENVIRONMENT !== 'testing') { + // @codeCoverageIgnoreStart + if (ob_get_level() > 0) { + ob_end_flush(); + } + // @codeCoverageIgnoreEnd + } + // When testing, one is for phpunit, another is for test case. + elseif (ob_get_level() > 2) { + ob_end_flush(); // @codeCoverageIgnore + } + + throw PageNotFoundException::forPageNotFound(ENVIRONMENT !== 'production' || is_cli() ? $e->getMessage() : ''); + } + + /** + * Gathers the script output from the buffer, replaces some execution + * time tag in the output and displays the debug toolbar, if required. + * + * @param mixed|null $returned + */ + protected function gatherOutput(?Cache $cacheConfig = null, $returned = null) + { + $this->output = ob_get_contents(); + // If buffering is not null. + // Clean (erase) the output buffer and turn off output buffering + if (ob_get_length()) { + ob_end_clean(); + } + + if ($returned instanceof DownloadResponse) { + $this->response = $returned; + + return; + } + // If the controller returned a response object, + // we need to grab the body from it so it can + // be added to anything else that might have been + // echoed already. + // We also need to save the instance locally + // so that any status code changes, etc, take place. + if ($returned instanceof ResponseInterface) { + $this->response = $returned; + $returned = $returned->getBody(); + } + + if (is_string($returned)) { + $this->output .= $returned; + } + + // Cache it without the performance metrics replaced + // so that we can have live speed updates along the way. + if (static::$cacheTTL > 0) { + $this->cachePage($cacheConfig); + } + + $this->output = $this->displayPerformanceMetrics($this->output); + + $this->response->setBody($this->output); + } + + /** + * If we have a session object to use, store the current URI + * as the previous URI. This is called just prior to sending the + * response to the client, and will make it available next request. + * + * This helps provider safer, more reliable previous_url() detection. + * + * @param string|URI $uri + */ + public function storePreviousURL($uri) + { + // Ignore CLI requests + if (is_cli() && ENVIRONMENT !== 'testing') { + return; // @codeCoverageIgnore + } + // Ignore AJAX requests + if (method_exists($this->request, 'isAJAX') && $this->request->isAJAX()) { + return; + } + + // Ignore unroutable responses + if ($this->response instanceof DownloadResponse || $this->response instanceof RedirectResponse) { + return; + } + + // This is mainly needed during testing... + if (is_string($uri)) { + $uri = new URI($uri); + } + + if (isset($_SESSION)) { + $_SESSION['_ci_previous_url'] = URI::createURIString($uri->getScheme(), $uri->getAuthority(), $uri->getPath(), $uri->getQuery(), $uri->getFragment()); + } + } + + /** + * Modifies the Request Object to use a different method if a POST + * variable called _method is found. + */ + public function spoofRequestMethod() + { + // Only works with POSTED forms + if ($this->request->getMethod() !== 'post') { + return; + } + + $method = $this->request->getPost('_method'); + + if (empty($method)) { + return; + } + + // Only allows PUT, PATCH, DELETE + if (in_array(strtoupper($method), ['PUT', 'PATCH', 'DELETE'], true)) { + $this->request = $this->request->setMethod($method); + } + } + + /** + * Sends the output of this request back to the client. + * This is what they've been waiting for! + */ + protected function sendResponse() + { + $this->response->pretend($this->useSafeOutput)->send(); + } + + /** + * Exits the application, setting the exit code for CLI-based applications + * that might be watching. + * + * Made into a separate method so that it can be mocked during testing + * without actually stopping script execution. + * + * @param int $code + */ + protected function callExit($code) + { + exit($code); // @codeCoverageIgnore + } +} diff --git a/system/Commands/Cache/ClearCache.php b/system/Commands/Cache/ClearCache.php new file mode 100644 index 0000000..bb98177 --- /dev/null +++ b/system/Commands/Cache/ClearCache.php @@ -0,0 +1,87 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Commands\Cache; + +use CodeIgniter\Cache\CacheFactory; +use CodeIgniter\CLI\BaseCommand; +use CodeIgniter\CLI\CLI; + +/** + * Clears current cache. + */ +class ClearCache extends BaseCommand +{ + /** + * Command grouping. + * + * @var string + */ + protected $group = 'Cache'; + + /** + * The Command's name + * + * @var string + */ + protected $name = 'cache:clear'; + + /** + * the Command's short description + * + * @var string + */ + protected $description = 'Clears the current system caches.'; + + /** + * the Command's usage + * + * @var string + */ + protected $usage = 'cache:clear [driver]'; + + /** + * the Command's Arguments + * + * @var array + */ + protected $arguments = [ + 'driver' => 'The cache driver to use', + ]; + + /** + * Clears the cache + */ + public function run(array $params) + { + $config = config('Cache'); + $handler = $params[0] ?? $config->handler; + + if (! array_key_exists($handler, $config->validHandlers)) { + CLI::error($handler . ' is not a valid cache handler.'); + + return; + } + + $config->handler = $handler; + $cache = CacheFactory::getHandler($config); + + if (! $cache->clean()) { + // @codeCoverageIgnoreStart + CLI::error('Error while clearing the cache.'); + + return; + // @codeCoverageIgnoreEnd + } + + CLI::write(CLI::color('Cache cleared.', 'green')); + } +} diff --git a/system/Commands/Cache/InfoCache.php b/system/Commands/Cache/InfoCache.php new file mode 100644 index 0000000..db5a51d --- /dev/null +++ b/system/Commands/Cache/InfoCache.php @@ -0,0 +1,88 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Commands\Cache; + +use CodeIgniter\Cache\CacheFactory; +use CodeIgniter\CLI\BaseCommand; +use CodeIgniter\CLI\CLI; +use CodeIgniter\I18n\Time; + +/** + * Shows information on the cache. + */ +class InfoCache extends BaseCommand +{ + /** + * Command grouping. + * + * @var string + */ + protected $group = 'Cache'; + + /** + * The Command's name + * + * @var string + */ + protected $name = 'cache:info'; + + /** + * the Command's short description + * + * @var string + */ + protected $description = 'Shows file cache information in the current system.'; + + /** + * the Command's usage + * + * @var string + */ + protected $usage = 'cache:info'; + + /** + * Clears the cache + */ + public function run(array $params) + { + $config = config('Cache'); + helper('number'); + + if ($config->handler !== 'file') { + CLI::error('This command only supports the file cache handler.'); + + return; + } + + $cache = CacheFactory::getHandler($config); + $caches = $cache->getCacheInfo(); + $tbody = []; + + foreach ($caches as $key => $field) { + $tbody[] = [ + $key, + clean_path($field['server_path']), + number_to_size($field['size']), + Time::createFromTimestamp($field['date']), + ]; + } + + $thead = [ + CLI::color('Name', 'green'), + CLI::color('Server Path', 'green'), + CLI::color('Size', 'green'), + CLI::color('Date', 'green'), + ]; + + CLI::table($tbody, $thead); + } +} diff --git a/system/Commands/Database/CreateDatabase.php b/system/Commands/Database/CreateDatabase.php new file mode 100644 index 0000000..17e1e51 --- /dev/null +++ b/system/Commands/Database/CreateDatabase.php @@ -0,0 +1,155 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Commands\Database; + +use CodeIgniter\CLI\BaseCommand; +use CodeIgniter\CLI\CLI; +use CodeIgniter\Config\Factories; +use CodeIgniter\Database\SQLite3\Connection; +use Config\Database; +use Throwable; + +/** + * Creates a new database. + */ +class CreateDatabase extends BaseCommand +{ + /** + * The group the command is lumped under + * when listing commands. + * + * @var string + */ + protected $group = 'Database'; + + /** + * The Command's name + * + * @var string + */ + protected $name = 'db:create'; + + /** + * the Command's short description + * + * @var string + */ + protected $description = 'Create a new database schema.'; + + /** + * the Command's usage + * + * @var string + */ + protected $usage = 'db:create [options]'; + + /** + * The Command's arguments + * + * @var array + */ + protected $arguments = [ + 'db_name' => 'The database name to use', + ]; + + /** + * The Command's options + * + * @var array + */ + protected $options = [ + '--ext' => 'File extension of the database file for SQLite3. Can be `db` or `sqlite`. Defaults to `db`.', + ]; + + /** + * Creates a new database. + */ + public function run(array $params) + { + $name = array_shift($params); + + if (empty($name)) { + $name = CLI::prompt('Database name', null, 'required'); // @codeCoverageIgnore + } + + try { + /** + * @var Database $config + */ + $config = config('Database'); + + // Set to an empty database to prevent connection errors. + $group = ENVIRONMENT === 'testing' ? 'tests' : $config->defaultGroup; + + $config->{$group}['database'] = ''; + + $db = Database::connect(); + + // Special SQLite3 handling + if ($db instanceof Connection) { + $ext = $params['ext'] ?? CLI::getOption('ext') ?? 'db'; + + if (! in_array($ext, ['db', 'sqlite'], true)) { + $ext = CLI::prompt('Please choose a valid file extension', ['db', 'sqlite']); // @codeCoverageIgnore + } + + if ($name !== ':memory:') { + $name = str_replace(['.db', '.sqlite'], '', $name) . ".{$ext}"; + } + + $config->{$group}['DBDriver'] = 'SQLite3'; + $config->{$group}['database'] = $name; + + if ($name !== ':memory:') { + $dbName = strpos($name, DIRECTORY_SEPARATOR) === false ? WRITEPATH . $name : $name; + + if (is_file($dbName)) { + CLI::error("Database \"{$dbName}\" already exists.", 'light_gray', 'red'); + CLI::newLine(); + + return; + } + + unset($dbName); + } + + // Connect to new SQLite3 to create new database + $db = Database::connect(null, false); + $db->connect(); + + if (! is_file($db->getDatabase()) && $name !== ':memory:') { + // @codeCoverageIgnoreStart + CLI::error('Database creation failed.', 'light_gray', 'red'); + CLI::newLine(); + + return; + // @codeCoverageIgnoreEnd + } + } elseif (! Database::forge()->createDatabase($name)) { + // @codeCoverageIgnoreStart + CLI::error('Database creation failed.', 'light_gray', 'red'); + CLI::newLine(); + + return; + // @codeCoverageIgnoreEnd + } + + CLI::write("Database \"{$name}\" successfully created.", 'green'); + CLI::newLine(); + } catch (Throwable $e) { + $this->showError($e); + } finally { + // Reset the altered config no matter what happens. + Factories::reset('config'); + } + } +} diff --git a/system/Commands/Database/Migrate.php b/system/Commands/Database/Migrate.php new file mode 100644 index 0000000..91a699b --- /dev/null +++ b/system/Commands/Database/Migrate.php @@ -0,0 +1,102 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Commands\Database; + +use CodeIgniter\CLI\BaseCommand; +use CodeIgniter\CLI\CLI; +use Config\Services; +use Throwable; + +/** + * Runs all new migrations. + */ +class Migrate extends BaseCommand +{ + /** + * The group the command is lumped under + * when listing commands. + * + * @var string + */ + protected $group = 'Database'; + + /** + * The Command's name + * + * @var string + */ + protected $name = 'migrate'; + + /** + * the Command's short description + * + * @var string + */ + protected $description = 'Locates and runs all new migrations against the database.'; + + /** + * the Command's usage + * + * @var string + */ + protected $usage = 'migrate [options]'; + + /** + * the Command's Options + * + * @var array + */ + protected $options = [ + '-n' => 'Set migration namespace', + '-g' => 'Set database group', + '--all' => 'Set for all namespaces, will ignore (-n) option', + ]; + + /** + * Ensures that all migrations have been run. + */ + public function run(array $params) + { + $runner = Services::migrations(); + $runner->clearCliMessages(); + + CLI::write(lang('Migrations.latest'), 'yellow'); + + $namespace = $params['n'] ?? CLI::getOption('n'); + $group = $params['g'] ?? CLI::getOption('g'); + + try { + if (array_key_exists('all', $params) || CLI::getOption('all')) { + $runner->setNamespace(null); + } elseif ($namespace) { + $runner->setNamespace($namespace); + } + + if (! $runner->latest($group)) { + CLI::error(lang('Migrations.generalFault'), 'light_gray', 'red'); // @codeCoverageIgnore + } + + $messages = $runner->getCliMessages(); + + foreach ($messages as $message) { + CLI::write($message); + } + + CLI::write('Done migrations.', 'green'); + + // @codeCoverageIgnoreStart + } catch (Throwable $e) { + $this->showError($e); + // @codeCoverageIgnoreEnd + } + } +} diff --git a/system/Commands/Database/MigrateRefresh.php b/system/Commands/Database/MigrateRefresh.php new file mode 100644 index 0000000..689c754 --- /dev/null +++ b/system/Commands/Database/MigrateRefresh.php @@ -0,0 +1,87 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Commands\Database; + +use CodeIgniter\CLI\BaseCommand; +use CodeIgniter\CLI\CLI; + +/** + * Does a rollback followed by a latest to refresh the current state + * of the database. + */ +class MigrateRefresh extends BaseCommand +{ + /** + * The group the command is lumped under + * when listing commands. + * + * @var string + */ + protected $group = 'Database'; + + /** + * The Command's name + * + * @var string + */ + protected $name = 'migrate:refresh'; + + /** + * the Command's short description + * + * @var string + */ + protected $description = 'Does a rollback followed by a latest to refresh the current state of the database.'; + + /** + * the Command's usage + * + * @var string + */ + protected $usage = 'migrate:refresh [options]'; + + /** + * the Command's Options + * + * @var array + */ + protected $options = [ + '-n' => 'Set migration namespace', + '-g' => 'Set database group', + '--all' => 'Set latest for all namespace, will ignore (-n) option', + '-f' => 'Force command - this option allows you to bypass the confirmation question when running this command in a production environment', + ]; + + /** + * Does a rollback followed by a latest to refresh the current state + * of the database. + */ + public function run(array $params) + { + $params['b'] = 0; + + if (ENVIRONMENT === 'production') { + // @codeCoverageIgnoreStart + $force = array_key_exists('f', $params) || CLI::getOption('f'); + + if (! $force && CLI::prompt(lang('Migrations.refreshConfirm'), ['y', 'n']) === 'n') { + return; + } + + $params['f'] = null; + // @codeCoverageIgnoreEnd + } + + $this->call('migrate:rollback', $params); + $this->call('migrate', $params); + } +} diff --git a/system/Commands/Database/MigrateRollback.php b/system/Commands/Database/MigrateRollback.php new file mode 100644 index 0000000..17434da --- /dev/null +++ b/system/Commands/Database/MigrateRollback.php @@ -0,0 +1,110 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Commands\Database; + +use CodeIgniter\CLI\BaseCommand; +use CodeIgniter\CLI\CLI; +use Config\Services; +use Throwable; + +/** + * Runs all of the migrations in reverse order, until they have + * all been unapplied. + */ +class MigrateRollback extends BaseCommand +{ + /** + * The group the command is lumped under + * when listing commands. + * + * @var string + */ + protected $group = 'Database'; + + /** + * The Command's name + * + * @var string + */ + protected $name = 'migrate:rollback'; + + /** + * the Command's short description + * + * @var string + */ + protected $description = 'Runs the "down" method for all migrations in the last batch.'; + + /** + * the Command's usage + * + * @var string + */ + protected $usage = 'migrate:rollback [options]'; + + /** + * the Command's Options + * + * @var array + */ + protected $options = [ + '-b' => 'Specify a batch to roll back to; e.g. "3" to return to batch #3 or "-2" to roll back twice', + '-g' => 'Set database group', + '-f' => 'Force command - this option allows you to bypass the confirmation question when running this command in a production environment', + ]; + + /** + * Runs all of the migrations in reverse order, until they have + * all been unapplied. + */ + public function run(array $params) + { + if (ENVIRONMENT === 'production') { + // @codeCoverageIgnoreStart + $force = array_key_exists('f', $params) || CLI::getOption('f'); + + if (! $force && CLI::prompt(lang('Migrations.rollBackConfirm'), ['y', 'n']) === 'n') { + return; + } + // @codeCoverageIgnoreEnd + } + + $runner = Services::migrations(); + $group = $params['g'] ?? CLI::getOption('g'); + + if (is_string($group)) { + $runner->setGroup($group); + } + + try { + $batch = $params['b'] ?? CLI::getOption('b') ?? $runner->getLastBatch() - 1; + CLI::write(lang('Migrations.rollingBack') . ' ' . $batch, 'yellow'); + + if (! $runner->regress($batch)) { + CLI::error(lang('Migrations.generalFault'), 'light_gray', 'red'); // @codeCoverageIgnore + } + + $messages = $runner->getCliMessages(); + + foreach ($messages as $message) { + CLI::write($message); + } + + CLI::write('Done rolling back migrations.', 'green'); + + // @codeCoverageIgnoreStart + } catch (Throwable $e) { + $this->showError($e); + // @codeCoverageIgnoreEnd + } + } +} diff --git a/system/Commands/Database/MigrateStatus.php b/system/Commands/Database/MigrateStatus.php new file mode 100644 index 0000000..91b5295 --- /dev/null +++ b/system/Commands/Database/MigrateStatus.php @@ -0,0 +1,164 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Commands\Database; + +use CodeIgniter\CLI\BaseCommand; +use CodeIgniter\CLI\CLI; +use Config\Services; + +/** + * Displays a list of all migrations and whether they've been run or not. + */ +class MigrateStatus extends BaseCommand +{ + /** + * The group the command is lumped under + * when listing commands. + * + * @var string + */ + protected $group = 'Database'; + + /** + * The Command's name + * + * @var string + */ + protected $name = 'migrate:status'; + + /** + * the Command's short description + * + * @var string + */ + protected $description = 'Displays a list of all migrations and whether they\'ve been run or not.'; + + /** + * the Command's usage + * + * @var string + */ + protected $usage = 'migrate:status [options]'; + + /** + * the Command's Options + * + * @var array + */ + protected $options = [ + '-g' => 'Set database group', + ]; + + /** + * Namespaces to ignore when looking for migrations. + * + * @var string[] + */ + protected $ignoredNamespaces = [ + 'CodeIgniter', + 'Config', + 'Kint', + 'Laminas\ZendFrameworkBridge', + 'Laminas\Escaper', + 'Psr\Log', + ]; + + /** + * Displays a list of all migrations and whether they've been run or not. + * + * @param array $params + */ + public function run(array $params) + { + $runner = Services::migrations(); + $group = $params['g'] ?? CLI::getOption('g'); + + // Get all namespaces + $namespaces = Services::autoloader()->getNamespace(); + + // Collection of migration status + $status = []; + + foreach (array_keys($namespaces) as $namespace) { + if (ENVIRONMENT !== 'testing') { + // Make Tests\\Support discoverable for testing + $this->ignoredNamespaces[] = 'Tests\Support'; // @codeCoverageIgnore + } + + if (in_array($namespace, $this->ignoredNamespaces, true)) { + continue; + } + + if (APP_NAMESPACE !== 'App' && $namespace === 'App') { + continue; // @codeCoverageIgnore + } + + $migrations = $runner->findNamespaceMigrations($namespace); + + if (empty($migrations)) { + continue; + } + + $history = $runner->getHistory((string) $group); + ksort($migrations); + + foreach ($migrations as $uid => $migration) { + $migrations[$uid]->name = mb_substr($migration->name, mb_strpos($migration->name, $uid . '_')); + + $date = '---'; + $group = '---'; + $batch = '---'; + + foreach ($history as $row) { + // @codeCoverageIgnoreStart + if ($runner->getObjectUid($row) !== $migration->uid) { + continue; + } + + $date = date('Y-m-d H:i:s', $row->time); + $group = $row->group; + $batch = $row->batch; + // @codeCoverageIgnoreEnd + } + + $status[] = [ + $namespace, + $migration->version, + $migration->name, + $group, + $date, + $batch, + ]; + } + } + + if (! $status) { + // @codeCoverageIgnoreStart + CLI::error(lang('Migrations.noneFound'), 'light_gray', 'red'); + CLI::newLine(); + + return; + // @codeCoverageIgnoreEnd + } + + $headers = [ + CLI::color(lang('Migrations.namespace'), 'yellow'), + CLI::color(lang('Migrations.version'), 'yellow'), + CLI::color(lang('Migrations.filename'), 'yellow'), + CLI::color(lang('Migrations.group'), 'yellow'), + CLI::color(str_replace(': ', '', lang('Migrations.on')), 'yellow'), + CLI::color(lang('Migrations.batch'), 'yellow'), + ]; + + CLI::table($status, $headers); + } +} diff --git a/system/Commands/Database/Seed.php b/system/Commands/Database/Seed.php new file mode 100644 index 0000000..adfdd0a --- /dev/null +++ b/system/Commands/Database/Seed.php @@ -0,0 +1,82 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Commands\Database; + +use CodeIgniter\CLI\BaseCommand; +use CodeIgniter\CLI\CLI; +use CodeIgniter\Database\Seeder; +use Config\Database; +use Throwable; + +/** + * Runs the specified Seeder file to populate the database + * with some data. + */ +class Seed extends BaseCommand +{ + /** + * The group the command is lumped under + * when listing commands. + * + * @var string + */ + protected $group = 'Database'; + + /** + * The Command's name + * + * @var string + */ + protected $name = 'db:seed'; + + /** + * the Command's short description + * + * @var string + */ + protected $description = 'Runs the specified seeder to populate known data into the database.'; + + /** + * the Command's usage + * + * @var string + */ + protected $usage = 'db:seed '; + + /** + * the Command's Arguments + * + * @var array + */ + protected $arguments = [ + 'seeder_name' => 'The seeder name to run', + ]; + + /** + * Passes to Seeder to populate the database. + */ + public function run(array $params) + { + $seeder = new Seeder(new Database()); + $seedName = array_shift($params); + + if (empty($seedName)) { + $seedName = CLI::prompt(lang('Migrations.migSeeder'), null, 'required'); // @codeCoverageIgnore + } + + try { + $seeder->call($seedName); + } catch (Throwable $e) { + $this->showError($e); + } + } +} diff --git a/system/Commands/Encryption/GenerateKey.php b/system/Commands/Encryption/GenerateKey.php new file mode 100644 index 0000000..810f2dc --- /dev/null +++ b/system/Commands/Encryption/GenerateKey.php @@ -0,0 +1,188 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Commands\Encryption; + +use CodeIgniter\CLI\BaseCommand; +use CodeIgniter\CLI\CLI; +use CodeIgniter\Config\DotEnv; +use CodeIgniter\Encryption\Encryption; + +/** + * Generates a new encryption key. + */ +class GenerateKey extends BaseCommand +{ + /** + * The Command's group. + * + * @var string + */ + protected $group = 'Encryption'; + + /** + * The Command's name. + * + * @var string + */ + protected $name = 'key:generate'; + + /** + * The Command's usage. + * + * @var string + */ + protected $usage = 'key:generate [options]'; + + /** + * The Command's short description. + * + * @var string + */ + protected $description = 'Generates a new encryption key and writes it in an `.env` file.'; + + /** + * The command's options + * + * @var array + */ + protected $options = [ + '--force' => 'Force overwrite existing key in `.env` file.', + '--length' => 'The length of the random string that should be returned in bytes. Defaults to 32.', + '--prefix' => 'Prefix to prepend to encoded key (either hex2bin or base64). Defaults to hex2bin.', + '--show' => 'Shows the generated key in the terminal instead of storing in the `.env` file.', + ]; + + /** + * Actually execute the command. + */ + public function run(array $params) + { + $prefix = $params['prefix'] ?? CLI::getOption('prefix'); + if (in_array($prefix, [null, true], true)) { + $prefix = 'hex2bin'; + } elseif (! in_array($prefix, ['hex2bin', 'base64'], true)) { + $prefix = CLI::prompt('Please provide a valid prefix to use.', ['hex2bin', 'base64'], 'required'); // @codeCoverageIgnore + } + + $length = $params['length'] ?? CLI::getOption('length'); + if (in_array($length, [null, true], true)) { + $length = 32; + } + + $encodedKey = $this->generateRandomKey($prefix, $length); + + if (array_key_exists('show', $params) || (bool) CLI::getOption('show')) { + CLI::write($encodedKey, 'yellow'); + CLI::newLine(); + + return; + } + + if (! $this->setNewEncryptionKey($encodedKey, $params)) { + CLI::write('Error in setting new encryption key to .env file.', 'light_gray', 'red'); + CLI::newLine(); + + return; + } + + // force DotEnv to reload the new env vars + putenv('encryption.key'); + unset($_ENV['encryption.key'], $_SERVER['encryption.key']); + $dotenv = new DotEnv(ROOTPATH); + $dotenv->load(); + + CLI::write('Application\'s new encryption key was successfully set.', 'green'); + CLI::newLine(); + } + + /** + * Generates a key and encodes it. + */ + protected function generateRandomKey(string $prefix, int $length): string + { + $key = Encryption::createKey($length); + + if ($prefix === 'hex2bin') { + return 'hex2bin:' . bin2hex($key); + } + + return 'base64:' . base64_encode($key); + } + + /** + * Sets the new encryption key in your .env file. + */ + protected function setNewEncryptionKey(string $key, array $params): bool + { + $currentKey = env('encryption.key', ''); + + if ($currentKey !== '' && ! $this->confirmOverwrite($params)) { + // Not yet testable since it requires keyboard input + // @codeCoverageIgnoreStart + return false; + // @codeCoverageIgnoreEnd + } + + return $this->writeNewEncryptionKeyToFile($currentKey, $key); + } + + /** + * Checks whether to overwrite existing encryption key. + */ + protected function confirmOverwrite(array $params): bool + { + return (array_key_exists('force', $params) || CLI::getOption('force')) || CLI::prompt('Overwrite existing key?', ['n', 'y']) === 'y'; + } + + /** + * Writes the new encryption key to .env file. + */ + protected function writeNewEncryptionKeyToFile(string $oldKey, string $newKey): bool + { + $baseEnv = ROOTPATH . 'env'; + $envFile = ROOTPATH . '.env'; + + if (! file_exists($envFile)) { + if (! file_exists($baseEnv)) { + CLI::write('Both default shipped `env` file and custom `.env` are missing.', 'yellow'); + CLI::write('Here\'s your new key instead: ' . CLI::color($newKey, 'yellow')); + CLI::newLine(); + + return false; + } + + copy($baseEnv, $envFile); + } + + $ret = file_put_contents($envFile, preg_replace( + $this->keyPattern($oldKey), + "\nencryption.key = {$newKey}", + file_get_contents($envFile) + )); + + return $ret !== false; + } + + /** + * Get the regex of the current encryption key. + */ + protected function keyPattern(string $oldKey): string + { + $escaped = preg_quote($oldKey, '/'); + + if ($escaped !== '') { + $escaped = "[{$escaped}]*"; + } + + return "/^[#\\s]*encryption.key[=\\s]*{$escaped}$/m"; + } +} diff --git a/system/Commands/Generators/CommandGenerator.php b/system/Commands/Generators/CommandGenerator.php new file mode 100644 index 0000000..7ccae13 --- /dev/null +++ b/system/Commands/Generators/CommandGenerator.php @@ -0,0 +1,119 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Commands\Generators; + +use CodeIgniter\CLI\BaseCommand; +use CodeIgniter\CLI\CLI; +use CodeIgniter\CLI\GeneratorTrait; + +/** + * Generates a skeleton command file. + */ +class CommandGenerator extends BaseCommand +{ + use GeneratorTrait; + + /** + * The Command's Group + * + * @var string + */ + protected $group = 'Generators'; + + /** + * The Command's Name + * + * @var string + */ + protected $name = 'make:command'; + + /** + * The Command's Description + * + * @var string + */ + protected $description = 'Generates a new spark command.'; + + /** + * The Command's Usage + * + * @var string + */ + protected $usage = 'make:command [options]'; + + /** + * The Command's Arguments + * + * @var array + */ + protected $arguments = [ + 'name' => 'The command class name.', + ]; + + /** + * The Command's Options + * + * @var array + */ + protected $options = [ + '--command' => 'The command name. Default: "command:name"', + '--type' => 'The command type. Options [basic, generator]. Default: "basic".', + '--group' => 'The command group. Default: [basic -> "CodeIgniter", generator -> "Generators"].', + '--namespace' => 'Set root namespace. Default: "APP_NAMESPACE".', + '--suffix' => 'Append the component title to the class name (e.g. User => UserCommand).', + '--force' => 'Force overwrite existing file.', + ]; + + /** + * Actually execute a command. + */ + public function run(array $params) + { + $this->component = 'Command'; + $this->directory = 'Commands'; + $this->template = 'command.tpl.php'; + + $this->classNameLang = 'CLI.generator.className.command'; + $this->execute($params); + } + + /** + * Prepare options and do the necessary replacements. + */ + protected function prepare(string $class): string + { + $command = $this->getOption('command'); + $group = $this->getOption('group'); + $type = $this->getOption('type'); + + $command = is_string($command) ? $command : 'command:name'; + $type = is_string($type) ? $type : 'basic'; + + if (! in_array($type, ['basic', 'generator'], true)) { + // @codeCoverageIgnoreStart + $type = CLI::prompt(lang('CLI.generator.commandType'), ['basic', 'generator'], 'required'); + CLI::newLine(); + // @codeCoverageIgnoreEnd + } + + if (! is_string($group)) { + $group = $type === 'generator' ? 'Generators' : 'CodeIgniter'; + } + + return $this->parseTemplate( + $class, + ['{group}', '{command}'], + [$group, $command], + ['type' => $type] + ); + } +} diff --git a/system/Commands/Generators/ConfigGenerator.php b/system/Commands/Generators/ConfigGenerator.php new file mode 100644 index 0000000..606af47 --- /dev/null +++ b/system/Commands/Generators/ConfigGenerator.php @@ -0,0 +1,98 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Commands\Generators; + +use CodeIgniter\CLI\BaseCommand; +use CodeIgniter\CLI\GeneratorTrait; + +/** + * Generates a skeleton config file. + */ +class ConfigGenerator extends BaseCommand +{ + use GeneratorTrait; + + /** + * The Command's Group + * + * @var string + */ + protected $group = 'Generators'; + + /** + * The Command's Name + * + * @var string + */ + protected $name = 'make:config'; + + /** + * The Command's Description + * + * @var string + */ + protected $description = 'Generates a new config file.'; + + /** + * The Command's Usage + * + * @var string + */ + protected $usage = 'make:config [options]'; + + /** + * The Command's Arguments + * + * @var array + */ + protected $arguments = [ + 'name' => 'The config class name.', + ]; + + /** + * The Command's Options + * + * @var array + */ + protected $options = [ + '--namespace' => 'Set root namespace. Default: "APP_NAMESPACE".', + '--suffix' => 'Append the component title to the class name (e.g. User => UserConfig).', + '--force' => 'Force overwrite existing file.', + ]; + + /** + * Actually execute a command. + */ + public function run(array $params) + { + $this->component = 'Config'; + $this->directory = 'Config'; + $this->template = 'config.tpl.php'; + + $this->classNameLang = 'CLI.generator.className.config'; + $this->execute($params); + } + + /** + * Prepare options and do the necessary replacements. + */ + protected function prepare(string $class): string + { + $namespace = $this->getOption('namespace') ?? APP_NAMESPACE; + + if ($namespace === APP_NAMESPACE) { + $class = substr($class, strlen($namespace . '\\')); + } + + return $this->parseTemplate($class); + } +} diff --git a/system/Commands/Generators/ControllerGenerator.php b/system/Commands/Generators/ControllerGenerator.php new file mode 100644 index 0000000..36a951c --- /dev/null +++ b/system/Commands/Generators/ControllerGenerator.php @@ -0,0 +1,131 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Commands\Generators; + +use CodeIgniter\CLI\BaseCommand; +use CodeIgniter\CLI\CLI; +use CodeIgniter\CLI\GeneratorTrait; + +/** + * Generates a skeleton controller file. + */ +class ControllerGenerator extends BaseCommand +{ + use GeneratorTrait; + + /** + * The Command's Group + * + * @var string + */ + protected $group = 'Generators'; + + /** + * The Command's Name + * + * @var string + */ + protected $name = 'make:controller'; + + /** + * The Command's Description + * + * @var string + */ + protected $description = 'Generates a new controller file.'; + + /** + * The Command's Usage + * + * @var string + */ + protected $usage = 'make:controller [options]'; + + /** + * The Command's Arguments + * + * @var array + */ + protected $arguments = [ + 'name' => 'The controller class name.', + ]; + + /** + * The Command's Options + * + * @var array + */ + protected $options = [ + '--bare' => 'Extends from CodeIgniter\Controller instead of BaseController.', + '--restful' => 'Extends from a RESTful resource, Options: [controller, presenter]. Default: "controller".', + '--namespace' => 'Set root namespace. Default: "APP_NAMESPACE".', + '--suffix' => 'Append the component title to the class name (e.g. User => UserController).', + '--force' => 'Force overwrite existing file.', + ]; + + /** + * Actually execute a command. + */ + public function run(array $params) + { + $this->component = 'Controller'; + $this->directory = 'Controllers'; + $this->template = 'controller.tpl.php'; + + $this->classNameLang = 'CLI.generator.className.controller'; + $this->execute($params); + } + + /** + * Prepare options and do the necessary replacements. + */ + protected function prepare(string $class): string + { + $bare = $this->getOption('bare'); + $rest = $this->getOption('restful'); + + $useStatement = trim(APP_NAMESPACE, '\\') . '\Controllers\BaseController'; + $extends = 'BaseController'; + + // Gets the appropriate parent class to extend. + if ($bare || $rest) { + if ($bare) { + $useStatement = 'CodeIgniter\Controller'; + $extends = 'Controller'; + } elseif ($rest) { + $rest = is_string($rest) ? $rest : 'controller'; + + if (! in_array($rest, ['controller', 'presenter'], true)) { + // @codeCoverageIgnoreStart + $rest = CLI::prompt(lang('CLI.generator.parentClass'), ['controller', 'presenter'], 'required'); + CLI::newLine(); + // @codeCoverageIgnoreEnd + } + + if ($rest === 'controller') { + $useStatement = 'CodeIgniter\RESTful\ResourceController'; + $extends = 'ResourceController'; + } elseif ($rest === 'presenter') { + $useStatement = 'CodeIgniter\RESTful\ResourcePresenter'; + $extends = 'ResourcePresenter'; + } + } + } + + return $this->parseTemplate( + $class, + ['{useStatement}', '{extends}'], + [$useStatement, $extends], + ['type' => $rest] + ); + } +} diff --git a/system/Commands/Generators/EntityGenerator.php b/system/Commands/Generators/EntityGenerator.php new file mode 100644 index 0000000..8cd8478 --- /dev/null +++ b/system/Commands/Generators/EntityGenerator.php @@ -0,0 +1,84 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Commands\Generators; + +use CodeIgniter\CLI\BaseCommand; +use CodeIgniter\CLI\GeneratorTrait; + +/** + * Generates a skeleton Entity file. + */ +class EntityGenerator extends BaseCommand +{ + use GeneratorTrait; + + /** + * The Command's Group + * + * @var string + */ + protected $group = 'Generators'; + + /** + * The Command's Name + * + * @var string + */ + protected $name = 'make:entity'; + + /** + * The Command's Description + * + * @var string + */ + protected $description = 'Generates a new entity file.'; + + /** + * The Command's Usage + * + * @var string + */ + protected $usage = 'make:entity [options]'; + + /** + * The Command's Arguments + * + * @var array + */ + protected $arguments = [ + 'name' => 'The entity class name.', + ]; + + /** + * The Command's Options + * + * @var array + */ + protected $options = [ + '--namespace' => 'Set root namespace. Default: "APP_NAMESPACE".', + '--suffix' => 'Append the component title to the class name (e.g. User => UserEntity).', + '--force' => 'Force overwrite existing file.', + ]; + + /** + * Actually execute a command. + */ + public function run(array $params) + { + $this->component = 'Entity'; + $this->directory = 'Entities'; + $this->template = 'entity.tpl.php'; + + $this->classNameLang = 'CLI.generator.className.entity'; + $this->execute($params); + } +} diff --git a/system/Commands/Generators/FilterGenerator.php b/system/Commands/Generators/FilterGenerator.php new file mode 100644 index 0000000..02060b0 --- /dev/null +++ b/system/Commands/Generators/FilterGenerator.php @@ -0,0 +1,84 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Commands\Generators; + +use CodeIgniter\CLI\BaseCommand; +use CodeIgniter\CLI\GeneratorTrait; + +/** + * Generates a skeleton Filter file. + */ +class FilterGenerator extends BaseCommand +{ + use GeneratorTrait; + + /** + * The Command's Group + * + * @var string + */ + protected $group = 'Generators'; + + /** + * The Command's Name + * + * @var string + */ + protected $name = 'make:filter'; + + /** + * The Command's Description + * + * @var string + */ + protected $description = 'Generates a new filter file.'; + + /** + * The Command's Usage + * + * @var string + */ + protected $usage = 'make:filter [options]'; + + /** + * The Command's Arguments + * + * @var array + */ + protected $arguments = [ + 'name' => 'The filter class name.', + ]; + + /** + * The Command's Options + * + * @var array + */ + protected $options = [ + '--namespace' => 'Set root namespace. Default: "APP_NAMESPACE".', + '--suffix' => 'Append the component title to the class name (e.g. User => UserFilter).', + '--force' => 'Force overwrite existing file.', + ]; + + /** + * Actually execute a command. + */ + public function run(array $params) + { + $this->component = 'Filter'; + $this->directory = 'Filters'; + $this->template = 'filter.tpl.php'; + + $this->classNameLang = 'CLI.generator.className.filter'; + $this->execute($params); + } +} diff --git a/system/Commands/Generators/MigrateCreate.php b/system/Commands/Generators/MigrateCreate.php new file mode 100644 index 0000000..4803dc9 --- /dev/null +++ b/system/Commands/Generators/MigrateCreate.php @@ -0,0 +1,90 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Commands\Generators; + +use CodeIgniter\CLI\BaseCommand; +use CodeIgniter\CLI\CLI; + +/** + * Deprecated class for the migration creation command. + * + * @deprecated Use make:migration instead. + * + * @codeCoverageIgnore + */ +class MigrateCreate extends BaseCommand +{ + /** + * The group the command is lumped under + * when listing commands. + * + * @var string + */ + protected $group = 'Generators'; + + /** + * The Command's name + * + * @var string + */ + protected $name = 'migrate:create'; + + /** + * The Command's short description + * + * @var string + */ + protected $description = '[DEPRECATED] Creates a new migration file. Please use "make:migration" instead.'; + + /** + * The Command's usage + * + * @var string + */ + protected $usage = 'migrate:create [options]'; + + /** + * The Command's arguments. + * + * @var array + */ + protected $arguments = [ + 'name' => 'The migration file name.', + ]; + + /** + * The Command's options. + * + * @var array + */ + protected $options = [ + '--namespace' => 'Set root namespace. Defaults to APP_NAMESPACE', + '--force' => 'Force overwrite existing files.', + ]; + + /** + * Actually execute a command. + */ + public function run(array $params) + { + // Resolve arguments before passing to make:migration + $params[0] = $params[0] ?? CLI::getSegment(2); + + $params['namespace'] = $params['namespace'] ?? CLI::getOption('namespace') ?? APP_NAMESPACE; + + if (array_key_exists('force', $params) || CLI::getOption('force')) { + $params['force'] = null; + } + + $this->call('make:migration', $params); + } +} diff --git a/system/Commands/Generators/MigrationGenerator.php b/system/Commands/Generators/MigrationGenerator.php new file mode 100644 index 0000000..24ab3ea --- /dev/null +++ b/system/Commands/Generators/MigrationGenerator.php @@ -0,0 +1,121 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Commands\Generators; + +use CodeIgniter\CLI\BaseCommand; +use CodeIgniter\CLI\CLI; +use CodeIgniter\CLI\GeneratorTrait; + +/** + * Generates a skeleton migration file. + */ +class MigrationGenerator extends BaseCommand +{ + use GeneratorTrait; + + /** + * The Command's Group + * + * @var string + */ + protected $group = 'Generators'; + + /** + * The Command's Name + * + * @var string + */ + protected $name = 'make:migration'; + + /** + * The Command's Description + * + * @var string + */ + protected $description = 'Generates a new migration file.'; + + /** + * The Command's Usage + * + * @var string + */ + protected $usage = 'make:migration [options]'; + + /** + * The Command's Arguments + * + * @var array + */ + protected $arguments = [ + 'name' => 'The migration class name.', + ]; + + /** + * The Command's Options + * + * @var array + */ + protected $options = [ + '--session' => 'Generates the migration file for database sessions.', + '--table' => 'Table name to use for database sessions. Default: "ci_sessions".', + '--dbgroup' => 'Database group to use for database sessions. Default: "default".', + '--namespace' => 'Set root namespace. Default: "APP_NAMESPACE".', + '--suffix' => 'Append the component title to the class name (e.g. User => UserMigration).', + ]; + + /** + * Actually execute a command. + */ + public function run(array $params) + { + $this->component = 'Migration'; + $this->directory = 'Database\Migrations'; + $this->template = 'migration.tpl.php'; + + if (array_key_exists('session', $params) || CLI::getOption('session')) { + $table = $params['table'] ?? CLI::getOption('table') ?? 'ci_sessions'; + $params[0] = "_create_{$table}_table"; + } + + $this->classNameLang = 'CLI.generator.className.migration'; + $this->execute($params); + } + + /** + * Prepare options and do the necessary replacements. + */ + protected function prepare(string $class): string + { + $data['session'] = false; + + if ($this->getOption('session')) { + $table = $this->getOption('table'); + $DBGroup = $this->getOption('dbgroup'); + + $data['session'] = true; + $data['table'] = is_string($table) ? $table : 'ci_sessions'; + $data['DBGroup'] = is_string($DBGroup) ? $DBGroup : 'default'; + $data['DBDriver'] = config('Database')->{$data['DBGroup']}['DBDriver']; + $data['matchIP'] = config('App')->sessionMatchIP; + } + + return $this->parseTemplate($class, [], [], $data); + } + + /** + * Change file basename before saving. + */ + protected function basename(string $filename): string + { + return gmdate(config('Migrations')->timestampFormat) . basename($filename); + } +} diff --git a/system/Commands/Generators/ModelGenerator.php b/system/Commands/Generators/ModelGenerator.php new file mode 100644 index 0000000..b4b7ffc --- /dev/null +++ b/system/Commands/Generators/ModelGenerator.php @@ -0,0 +1,134 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Commands\Generators; + +use CodeIgniter\CLI\BaseCommand; +use CodeIgniter\CLI\CLI; +use CodeIgniter\CLI\GeneratorTrait; + +/** + * Generates a skeleton Model file. + */ +class ModelGenerator extends BaseCommand +{ + use GeneratorTrait; + + /** + * The Command's Group + * + * @var string + */ + protected $group = 'Generators'; + + /** + * The Command's Name + * + * @var string + */ + protected $name = 'make:model'; + + /** + * The Command's Description + * + * @var string + */ + protected $description = 'Generates a new model file.'; + + /** + * The Command's Usage + * + * @var string + */ + protected $usage = 'make:model [options]'; + + /** + * The Command's Arguments + * + * @var array + */ + protected $arguments = [ + 'name' => 'The model class name.', + ]; + + /** + * The Command's Options + * + * @var array + */ + protected $options = [ + '--table' => 'Supply a table name. Default: "the lowercased plural of the class name".', + '--dbgroup' => 'Database group to use. Default: "default".', + '--return' => 'Return type, Options: [array, object, entity]. Default: "array".', + '--namespace' => 'Set root namespace. Default: "APP_NAMESPACE".', + '--suffix' => 'Append the component title to the class name (e.g. User => UserModel).', + '--force' => 'Force overwrite existing file.', + ]; + + /** + * Actually execute a command. + */ + public function run(array $params) + { + $this->component = 'Model'; + $this->directory = 'Models'; + $this->template = 'model.tpl.php'; + + $this->classNameLang = 'CLI.generator.className.model'; + $this->execute($params); + } + + /** + * Prepare options and do the necessary replacements. + */ + protected function prepare(string $class): string + { + $table = $this->getOption('table'); + $dbGroup = $this->getOption('dbgroup'); + $return = $this->getOption('return'); + + $baseClass = class_basename($class); + + if (preg_match('/^(\S+)Model$/i', $baseClass, $match) === 1) { + $baseClass = $match[1]; + } + + $table = is_string($table) ? $table : plural(strtolower($baseClass)); + $dbGroup = is_string($dbGroup) ? $dbGroup : 'default'; + $return = is_string($return) ? $return : 'array'; + + if (! in_array($return, ['array', 'object', 'entity'], true)) { + // @codeCoverageIgnoreStart + $return = CLI::prompt(lang('CLI.generator.returnType'), ['array', 'object', 'entity'], 'required'); + CLI::newLine(); + // @codeCoverageIgnoreEnd + } + + if ($return === 'entity') { + $return = str_replace('Models', 'Entities', $class); + + if (preg_match('/^(\S+)Model$/i', $return, $match) === 1) { + $return = $match[1]; + + if ($this->getOption('suffix')) { + $return .= 'Entity'; + } + } + + $return = '\\' . trim($return, '\\') . '::class'; + $this->call('make:entity', array_merge([$baseClass], $this->params)); + } else { + $return = "'{$return}'"; + } + + return $this->parseTemplate($class, ['{table}', '{dbGroup}', '{return}'], [$table, $dbGroup, $return]); + } +} diff --git a/system/Commands/Generators/ScaffoldGenerator.php b/system/Commands/Generators/ScaffoldGenerator.php new file mode 100644 index 0000000..351ee00 --- /dev/null +++ b/system/Commands/Generators/ScaffoldGenerator.php @@ -0,0 +1,121 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Commands\Generators; + +use CodeIgniter\CLI\BaseCommand; +use CodeIgniter\CLI\CLI; +use CodeIgniter\CLI\GeneratorTrait; + +/** + * Generates a complete set of scaffold files. + */ +class ScaffoldGenerator extends BaseCommand +{ + use GeneratorTrait; + + /** + * The Command's Group + * + * @var string + */ + protected $group = 'Generators'; + + /** + * The Command's Name + * + * @var string + */ + protected $name = 'make:scaffold'; + + /** + * The Command's Description + * + * @var string + */ + protected $description = 'Generates a complete set of scaffold files.'; + + /** + * The Command's Usage + * + * @var string + */ + protected $usage = 'make:scaffold [options]'; + + /** + * The Command's Arguments + * + * @var array + */ + protected $arguments = [ + 'name' => 'The class name', + ]; + + /** + * The Command's Options + * + * @var array + */ + protected $options = [ + '--bare' => 'Add the "--bare" option to controller component.', + '--restful' => 'Add the "--restful" option to controller component.', + '--table' => 'Add the "--table" option to the model component.', + '--dbgroup' => 'Add the "--dbgroup" option to model component.', + '--return' => 'Add the "--return" option to the model component.', + '--namespace' => 'Set root namespace. Default: "APP_NAMESPACE".', + '--suffix' => 'Append the component title to the class name.', + '--force' => 'Force overwrite existing file.', + ]; + + /** + * Actually execute a command. + */ + public function run(array $params) + { + $this->params = $params; + + $options = []; + + if ($this->getOption('namespace')) { + $options['namespace'] = $this->getOption('namespace'); + } + + if ($this->getOption('suffix')) { + $options['suffix'] = null; + } + + if ($this->getOption('force')) { + $options['force'] = null; + } + + $controllerOpts = []; + + if ($this->getOption('bare')) { + $controllerOpts['bare'] = null; + } elseif ($this->getOption('restful')) { + $controllerOpts['restful'] = $this->getOption('restful'); + } + + $modelOpts = [ + 'table' => $this->getOption('table'), + 'dbgroup' => $this->getOption('dbgroup'), + 'return' => $this->getOption('return'), + ]; + + $class = $params[0] ?? CLI::getSegment(2); + + // Call those commands! + $this->call('make:controller', array_merge([$class], $controllerOpts, $options)); + $this->call('make:model', array_merge([$class], $modelOpts, $options)); + $this->call('make:migration', array_merge([$class], $options)); + $this->call('make:seeder', array_merge([$class], $options)); + } +} diff --git a/system/Commands/Generators/SeederGenerator.php b/system/Commands/Generators/SeederGenerator.php new file mode 100644 index 0000000..09a1037 --- /dev/null +++ b/system/Commands/Generators/SeederGenerator.php @@ -0,0 +1,84 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Commands\Generators; + +use CodeIgniter\CLI\BaseCommand; +use CodeIgniter\CLI\GeneratorTrait; + +/** + * Generates a skeleton seeder file. + */ +class SeederGenerator extends BaseCommand +{ + use GeneratorTrait; + + /** + * The Command's Group + * + * @var string + */ + protected $group = 'Generators'; + + /** + * The Command's Name + * + * @var string + */ + protected $name = 'make:seeder'; + + /** + * The Command's Description + * + * @var string + */ + protected $description = 'Generates a new seeder file.'; + + /** + * The Command's Usage + * + * @var string + */ + protected $usage = 'make:seeder [options]'; + + /** + * The Command's Arguments + * + * @var array + */ + protected $arguments = [ + 'name' => 'The seeder class name.', + ]; + + /** + * The Command's Options + * + * @var array + */ + protected $options = [ + '--namespace' => 'Set root namespace. Default: "APP_NAMESPACE".', + '--suffix' => 'Append the component title to the class name (e.g. User => UserSeeder).', + '--force' => 'Force overwrite existing file.', + ]; + + /** + * Actually execute a command. + */ + public function run(array $params) + { + $this->component = 'Seeder'; + $this->directory = 'Database\Seeds'; + $this->template = 'seeder.tpl.php'; + + $this->classNameLang = 'CLI.generator.className.seeder'; + $this->execute($params); + } +} diff --git a/system/Commands/Generators/SessionMigrationGenerator.php b/system/Commands/Generators/SessionMigrationGenerator.php new file mode 100644 index 0000000..a1e02a1 --- /dev/null +++ b/system/Commands/Generators/SessionMigrationGenerator.php @@ -0,0 +1,110 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Commands\Generators; + +use CodeIgniter\CLI\BaseCommand; +use CodeIgniter\CLI\CLI; +use CodeIgniter\CLI\GeneratorTrait; + +/** + * Generates a migration file for database sessions. + * + * @deprecated Use `make:migration --session` instead. + * + * @codeCoverageIgnore + */ +class SessionMigrationGenerator extends BaseCommand +{ + use GeneratorTrait; + + /** + * The Command's Group + * + * @var string + */ + protected $group = 'Generators'; + + /** + * The Command's Name + * + * @var string + */ + protected $name = 'session:migration'; + + /** + * The Command's Description + * + * @var string + */ + protected $description = '[DEPRECATED] Generates the migration file for database sessions, Please use "make:migration --session" instead.'; + + /** + * The Command's Usage + * + * @var string + */ + protected $usage = 'session:migration [options]'; + + /** + * The Command's Options + * + * @var array + */ + protected $options = [ + '-t' => 'Supply a table name.', + '-g' => 'Database group to use. Default: "default".', + ]; + + /** + * Actually execute a command. + */ + public function run(array $params) + { + $this->component = 'Migration'; + $this->directory = 'Database\Migrations'; + $this->template = 'migration.tpl.php'; + + $table = 'ci_sessions'; + + if (array_key_exists('t', $params) || CLI::getOption('t')) { + $table = $params['t'] ?? CLI::getOption('t'); + } + + $params[0] = "_create_{$table}_table"; + + $this->execute($params); + } + + /** + * Performs the necessary replacements. + */ + protected function prepare(string $class): string + { + $data['session'] = true; + $data['table'] = $this->getOption('t'); + $data['DBGroup'] = $this->getOption('g'); + $data['matchIP'] = config('App')->sessionMatchIP ?? false; + + $data['table'] = is_string($data['table']) ? $data['table'] : 'ci_sessions'; + $data['DBGroup'] = is_string($data['DBGroup']) ? $data['DBGroup'] : 'default'; + + return $this->parseTemplate($class, [], [], $data); + } + + /** + * Change file basename before saving. + */ + protected function basename(string $filename): string + { + return gmdate(config('Migrations')->timestampFormat) . basename($filename); + } +} diff --git a/system/Commands/Generators/ValidationGenerator.php b/system/Commands/Generators/ValidationGenerator.php new file mode 100644 index 0000000..0c58ca5 --- /dev/null +++ b/system/Commands/Generators/ValidationGenerator.php @@ -0,0 +1,84 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Commands\Generators; + +use CodeIgniter\CLI\BaseCommand; +use CodeIgniter\CLI\GeneratorTrait; + +/** + * Generates a skeleton Validation file. + */ +class ValidationGenerator extends BaseCommand +{ + use GeneratorTrait; + + /** + * The Command's Group + * + * @var string + */ + protected $group = 'Generators'; + + /** + * The Command's Name + * + * @var string + */ + protected $name = 'make:validation'; + + /** + * The Command's Description + * + * @var string + */ + protected $description = 'Generates a new validation file.'; + + /** + * The Command's Usage + * + * @var string + */ + protected $usage = 'make:validation [options]'; + + /** + * The Command's Arguments + * + * @var array + */ + protected $arguments = [ + 'name' => 'The validation class name.', + ]; + + /** + * The Command's Options + * + * @var array + */ + protected $options = [ + '--namespace' => 'Set root namespace. Default: "APP_NAMESPACE".', + '--suffix' => 'Append the component title to the class name (e.g. User => UserValidation).', + '--force' => 'Force overwrite existing file.', + ]; + + /** + * Actually execute a command. + */ + public function run(array $params) + { + $this->component = 'Validation'; + $this->directory = 'Validation'; + $this->template = 'validation.tpl.php'; + + $this->classNameLang = 'CLI.generator.className.validation'; + $this->execute($params); + } +} diff --git a/system/Commands/Generators/Views/command.tpl.php b/system/Commands/Generators/Views/command.tpl.php new file mode 100644 index 0000000..bfbdcc4 --- /dev/null +++ b/system/Commands/Generators/Views/command.tpl.php @@ -0,0 +1,76 @@ +<@php + +namespace {namespace}; + +use CodeIgniter\CLI\BaseCommand; +use CodeIgniter\CLI\CLI; + +use CodeIgniter\CLI\GeneratorTrait; + + +class {class} extends BaseCommand +{ + + use GeneratorTrait; + + + /** + * The Command's Group + * + * @var string + */ + protected $group = '{group}'; + + /** + * The Command's Name + * + * @var string + */ + protected $name = '{command}'; + + /** + * The Command's Description + * + * @var string + */ + protected $description = ''; + + /** + * The Command's Usage + * + * @var string + */ + protected $usage = '{command} [arguments] [options]'; + + /** + * The Command's Arguments + * + * @var array + */ + protected $arguments = []; + + /** + * The Command's Options + * + * @var array + */ + protected $options = []; + + /** + * Actually execute a command. + * + * @param array $params + */ + public function run(array $params) + { + + $this->component = 'Command'; + $this->directory = 'Commands'; + $this->template = 'command.tpl.php'; + + $this->execute($params); + + // + + } +} diff --git a/system/Commands/Generators/Views/config.tpl.php b/system/Commands/Generators/Views/config.tpl.php new file mode 100644 index 0000000..31c60cb --- /dev/null +++ b/system/Commands/Generators/Views/config.tpl.php @@ -0,0 +1,10 @@ +<@php + +namespace {namespace}; + +use CodeIgniter\Config\BaseConfig; + +class {class} extends BaseConfig +{ + // +} diff --git a/system/Commands/Generators/Views/controller.tpl.php b/system/Commands/Generators/Views/controller.tpl.php new file mode 100644 index 0000000..de4447c --- /dev/null +++ b/system/Commands/Generators/Views/controller.tpl.php @@ -0,0 +1,177 @@ +<@php + +namespace {namespace}; + +use {useStatement}; + +class {class} extends {extends} +{ + + /** + * Return an array of resource objects, themselves in array format + * + * @return mixed + */ + public function index() + { + // + } + + /** + * Return the properties of a resource object + * + * @return mixed + */ + public function show($id = null) + { + // + } + + /** + * Return a new resource object, with default properties + * + * @return mixed + */ + public function new() + { + // + } + + /** + * Create a new resource object, from "posted" parameters + * + * @return mixed + */ + public function create() + { + // + } + + /** + * Return the editable properties of a resource object + * + * @return mixed + */ + public function edit($id = null) + { + // + } + + /** + * Add or update a model resource, from "posted" properties + * + * @return mixed + */ + public function update($id = null) + { + // + } + + /** + * Delete the designated resource object from the model + * + * @return mixed + */ + public function delete($id = null) + { + // + } + + /** + * Present a view of resource objects + * + * @return mixed + */ + public function index() + { + // + } + + /** + * Present a view to present a specific resource object + * + * @param mixed $id + * + * @return mixed + */ + public function show($id = null) + { + // + } + + /** + * Present a view to present a new single resource object + * + * @return mixed + */ + public function new() + { + // + } + + /** + * Process the creation/insertion of a new resource object. + * This should be a POST. + * + * @return mixed + */ + public function create() + { + // + } + + /** + * Present a view to edit the properties of a specific resource object + * + * @param mixed $id + * + * @return mixed + */ + public function edit($id = null) + { + // + } + + /** + * Process the updating, full or partial, of a specific resource object. + * This should be a POST. + * + * @param mixed $id + * + * @return mixed + */ + public function update($id = null) + { + // + } + + /** + * Present a view to confirm the deletion of a specific resource object + * + * @param mixed $id + * + * @return mixed + */ + public function remove($id = null) + { + // + } + + /** + * Process the deletion of a specific resource object + * + * @param mixed $id + * + * @return mixed + */ + public function delete($id = null) + { + // + } + + public function index() + { + // + } + +} diff --git a/system/Commands/Generators/Views/entity.tpl.php b/system/Commands/Generators/Views/entity.tpl.php new file mode 100644 index 0000000..c74c776 --- /dev/null +++ b/system/Commands/Generators/Views/entity.tpl.php @@ -0,0 +1,12 @@ +<@php + +namespace {namespace}; + +use CodeIgniter\Entity\Entity; + +class {class} extends Entity +{ + protected $datamap = []; + protected $dates = ['created_at', 'updated_at', 'deleted_at']; + protected $casts = []; +} diff --git a/system/Commands/Generators/Views/filter.tpl.php b/system/Commands/Generators/Views/filter.tpl.php new file mode 100644 index 0000000..c080e92 --- /dev/null +++ b/system/Commands/Generators/Views/filter.tpl.php @@ -0,0 +1,47 @@ +<@php + +namespace {namespace}; + +use CodeIgniter\Filters\FilterInterface; +use CodeIgniter\HTTP\RequestInterface; +use CodeIgniter\HTTP\ResponseInterface; + +class {class} implements FilterInterface +{ + /** + * Do whatever processing this filter needs to do. + * By default it should not return anything during + * normal execution. However, when an abnormal state + * is found, it should return an instance of + * CodeIgniter\HTTP\Response. If it does, script + * execution will end and that Response will be + * sent back to the client, allowing for error pages, + * redirects, etc. + * + * @param RequestInterface $request + * @param array|null $arguments + * + * @return mixed + */ + public function before(RequestInterface $request, $arguments = null) + { + // + } + + /** + * Allows After filters to inspect and modify the response + * object as needed. This method does not allow any way + * to stop execution of other after filters, short of + * throwing an Exception or Error. + * + * @param RequestInterface $request + * @param ResponseInterface $response + * @param array|null $arguments + * + * @return mixed + */ + public function after(RequestInterface $request, ResponseInterface $response, $arguments = null) + { + // + } +} diff --git a/system/Commands/Generators/Views/migration.tpl.php b/system/Commands/Generators/Views/migration.tpl.php new file mode 100644 index 0000000..321895e --- /dev/null +++ b/system/Commands/Generators/Views/migration.tpl.php @@ -0,0 +1,50 @@ +<@php + +namespace {namespace}; + +use CodeIgniter\Database\Migration; + +class {class} extends Migration +{ + + protected $DBGroup = ''; + + public function up() + { + $this->forge->addField([ + 'id' => ['type' => 'VARCHAR', 'constraint' => 128, 'null' => false], + + 'ip_address' => ['type' => 'VARCHAR', 'constraint' => 45, 'null' => false], + 'timestamp timestamp DEFAULT CURRENT_TIMESTAMP NOT NULL', + 'data' => ['type' => 'BLOB', 'null' => false], + + 'ip_address inet NOT NULL', + 'timestamp timestamptz DEFAULT CURRENT_TIMESTAMP NOT NULL', + "data bytea DEFAULT '' NOT NULL", + + ]); + + $this->forge->addKey(['id', 'ip_address'], true); + + $this->forge->addKey('id', true); + + $this->forge->addKey('timestamp'); + $this->forge->createTable('', true); + } + + public function down() + { + $this->forge->dropTable('', true); + } + + public function up() + { + // + } + + public function down() + { + // + } + +} diff --git a/system/Commands/Generators/Views/model.tpl.php b/system/Commands/Generators/Views/model.tpl.php new file mode 100644 index 0000000..5fc5ed9 --- /dev/null +++ b/system/Commands/Generators/Views/model.tpl.php @@ -0,0 +1,42 @@ +<@php + +namespace {namespace}; + +use CodeIgniter\Model; + +class {class} extends Model +{ + protected $DBGroup = '{dbGroup}'; + protected $table = '{table}'; + protected $primaryKey = 'id'; + protected $useAutoIncrement = true; + protected $insertID = 0; + protected $returnType = {return}; + protected $useSoftDeletes = false; + protected $protectFields = true; + protected $allowedFields = []; + + // Dates + protected $useTimestamps = false; + protected $dateFormat = 'datetime'; + protected $createdField = 'created_at'; + protected $updatedField = 'updated_at'; + protected $deletedField = 'deleted_at'; + + // Validation + protected $validationRules = []; + protected $validationMessages = []; + protected $skipValidation = false; + protected $cleanValidationRules = true; + + // Callbacks + protected $allowCallbacks = true; + protected $beforeInsert = []; + protected $afterInsert = []; + protected $beforeUpdate = []; + protected $afterUpdate = []; + protected $beforeFind = []; + protected $afterFind = []; + protected $beforeDelete = []; + protected $afterDelete = []; +} diff --git a/system/Commands/Generators/Views/seeder.tpl.php b/system/Commands/Generators/Views/seeder.tpl.php new file mode 100644 index 0000000..6f21628 --- /dev/null +++ b/system/Commands/Generators/Views/seeder.tpl.php @@ -0,0 +1,13 @@ +<@php + +namespace {namespace}; + +use CodeIgniter\Database\Seeder; + +class {class} extends Seeder +{ + public function run() + { + // + } +} diff --git a/system/Commands/Generators/Views/validation.tpl.php b/system/Commands/Generators/Views/validation.tpl.php new file mode 100644 index 0000000..e040a74 --- /dev/null +++ b/system/Commands/Generators/Views/validation.tpl.php @@ -0,0 +1,11 @@ +<@php + +namespace {namespace}; + +class {class} +{ + // public function custom_rule(): bool + // { + // return true; + // } +} diff --git a/system/Commands/Help.php b/system/Commands/Help.php new file mode 100644 index 0000000..7562333 --- /dev/null +++ b/system/Commands/Help.php @@ -0,0 +1,85 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Commands; + +use CodeIgniter\CLI\BaseCommand; + +/** + * CI Help command for the spark script. + * + * Lists the basic usage information for the spark script, + * and provides a way to list help for other commands. + */ +class Help extends BaseCommand +{ + /** + * The group the command is lumped under + * when listing commands. + * + * @var string + */ + protected $group = 'CodeIgniter'; + + /** + * The Command's name + * + * @var string + */ + protected $name = 'help'; + + /** + * the Command's short description + * + * @var string + */ + protected $description = 'Displays basic usage information.'; + + /** + * the Command's usage + * + * @var string + */ + protected $usage = 'help command_name'; + + /** + * the Command's Arguments + * + * @var array + */ + protected $arguments = [ + 'command_name' => 'The command name [default: "help"]', + ]; + + /** + * the Command's Options + * + * @var array + */ + protected $options = []; + + /** + * Displays the help for spark commands. + */ + public function run(array $params) + { + $command = array_shift($params); + $command = $command ?? 'help'; + $commands = $this->commands->getCommands(); + + if (! $this->commands->verifyCommand($command, $commands)) { + return; + } + + $class = new $commands[$command]['class']($this->logger, $this->commands); + $class->showHelp(); + } +} diff --git a/system/Commands/Housekeeping/ClearDebugbar.php b/system/Commands/Housekeeping/ClearDebugbar.php new file mode 100644 index 0000000..da6f76a --- /dev/null +++ b/system/Commands/Housekeeping/ClearDebugbar.php @@ -0,0 +1,70 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Commands\Housekeeping; + +use CodeIgniter\CLI\BaseCommand; +use CodeIgniter\CLI\CLI; + +/** + * ClearDebugbar Command + */ +class ClearDebugbar extends BaseCommand +{ + /** + * The group the command is lumped under + * when listing commands. + * + * @var string + */ + protected $group = 'Housekeeping'; + + /** + * The Command's name + * + * @var string + */ + protected $name = 'debugbar:clear'; + + /** + * The Command's usage + * + * @var string + */ + protected $usage = 'debugbar:clear'; + + /** + * The Command's short description. + * + * @var string + */ + protected $description = 'Clears all debugbar JSON files.'; + + /** + * Actually runs the command. + */ + public function run(array $params) + { + helper('filesystem'); + + if (! delete_files(WRITEPATH . 'debugbar')) { + // @codeCoverageIgnoreStart + CLI::error('Error deleting the debugbar JSON files.'); + CLI::newLine(); + + return; + // @codeCoverageIgnoreEnd + } + + CLI::write('Debugbar cleared.', 'green'); + CLI::newLine(); + } +} diff --git a/system/Commands/Housekeeping/ClearLogs.php b/system/Commands/Housekeeping/ClearLogs.php new file mode 100644 index 0000000..eb2489c --- /dev/null +++ b/system/Commands/Housekeeping/ClearLogs.php @@ -0,0 +1,91 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Commands\Housekeeping; + +use CodeIgniter\CLI\BaseCommand; +use CodeIgniter\CLI\CLI; + +/** + * ClearLogs command. + */ +class ClearLogs extends BaseCommand +{ + /** + * The group the command is lumped under + * when listing commands. + * + * @var string + */ + protected $group = 'Housekeeping'; + + /** + * The Command's name + * + * @var string + */ + protected $name = 'logs:clear'; + + /** + * The Command's short description + * + * @var string + */ + protected $description = 'Clears all log files.'; + + /** + * The Command's usage + * + * @var string + */ + protected $usage = 'logs:clear [option'; + + /** + * The Command's options + * + * @var array + */ + protected $options = [ + '--force' => 'Force delete of all logs files without prompting.', + ]; + + /** + * Actually execute a command. + */ + public function run(array $params) + { + $force = array_key_exists('force', $params) || CLI::getOption('force'); + + if (! $force && CLI::prompt('Are you sure you want to delete the logs?', ['n', 'y']) === 'n') { + // @codeCoverageIgnoreStart + CLI::error('Deleting logs aborted.', 'light_gray', 'red'); + CLI::error('If you want, use the "-force" option to force delete all log files.', 'light_gray', 'red'); + CLI::newLine(); + + return; + // @codeCoverageIgnoreEnd + } + + helper('filesystem'); + + if (! delete_files(WRITEPATH . 'logs', false, true)) { + // @codeCoverageIgnoreStart + CLI::error('Error in deleting the logs files.', 'light_gray', 'red'); + CLI::newLine(); + + return; + // @codeCoverageIgnoreEnd + } + + CLI::write('Logs cleared.', 'green'); + CLI::newLine(); + } +} diff --git a/system/Commands/ListCommands.php b/system/Commands/ListCommands.php new file mode 100644 index 0000000..0c80832 --- /dev/null +++ b/system/Commands/ListCommands.php @@ -0,0 +1,134 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Commands; + +use CodeIgniter\CLI\BaseCommand; +use CodeIgniter\CLI\CLI; + +/** + * CI Help command for the spark script. + * + * Lists the basic usage information for the spark script, + * and provides a way to list help for other commands. + */ +class ListCommands extends BaseCommand +{ + /** + * The group the command is lumped under + * when listing commands. + * + * @var string + */ + protected $group = 'CodeIgniter'; + + /** + * The Command's name + * + * @var string + */ + protected $name = 'list'; + + /** + * the Command's short description + * + * @var string + */ + protected $description = 'Lists the available commands.'; + + /** + * the Command's usage + * + * @var string + */ + protected $usage = 'list'; + + /** + * the Command's Arguments + * + * @var array + */ + protected $arguments = []; + + /** + * the Command's Options + * + * @var array + */ + protected $options = [ + '--simple' => 'Prints a list of the commands with no other info', + ]; + + /** + * Displays the help for the spark cli script itself. + */ + public function run(array $params) + { + $commands = $this->commands->getCommands(); + ksort($commands); + + // Check for 'simple' format + return array_key_exists('simple', $params) || CLI::getOption('simple') + ? $this->listSimple($commands) + : $this->listFull($commands); + } + + /** + * Lists the commands with accompanying info. + */ + protected function listFull(array $commands) + { + // Sort into buckets by group + $groups = []; + + foreach ($commands as $title => $command) { + if (! isset($groups[$command['group']])) { + $groups[$command['group']] = []; + } + + $groups[$command['group']][$title] = $command; + } + + $length = max(array_map('strlen', array_keys($commands))); + + ksort($groups); + + // Display it all... + foreach ($groups as $group => $commands) { + CLI::write($group, 'yellow'); + + foreach ($commands as $name => $command) { + $name = $this->setPad($name, $length, 2, 2); + $output = CLI::color($name, 'green'); + + if (isset($command['description'])) { + $output .= CLI::wrap($command['description'], 125, strlen($name)); + } + + CLI::write($output); + } + + if ($group !== array_key_last($groups)) { + CLI::newLine(); + } + } + } + + /** + * Lists the commands only. + */ + protected function listSimple(array $commands) + { + foreach (array_keys($commands) as $title) { + CLI::write($title); + } + } +} diff --git a/system/Commands/Server/Serve.php b/system/Commands/Server/Serve.php new file mode 100644 index 0000000..2dc9e5d --- /dev/null +++ b/system/Commands/Server/Serve.php @@ -0,0 +1,117 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Commands\Server; + +use CodeIgniter\CLI\BaseCommand; +use CodeIgniter\CLI\CLI; + +/** + * Launch the PHP development server + * + * Not testable, as it throws phpunit for a loop :-/ + * + * @codeCoverageIgnore + */ +class Serve extends BaseCommand +{ + /** + * Group + * + * @var string + */ + protected $group = 'CodeIgniter'; + + /** + * Name + * + * @var string + */ + protected $name = 'serve'; + + /** + * Description + * + * @var string + */ + protected $description = 'Launches the CodeIgniter PHP-Development Server.'; + + /** + * Usage + * + * @var string + */ + protected $usage = 'serve'; + + /** + * Arguments + * + * @var array + */ + protected $arguments = []; + + /** + * The current port offset. + * + * @var int + */ + protected $portOffset = 0; + + /** + * The max number of ports to attempt to serve from + * + * @var int + */ + protected $tries = 10; + + /** + * Options + * + * @var array + */ + protected $options = [ + '--php' => 'The PHP Binary [default: "PHP_BINARY"]', + '--host' => 'The HTTP Host [default: "localhost"]', + '--port' => 'The HTTP Host Port [default: "8080"]', + ]; + + /** + * Run the server + */ + public function run(array $params) + { + // Collect any user-supplied options and apply them. + $php = escapeshellarg(CLI::getOption('php') ?? PHP_BINARY); + $host = CLI::getOption('host') ?? 'localhost'; + $port = (int) (CLI::getOption('port') ?? 8080) + $this->portOffset; + + // Get the party started. + CLI::write('CodeIgniter development server started on http://' . $host . ':' . $port, 'green'); + CLI::write('Press Control-C to stop.'); + + // Set the Front Controller path as Document Root. + $docroot = escapeshellarg(FCPATH); + + // Mimic Apache's mod_rewrite functionality with user settings. + $rewrite = escapeshellarg(__DIR__ . '/rewrite.php'); + + // Call PHP's built-in webserver, making sure to set our + // base path to the public folder, and to use the rewrite file + // to ensure our environment is set and it simulates basic mod_rewrite. + passthru($php . ' -S ' . $host . ':' . $port . ' -t ' . $docroot . ' ' . $rewrite, $status); + + if ($status && $this->portOffset < $this->tries) { + $this->portOffset++; + + $this->run($params); + } + } +} diff --git a/system/Commands/Server/rewrite.php b/system/Commands/Server/rewrite.php new file mode 100644 index 0000000..ef5dc07 --- /dev/null +++ b/system/Commands/Server/rewrite.php @@ -0,0 +1,44 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +/* + * CodeIgniter PHP-Development Server Rewrite Rules + * + * This script works with the CLI serve command to help run a seamless + * development server based around PHP's built-in development + * server. This file simply tries to mimic Apache's mod_rewrite + * functionality so the site will operate as normal. + */ + +// @codeCoverageIgnoreStart +// Avoid this file run when listing commands +if (PHP_SAPI === 'cli') { + return; +} + +$uri = urldecode(parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH)); + +// Front Controller path - expected to be in the default folder +$fcpath = $_SERVER['DOCUMENT_ROOT'] . DIRECTORY_SEPARATOR; + +// Full path +$path = $fcpath . ltrim($uri, '/'); + +// If $path is an existing file or folder within the public folder +// then let the request handle it like normal. +if ($uri !== '/' && (is_file($path) || is_dir($path))) { + return false; +} + +// Otherwise, we'll load the index file and let +// the framework handle the request from here. +require_once $fcpath . 'index.php'; +// @codeCoverageIgnoreEnd diff --git a/system/Commands/Utilities/Environment.php b/system/Commands/Utilities/Environment.php new file mode 100644 index 0000000..5586de5 --- /dev/null +++ b/system/Commands/Utilities/Environment.php @@ -0,0 +1,155 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Commands\Utilities; + +use CodeIgniter\CLI\BaseCommand; +use CodeIgniter\CLI\CLI; +use CodeIgniter\Config\DotEnv; + +/** + * Command to display the current environment, + * or set a new one in the `.env` file. + */ +final class Environment extends BaseCommand +{ + /** + * The group the command is lumped under + * when listing commands. + * + * @var string + */ + protected $group = 'CodeIgniter'; + + /** + * The Command's name + * + * @var string + */ + protected $name = 'env'; + + /** + * The Command's short description + * + * @var string + */ + protected $description = 'Retrieves the current environment, or set a new one.'; + + /** + * The Command's usage + * + * @var string + */ + protected $usage = 'env []'; + + /** + * The Command's arguments + * + * @var array + */ + protected $arguments = [ + 'environment' => '[Optional] The new environment to set. If none is provided, this will print the current environment.', + ]; + + /** + * The Command's options + * + * @var array + */ + protected $options = []; + + /** + * Allowed values for environment. `testing` is excluded + * since spark won't work on it. + * + * @var array + */ + private static $knownTypes = [ + 'production', + 'development', + ]; + + /** + * {@inheritDoc} + */ + public function run(array $params) + { + if ($params === []) { + CLI::write(sprintf('Your environment is currently set as %s.', CLI::color($_SERVER['CI_ENVIRONMENT'] ?? ENVIRONMENT, 'green'))); + CLI::newLine(); + + return; + } + + $env = strtolower(array_shift($params)); + + if ($env === 'testing') { + CLI::error('The "testing" environment is reserved for PHPUnit testing.', 'light_gray', 'red'); + CLI::error('You will not be able to run spark under a "testing" environment.', 'light_gray', 'red'); + CLI::newLine(); + + return; + } + + if (! in_array($env, self::$knownTypes, true)) { + CLI::error(sprintf('Invalid environment type "%s". Expected one of "%s".', $env, implode('" and "', self::$knownTypes)), 'light_gray', 'red'); + CLI::newLine(); + + return; + } + + if (! $this->writeNewEnvironmentToEnvFile($env)) { + CLI::error('Error in writing new environment to .env file.', 'light_gray', 'red'); + CLI::newLine(); + + return; + } + + // force DotEnv to reload the new environment + // however we cannot redefine the ENVIRONMENT constant + putenv('CI_ENVIRONMENT'); + unset($_ENV['CI_ENVIRONMENT'], $_SERVER['CI_ENVIRONMENT']); + (new DotEnv(ROOTPATH))->load(); + + CLI::write(sprintf('Environment is successfully changed to "%s".', $env), 'green'); + CLI::write('The ENVIRONMENT constant will be changed in the next script execution.'); + CLI::newLine(); + } + + /** + * @see https://regex101.com/r/4sSORp/1 for the regex in action + */ + private function writeNewEnvironmentToEnvFile(string $newEnv): bool + { + $baseEnv = ROOTPATH . 'env'; + $envFile = ROOTPATH . '.env'; + + if (! is_file($envFile)) { + if (! is_file($baseEnv)) { + CLI::write('Both default shipped `env` file and custom `.env` are missing.', 'yellow'); + CLI::write('It is impossible to write the new environment type.', 'yellow'); + CLI::newLine(); + + return false; + } + + copy($baseEnv, $envFile); + } + + $pattern = preg_quote($_SERVER['CI_ENVIRONMENT'] ?? ENVIRONMENT, '/'); + $pattern = sprintf('/^[#\s]*CI_ENVIRONMENT[=\s]+%s$/m', $pattern); + + return file_put_contents( + $envFile, + preg_replace($pattern, "\nCI_ENVIRONMENT = {$newEnv}", file_get_contents($envFile), -1, $count) + ) !== false && $count > 0; + } +} diff --git a/system/Commands/Utilities/Namespaces.php b/system/Commands/Utilities/Namespaces.php new file mode 100644 index 0000000..989f020 --- /dev/null +++ b/system/Commands/Utilities/Namespaces.php @@ -0,0 +1,95 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Commands\Utilities; + +use CodeIgniter\CLI\BaseCommand; +use CodeIgniter\CLI\CLI; +use Config\Autoload; + +/** + * Lists namespaces set in Config\Autoload with their + * full server path. Helps you to verify that you have + * the namespaces setup correctly. + */ +class Namespaces extends BaseCommand +{ + /** + * The group the command is lumped under + * when listing commands. + * + * @var string + */ + protected $group = 'CodeIgniter'; + + /** + * The Command's name + * + * @var string + */ + protected $name = 'namespaces'; + + /** + * the Command's short description + * + * @var string + */ + protected $description = 'Verifies your namespaces are setup correctly.'; + + /** + * the Command's usage + * + * @var string + */ + protected $usage = 'namespaces'; + + /** + * the Command's Arguments + * + * @var array + */ + protected $arguments = []; + + /** + * the Command's Options + * + * @var array + */ + protected $options = []; + + /** + * Displays the help for the spark cli script itself. + */ + public function run(array $params) + { + $config = new Autoload(); + + $tbody = []; + + foreach ($config->psr4 as $ns => $path) { + $path = realpath($path) ?: $path; + + $tbody[] = [ + $ns, + realpath($path) ?: $path, + is_dir($path) ? 'Yes' : 'MISSING', + ]; + } + + $thead = [ + 'Namespace', + 'Path', + 'Found?', + ]; + + CLI::table($tbody, $thead); + } +} diff --git a/system/Commands/Utilities/Publish.php b/system/Commands/Utilities/Publish.php new file mode 100644 index 0000000..cfed047 --- /dev/null +++ b/system/Commands/Utilities/Publish.php @@ -0,0 +1,104 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Commands\Utilities; + +use CodeIgniter\CLI\BaseCommand; +use CodeIgniter\CLI\CLI; +use CodeIgniter\Publisher\Publisher; + +/** + * Discovers all Publisher classes from the "Publishers/" directory + * across namespaces. Executes `publish()` from each instance, parsing + * each result. + */ +class Publish extends BaseCommand +{ + /** + * The group the command is lumped under + * when listing commands. + * + * @var string + */ + protected $group = 'CodeIgniter'; + + /** + * The Command's name + * + * @var string + */ + protected $name = 'publish'; + + /** + * The Command's short description + * + * @var string + */ + protected $description = 'Discovers and executes all predefined Publisher classes.'; + + /** + * The Command's usage + * + * @var string + */ + protected $usage = 'publish []'; + + /** + * The Command's arguments + * + * @var array + */ + protected $arguments = [ + 'directory' => '[Optional] The directory to scan within each namespace. Default: "Publishers".', + ]; + + /** + * the Command's Options + * + * @var array + */ + protected $options = []; + + /** + * Displays the help for the spark cli script itself. + */ + public function run(array $params) + { + $directory = array_shift($params) ?? 'Publishers'; + + if ([] === $publishers = Publisher::discover($directory)) { + CLI::write(lang('Publisher.publishMissing', [$directory])); + + return; + } + + foreach ($publishers as $publisher) { + if ($publisher->publish()) { + CLI::write(lang('Publisher.publishSuccess', [ + get_class($publisher), + count($publisher->getPublished()), + $publisher->getDestination(), + ]), 'green'); + } else { + CLI::error(lang('Publisher.publishFailure', [ + get_class($publisher), + $publisher->getDestination(), + ]), 'light_gray', 'red'); + + foreach ($publisher->getErrors() as $file => $exception) { + CLI::write($file); + CLI::error($exception->getMessage()); + CLI::newLine(); + } + } + } + } +} diff --git a/system/Commands/Utilities/Routes.php b/system/Commands/Utilities/Routes.php new file mode 100644 index 0000000..210d1e1 --- /dev/null +++ b/system/Commands/Utilities/Routes.php @@ -0,0 +1,112 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Commands\Utilities; + +use CodeIgniter\CLI\BaseCommand; +use CodeIgniter\CLI\CLI; +use Config\Services; + +/** + * Lists all of the user-defined routes. This will include any Routes files + * that can be discovered, but will NOT include any routes that are not defined + * in a routes file, but are instead discovered through auto-routing. + */ +class Routes extends BaseCommand +{ + /** + * The group the command is lumped under + * when listing commands. + * + * @var string + */ + protected $group = 'CodeIgniter'; + + /** + * The Command's name + * + * @var string + */ + protected $name = 'routes'; + + /** + * the Command's short description + * + * @var string + */ + protected $description = 'Displays all of user-defined routes. Does NOT display auto-detected routes.'; + + /** + * the Command's usage + * + * @var string + */ + protected $usage = 'routes'; + + /** + * the Command's Arguments + * + * @var array + */ + protected $arguments = []; + + /** + * the Command's Options + * + * @var array + */ + protected $options = []; + + /** + * Displays the help for the spark cli script itself. + */ + public function run(array $params) + { + $collection = Services::routes(true); + $methods = [ + 'get', + 'head', + 'post', + 'patch', + 'put', + 'delete', + 'options', + 'trace', + 'connect', + 'cli', + ]; + + $tbody = []; + + foreach ($methods as $method) { + $routes = $collection->getRoutes($method); + + foreach ($routes as $route => $handler) { + // filter for strings, as callbacks aren't displayable + if (is_string($handler)) { + $tbody[] = [ + strtoupper($method), + $route, + $handler, + ]; + } + } + } + + $thead = [ + 'Method', + 'Route', + 'Handler', + ]; + + CLI::table($tbody, $thead); + } +} diff --git a/system/Common.php b/system/Common.php new file mode 100644 index 0000000..e132d98 --- /dev/null +++ b/system/Common.php @@ -0,0 +1,1179 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +use CodeIgniter\Cache\CacheInterface; +use CodeIgniter\Config\Factories; +use CodeIgniter\Cookie\Cookie; +use CodeIgniter\Cookie\CookieStore; +use CodeIgniter\Cookie\Exceptions\CookieException; +use CodeIgniter\Database\BaseConnection; +use CodeIgniter\Database\ConnectionInterface; +use CodeIgniter\Debug\Timer; +use CodeIgniter\Files\Exceptions\FileNotFoundException; +use CodeIgniter\HTTP\Exceptions\HTTPException; +use CodeIgniter\HTTP\RedirectResponse; +use CodeIgniter\HTTP\RequestInterface; +use CodeIgniter\HTTP\ResponseInterface; +use CodeIgniter\HTTP\URI; +use CodeIgniter\Model; +use CodeIgniter\Session\Session; +use CodeIgniter\Test\TestLogger; +use Config\App; +use Config\Database; +use Config\Logger; +use Config\Services; +use Config\View; +use Laminas\Escaper\Escaper; + +// Services Convenience Functions + +if (! function_exists('app_timezone')) { + /** + * Returns the timezone the application has been set to display + * dates in. This might be different than the timezone set + * at the server level, as you often want to stores dates in UTC + * and convert them on the fly for the user. + */ + function app_timezone(): string + { + $config = config(App::class); + + return $config->appTimezone; + } +} + +if (! function_exists('cache')) { + /** + * A convenience method that provides access to the Cache + * object. If no parameter is provided, will return the object, + * otherwise, will attempt to return the cached value. + * + * Examples: + * cache()->save('foo', 'bar'); + * $foo = cache('bar'); + * + * @return CacheInterface|mixed + */ + function cache(?string $key = null) + { + $cache = Services::cache(); + + // No params - return cache object + if ($key === null) { + return $cache; + } + + // Still here? Retrieve the value. + return $cache->get($key); + } +} + +if (! function_exists('clean_path')) { + /** + * A convenience method to clean paths for + * a nicer looking output. Useful for exception + * handling, error logging, etc. + */ + function clean_path(string $path): string + { + // Resolve relative paths + $path = realpath($path) ?: $path; + + switch (true) { + case strpos($path, APPPATH) === 0: + return 'APPPATH' . DIRECTORY_SEPARATOR . substr($path, strlen(APPPATH)); + + case strpos($path, SYSTEMPATH) === 0: + return 'SYSTEMPATH' . DIRECTORY_SEPARATOR . substr($path, strlen(SYSTEMPATH)); + + case strpos($path, FCPATH) === 0: + return 'FCPATH' . DIRECTORY_SEPARATOR . substr($path, strlen(FCPATH)); + + case defined('VENDORPATH') && strpos($path, VENDORPATH) === 0: + return 'VENDORPATH' . DIRECTORY_SEPARATOR . substr($path, strlen(VENDORPATH)); + + case strpos($path, ROOTPATH) === 0: + return 'ROOTPATH' . DIRECTORY_SEPARATOR . substr($path, strlen(ROOTPATH)); + + default: + return $path; + } + } +} + +if (! function_exists('command')) { + /** + * Runs a single command. + * Input expected in a single string as would + * be used on the command line itself: + * + * > command('migrate:create SomeMigration'); + * + * @return false|string + */ + function command(string $command) + { + $runner = service('commands'); + $regexString = '([^\s]+?)(?:\s|(? $arg) { + if (mb_strpos($arg, '-') !== 0) { + if ($optionValue) { + // if this was an option value, it was already + // included in the previous iteration + $optionValue = false; + } else { + // add to segments if not starting with '-' + // and not an option value + $params[] = $arg; + } + + continue; + } + + $arg = ltrim($arg, '-'); + $value = null; + + if (isset($args[$i + 1]) && mb_strpos($args[$i + 1], '-') !== 0) { + $value = $args[$i + 1]; + $optionValue = true; + } + + $params[$arg] = $value; + } + + ob_start(); + $runner->run($command, $params); + + return ob_get_clean(); + } +} + +if (! function_exists('config')) { + /** + * More simple way of getting config instances from Factories + * + * @return mixed + */ + function config(string $name, bool $getShared = true) + { + return Factories::config($name, ['getShared' => $getShared]); + } +} + +if (! function_exists('cookie')) { + /** + * Simpler way to create a new Cookie instance. + * + * @param string $name Name of the cookie + * @param string $value Value of the cookie + * @param array $options Array of options to be passed to the cookie + * + * @throws CookieException + */ + function cookie(string $name, string $value = '', array $options = []): Cookie + { + return new Cookie($name, $value, $options); + } +} + +if (! function_exists('cookies')) { + /** + * Fetches the global `CookieStore` instance held by `Response`. + * + * @param Cookie[] $cookies If `getGlobal` is false, this is passed to CookieStore's constructor + * @param bool $getGlobal If false, creates a new instance of CookieStore + */ + function cookies(array $cookies = [], bool $getGlobal = true): CookieStore + { + if ($getGlobal) { + return Services::response()->getCookieStore(); + } + + return new CookieStore($cookies); + } +} + +if (! function_exists('csrf_token')) { + /** + * Returns the CSRF token name. + * Can be used in Views when building hidden inputs manually, + * or used in javascript vars when using APIs. + */ + function csrf_token(): string + { + return Services::security()->getTokenName(); + } +} + +if (! function_exists('csrf_header')) { + /** + * Returns the CSRF header name. + * Can be used in Views by adding it to the meta tag + * or used in javascript to define a header name when using APIs. + */ + function csrf_header(): string + { + return Services::security()->getHeaderName(); + } +} + +if (! function_exists('csrf_hash')) { + /** + * Returns the current hash value for the CSRF protection. + * Can be used in Views when building hidden inputs manually, + * or used in javascript vars for API usage. + */ + function csrf_hash(): string + { + return Services::security()->getHash(); + } +} + +if (! function_exists('csrf_field')) { + /** + * Generates a hidden input field for use within manually generated forms. + */ + function csrf_field(?string $id = null): string + { + return ''; + } +} + +if (! function_exists('csrf_meta')) { + /** + * Generates a meta tag for use within javascript calls. + */ + function csrf_meta(?string $id = null): string + { + return ''; + } +} + +if (! function_exists('db_connect')) { + /** + * Grabs a database connection and returns it to the user. + * + * This is a convenience wrapper for \Config\Database::connect() + * and supports the same parameters. Namely: + * + * When passing in $db, you may pass any of the following to connect: + * - group name + * - existing connection instance + * - array of database configuration values + * + * If $getShared === false then a new connection instance will be provided, + * otherwise it will all calls will return the same instance. + * + * @param array|ConnectionInterface|string|null $db + * + * @return BaseConnection + */ + function db_connect($db = null, bool $getShared = true) + { + return Database::connect($db, $getShared); + } +} + +if (! function_exists('dd')) { + /** + * Prints a Kint debug report and exits. + * + * @param array ...$vars + * + * @codeCoverageIgnore Can't be tested ... exits + */ + function dd(...$vars) + { + // @codeCoverageIgnoreStart + Kint::$aliases[] = 'dd'; + Kint::dump(...$vars); + + exit; + // @codeCoverageIgnoreEnd + } +} + +if (! function_exists('env')) { + /** + * Allows user to retrieve values from the environment + * variables that have been set. Especially useful for + * retrieving values set from the .env file for + * use in config files. + * + * @param string|null $default + * + * @return mixed + */ + function env(string $key, $default = null) + { + $value = $_ENV[$key] ?? $_SERVER[$key] ?? getenv($key); + + // Not found? Return the default value + if ($value === false) { + return $default; + } + + // Handle any boolean values + switch (strtolower($value)) { + case 'true': + return true; + + case 'false': + return false; + + case 'empty': + return ''; + + case 'null': + return null; + } + + return $value; + } +} + +if (! function_exists('esc')) { + /** + * Performs simple auto-escaping of data for security reasons. + * Might consider making this more complex at a later date. + * + * If $data is a string, then it simply escapes and returns it. + * If $data is an array, then it loops over it, escaping each + * 'value' of the key/value pairs. + * + * Valid context values: html, js, css, url, attr, raw + * + * @param array|string $data + * @param string $encoding + * + * @throws InvalidArgumentException + * + * @return array|string + */ + function esc($data, string $context = 'html', ?string $encoding = null) + { + if (is_array($data)) { + foreach ($data as &$value) { + $value = esc($value, $context); + } + } + + if (is_string($data)) { + $context = strtolower($context); + + // Provide a way to NOT escape data since + // this could be called automatically by + // the View library. + if (empty($context) || $context === 'raw') { + return $data; + } + + if (! in_array($context, ['html', 'js', 'css', 'url', 'attr'], true)) { + throw new InvalidArgumentException('Invalid escape context provided.'); + } + + $method = $context === 'attr' ? 'escapeHtmlAttr' : 'escape' . ucfirst($context); + + static $escaper; + if (! $escaper) { + $escaper = new Escaper($encoding); + } + + if ($encoding && $escaper->getEncoding() !== $encoding) { + $escaper = new Escaper($encoding); + } + + $data = $escaper->{$method}($data); + } + + return $data; + } +} + +if (! function_exists('force_https')) { + /** + * Used to force a page to be accessed in via HTTPS. + * Uses a standard redirect, plus will set the HSTS header + * for modern browsers that support, which gives best + * protection against man-in-the-middle attacks. + * + * @see https://en.wikipedia.org/wiki/HTTP_Strict_Transport_Security + * + * @param int $duration How long should the SSL header be set for? (in seconds) + * Defaults to 1 year. + * @param RequestInterface $request + * @param ResponseInterface $response + * + * @throws HTTPException + */ + function force_https(int $duration = 31536000, ?RequestInterface $request = null, ?ResponseInterface $response = null) + { + if ($request === null) { + $request = Services::request(null, true); + } + if ($response === null) { + $response = Services::response(null, true); + } + + if ((ENVIRONMENT !== 'testing' && (is_cli() || $request->isSecure())) || (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'test')) { + // @codeCoverageIgnoreStart + return; + // @codeCoverageIgnoreEnd + } + + // If the session status is active, we should regenerate + // the session ID for safety sake. + if (ENVIRONMENT !== 'testing' && session_status() === PHP_SESSION_ACTIVE) { + // @codeCoverageIgnoreStart + Services::session(null, true) + ->regenerate(); + // @codeCoverageIgnoreEnd + } + + $baseURL = config(App::class)->baseURL; + + if (strpos($baseURL, 'https://') === 0) { + $baseURL = substr($baseURL, strlen('https://')); + } elseif (strpos($baseURL, 'http://') === 0) { + $baseURL = substr($baseURL, strlen('http://')); + } + + $uri = URI::createURIString( + 'https', + $baseURL, + $request->getUri()->getPath(), // Absolute URIs should use a "/" for an empty path + $request->getUri()->getQuery(), + $request->getUri()->getFragment() + ); + + // Set an HSTS header + $response->setHeader('Strict-Transport-Security', 'max-age=' . $duration); + $response->redirect($uri); + $response->sendHeaders(); + + if (ENVIRONMENT !== 'testing') { + // @codeCoverageIgnoreStart + exit(); + // @codeCoverageIgnoreEnd + } + } +} + +if (! function_exists('function_usable')) { + /** + * Function usable + * + * Executes a function_exists() check, and if the Suhosin PHP + * extension is loaded - checks whether the function that is + * checked might be disabled in there as well. + * + * This is useful as function_exists() will return FALSE for + * functions disabled via the *disable_functions* php.ini + * setting, but not for *suhosin.executor.func.blacklist* and + * *suhosin.executor.disable_eval*. These settings will just + * terminate script execution if a disabled function is executed. + * + * The above described behavior turned out to be a bug in Suhosin, + * but even though a fix was committed for 0.9.34 on 2012-02-12, + * that version is yet to be released. This function will therefore + * be just temporary, but would probably be kept for a few years. + * + * @see http://www.hardened-php.net/suhosin/ + * + * @param string $functionName Function to check for + * + * @return bool TRUE if the function exists and is safe to call, + * FALSE otherwise. + * + * @codeCoverageIgnore This is too exotic + */ + function function_usable(string $functionName): bool + { + static $_suhosin_func_blacklist; + + if (function_exists($functionName)) { + if (! isset($_suhosin_func_blacklist)) { + $_suhosin_func_blacklist = extension_loaded('suhosin') ? explode(',', trim(ini_get('suhosin.executor.func.blacklist'))) : []; + } + + return ! in_array($functionName, $_suhosin_func_blacklist, true); + } + + return false; + } +} + +if (! function_exists('helper')) { + /** + * Loads a helper file into memory. Supports namespaced helpers, + * both in and out of the 'helpers' directory of a namespaced directory. + * + * Will load ALL helpers of the matching name, in the following order: + * 1. app/Helpers + * 2. {namespace}/Helpers + * 3. system/Helpers + * + * @param array|string $filenames + * + * @throws FileNotFoundException + */ + function helper($filenames) + { + static $loaded = []; + + $loader = Services::locator(); + + if (! is_array($filenames)) { + $filenames = [$filenames]; + } + + // Store a list of all files to include... + $includes = []; + + foreach ($filenames as $filename) { + // Store our system and application helper + // versions so that we can control the load ordering. + $systemHelper = null; + $appHelper = null; + $localIncludes = []; + + if (strpos($filename, '_helper') === false) { + $filename .= '_helper'; + } + + // Check if this helper has already been loaded + if (in_array($filename, $loaded, true)) { + continue; + } + + // If the file is namespaced, we'll just grab that + // file and not search for any others + if (strpos($filename, '\\') !== false) { + $path = $loader->locateFile($filename, 'Helpers'); + + if (empty($path)) { + throw FileNotFoundException::forFileNotFound($filename); + } + + $includes[] = $path; + $loaded[] = $filename; + } else { + // No namespaces, so search in all available locations + $paths = $loader->search('Helpers/' . $filename); + + foreach ($paths as $path) { + if (strpos($path, APPPATH . 'Helpers' . DIRECTORY_SEPARATOR) === 0) { + $appHelper = $path; + } elseif (strpos($path, SYSTEMPATH . 'Helpers' . DIRECTORY_SEPARATOR) === 0) { + $systemHelper = $path; + } else { + $localIncludes[] = $path; + $loaded[] = $filename; + } + } + + // App-level helpers should override all others + if (! empty($appHelper)) { + $includes[] = $appHelper; + $loaded[] = $filename; + } + + // All namespaced files get added in next + $includes = array_merge($includes, $localIncludes); + + // And the system default one should be added in last. + if (! empty($systemHelper)) { + $includes[] = $systemHelper; + $loaded[] = $filename; + } + } + } + + // Now actually include all of the files + foreach ($includes as $path) { + include_once $path; + } + } +} + +if (! function_exists('is_cli')) { + /** + * Check if PHP was invoked from the command line. + * + * @codeCoverageIgnore Cannot be tested fully as PHPUnit always run in php-cli + */ + function is_cli(): bool + { + if (in_array(PHP_SAPI, ['cli', 'phpdbg'], true)) { + return true; + } + + // PHP_SAPI could be 'cgi-fcgi', 'fpm-fcgi'. + // See https://github.com/codeigniter4/CodeIgniter4/pull/5393 + return ! isset($_SERVER['REMOTE_ADDR']) && ! isset($_SERVER['REQUEST_METHOD']); + } +} + +if (! function_exists('is_really_writable')) { + /** + * Tests for file writability + * + * is_writable() returns TRUE on Windows servers when you really can't write to + * the file, based on the read-only attribute. is_writable() is also unreliable + * on Unix servers if safe_mode is on. + * + * @see https://bugs.php.net/bug.php?id=54709 + * + * @throws Exception + * + * @codeCoverageIgnore Not practical to test, as travis runs on linux + */ + function is_really_writable(string $file): bool + { + // If we're on a Unix server we call is_writable + if (DIRECTORY_SEPARATOR === '/') { + return is_writable($file); + } + + /* For Windows servers and safe_mode "on" installations we'll actually + * write a file then read it. Bah... + */ + if (is_dir($file)) { + $file = rtrim($file, '/') . '/' . bin2hex(random_bytes(16)); + if (($fp = @fopen($file, 'ab')) === false) { + return false; + } + + fclose($fp); + @chmod($file, 0777); + @unlink($file); + + return true; + } + + if (! is_file($file) || ($fp = @fopen($file, 'ab')) === false) { + return false; + } + + fclose($fp); + + return true; + } +} + +if (! function_exists('lang')) { + /** + * A convenience method to translate a string or array of them and format + * the result with the intl extension's MessageFormatter. + * + * @return string + */ + function lang(string $line, array $args = [], ?string $locale = null) + { + $language = Services::language(); + + // Get active locale + $activeLocale = $language->getLocale(); + + if ($locale && $locale !== $activeLocale) { + $language->setLocale($locale); + } + + $line = $language->getLine($line, $args); + + if ($locale && $locale !== $activeLocale) { + // Reset to active locale + $language->setLocale($activeLocale); + } + + return $line; + } +} + +if (! function_exists('log_message')) { + /** + * A convenience/compatibility method for logging events through + * the Log system. + * + * Allowed log levels are: + * - emergency + * - alert + * - critical + * - error + * - warning + * - notice + * - info + * - debug + * + * @return mixed + */ + function log_message(string $level, string $message, array $context = []) + { + // When running tests, we want to always ensure that the + // TestLogger is running, which provides utilities for + // for asserting that logs were called in the test code. + if (ENVIRONMENT === 'testing') { + $logger = new TestLogger(new Logger()); + + return $logger->log($level, $message, $context); + } + + // @codeCoverageIgnoreStart + return Services::logger(true) + ->log($level, $message, $context); + // @codeCoverageIgnoreEnd + } +} + +if (! function_exists('model')) { + /** + * More simple way of getting model instances from Factories + * + * @template T of Model + * + * @param class-string $name + * + * @return T + * @phpstan-return Model + */ + function model(string $name, bool $getShared = true, ?ConnectionInterface &$conn = null) + { + return Factories::models($name, ['getShared' => $getShared], $conn); + } +} + +if (! function_exists('old')) { + /** + * Provides access to "old input" that was set in the session + * during a redirect()->withInput(). + * + * @param null $default + * @param bool|string $escape + * + * @return mixed|null + */ + function old(string $key, $default = null, $escape = 'html') + { + // Ensure the session is loaded + if (session_status() === PHP_SESSION_NONE && ENVIRONMENT !== 'testing') { + // @codeCoverageIgnoreStart + session(); + // @codeCoverageIgnoreEnd + } + + $request = Services::request(); + + $value = $request->getOldInput($key); + + // Return the default value if nothing + // found in the old input. + if ($value === null) { + return $default; + } + + return $escape === false ? $value : esc($value, $escape); + } +} + +if (! function_exists('redirect')) { + /** + * Convenience method that works with the current global $request and + * $router instances to redirect using named/reverse-routed routes + * to determine the URL to go to. + * + * If more control is needed, you must use $response->redirect explicitly. + * + * @param string $route + */ + function redirect(?string $route = null): RedirectResponse + { + $response = Services::redirectresponse(null, true); + + if (! empty($route)) { + return $response->route($route); + } + + return $response; + } +} + +if (! function_exists('remove_invisible_characters')) { + /** + * Remove Invisible Characters + * + * This prevents sandwiching null characters + * between ascii characters, like Java\0script. + */ + function remove_invisible_characters(string $str, bool $urlEncoded = true): string + { + $nonDisplayables = []; + + // every control character except newline (dec 10), + // carriage return (dec 13) and horizontal tab (dec 09) + if ($urlEncoded) { + $nonDisplayables[] = '/%0[0-8bcef]/'; // url encoded 00-08, 11, 12, 14, 15 + $nonDisplayables[] = '/%1[0-9a-f]/'; // url encoded 16-31 + } + + $nonDisplayables[] = '/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]+/S'; // 00-08, 11, 12, 14-31, 127 + + do { + $str = preg_replace($nonDisplayables, '', $str, -1, $count); + } while ($count); + + return $str; + } +} + +if (! function_exists('route_to')) { + /** + * Given a controller/method string and any params, + * will attempt to build the relative URL to the + * matching route. + * + * NOTE: This requires the controller/method to + * have a route defined in the routes Config file. + * + * @param mixed ...$params + * + * @return false|string + */ + function route_to(string $method, ...$params) + { + return Services::routes()->reverseRoute($method, ...$params); + } +} + +if (! function_exists('session')) { + /** + * A convenience method for accessing the session instance, + * or an item that has been set in the session. + * + * Examples: + * session()->set('foo', 'bar'); + * $foo = session('bar'); + * + * @param string $val + * + * @return mixed|Session|null + */ + function session(?string $val = null) + { + $session = Services::session(); + + // Returning a single item? + if (is_string($val)) { + return $session->get($val); + } + + return $session; + } +} + +if (! function_exists('service')) { + /** + * Allows cleaner access to the Services Config file. + * Always returns a SHARED instance of the class, so + * calling the function multiple times should always + * return the same instance. + * + * These are equal: + * - $timer = service('timer') + * - $timer = \CodeIgniter\Config\Services::timer(); + * + * @param mixed ...$params + * + * @return mixed + */ + function service(string $name, ...$params) + { + return Services::$name(...$params); + } +} + +if (! function_exists('single_service')) { + /** + * Always returns a new instance of the class. + * + * @param mixed ...$params + * + * @return mixed + */ + function single_service(string $name, ...$params) + { + $service = Services::serviceExists($name); + + if ($service === null) { + // The service is not defined anywhere so just return. + return null; + } + + $method = new ReflectionMethod($service, $name); + $count = $method->getNumberOfParameters(); + $mParam = $method->getParameters(); + $params = $params ?? []; + + if ($count === 1) { + // This service needs only one argument, which is the shared + // instance flag, so let's wrap up and pass false here. + return $service::$name(false); + } + + // Fill in the params with the defaults, but stop before the last + for ($startIndex = count($params); $startIndex <= $count - 2; $startIndex++) { + $params[$startIndex] = $mParam[$startIndex]->getDefaultValue(); + } + + // Ensure the last argument will not create a shared instance + $params[$count - 1] = false; + + return $service::$name(...$params); + } +} + +if (! function_exists('slash_item')) { + // Unlike CI3, this function is placed here because + // it's not a config, or part of a config. + /** + * Fetch a config file item with slash appended (if not empty) + * + * @param string $item Config item name + * + * @return string|null The configuration item or NULL if + * the item doesn't exist + */ + function slash_item(string $item): ?string + { + $config = config(App::class); + $configItem = $config->{$item}; + + if (! isset($configItem) || empty(trim($configItem))) { + return $configItem; + } + + return rtrim($configItem, '/') . '/'; + } +} + +if (! function_exists('stringify_attributes')) { + /** + * Stringify attributes for use in HTML tags. + * + * Helper function used to convert a string, array, or object + * of attributes to a string. + * + * @param mixed $attributes string, array, object + */ + function stringify_attributes($attributes, bool $js = false): string + { + $atts = ''; + + if (empty($attributes)) { + return $atts; + } + + if (is_string($attributes)) { + return ' ' . $attributes; + } + + $attributes = (array) $attributes; + + foreach ($attributes as $key => $val) { + $atts .= ($js) ? $key . '=' . esc($val, 'js') . ',' : ' ' . $key . '="' . esc($val) . '"'; + } + + return rtrim($atts, ','); + } +} + +if (! function_exists('timer')) { + /** + * A convenience method for working with the timer. + * If no parameter is passed, it will return the timer instance, + * otherwise will start or stop the timer intelligently. + * + * @return mixed|Timer + */ + function timer(?string $name = null) + { + $timer = Services::timer(); + + if (empty($name)) { + return $timer; + } + + if ($timer->has($name)) { + return $timer->stop($name); + } + + return $timer->start($name); + } +} + +if (! function_exists('trace')) { + /** + * Provides a backtrace to the current execution point, from Kint. + */ + function trace() + { + Kint::$aliases[] = 'trace'; + Kint::trace(); + } +} + +if (! function_exists('view')) { + /** + * Grabs the current RendererInterface-compatible class + * and tells it to render the specified view. Simply provides + * a convenience method that can be used in Controllers, + * libraries, and routed closures. + * + * NOTE: Does not provide any escaping of the data, so that must + * all be handled manually by the developer. + * + * @param array $options Unused - reserved for third-party extensions. + */ + function view(string $name, array $data = [], array $options = []): string + { + /** + * @var CodeIgniter\View\View $renderer + */ + $renderer = Services::renderer(); + + $saveData = config(View::class)->saveData; + + if (array_key_exists('saveData', $options)) { + $saveData = (bool) $options['saveData']; + unset($options['saveData']); + } + + return $renderer->setData($data, 'raw')->render($name, $options, $saveData); + } +} + +if (! function_exists('view_cell')) { + /** + * View cells are used within views to insert HTML chunks that are managed + * by other classes. + * + * @param null $params + * + * @throws ReflectionException + */ + function view_cell(string $library, $params = null, int $ttl = 0, ?string $cacheName = null): string + { + return Services::viewcell() + ->render($library, $params, $ttl, $cacheName); + } +} + +/** + * These helpers come from Laravel so will not be + * re-tested and can be ignored safely. + * + * @see https://github.com/laravel/framework/blob/8.x/src/Illuminate/Support/helpers.php + */ +if (! function_exists('class_basename')) { + /** + * Get the class "basename" of the given object / class. + * + * @param object|string $class + * + * @return string + * + * @codeCoverageIgnore + */ + function class_basename($class) + { + $class = is_object($class) ? get_class($class) : $class; + + return basename(str_replace('\\', '/', $class)); + } +} + +if (! function_exists('class_uses_recursive')) { + /** + * Returns all traits used by a class, its parent classes and trait of their traits. + * + * @param object|string $class + * + * @return array + * + * @codeCoverageIgnore + */ + function class_uses_recursive($class) + { + if (is_object($class)) { + $class = get_class($class); + } + + $results = []; + + foreach (array_reverse(class_parents($class)) + [$class => $class] as $class) { + $results += trait_uses_recursive($class); + } + + return array_unique($results); + } +} + +if (! function_exists('trait_uses_recursive')) { + /** + * Returns all traits used by a trait and its traits. + * + * @param string $trait + * + * @return array + * + * @codeCoverageIgnore + */ + function trait_uses_recursive($trait) + { + $traits = class_uses($trait) ?: []; + + foreach ($traits as $trait) { + $traits += trait_uses_recursive($trait); + } + + return $traits; + } +} diff --git a/system/ComposerScripts.php b/system/ComposerScripts.php new file mode 100644 index 0000000..ef4dfe1 --- /dev/null +++ b/system/ComposerScripts.php @@ -0,0 +1,163 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter; + +use FilesystemIterator; +use RecursiveDirectoryIterator; +use RecursiveIteratorIterator; +use SplFileInfo; + +/** + * This class is used by Composer during installs and updates + * to move files to locations within the system folder so that end-users + * do not need to use Composer to install a package, but can simply + * download. + * + * @codeCoverageIgnore + * + * @internal + */ +final class ComposerScripts +{ + /** + * Path to the ThirdParty directory. + * + * @var string + */ + private static $path = __DIR__ . '/ThirdParty/'; + + /** + * Direct dependencies of CodeIgniter to copy + * contents to `system/ThirdParty/`. + * + * @var array> + */ + private static $dependencies = [ + 'kint-src' => [ + 'license' => __DIR__ . '/../vendor/kint-php/kint/LICENSE', + 'from' => __DIR__ . '/../vendor/kint-php/kint/src/', + 'to' => __DIR__ . '/ThirdParty/Kint/', + ], + 'kint-resources' => [ + 'from' => __DIR__ . '/../vendor/kint-php/kint/resources/', + 'to' => __DIR__ . '/ThirdParty/Kint/resources/', + ], + 'escaper' => [ + 'license' => __DIR__ . '/../vendor/laminas/laminas-escaper/LICENSE.md', + 'from' => __DIR__ . '/../vendor/laminas/laminas-escaper/src/', + 'to' => __DIR__ . '/ThirdParty/Escaper/', + ], + 'psr-log' => [ + 'license' => __DIR__ . '/../vendor/psr/log/LICENSE', + 'from' => __DIR__ . '/../vendor/psr/log/Psr/Log/', + 'to' => __DIR__ . '/ThirdParty/PSR/Log/', + ], + ]; + + /** + * This static method is called by Composer after every update event, + * i.e., `composer install`, `composer update`, `composer remove`. + */ + public static function postUpdate() + { + self::recursiveDelete(self::$path); + + foreach (self::$dependencies as $dependency) { + self::recursiveMirror($dependency['from'], $dependency['to']); + if (isset($dependency['license'])) { + $license = basename($dependency['license']); + copy($dependency['license'], $dependency['to'] . '/' . $license); + } + } + + self::copyKintInitFiles(); + self::recursiveDelete(self::$dependencies['psr-log']['to'] . 'Test/'); + } + + /** + * Recursively remove the contents of the previous `system/ThirdParty`. + */ + private static function recursiveDelete(string $directory): void + { + if (! is_dir($directory)) { + echo sprintf('Cannot recursively delete "%s" as it does not exist.', $directory); + } + + /** @var SplFileInfo $file */ + foreach (new RecursiveIteratorIterator( + new RecursiveDirectoryIterator(rtrim($directory, '\\/'), FilesystemIterator::SKIP_DOTS), + RecursiveIteratorIterator::CHILD_FIRST + ) as $file) { + $path = $file->getPathname(); + + if ($file->isDir()) { + @rmdir($path); + } else { + @unlink($path); + } + } + } + + /** + * Recursively copy the files and directories of the origin directory + * into the target directory, i.e. "mirror" its contents. + */ + private static function recursiveMirror(string $originDir, string $targetDir): void + { + $originDir = rtrim($originDir, '\\/'); + $targetDir = rtrim($targetDir, '\\/'); + + if (! is_dir($originDir)) { + echo sprintf('The origin directory "%s" was not found.', $originDir); + + exit(1); + } + + if (is_dir($targetDir)) { + echo sprintf('The target directory "%s" is existing. Run %s::recursiveDelete(\'%s\') first.', $targetDir, self::class, $targetDir); + + exit(1); + } + + @mkdir($targetDir, 0755, true); + + $dirLen = strlen($originDir); + + /** @var SplFileInfo $file */ + foreach (new RecursiveIteratorIterator( + new RecursiveDirectoryIterator($originDir, FilesystemIterator::SKIP_DOTS), + RecursiveIteratorIterator::SELF_FIRST + ) as $file) { + $origin = $file->getPathname(); + $target = $targetDir . substr($origin, $dirLen); + + if ($file->isDir()) { + @mkdir($target, 0755); + } else { + @copy($origin, $target); + } + } + } + + /** + * Copy Kint's init files into `system/ThirdParty/Kint/` + */ + private static function copyKintInitFiles(): void + { + $originDir = self::$dependencies['kint-src']['from'] . '../'; + $targetDir = self::$dependencies['kint-src']['to']; + + foreach (['init.php', 'init_helpers.php'] as $kintInit) { + @copy($originDir . $kintInit, $targetDir . $kintInit); + } + } +} diff --git a/system/Config/AutoloadConfig.php b/system/Config/AutoloadConfig.php new file mode 100644 index 0000000..0818271 --- /dev/null +++ b/system/Config/AutoloadConfig.php @@ -0,0 +1,135 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Config; + +/** + * AUTOLOADER CONFIGURATION + * + * This file defines the namespaces and class maps so the Autoloader + * can find the files as needed. + */ +class AutoloadConfig +{ + /** + * ------------------------------------------------------------------- + * Namespaces + * ------------------------------------------------------------------- + * This maps the locations of any namespaces in your application to + * their location on the file system. These are used by the autoloader + * to locate files the first time they have been instantiated. + * + * The '/app' and '/system' directories are already mapped for you. + * you may change the name of the 'App' namespace if you wish, + * but this should be done prior to creating any namespaced classes, + * else you will need to modify all of those classes for this to work. + * + * @var array + */ + public $psr4 = []; + + /** + * ------------------------------------------------------------------- + * Class Map + * ------------------------------------------------------------------- + * The class map provides a map of class names and their exact + * location on the drive. Classes loaded in this manner will have + * slightly faster performance because they will not have to be + * searched for within one or more directories as they would if they + * were being autoloaded through a namespace. + * + * @var array + */ + public $classmap = []; + + /** + * ------------------------------------------------------------------- + * Files + * ------------------------------------------------------------------- + * The files array provides a list of paths to __non-class__ files + * that will be autoloaded. This can be useful for bootstrap operations + * or for loading functions. + * + * @var array + */ + public $files = []; + + /** + * ------------------------------------------------------------------- + * Namespaces + * ------------------------------------------------------------------- + * This maps the locations of any namespaces in your application to + * their location on the file system. These are used by the autoloader + * to locate files the first time they have been instantiated. + * + * Do not change the name of the CodeIgniter namespace or your application + * will break. + * + * @var array + */ + protected $corePsr4 = [ + 'CodeIgniter' => SYSTEMPATH, + 'App' => APPPATH, // To ensure filters, etc still found, + ]; + + /** + * ------------------------------------------------------------------- + * Class Map + * ------------------------------------------------------------------- + * The class map provides a map of class names and their exact + * location on the drive. Classes loaded in this manner will have + * slightly faster performance because they will not have to be + * searched for within one or more directories as they would if they + * were being autoloaded through a namespace. + * + * @var array + */ + protected $coreClassmap = [ + 'Psr\Log\AbstractLogger' => SYSTEMPATH . 'ThirdParty/PSR/Log/AbstractLogger.php', + 'Psr\Log\InvalidArgumentException' => SYSTEMPATH . 'ThirdParty/PSR/Log/InvalidArgumentException.php', + 'Psr\Log\LoggerAwareInterface' => SYSTEMPATH . 'ThirdParty/PSR/Log/LoggerAwareInterface.php', + 'Psr\Log\LoggerAwareTrait' => SYSTEMPATH . 'ThirdParty/PSR/Log/LoggerAwareTrait.php', + 'Psr\Log\LoggerInterface' => SYSTEMPATH . 'ThirdParty/PSR/Log/LoggerInterface.php', + 'Psr\Log\LoggerTrait' => SYSTEMPATH . 'ThirdParty/PSR/Log/LoggerTrait.php', + 'Psr\Log\LogLevel' => SYSTEMPATH . 'ThirdParty/PSR/Log/LogLevel.php', + 'Psr\Log\NullLogger' => SYSTEMPATH . 'ThirdParty/PSR/Log/NullLogger.php', + 'Laminas\Escaper\Escaper' => SYSTEMPATH . 'ThirdParty/Escaper/Escaper.php', + ]; + + /** + * ------------------------------------------------------------------- + * Core Files + * ------------------------------------------------------------------- + * List of files from the framework to be autoloaded early. + * + * @var array + */ + protected $coreFiles = []; + + /** + * Constructor. + * + * Merge the built-in and developer-configured psr4 and classmap, + * with preference to the developer ones. + */ + public function __construct() + { + if (isset($_SERVER['CI_ENVIRONMENT']) && $_SERVER['CI_ENVIRONMENT'] === 'testing') { + $this->psr4['Tests\Support'] = SUPPORTPATH; + $this->classmap['CodeIgniter\Log\TestLogger'] = SYSTEMPATH . 'Test/TestLogger.php'; + $this->classmap['CIDatabaseTestCase'] = SYSTEMPATH . 'Test/CIDatabaseTestCase.php'; + } + + $this->psr4 = array_merge($this->corePsr4, $this->psr4); + $this->classmap = array_merge($this->coreClassmap, $this->classmap); + $this->files = array_merge($this->coreFiles, $this->files); + } +} diff --git a/system/Config/BaseConfig.php b/system/Config/BaseConfig.php new file mode 100644 index 0000000..9b71a49 --- /dev/null +++ b/system/Config/BaseConfig.php @@ -0,0 +1,204 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Config; + +use Config\Encryption; +use Config\Modules; +use Config\Services; +use ReflectionClass; +use ReflectionException; +use RuntimeException; + +/** + * Class BaseConfig + * + * Not intended to be used on its own, this class will attempt to + * automatically populate the child class' properties with values + * from the environment. + * + * These can be set within the .env file. + */ +class BaseConfig +{ + /** + * An optional array of classes that will act as Registrars + * for rapidly setting config class properties. + * + * @var array + */ + public static $registrars = []; + + /** + * Has module discovery happened yet? + * + * @var bool + */ + protected static $didDiscovery = false; + + /** + * The modules configuration. + * + * @var Modules + */ + protected static $moduleConfig; + + /** + * Will attempt to get environment variables with names + * that match the properties of the child class. + * + * The "shortPrefix" is the lowercase-only config class name. + */ + public function __construct() + { + static::$moduleConfig = config('Modules'); + + $this->registerProperties(); + + $properties = array_keys(get_object_vars($this)); + $prefix = static::class; + $slashAt = strrpos($prefix, '\\'); + $shortPrefix = strtolower(substr($prefix, $slashAt === false ? 0 : $slashAt + 1)); + + foreach ($properties as $property) { + $this->initEnvValue($this->{$property}, $property, $prefix, $shortPrefix); + + if ($this instanceof Encryption && $property === 'key') { + if (strpos($this->{$property}, 'hex2bin:') === 0) { + // Handle hex2bin prefix + $this->{$property} = hex2bin(substr($this->{$property}, 8)); + } elseif (strpos($this->{$property}, 'base64:') === 0) { + // Handle base64 prefix + $this->{$property} = base64_decode(substr($this->{$property}, 7), true); + } + } + } + } + + /** + * Initialization an environment-specific configuration setting + * + * @param mixed $property + * + * @return mixed + */ + protected function initEnvValue(&$property, string $name, string $prefix, string $shortPrefix) + { + if (is_array($property)) { + foreach (array_keys($property) as $key) { + $this->initEnvValue($property[$key], "{$name}.{$key}", $prefix, $shortPrefix); + } + } elseif (($value = $this->getEnvValue($name, $prefix, $shortPrefix)) !== false && $value !== null) { + if ($value === 'false') { + $value = false; + } elseif ($value === 'true') { + $value = true; + } + $property = is_bool($value) ? $value : trim($value, '\'"'); + } + + return $property; + } + + /** + * Retrieve an environment-specific configuration setting + * + * @return mixed + */ + protected function getEnvValue(string $property, string $prefix, string $shortPrefix) + { + $shortPrefix = ltrim($shortPrefix, '\\'); + $underscoreProperty = str_replace('.', '_', $property); + + switch (true) { + case array_key_exists("{$shortPrefix}.{$property}", $_ENV): + return $_ENV["{$shortPrefix}.{$property}"]; + + case array_key_exists("{$shortPrefix}_{$underscoreProperty}", $_ENV): + return $_ENV["{$shortPrefix}_{$underscoreProperty}"]; + + case array_key_exists("{$shortPrefix}.{$property}", $_SERVER): + return $_SERVER["{$shortPrefix}.{$property}"]; + + case array_key_exists("{$shortPrefix}_{$underscoreProperty}", $_SERVER): + return $_SERVER["{$shortPrefix}_{$underscoreProperty}"]; + + case array_key_exists("{$prefix}.{$property}", $_ENV): + return $_ENV["{$prefix}.{$property}"]; + + case array_key_exists("{$prefix}_{$underscoreProperty}", $_ENV): + return $_ENV["{$prefix}_{$underscoreProperty}"]; + + case array_key_exists("{$prefix}.{$property}", $_SERVER): + return $_SERVER["{$prefix}.{$property}"]; + + case array_key_exists("{$prefix}_{$underscoreProperty}", $_SERVER): + return $_SERVER["{$prefix}_{$underscoreProperty}"]; + + default: + $value = getenv("{$shortPrefix}.{$property}"); + $value = $value === false ? getenv("{$shortPrefix}_{$underscoreProperty}") : $value; + $value = $value === false ? getenv("{$prefix}.{$property}") : $value; + $value = $value === false ? getenv("{$prefix}_{$underscoreProperty}") : $value; + + return $value === false ? null : $value; + } + } + + /** + * Provides external libraries a simple way to register one or more + * options into a config file. + * + * @throws ReflectionException + */ + protected function registerProperties() + { + if (! static::$moduleConfig->shouldDiscover('registrars')) { + return; + } + + if (! static::$didDiscovery) { + $locator = Services::locator(); + $registrarsFiles = $locator->search('Config/Registrar.php'); + + foreach ($registrarsFiles as $file) { + $className = $locator->getClassname($file); + static::$registrars[] = new $className(); + } + + static::$didDiscovery = true; + } + + $shortName = (new ReflectionClass($this))->getShortName(); + + // Check the registrar class for a method named after this class' shortName + foreach (static::$registrars as $callable) { + // ignore non-applicable registrars + if (! method_exists($callable, $shortName)) { + continue; // @codeCoverageIgnore + } + + $properties = $callable::$shortName(); + + if (! is_array($properties)) { + throw new RuntimeException('Registrars must return an array of properties and their values.'); + } + + foreach ($properties as $property => $value) { + if (isset($this->{$property}) && is_array($this->{$property}) && is_array($value)) { + $this->{$property} = array_merge($this->{$property}, $value); + } else { + $this->{$property} = $value; + } + } + } + } +} diff --git a/system/Config/BaseService.php b/system/Config/BaseService.php new file mode 100644 index 0000000..d390807 --- /dev/null +++ b/system/Config/BaseService.php @@ -0,0 +1,378 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Config; + +use CodeIgniter\Autoloader\Autoloader; +use CodeIgniter\Autoloader\FileLocator; +use CodeIgniter\Cache\CacheInterface; +use CodeIgniter\CLI\Commands; +use CodeIgniter\CodeIgniter; +use CodeIgniter\Database\ConnectionInterface; +use CodeIgniter\Database\MigrationRunner; +use CodeIgniter\Debug\Exceptions; +use CodeIgniter\Debug\Iterator; +use CodeIgniter\Debug\Timer; +use CodeIgniter\Debug\Toolbar; +use CodeIgniter\Email\Email; +use CodeIgniter\Encryption\EncrypterInterface; +use CodeIgniter\Filters\Filters; +use CodeIgniter\Format\Format; +use CodeIgniter\Honeypot\Honeypot; +use CodeIgniter\HTTP\CLIRequest; +use CodeIgniter\HTTP\CURLRequest; +use CodeIgniter\HTTP\IncomingRequest; +use CodeIgniter\HTTP\Negotiate; +use CodeIgniter\HTTP\RedirectResponse; +use CodeIgniter\HTTP\Request; +use CodeIgniter\HTTP\RequestInterface; +use CodeIgniter\HTTP\Response; +use CodeIgniter\HTTP\ResponseInterface; +use CodeIgniter\HTTP\URI; +use CodeIgniter\Images\Handlers\BaseHandler; +use CodeIgniter\Language\Language; +use CodeIgniter\Log\Logger; +use CodeIgniter\Pager\Pager; +use CodeIgniter\Router\RouteCollection; +use CodeIgniter\Router\RouteCollectionInterface; +use CodeIgniter\Router\Router; +use CodeIgniter\Security\Security; +use CodeIgniter\Session\Session; +use CodeIgniter\Throttle\Throttler; +use CodeIgniter\Typography\Typography; +use CodeIgniter\Validation\Validation; +use CodeIgniter\View\Cell; +use CodeIgniter\View\Parser; +use CodeIgniter\View\RendererInterface; +use CodeIgniter\View\View; +use Config\App; +use Config\Autoload; +use Config\Cache; +use Config\Encryption; +use Config\Exceptions as ConfigExceptions; +use Config\Filters as ConfigFilters; +use Config\Format as ConfigFormat; +use Config\Honeypot as ConfigHoneyPot; +use Config\Images; +use Config\Migrations; +use Config\Modules; +use Config\Pager as ConfigPager; +use Config\Services as AppServices; +use Config\Toolbar as ConfigToolbar; +use Config\Validation as ConfigValidation; +use Config\View as ConfigView; + +/** + * Services Configuration file. + * + * Services are simply other classes/libraries that the system uses + * to do its job. This is used by CodeIgniter to allow the core of the + * framework to be swapped out easily without affecting the usage within + * the rest of your application. + * + * This is used in place of a Dependency Injection container primarily + * due to its simplicity, which allows a better long-term maintenance + * of the applications built on top of CodeIgniter. A bonus side-effect + * is that IDEs are able to determine what class you are calling + * whereas with DI Containers there usually isn't a way for them to do this. + * + * Warning: To allow overrides by service providers do not use static calls, + * instead call out to \Config\Services (imported as AppServices). + * + * @see http://blog.ircmaxell.com/2015/11/simple-easy-risk-and-change.html + * @see http://www.infoq.com/presentations/Simple-Made-Easy + * + * @method static CacheInterface cache(Cache $config = null, $getShared = true) + * @method static CLIRequest clirequest(App $config = null, $getShared = true) + * @method static CodeIgniter codeigniter(App $config = null, $getShared = true) + * @method static Commands commands($getShared = true) + * @method static CURLRequest curlrequest($options = [], ResponseInterface $response = null, App $config = null, $getShared = true) + * @method static Email email($config = null, $getShared = true) + * @method static EncrypterInterface encrypter(Encryption $config = null, $getShared = false) + * @method static Exceptions exceptions(ConfigExceptions $config = null, IncomingRequest $request = null, Response $response = null, $getShared = true) + * @method static Filters filters(ConfigFilters $config = null, $getShared = true) + * @method static Format format(ConfigFormat $config = null, $getShared = true) + * @method static Honeypot honeypot(ConfigHoneyPot $config = null, $getShared = true) + * @method static BaseHandler image($handler = null, Images $config = null, $getShared = true) + * @method static Iterator iterator($getShared = true) + * @method static Language language($locale = null, $getShared = true) + * @method static Logger logger($getShared = true) + * @method static MigrationRunner migrations(Migrations $config = null, ConnectionInterface $db = null, $getShared = true) + * @method static Negotiate negotiator(RequestInterface $request = null, $getShared = true) + * @method static Pager pager(ConfigPager $config = null, RendererInterface $view = null, $getShared = true) + * @method static Parser parser($viewPath = null, ConfigView $config = null, $getShared = true) + * @method static RedirectResponse redirectresponse(App $config = null, $getShared = true) + * @method static View renderer($viewPath = null, ConfigView $config = null, $getShared = true) + * @method static IncomingRequest request(App $config = null, $getShared = true) + * @method static Response response(App $config = null, $getShared = true) + * @method static Router router(RouteCollectionInterface $routes = null, Request $request = null, $getShared = true) + * @method static RouteCollection routes($getShared = true) + * @method static Security security(App $config = null, $getShared = true) + * @method static Session session(App $config = null, $getShared = true) + * @method static Throttler throttler($getShared = true) + * @method static Timer timer($getShared = true) + * @method static Toolbar toolbar(ConfigToolbar $config = null, $getShared = true) + * @method static Typography typography($getShared = true) + * @method static URI uri($uri = null, $getShared = true) + * @method static Validation validation(ConfigValidation $config = null, $getShared = true) + * @method static Cell viewcell($getShared = true) + */ +class BaseService +{ + /** + * Cache for instance of any services that + * have been requested as a "shared" instance. + * Keys should be lowercase service names. + * + * @var array + */ + protected static $instances = []; + + /** + * Mock objects for testing which are returned if exist. + * + * @var array + */ + protected static $mocks = []; + + /** + * Have we already discovered other Services? + * + * @var bool + */ + protected static $discovered = false; + + /** + * A cache of other service classes we've found. + * + * @var array + */ + protected static $services = []; + + /** + * A cache of the names of services classes found. + * + * @var array + */ + private static $serviceNames = []; + + /** + * Returns a shared instance of any of the class' services. + * + * $key must be a name matching a service. + * + * @param mixed ...$params + * + * @return mixed + */ + protected static function getSharedInstance(string $key, ...$params) + { + $key = strtolower($key); + + // Returns mock if exists + if (isset(static::$mocks[$key])) { + return static::$mocks[$key]; + } + + if (! isset(static::$instances[$key])) { + // Make sure $getShared is false + $params[] = false; + + static::$instances[$key] = AppServices::$key(...$params); + } + + return static::$instances[$key]; + } + + /** + * The Autoloader class is the central class that handles our + * spl_autoload_register method, and helper methods. + * + * @return Autoloader + */ + public static function autoloader(bool $getShared = true) + { + if ($getShared) { + if (empty(static::$instances['autoloader'])) { + static::$instances['autoloader'] = new Autoloader(); + } + + return static::$instances['autoloader']; + } + + return new Autoloader(); + } + + /** + * The file locator provides utility methods for looking for non-classes + * within namespaced folders, as well as convenience methods for + * loading 'helpers', and 'libraries'. + * + * @return FileLocator + */ + public static function locator(bool $getShared = true) + { + if ($getShared) { + if (empty(static::$instances['locator'])) { + static::$instances['locator'] = new FileLocator(static::autoloader()); + } + + return static::$mocks['locator'] ?? static::$instances['locator']; + } + + return new FileLocator(static::autoloader()); + } + + /** + * Provides the ability to perform case-insensitive calling of service + * names. + * + * @return mixed + */ + public static function __callStatic(string $name, array $arguments) + { + $service = static::serviceExists($name); + + if ($service === null) { + return null; + } + + return $service::$name(...$arguments); + } + + /** + * Check if the requested service is defined and return the declaring + * class. Return null if not found. + */ + public static function serviceExists(string $name): ?string + { + static::buildServicesCache(); + $services = array_merge(self::$serviceNames, [Services::class]); + $name = strtolower($name); + + foreach ($services as $service) { + if (method_exists($service, $name)) { + return $service; + } + } + + return null; + } + + /** + * Reset shared instances and mocks for testing. + */ + public static function reset(bool $initAutoloader = false) + { + static::$mocks = []; + static::$instances = []; + + if ($initAutoloader) { + static::autoloader()->initialize(new Autoload(), new Modules()); + } + } + + /** + * Resets any mock and shared instances for a single service. + */ + public static function resetSingle(string $name) + { + unset(static::$mocks[$name], static::$instances[$name]); + } + + /** + * Inject mock object for testing. + * + * @param mixed $mock + */ + public static function injectMock(string $name, $mock) + { + static::$mocks[strtolower($name)] = $mock; + } + + /** + * Will scan all psr4 namespaces registered with system to look + * for new Config\Services files. Caches a copy of each one, then + * looks for the service method in each, returning an instance of + * the service, if available. + * + * @return mixed + * + * @deprecated + * + * @codeCoverageIgnore + */ + protected static function discoverServices(string $name, array $arguments) + { + if (! static::$discovered) { + $config = config('Modules'); + + if ($config->shouldDiscover('services')) { + $locator = static::locator(); + $files = $locator->search('Config/Services'); + + if (empty($files)) { + // no files at all found - this would be really, really bad + return null; + } + + // Get instances of all service classes and cache them locally. + foreach ($files as $file) { + $classname = $locator->getClassname($file); + + if (! in_array($classname, ['CodeIgniter\\Config\\Services'], true)) { + static::$services[] = new $classname(); + } + } + } + + static::$discovered = true; + } + + if (! static::$services) { + // we found stuff, but no services - this would be really bad + return null; + } + + // Try to find the desired service method + foreach (static::$services as $class) { + if (method_exists($class, $name)) { + return $class::$name(...$arguments); + } + } + + return null; + } + + protected static function buildServicesCache(): void + { + if (! static::$discovered) { + $config = config('Modules'); + + if ($config->shouldDiscover('services')) { + $locator = static::locator(); + $files = $locator->search('Config/Services'); + + // Get instances of all service classes and cache them locally. + foreach ($files as $file) { + $classname = $locator->getClassname($file); + + if ($classname !== 'CodeIgniter\\Config\\Services') { + self::$serviceNames[] = $classname; + static::$services[] = new $classname(); + } + } + } + + static::$discovered = true; + } + } +} diff --git a/system/Config/Config.php b/system/Config/Config.php new file mode 100644 index 0000000..307f7ad --- /dev/null +++ b/system/Config/Config.php @@ -0,0 +1,50 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Config; + +/** + * @deprecated Use CodeIgniter\Config\Factories::config() + */ +class Config +{ + /** + * Create new configuration instances or return + * a shared instance + * + * @param string $name Configuration name + * @param bool $getShared Use shared instance + * + * @return mixed|null + */ + public static function get(string $name, bool $getShared = true) + { + return Factories::config($name, ['getShared' => $getShared]); + } + + /** + * Helper method for injecting mock instances while testing. + * + * @param object $instance + */ + public static function injectMock(string $name, $instance) + { + Factories::injectMock('config', $name, $instance); + } + + /** + * Resets the static arrays + */ + public static function reset() + { + Factories::reset('config'); + } +} diff --git a/system/Config/DotEnv.php b/system/Config/DotEnv.php new file mode 100644 index 0000000..ddc590c --- /dev/null +++ b/system/Config/DotEnv.php @@ -0,0 +1,233 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Config; + +use InvalidArgumentException; + +/** + * Environment-specific configuration + */ +class DotEnv +{ + /** + * The directory where the .env file can be located. + * + * @var string + */ + protected $path; + + /** + * Builds the path to our file. + */ + public function __construct(string $path, string $file = '.env') + { + $this->path = rtrim($path, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR . $file; + } + + /** + * The main entry point, will load the .env file and process it + * so that we end up with all settings in the PHP environment vars + * (i.e. getenv(), $_ENV, and $_SERVER) + */ + public function load(): bool + { + $vars = $this->parse(); + + return $vars !== null; + } + + /** + * Parse the .env file into an array of key => value + */ + public function parse(): ?array + { + // We don't want to enforce the presence of a .env file, they should be optional. + if (! is_file($this->path)) { + return null; + } + + // Ensure the file is readable + if (! is_readable($this->path)) { + throw new InvalidArgumentException("The .env file is not readable: {$this->path}"); + } + + $vars = []; + + $lines = file($this->path, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); + + foreach ($lines as $line) { + // Is it a comment? + if (strpos(trim($line), '#') === 0) { + continue; + } + + // If there is an equal sign, then we know we are assigning a variable. + if (strpos($line, '=') !== false) { + [$name, $value] = $this->normaliseVariable($line); + $vars[$name] = $value; + $this->setVariable($name, $value); + } + } + + return $vars; + } + + /** + * Sets the variable into the environment. Will parse the string + * first to look for {name}={value} pattern, ensure that nested + * variables are handled, and strip it of single and double quotes. + */ + protected function setVariable(string $name, string $value = '') + { + if (! getenv($name, true)) { + putenv("{$name}={$value}"); + } + + if (empty($_ENV[$name])) { + $_ENV[$name] = $value; + } + + if (empty($_SERVER[$name])) { + $_SERVER[$name] = $value; + } + } + + /** + * Parses for assignment, cleans the $name and $value, and ensures + * that nested variables are handled. + */ + public function normaliseVariable(string $name, string $value = ''): array + { + // Split our compound string into its parts. + if (strpos($name, '=') !== false) { + [$name, $value] = explode('=', $name, 2); + } + + $name = trim($name); + $value = trim($value); + + // Sanitize the name + $name = str_replace(['export', '\'', '"'], '', $name); + + // Sanitize the value + $value = $this->sanitizeValue($value); + $value = $this->resolveNestedVariables($value); + + return [$name, $value]; + } + + /** + * Strips quotes from the environment variable value. + * + * This was borrowed from the excellent phpdotenv with very few changes. + * https://github.com/vlucas/phpdotenv + * + * @throws InvalidArgumentException + */ + protected function sanitizeValue(string $value): string + { + if (! $value) { + return $value; + } + + // Does it begin with a quote? + if (strpbrk($value[0], '"\'') !== false) { + // value starts with a quote + $quote = $value[0]; + + $regexPattern = sprintf( + '/^ + %1$s # match a quote at the start of the value + ( # capturing sub-pattern used + (?: # we do not need to capture this + [^%1$s\\\\] # any character other than a quote or backslash + |\\\\\\\\ # or two backslashes together + |\\\\%1$s # or an escaped quote e.g \" + )* # as many characters that match the previous rules + ) # end of the capturing sub-pattern + %1$s # and the closing quote + .*$ # and discard any string after the closing quote + /mx', + $quote + ); + + $value = preg_replace($regexPattern, '$1', $value); + $value = str_replace("\\{$quote}", $quote, $value); + $value = str_replace('\\\\', '\\', $value); + } else { + $parts = explode(' #', $value, 2); + $value = trim($parts[0]); + + // Unquoted values cannot contain whitespace + if (preg_match('/\s+/', $value) > 0) { + throw new InvalidArgumentException('.env values containing spaces must be surrounded by quotes.'); + } + } + + return $value; + } + + /** + * Resolve the nested variables. + * + * Look for ${varname} patterns in the variable value and replace with an existing + * environment variable. + * + * This was borrowed from the excellent phpdotenv with very few changes. + * https://github.com/vlucas/phpdotenv + */ + protected function resolveNestedVariables(string $value): string + { + if (strpos($value, '$') !== false) { + $value = preg_replace_callback( + '/\${([a-zA-Z0-9_\.]+)}/', + function ($matchedPatterns) { + $nestedVariable = $this->getVariable($matchedPatterns[1]); + + if ($nestedVariable === null) { + return $matchedPatterns[0]; + } + + return $nestedVariable; + }, + $value + ); + } + + return $value; + } + + /** + * Search the different places for environment variables and return first value found. + * + * This was borrowed from the excellent phpdotenv with very few changes. + * https://github.com/vlucas/phpdotenv + * + * @return string|null + */ + protected function getVariable(string $name) + { + switch (true) { + case array_key_exists($name, $_ENV): + return $_ENV[$name]; + + case array_key_exists($name, $_SERVER): + return $_SERVER[$name]; + + default: + $value = getenv($name); + + // switch getenv default to null + return $value === false ? null : $value; + } + } +} diff --git a/system/Config/Factories.php b/system/Config/Factories.php new file mode 100644 index 0000000..8bcef3e --- /dev/null +++ b/system/Config/Factories.php @@ -0,0 +1,316 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Config; + +use CodeIgniter\Model; +use Config\Services; + +/** + * Factories for creating instances. + * + * Factories allow dynamic loading of components by their path + * and name. The "shared instance" implementation provides a + * large performance boost and helps keep code clean of lengthy + * instantiation checks. + * + * @method static BaseConfig config(...$arguments) + * @method static Model models(...$arguments) + */ +class Factories +{ + /** + * Store of component-specific options, usually + * from CodeIgniter\Config\Factory. + * + * @var array + */ + protected static $options = []; + + /** + * Explicit options for the Config + * component to prevent logic loops. + * + * @var array + */ + private static $configOptions = [ + 'component' => 'config', + 'path' => 'Config', + 'instanceOf' => null, + 'getShared' => true, + 'preferApp' => true, + ]; + + /** + * Mapping of class basenames (no namespace) to + * their instances. + * + * @var array + */ + protected static $basenames = []; + + /** + * Store for instances of any component that + * has been requested as "shared". + * A multi-dimensional array with components as + * keys to the array of name-indexed instances. + * + * @var array + */ + protected static $instances = []; + + /** + * Loads instances based on the method component name. Either + * creates a new instance or returns an existing shared instance. + * + * @return mixed + */ + public static function __callStatic(string $component, array $arguments) + { + // First argument is the name, second is options + $name = trim(array_shift($arguments), '\\ '); + $options = array_shift($arguments) ?? []; + + // Determine the component-specific options + $options = array_merge(self::getOptions(strtolower($component)), $options); + + if (! $options['getShared']) { + if ($class = self::locateClass($options, $name)) { + return new $class(...$arguments); + } + + return null; + } + + $basename = self::getBasename($name); + + // Check for an existing instance + if (isset(self::$basenames[$options['component']][$basename])) { + $class = self::$basenames[$options['component']][$basename]; + + // Need to verify if the shared instance matches the request + if (self::verifyInstanceOf($options, $class)) { + return self::$instances[$options['component']][$class]; + } + } + + // Try to locate the class + if (! $class = self::locateClass($options, $name)) { + return null; + } + + self::$instances[$options['component']][$class] = new $class(...$arguments); + self::$basenames[$options['component']][$basename] = $class; + + return self::$instances[$options['component']][$class]; + } + + /** + * Finds a component class + * + * @param array $options The array of component-specific directives + * @param string $name Class name, namespace optional + */ + protected static function locateClass(array $options, string $name): ?string + { + // Check for low-hanging fruit + if (class_exists($name, false) && self::verifyPreferApp($options, $name) && self::verifyInstanceOf($options, $name)) { + return $name; + } + + // Determine the relative class names we need + $basename = self::getBasename($name); + $appname = $options['component'] === 'config' + ? 'Config\\' . $basename + : rtrim(APP_NAMESPACE, '\\') . '\\' . $options['path'] . '\\' . $basename; + + // If an App version was requested then see if it verifies + if ($options['preferApp'] && class_exists($appname) && self::verifyInstanceOf($options, $name)) { + return $appname; + } + + // If we have ruled out an App version and the class exists then try it + if (class_exists($name) && self::verifyInstanceOf($options, $name)) { + return $name; + } + + // Have to do this the hard way... + $locator = Services::locator(); + + // Check if the class was namespaced + if (strpos($name, '\\') !== false) { + if (! $file = $locator->locateFile($name, $options['path'])) { + return null; + } + $files = [$file]; + } + // No namespace? Search for it + // Check all namespaces, prioritizing App and modules + elseif (! $files = $locator->search($options['path'] . DIRECTORY_SEPARATOR . $name)) { + return null; + } + + // Check all files for a valid class + foreach ($files as $file) { + $class = $locator->getClassname($file); + + if ($class && self::verifyInstanceOf($options, $class)) { + return $class; + } + } + + return null; + } + + /** + * Verifies that a class & config satisfy the "preferApp" option + * + * @param array $options The array of component-specific directives + * @param string $name Class name, namespace optional + */ + protected static function verifyPreferApp(array $options, string $name): bool + { + // Anything without that restriction passes + if (! $options['preferApp']) { + return true; + } + + // Special case for Config since its App namespace is actually \Config + if ($options['component'] === 'config') { + return strpos($name, 'Config') === 0; + } + + return strpos($name, APP_NAMESPACE) === 0; + } + + /** + * Verifies that a class & config satisfy the "instanceOf" option + * + * @param array $options The array of component-specific directives + * @param string $name Class name, namespace optional + */ + protected static function verifyInstanceOf(array $options, string $name): bool + { + // Anything without that restriction passes + if (! $options['instanceOf']) { + return true; + } + + return is_a($name, $options['instanceOf'], true); + } + + /** + * Returns the component-specific configuration + * + * @param string $component Lowercase, plural component name + * + * @return array + */ + public static function getOptions(string $component): array + { + $component = strtolower($component); + + // Check for a stored version + if (isset(self::$options[$component])) { + return self::$options[$component]; + } + + $values = $component === 'config' + // Handle Config as a special case to prevent logic loops + ? self::$configOptions + // Load values from the best Factory configuration (will include Registrars) + : config('Factory')->{$component} ?? []; + + return self::setOptions($component, $values); + } + + /** + * Normalizes, stores, and returns the configuration for a specific component + * + * @param string $component Lowercase, plural component name + * + * @return array The result after applying defaults and normalization + */ + public static function setOptions(string $component, array $values): array + { + // Allow the config to replace the component name, to support "aliases" + $values['component'] = strtolower($values['component'] ?? $component); + + // Reset this component so instances can be rediscovered with the updated config + self::reset($values['component']); + + // If no path was available then use the component + $values['path'] = trim($values['path'] ?? ucfirst($values['component']), '\\ '); + + // Add defaults for any missing values + $values = array_merge(Factory::$default, $values); + + // Store the result to the supplied name and potential alias + self::$options[$component] = $values; + self::$options[$values['component']] = $values; + + return $values; + } + + /** + * Resets the static arrays, optionally just for one component + * + * @param string $component Lowercase, plural component name + */ + public static function reset(?string $component = null) + { + if ($component) { + unset( + static::$options[$component], + static::$basenames[$component], + static::$instances[$component] + ); + + return; + } + + static::$options = []; + static::$basenames = []; + static::$instances = []; + } + + /** + * Helper method for injecting mock instances + * + * @param string $component Lowercase, plural component name + * @param string $name The name of the instance + */ + public static function injectMock(string $component, string $name, object $instance) + { + // Force a configuration to exist for this component + $component = strtolower($component); + self::getOptions($component); + + $class = get_class($instance); + $basename = self::getBasename($name); + + self::$instances[$component][$class] = $instance; + self::$basenames[$component][$basename] = $class; + } + + /** + * Gets a basename from a class name, namespaced or not. + */ + public static function getBasename(string $name): string + { + // Determine the basename + if ($basename = strrchr($name, '\\')) { + return substr($basename, 1); + } + + return $name; + } +} diff --git a/system/Config/Factory.php b/system/Config/Factory.php new file mode 100644 index 0000000..5889bf4 --- /dev/null +++ b/system/Config/Factory.php @@ -0,0 +1,48 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Config; + +/** + * Factories Configuration file. + * + * Provides overriding directives for how + * Factories should handle discovery and + * instantiation of specific components. + * Each property should correspond to the + * lowercase, plural component name. + */ +class Factory extends BaseConfig +{ + /** + * Supplies a default set of options to merge for + * all unspecified factory components. + * + * @var array + */ + public static $default = [ + 'component' => null, + 'path' => null, + 'instanceOf' => null, + 'getShared' => true, + 'preferApp' => true, + ]; + + /** + * Specifies that Models should always favor child + * classes to allow easy extension of module Models. + * + * @var array + */ + public $models = [ + 'preferApp' => true, + ]; +} diff --git a/system/Config/ForeignCharacters.php b/system/Config/ForeignCharacters.php new file mode 100644 index 0000000..f2e7cc5 --- /dev/null +++ b/system/Config/ForeignCharacters.php @@ -0,0 +1,113 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Config; + +/** + * Describes foreign characters for transliteration with the text helper. + */ +class ForeignCharacters +{ + /** + * Without further ado, the list of foreign characters. + */ + public $characterList = [ + '/Ƥ|Ʀ|ǽ/' => 'ae', + '/ƶ|œ/' => 'oe', + '/ü/' => 'ue', + '/Ƅ/' => 'Ae', + '/Ü/' => 'Ue', + '/Ɩ/' => 'Oe', + '/ƀ|Ɓ|Ƃ|ƃ|Ƅ|ƅ|Ēŗ|Ā|Ă|Ą|Ē|Ī‘|Ά|įŗ¢|įŗ |įŗ¦|įŗŖ|įŗØ|įŗ¬|įŗ°|įŗ®|įŗ“|įŗ²|įŗ¶|А/' => 'A', + '/Ć |Ć”|Ć¢|Ć£|Ć„|Ē»|ā|ă|ą|ĒŽ|ĀŖ|α|ά|įŗ£|įŗ”|įŗ§|įŗ„|įŗ«|įŗ©|įŗ­|įŗ±|įŗÆ|įŗµ|įŗ³|įŗ·|а/' => 'a', + '/Š‘/' => 'B', + '/б/' => 'b', + '/Ƈ|Ć|Ĉ|Ċ|Č/' => 'C', + '/Ƨ|ć|ĉ|ċ|č/' => 'c', + '/Š”/' => 'D', + '/Š“/' => 'd', + '/Ɛ|Ď|Đ|Ī”/' => 'Dj', + '/ư|ď|đ|Ī“/' => 'dj', + '/ƈ|Ɖ|Ê|Ƌ|Ē|Ĕ|Ė|Ę|Ě|Ī•|Έ|įŗ¼|įŗŗ|įŗø|Ề|įŗ¾|Ễ|Ể|Ệ|Š•|Š­/' => 'E', + '/ĆØ|Ć©|ĆŖ|Ć«|ē|ĕ|ė|ę|ě|Ī­|ε|įŗ½|įŗ»|įŗ¹|ề|įŗæ|į»…|ể|ệ|е|э/' => 'e', + '/Ф/' => 'F', + '/ф/' => 'f', + '/Ĝ|Ğ|Ä |Ä¢|Ī“|Š“|Ґ/' => 'G', + '/ĝ|ğ|Ä”|Ä£|γ|г|Ņ‘/' => 'g', + '/Ĥ|Ħ/' => 'H', + '/Ä„|ħ/' => 'h', + '/Ì|ƍ|Ǝ|Ə|ÄØ|ÄŖ|Ĭ|Ē|Ä®|İ|Ī—|Ή|Ί|Ī™|ĪŖ|Ỉ|Ị|И|Š«/' => 'I', + '/Ƭ|Ć­|Ć®|ĆÆ|Ä©|Ä«|Ä­|ǐ|ÄÆ|ı|Ī·|Ī®|ĪÆ|ι|ϊ|ỉ|ị|Šø|ы|ї/' => 'i', + '/Ä“/' => 'J', + '/ĵ/' => 'j', + '/Ķ|Κ|К/' => 'K', + '/Ä·|Īŗ|Šŗ/' => 'k', + '/Ĺ|Ä»|Ľ|Äæ|Ł|Ī›|Š›/' => 'L', + '/Äŗ|ļ|ľ|ŀ|ł|Ī»|Š»/' => 'l', + '/М/' => 'M', + '/м/' => 'm', + '/Ƒ|Ń|Ņ|Ň|Ī|Š/' => 'N', + '/Ʊ|ń|ņ|ň|ʼn|ν|н/' => 'n', + '/ƒ|Ɠ|Ɣ|ƕ|Ō|Ŏ|Ē‘|Ő|Ę |Ƙ|Ǿ|Ο|Ό|Ī©|Ī|į»Ž|Ọ|į»’|Ố|į»–|į»”|Ộ|Ờ|Ớ|į» |į»ž|Ợ|Šž/' => 'O', + '/ò|ó|Ć“|Ƶ|ō|ŏ|Ē’|ő|Ę”|Ćø|Ēæ|Āŗ|Īæ|ό|ω|ĻŽ|į»|į»|ồ|ố|į»—|ổ|į»™|į»|į»›|į»”|ở|ợ|о/' => 'o', + '/П/' => 'P', + '/Šæ/' => 'p', + '/Ŕ|Ŗ|Ř|Ī”|Š /' => 'R', + '/ŕ|ŗ|ř|ρ|р/' => 'r', + '/Ś|Ŝ|Ş|Ș|Å |Ī£|Š”/' => 'S', + '/ś|ŝ|ş|ș|Å”|Åæ|σ|Ļ‚|с/' => 's', + '/Ț|Å¢|Ť|Ŧ|Ļ„|Š¢/' => 'T', + '/ț|Å£|Å„|ŧ|т/' => 't', + '/ƙ|Ú|ƛ|ÅØ|ÅŖ|Ŭ|Å®|Ű|Ų|ĘÆ|Ē“|Ē•|Ē—|Ē™|Ē›|ÅØ|Ủ|Ụ|Ừ|Ứ|į»®|Ử|į»°|Š£/' => 'U', + '/ù|Ćŗ|Ć»|Å©|Å«|Å­|ÅÆ|ű|ų|ʰ|Ē”|Ē–|ǘ|ǚ|ǜ|Ļ…|Ļ|Ļ‹|į»§|Ễ|ừ|ứ|ữ|į»­|į»±|у/' => 'u', + '/Ƴ|Ɏ|ồ|įŗŽ|Ó²|Ó®|ŠŽ|Ɲ|Åø|Ŷ|Ī„|ĪŽ|Ī«|Ỳ|Ỹ|į»¶|ồ|Š™/' => 'Y', + '/įŗ™|Ź|Ę“|ɏ|ỵ|įŗ|Ó³|ÓÆ|ў|ý|Ćæ|Å·|ỳ|ỹ|į»·|ỵ|й/' => 'y', + '/Š’/' => 'V', + '/в/' => 'v', + '/Å“/' => 'W', + '/ŵ/' => 'w', + '/Ź|Å»|Ž|Ī–|Š—/' => 'Z', + '/Åŗ|ż|ž|ζ|Š·/' => 'z', + '/Ɔ|Ǽ/' => 'AE', + '/ß/' => 'ss', + '/IJ/' => 'IJ', + '/ij/' => 'ij', + '/Œ/' => 'OE', + '/ʒ/' => 'f', + '/ξ/' => 'ks', + '/Ļ€/' => 'p', + '/β/' => 'v', + '/μ/' => 'm', + '/ψ/' => 'ps', + '/Ё/' => 'Yo', + '/ё/' => 'yo', + '/Š„/' => 'Ye', + '/є/' => 'ye', + '/Ї/' => 'Yi', + '/Š–/' => 'Zh', + '/ж/' => 'zh', + '/Š„/' => 'Kh', + '/х/' => 'kh', + '/Ц/' => 'Ts', + '/ц/' => 'ts', + '/Ч/' => 'Ch', + '/ч/' => 'ch', + '/ŠØ/' => 'Sh', + '/ш/' => 'sh', + '/Š©/' => 'Shch', + '/щ/' => 'shch', + '/ŠŖ|ъ|Ь|ь/' => '', + '/Š®/' => 'Yu', + '/ю/' => 'yu', + '/ŠÆ/' => 'Ya', + '/я/' => 'ya', + ]; +} diff --git a/system/Config/Publisher.php b/system/Config/Publisher.php new file mode 100644 index 0000000..608e87a --- /dev/null +++ b/system/Config/Publisher.php @@ -0,0 +1,42 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Config; + +/** + * Publisher Configuration + * + * Defines basic security restrictions for the Publisher class + * to prevent abuse by injecting malicious files into a project. + */ +class Publisher extends BaseConfig +{ + /** + * A list of allowed destinations with a (pseudo-)regex + * of allowed files for each destination. + * Attempts to publish to directories not in this list will + * result in a PublisherException. Files that do no fit the + * pattern will cause copy/merge to fail. + * + * @var array + */ + public $restrictions = [ + ROOTPATH => '*', + FCPATH => '#\.(?css|js|map|htm?|xml|json|webmanifest|tff|eot|woff?|gif|jpe?g|tiff?|png|webp|bmp|ico|svg)$#i', + ]; + + /** + * Disables Registrars to prevent modules from altering the restrictions. + */ + final protected function registerProperties() + { + } +} diff --git a/system/Config/Routes.php b/system/Config/Routes.php new file mode 100644 index 0000000..4ace952 --- /dev/null +++ b/system/Config/Routes.php @@ -0,0 +1,40 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +use CodeIgniter\Exceptions\PageNotFoundException; + +/* + * System URI Routing + * + * This file contains any routing to system tools, such as command-line + * tools for migrations, etc. + * + * It is called by Config\Routes, and has the $routes RouteCollection + * already loaded up and ready for us to use. + */ + +// Prevent access to BaseController +$routes->add('BaseController(:any)', static function () { + throw PageNotFoundException::forPageNotFound(); +}); + +// Prevent access to initController method +$routes->add('(:any)/initController', static function () { + throw PageNotFoundException::forPageNotFound(); +}); + +// Migrations +$routes->cli('migrations/(:segment)/(:segment)', '\CodeIgniter\Commands\MigrationsCommand::$1/$2'); +$routes->cli('migrations/(:segment)', '\CodeIgniter\Commands\MigrationsCommand::$1'); +$routes->cli('migrations', '\CodeIgniter\Commands\MigrationsCommand::index'); + +// CLI Catchall - uses a _remap to call Commands +$routes->cli('ci(:any)', '\CodeIgniter\CLI\CommandRunner::index/$1'); diff --git a/system/Config/Services.php b/system/Config/Services.php new file mode 100644 index 0000000..0b681f1 --- /dev/null +++ b/system/Config/Services.php @@ -0,0 +1,689 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Config; + +use CodeIgniter\Cache\CacheFactory; +use CodeIgniter\Cache\CacheInterface; +use CodeIgniter\CLI\Commands; +use CodeIgniter\CodeIgniter; +use CodeIgniter\Database\ConnectionInterface; +use CodeIgniter\Database\MigrationRunner; +use CodeIgniter\Debug\Exceptions; +use CodeIgniter\Debug\Iterator; +use CodeIgniter\Debug\Timer; +use CodeIgniter\Debug\Toolbar; +use CodeIgniter\Email\Email; +use CodeIgniter\Encryption\EncrypterInterface; +use CodeIgniter\Encryption\Encryption; +use CodeIgniter\Filters\Filters; +use CodeIgniter\Format\Format; +use CodeIgniter\Honeypot\Honeypot; +use CodeIgniter\HTTP\CLIRequest; +use CodeIgniter\HTTP\CURLRequest; +use CodeIgniter\HTTP\IncomingRequest; +use CodeIgniter\HTTP\Negotiate; +use CodeIgniter\HTTP\RedirectResponse; +use CodeIgniter\HTTP\Request; +use CodeIgniter\HTTP\RequestInterface; +use CodeIgniter\HTTP\Response; +use CodeIgniter\HTTP\ResponseInterface; +use CodeIgniter\HTTP\URI; +use CodeIgniter\HTTP\UserAgent; +use CodeIgniter\Images\Handlers\BaseHandler; +use CodeIgniter\Language\Language; +use CodeIgniter\Log\Logger; +use CodeIgniter\Pager\Pager; +use CodeIgniter\Router\RouteCollection; +use CodeIgniter\Router\RouteCollectionInterface; +use CodeIgniter\Router\Router; +use CodeIgniter\Security\Security; +use CodeIgniter\Session\Session; +use CodeIgniter\Throttle\Throttler; +use CodeIgniter\Typography\Typography; +use CodeIgniter\Validation\Validation; +use CodeIgniter\View\Cell; +use CodeIgniter\View\Parser; +use CodeIgniter\View\RendererInterface; +use CodeIgniter\View\View; +use Config\App; +use Config\Cache; +use Config\Email as EmailConfig; +use Config\Encryption as EncryptionConfig; +use Config\Exceptions as ExceptionsConfig; +use Config\Filters as FiltersConfig; +use Config\Format as FormatConfig; +use Config\Honeypot as HoneypotConfig; +use Config\Images; +use Config\Migrations; +use Config\Pager as PagerConfig; +use Config\Services as AppServices; +use Config\Toolbar as ToolbarConfig; +use Config\Validation as ValidationConfig; +use Config\View as ViewConfig; + +/** + * Services Configuration file. + * + * Services are simply other classes/libraries that the system uses + * to do its job. This is used by CodeIgniter to allow the core of the + * framework to be swapped out easily without affecting the usage within + * the rest of your application. + * + * This is used in place of a Dependency Injection container primarily + * due to its simplicity, which allows a better long-term maintenance + * of the applications built on top of CodeIgniter. A bonus side-effect + * is that IDEs are able to determine what class you are calling + * whereas with DI Containers there usually isn't a way for them to do this. + * + * @see http://blog.ircmaxell.com/2015/11/simple-easy-risk-and-change.html + * @see http://www.infoq.com/presentations/Simple-Made-Easy + */ +class Services extends BaseService +{ + /** + * The cache class provides a simple way to store and retrieve + * complex data for later. + * + * @return CacheInterface + */ + public static function cache(?Cache $config = null, bool $getShared = true) + { + if ($getShared) { + return static::getSharedInstance('cache', $config); + } + + $config = $config ?? new Cache(); + + return CacheFactory::getHandler($config); + } + + /** + * The CLI Request class provides for ways to interact with + * a command line request. + * + * @return CLIRequest + */ + public static function clirequest(?App $config = null, bool $getShared = true) + { + if ($getShared) { + return static::getSharedInstance('clirequest', $config); + } + + $config = $config ?? config('App'); + + return new CLIRequest($config); + } + + /** + * CodeIgniter, the core of the framework. + * + * @return CodeIgniter + */ + public static function codeigniter(?App $config = null, bool $getShared = true) + { + if ($getShared) { + return static::getSharedInstance('codeigniter', $config); + } + + $config = $config ?? config('App'); + + return new CodeIgniter($config); + } + + /** + * The commands utility for running and working with CLI commands. + * + * @return Commands + */ + public static function commands(bool $getShared = true) + { + if ($getShared) { + return static::getSharedInstance('commands'); + } + + return new Commands(); + } + + /** + * The CURL Request class acts as a simple HTTP client for interacting + * with other servers, typically through APIs. + * + * @return CURLRequest + */ + public static function curlrequest(array $options = [], ?ResponseInterface $response = null, ?App $config = null, bool $getShared = true) + { + if ($getShared === true) { + return static::getSharedInstance('curlrequest', $options, $response, $config); + } + + $config = $config ?? config('App'); + $response = $response ?? new Response($config); + + return new CURLRequest( + $config, + new URI($options['base_uri'] ?? null), + $response, + $options + ); + } + + /** + * The Email class allows you to send email via mail, sendmail, SMTP. + * + * @param array|EmailConfig|null $config + * + * @return Email + */ + public static function email($config = null, bool $getShared = true) + { + if ($getShared) { + return static::getSharedInstance('email', $config); + } + + if (empty($config) || ! (is_array($config) || $config instanceof EmailConfig)) { + $config = config('Email'); + } + + return new Email($config); + } + + /** + * The Encryption class provides two-way encryption. + * + * @param bool $getShared + * + * @return EncrypterInterface Encryption handler + */ + public static function encrypter(?EncryptionConfig $config = null, $getShared = false) + { + if ($getShared === true) { + return static::getSharedInstance('encrypter', $config); + } + + $config = $config ?? config('Encryption'); + $encryption = new Encryption($config); + + return $encryption->initialize($config); + } + + /** + * The Exceptions class holds the methods that handle: + * + * - set_exception_handler + * - set_error_handler + * - register_shutdown_function + * + * @return Exceptions + */ + public static function exceptions( + ?ExceptionsConfig $config = null, + ?IncomingRequest $request = null, + ?Response $response = null, + bool $getShared = true + ) { + if ($getShared) { + return static::getSharedInstance('exceptions', $config, $request, $response); + } + + $config = $config ?? config('Exceptions'); + $request = $request ?? AppServices::request(); + $response = $response ?? AppServices::response(); + + return new Exceptions($config, $request, $response); + } + + /** + * Filters allow you to run tasks before and/or after a controller + * is executed. During before filters, the request can be modified, + * and actions taken based on the request, while after filters can + * act on or modify the response itself before it is sent to the client. + * + * @return Filters + */ + public static function filters(?FiltersConfig $config = null, bool $getShared = true) + { + if ($getShared) { + return static::getSharedInstance('filters', $config); + } + + $config = $config ?? config('Filters'); + + return new Filters($config, AppServices::request(), AppServices::response()); + } + + /** + * The Format class is a convenient place to create Formatters. + * + * @return Format + */ + public static function format(?FormatConfig $config = null, bool $getShared = true) + { + if ($getShared) { + return static::getSharedInstance('format', $config); + } + + $config = $config ?? config('Format'); + + return new Format($config); + } + + /** + * The Honeypot provides a secret input on forms that bots should NOT + * fill in, providing an additional safeguard when accepting user input. + * + * @return Honeypot + */ + public static function honeypot(?HoneypotConfig $config = null, bool $getShared = true) + { + if ($getShared) { + return static::getSharedInstance('honeypot', $config); + } + + $config = $config ?? config('Honeypot'); + + return new Honeypot($config); + } + + /** + * Acts as a factory for ImageHandler classes and returns an instance + * of the handler. Used like Services::image()->withFile($path)->rotate(90)->save(); + * + * @return BaseHandler + */ + public static function image(?string $handler = null, ?Images $config = null, bool $getShared = true) + { + if ($getShared) { + return static::getSharedInstance('image', $handler, $config); + } + + $config = $config ?? config('Images'); + $handler = $handler ?: $config->defaultHandler; + $class = $config->handlers[$handler]; + + return new $class($config); + } + + /** + * The Iterator class provides a simple way of looping over a function + * and timing the results and memory usage. Used when debugging and + * optimizing applications. + * + * @return Iterator + */ + public static function iterator(bool $getShared = true) + { + if ($getShared) { + return static::getSharedInstance('iterator'); + } + + return new Iterator(); + } + + /** + * Responsible for loading the language string translations. + * + * @return Language + */ + public static function language(?string $locale = null, bool $getShared = true) + { + if ($getShared) { + return static::getSharedInstance('language', $locale)->setLocale($locale); + } + + // Use '?:' for empty string check + $locale = $locale ?: AppServices::request()->getLocale(); + + return new Language($locale); + } + + /** + * The Logger class is a PSR-3 compatible Logging class that supports + * multiple handlers that process the actual logging. + * + * @return Logger + */ + public static function logger(bool $getShared = true) + { + if ($getShared) { + return static::getSharedInstance('logger'); + } + + return new Logger(config('Logger')); + } + + /** + * Return the appropriate Migration runner. + * + * @return MigrationRunner + */ + public static function migrations(?Migrations $config = null, ?ConnectionInterface $db = null, bool $getShared = true) + { + if ($getShared) { + return static::getSharedInstance('migrations', $config, $db); + } + + $config = $config ?? config('Migrations'); + + return new MigrationRunner($config, $db); + } + + /** + * The Negotiate class provides the content negotiation features for + * working the request to determine correct language, encoding, charset, + * and more. + * + * @return Negotiate + */ + public static function negotiator(?RequestInterface $request = null, bool $getShared = true) + { + if ($getShared) { + return static::getSharedInstance('negotiator', $request); + } + + $request = $request ?? AppServices::request(); + + return new Negotiate($request); + } + + /** + * Return the appropriate pagination handler. + * + * @return Pager + */ + public static function pager(?PagerConfig $config = null, ?RendererInterface $view = null, bool $getShared = true) + { + if ($getShared) { + return static::getSharedInstance('pager', $config, $view); + } + + $config = $config ?? config('Pager'); + $view = $view ?? AppServices::renderer(); + + return new Pager($config, $view); + } + + /** + * The Parser is a simple template parser. + * + * @return Parser + */ + public static function parser(?string $viewPath = null, ?ViewConfig $config = null, bool $getShared = true) + { + if ($getShared) { + return static::getSharedInstance('parser', $viewPath, $config); + } + + $viewPath = $viewPath ?: config('Paths')->viewDirectory; + $config = $config ?? config('View'); + + return new Parser($config, $viewPath, AppServices::locator(), CI_DEBUG, AppServices::logger()); + } + + /** + * The Renderer class is the class that actually displays a file to the user. + * The default View class within CodeIgniter is intentionally simple, but this + * service could easily be replaced by a template engine if the user needed to. + * + * @return View + */ + public static function renderer(?string $viewPath = null, ?ViewConfig $config = null, bool $getShared = true) + { + if ($getShared) { + return static::getSharedInstance('renderer', $viewPath, $config); + } + + $viewPath = $viewPath ?: config('Paths')->viewDirectory; + $config = $config ?? config('View'); + + return new View($config, $viewPath, AppServices::locator(), CI_DEBUG, AppServices::logger()); + } + + /** + * The Request class models an HTTP request. + * + * @return IncomingRequest + */ + public static function request(?App $config = null, bool $getShared = true) + { + if ($getShared) { + return static::getSharedInstance('request', $config); + } + + $config = $config ?? config('App'); + + return new IncomingRequest( + $config, + AppServices::uri(), + 'php://input', + new UserAgent() + ); + } + + /** + * The Response class models an HTTP response. + * + * @return Response + */ + public static function response(?App $config = null, bool $getShared = true) + { + if ($getShared) { + return static::getSharedInstance('response', $config); + } + + $config = $config ?? config('App'); + + return new Response($config); + } + + /** + * The Redirect class provides nice way of working with redirects. + * + * @return RedirectResponse + */ + public static function redirectresponse(?App $config = null, bool $getShared = true) + { + if ($getShared) { + return static::getSharedInstance('redirectresponse', $config); + } + + $config = $config ?? config('App'); + $response = new RedirectResponse($config); + $response->setProtocolVersion(AppServices::request()->getProtocolVersion()); + + return $response; + } + + /** + * The Routes service is a class that allows for easily building + * a collection of routes. + * + * @return RouteCollection + */ + public static function routes(bool $getShared = true) + { + if ($getShared) { + return static::getSharedInstance('routes'); + } + + return new RouteCollection(AppServices::locator(), config('Modules')); + } + + /** + * The Router class uses a RouteCollection's array of routes, and determines + * the correct Controller and Method to execute. + * + * @return Router + */ + public static function router(?RouteCollectionInterface $routes = null, ?Request $request = null, bool $getShared = true) + { + if ($getShared) { + return static::getSharedInstance('router', $routes, $request); + } + + $routes = $routes ?? AppServices::routes(); + $request = $request ?? AppServices::request(); + + return new Router($routes, $request); + } + + /** + * The Security class provides a few handy tools for keeping the site + * secure, most notably the CSRF protection tools. + * + * @return Security + */ + public static function security(?App $config = null, bool $getShared = true) + { + if ($getShared) { + return static::getSharedInstance('security', $config); + } + + $config = $config ?? config('App'); + + return new Security($config); + } + + /** + * Return the session manager. + * + * @return Session + */ + public static function session(?App $config = null, bool $getShared = true) + { + if ($getShared) { + return static::getSharedInstance('session', $config); + } + + $config = $config ?? config('App'); + $logger = AppServices::logger(); + + $driverName = $config->sessionDriver; + $driver = new $driverName($config, AppServices::request()->getIPAddress()); + $driver->setLogger($logger); + + $session = new Session($driver, $config); + $session->setLogger($logger); + + if (session_status() === PHP_SESSION_NONE) { + $session->start(); + } + + return $session; + } + + /** + * The Throttler class provides a simple method for implementing + * rate limiting in your applications. + * + * @return Throttler + */ + public static function throttler(bool $getShared = true) + { + if ($getShared) { + return static::getSharedInstance('throttler'); + } + + return new Throttler(AppServices::cache()); + } + + /** + * The Timer class provides a simple way to Benchmark portions of your + * application. + * + * @return Timer + */ + public static function timer(bool $getShared = true) + { + if ($getShared) { + return static::getSharedInstance('timer'); + } + + return new Timer(); + } + + /** + * Return the debug toolbar. + * + * @return Toolbar + */ + public static function toolbar(?ToolbarConfig $config = null, bool $getShared = true) + { + if ($getShared) { + return static::getSharedInstance('toolbar', $config); + } + + $config = $config ?? config('Toolbar'); + + return new Toolbar($config); + } + + /** + * The URI class provides a way to model and manipulate URIs. + * + * @param string $uri + * + * @return URI + */ + public static function uri(?string $uri = null, bool $getShared = true) + { + if ($getShared) { + return static::getSharedInstance('uri', $uri); + } + + return new URI($uri); + } + + /** + * The Validation class provides tools for validating input data. + * + * @return Validation + */ + public static function validation(?ValidationConfig $config = null, bool $getShared = true) + { + if ($getShared) { + return static::getSharedInstance('validation', $config); + } + + $config = $config ?? config('Validation'); + + return new Validation($config, AppServices::renderer()); + } + + /** + * View cells are intended to let you insert HTML into view + * that has been generated by any callable in the system. + * + * @return Cell + */ + public static function viewcell(bool $getShared = true) + { + if ($getShared) { + return static::getSharedInstance('viewcell'); + } + + return new Cell(AppServices::cache()); + } + + /** + * The Typography class provides a way to format text in semantically relevant ways. + * + * @return Typography + */ + public static function typography(bool $getShared = true) + { + if ($getShared) { + return static::getSharedInstance('typography'); + } + + return new Typography(); + } +} diff --git a/system/Config/View.php b/system/Config/View.php new file mode 100644 index 0000000..5a8baea --- /dev/null +++ b/system/Config/View.php @@ -0,0 +1,100 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Config; + +/** + * View configuration + */ +class View extends BaseConfig +{ + /** + * When false, the view method will clear the data between each + * call. + * + * @var bool + */ + public $saveData = true; + + /** + * Parser Filters map a filter name with any PHP callable. When the + * Parser prepares a variable for display, it will chain it + * through the filters in the order defined, inserting any parameters. + * + * To prevent potential abuse, all filters MUST be defined here + * in order for them to be available for use within the Parser. + */ + public $filters = []; + + /** + * Parser Plugins provide a way to extend the functionality provided + * by the core Parser by creating aliases that will be replaced with + * any callable. Can be single or tag pair. + */ + public $plugins = []; + + /** + * Built-in View filters. + * + * @var array + */ + protected $coreFilters = [ + 'abs' => '\abs', + 'capitalize' => '\CodeIgniter\View\Filters::capitalize', + 'date' => '\CodeIgniter\View\Filters::date', + 'date_modify' => '\CodeIgniter\View\Filters::date_modify', + 'default' => '\CodeIgniter\View\Filters::default', + 'esc' => '\CodeIgniter\View\Filters::esc', + 'excerpt' => '\CodeIgniter\View\Filters::excerpt', + 'highlight' => '\CodeIgniter\View\Filters::highlight', + 'highlight_code' => '\CodeIgniter\View\Filters::highlight_code', + 'limit_words' => '\CodeIgniter\View\Filters::limit_words', + 'limit_chars' => '\CodeIgniter\View\Filters::limit_chars', + 'local_currency' => '\CodeIgniter\View\Filters::local_currency', + 'local_number' => '\CodeIgniter\View\Filters::local_number', + 'lower' => '\strtolower', + 'nl2br' => '\CodeIgniter\View\Filters::nl2br', + 'number_format' => '\number_format', + 'prose' => '\CodeIgniter\View\Filters::prose', + 'round' => '\CodeIgniter\View\Filters::round', + 'strip_tags' => '\strip_tags', + 'title' => '\CodeIgniter\View\Filters::title', + 'upper' => '\strtoupper', + ]; + + /** + * Built-in View plugins. + * + * @var array + */ + protected $corePlugins = [ + 'current_url' => '\CodeIgniter\View\Plugins::currentURL', + 'previous_url' => '\CodeIgniter\View\Plugins::previousURL', + 'mailto' => '\CodeIgniter\View\Plugins::mailto', + 'safe_mailto' => '\CodeIgniter\View\Plugins::safeMailto', + 'lang' => '\CodeIgniter\View\Plugins::lang', + 'validation_errors' => '\CodeIgniter\View\Plugins::validationErrors', + 'route' => '\CodeIgniter\View\Plugins::route', + 'siteURL' => '\CodeIgniter\View\Plugins::siteURL', + ]; + + /** + * Merge the built-in and developer-configured filters and plugins, + * with preference to the developer ones. + */ + public function __construct() + { + $this->filters = array_merge($this->coreFilters, $this->filters); + $this->plugins = array_merge($this->corePlugins, $this->plugins); + + parent::__construct(); + } +} diff --git a/system/Controller.php b/system/Controller.php new file mode 100644 index 0000000..b50c8bc --- /dev/null +++ b/system/Controller.php @@ -0,0 +1,162 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter; + +use CodeIgniter\HTTP\Exceptions\HTTPException; +use CodeIgniter\HTTP\RequestInterface; +use CodeIgniter\HTTP\ResponseInterface; +use CodeIgniter\Validation\Exceptions\ValidationException; +use CodeIgniter\Validation\Validation; +use Config\Services; +use Psr\Log\LoggerInterface; + +/** + * Class Controller + */ +class Controller +{ + /** + * Helpers that will be automatically loaded on class instantiation. + * + * @var array + */ + protected $helpers = []; + + /** + * Instance of the main Request object. + * + * @var RequestInterface + */ + protected $request; + + /** + * Instance of the main response object. + * + * @var ResponseInterface + */ + protected $response; + + /** + * Instance of logger to use. + * + * @var LoggerInterface + */ + protected $logger; + + /** + * Should enforce HTTPS access for all methods in this controller. + * + * @var int Number of seconds to set HSTS header + */ + protected $forceHTTPS = 0; + + /** + * Once validation has been run, will hold the Validation instance. + * + * @var Validation + */ + protected $validator; + + /** + * Constructor. + * + * @throws HTTPException + */ + public function initController(RequestInterface $request, ResponseInterface $response, LoggerInterface $logger) + { + $this->request = $request; + $this->response = $response; + $this->logger = $logger; + + if ($this->forceHTTPS > 0) { + $this->forceHTTPS($this->forceHTTPS); + } + + // Autoload helper files. + helper($this->helpers); + } + + /** + * A convenience method to use when you need to ensure that a single + * method is reached only via HTTPS. If it isn't, then a redirect + * will happen back to this method and HSTS header will be sent + * to have modern browsers transform requests automatically. + * + * @param int $duration The number of seconds this link should be + * considered secure for. Only with HSTS header. + * Default value is 1 year. + * + * @throws HTTPException + */ + protected function forceHTTPS(int $duration = 31536000) + { + force_https($duration, $this->request, $this->response); + } + + /** + * Provides a simple way to tie into the main CodeIgniter class and + * tell it how long to cache the current page for. + */ + protected function cachePage(int $time) + { + CodeIgniter::cache($time); + } + + /** + * Handles "auto-loading" helper files. + * + * @deprecated Use `helper` function instead of using this method. + * + * @codeCoverageIgnore + */ + protected function loadHelpers() + { + if (empty($this->helpers)) { + return; + } + + helper($this->helpers); + } + + /** + * A shortcut to performing validation on input data. If validation + * is not successful, a $errors property will be set on this class. + * + * @param array|string $rules + * @param array $messages An array of custom error messages + */ + protected function validate($rules, array $messages = []): bool + { + $this->validator = Services::validation(); + + // If you replace the $rules array with the name of the group + if (is_string($rules)) { + $validation = config('Validation'); + + // If the rule wasn't found in the \Config\Validation, we + // should throw an exception so the developer can find it. + if (! isset($validation->{$rules})) { + throw ValidationException::forRuleNotFound($rules); + } + + // If no error message is defined, use the error message in the Config\Validation file + if (! $messages) { + $errorName = $rules . '_errors'; + $messages = $validation->{$errorName} ?? []; + } + + $rules = $validation->{$rules}; + } + + return $this->validator->withRequest($this->request)->setRules($rules, $messages)->run(); + } +} diff --git a/system/Cookie/CloneableCookieInterface.php b/system/Cookie/CloneableCookieInterface.php new file mode 100644 index 0000000..508c135 --- /dev/null +++ b/system/Cookie/CloneableCookieInterface.php @@ -0,0 +1,107 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Cookie; + +use DateTimeInterface; + +/** + * Interface for a fresh Cookie instance with selected attribute(s) + * only changed from the original instance. + */ +interface CloneableCookieInterface extends CookieInterface +{ + /** + * Creates a new Cookie with a new cookie prefix. + * + * @return static + */ + public function withPrefix(string $prefix = ''); + + /** + * Creates a new Cookie with a new name. + * + * @return static + */ + public function withName(string $name); + + /** + * Creates a new Cookie with new value. + * + * @return static + */ + public function withValue(string $value); + + /** + * Creates a new Cookie with a new cookie expires time. + * + * @param DateTimeInterface|int|string $expires + * + * @return static + */ + public function withExpires($expires); + + /** + * Creates a new Cookie that will expire the cookie from the browser. + * + * @return static + */ + public function withExpired(); + + /** + * Creates a new Cookie that will virtually never expire from the browser. + * + * @return static + */ + public function withNeverExpiring(); + + /** + * Creates a new Cookie with a new path on the server the cookie is available. + * + * @return static + */ + public function withPath(?string $path); + + /** + * Creates a new Cookie with a new domain the cookie is available. + * + * @return static + */ + public function withDomain(?string $domain); + + /** + * Creates a new Cookie with a new "Secure" attribute. + * + * @return static + */ + public function withSecure(bool $secure = true); + + /** + * Creates a new Cookie with a new "HttpOnly" attribute + * + * @return static + */ + public function withHTTPOnly(bool $httponly = true); + + /** + * Creates a new Cookie with a new "SameSite" attribute. + * + * @return static + */ + public function withSameSite(string $samesite); + + /** + * Creates a new Cookie with URL encoding option updated. + * + * @return static + */ + public function withRaw(bool $raw = true); +} diff --git a/system/Cookie/Cookie.php b/system/Cookie/Cookie.php new file mode 100644 index 0000000..150d420 --- /dev/null +++ b/system/Cookie/Cookie.php @@ -0,0 +1,783 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Cookie; + +use ArrayAccess; +use CodeIgniter\Cookie\Exceptions\CookieException; +use Config\Cookie as CookieConfig; +use DateTimeInterface; +use InvalidArgumentException; +use LogicException; +use ReturnTypeWillChange; + +/** + * A `Cookie` class represents an immutable HTTP cookie value object. + * + * Being immutable, modifying one or more of its attributes will return + * a new `Cookie` instance, rather than modifying itself. Users should + * reassign this new instance to a new variable to capture it. + * + * ```php + * $cookie = new Cookie('test_cookie', 'test_value'); + * $cookie->getName(); // test_cookie + * + * $cookie->withName('prod_cookie'); + * $cookie->getName(); // test_cookie + * + * $cookie2 = $cookie->withName('prod_cookie'); + * $cookie2->getName(); // prod_cookie + * ``` + */ +class Cookie implements ArrayAccess, CloneableCookieInterface +{ + /** + * @var string + */ + protected $prefix = ''; + + /** + * @var string + */ + protected $name; + + /** + * @var string + */ + protected $value; + + /** + * @var int + */ + protected $expires; + + /** + * @var string + */ + protected $path = '/'; + + /** + * @var string + */ + protected $domain = ''; + + /** + * @var bool + */ + protected $secure = false; + + /** + * @var bool + */ + protected $httponly = true; + + /** + * @var string + */ + protected $samesite = self::SAMESITE_LAX; + + /** + * @var bool + */ + protected $raw = false; + + /** + * Default attributes for a Cookie object. The keys here are the + * lowercase attribute names. Do not camelCase! + * + * @var array + */ + private static $defaults = [ + 'prefix' => '', + 'expires' => 0, + 'path' => '/', + 'domain' => '', + 'secure' => false, + 'httponly' => true, + 'samesite' => self::SAMESITE_LAX, + 'raw' => false, + ]; + + /** + * A cookie name can be any US-ASCII characters, except control characters, + * spaces, tabs, or separator characters. + * + * @var string + * + * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie#attributes + * @see https://tools.ietf.org/html/rfc2616#section-2.2 + */ + private static $reservedCharsList = "=,; \t\r\n\v\f()<>@:\\\"/[]?{}"; + + /** + * Set the default attributes to a Cookie instance by injecting + * the values from the `CookieConfig` config or an array. + * + * @param array|CookieConfig $config + * + * @return array The old defaults array. Useful for resetting. + */ + public static function setDefaults($config = []) + { + $oldDefaults = self::$defaults; + $newDefaults = []; + + if ($config instanceof CookieConfig) { + $newDefaults = [ + 'prefix' => $config->prefix, + 'expires' => $config->expires, + 'path' => $config->path, + 'domain' => $config->domain, + 'secure' => $config->secure, + 'httponly' => $config->httponly, + 'samesite' => $config->samesite, + 'raw' => $config->raw, + ]; + } elseif (is_array($config)) { + $newDefaults = $config; + } + + // This array union ensures that even if passed `$config` is not + // `CookieConfig` or `array`, no empty defaults will occur. + self::$defaults = $newDefaults + $oldDefaults; + + return $oldDefaults; + } + + //========================================================================= + // CONSTRUCTORS + //========================================================================= + + /** + * Create a new Cookie instance from a `Set-Cookie` header. + * + * @throws CookieException + * + * @return static + */ + public static function fromHeaderString(string $cookie, bool $raw = false) + { + $data = self::$defaults; + $data['raw'] = $raw; + + $parts = preg_split('/\;[\s]*/', $cookie); + $part = explode('=', array_shift($parts), 2); + + $name = $raw ? $part[0] : urldecode($part[0]); + $value = isset($part[1]) ? ($raw ? $part[1] : urldecode($part[1])) : ''; + unset($part); + + foreach ($parts as $part) { + if (strpos($part, '=') !== false) { + [$attr, $val] = explode('=', $part); + } else { + $attr = $part; + $val = true; + } + + $data[strtolower($attr)] = $val; + } + + return new static($name, $value, $data); + } + + /** + * Construct a new Cookie instance. + * + * @param string $name The cookie's name + * @param string $value The cookie's value + * @param array $options The cookie's options + * + * @throws CookieException + */ + final public function __construct(string $name, string $value = '', array $options = []) + { + $options += self::$defaults; + + $options['expires'] = static::convertExpiresTimestamp($options['expires']); + + // If both `Expires` and `Max-Age` are set, `Max-Age` has precedence. + if (isset($options['max-age']) && is_numeric($options['max-age'])) { + $options['expires'] = time() + (int) $options['max-age']; + unset($options['max-age']); + } + + // to preserve backward compatibility with array-based cookies in previous CI versions + $prefix = $options['prefix'] ?: self::$defaults['prefix']; + $path = $options['path'] ?: self::$defaults['path']; + $domain = $options['domain'] ?: self::$defaults['domain']; + + // empty string SameSite should use the default for browsers + $samesite = $options['samesite'] ?: self::$defaults['samesite']; + + $raw = $options['raw']; + $secure = $options['secure']; + $httponly = $options['httponly']; + + $this->validateName($name, $raw); + $this->validatePrefix($prefix, $secure, $path, $domain); + $this->validateSameSite($samesite, $secure); + + $this->prefix = $prefix; + $this->name = $name; + $this->value = $value; + $this->expires = static::convertExpiresTimestamp($options['expires']); + $this->path = $path; + $this->domain = $domain; + $this->secure = $secure; + $this->httponly = $httponly; + $this->samesite = ucfirst(strtolower($samesite)); + $this->raw = $raw; + } + + //========================================================================= + // GETTERS + //========================================================================= + + /** + * {@inheritDoc} + */ + public function getId(): string + { + return implode(';', [$this->getPrefixedName(), $this->getPath(), $this->getDomain()]); + } + + /** + * {@inheritDoc} + */ + public function getPrefix(): string + { + return $this->prefix; + } + + /** + * {@inheritDoc} + */ + public function getName(): string + { + return $this->name; + } + + /** + * {@inheritDoc} + */ + public function getPrefixedName(): string + { + $name = $this->getPrefix(); + + if ($this->isRaw()) { + $name .= $this->getName(); + } else { + $search = str_split(self::$reservedCharsList); + $replace = array_map('rawurlencode', $search); + + $name .= str_replace($search, $replace, $this->getName()); + } + + return $name; + } + + /** + * {@inheritDoc} + */ + public function getValue(): string + { + return $this->value; + } + + /** + * {@inheritDoc} + */ + public function getExpiresTimestamp(): int + { + return $this->expires; + } + + /** + * {@inheritDoc} + */ + public function getExpiresString(): string + { + return gmdate(self::EXPIRES_FORMAT, $this->expires); + } + + /** + * {@inheritDoc} + */ + public function isExpired(): bool + { + return $this->expires === 0 || $this->expires < time(); + } + + /** + * {@inheritDoc} + */ + public function getMaxAge(): int + { + $maxAge = $this->expires - time(); + + return $maxAge >= 0 ? $maxAge : 0; + } + + /** + * {@inheritDoc} + */ + public function getPath(): string + { + return $this->path; + } + + /** + * {@inheritDoc} + */ + public function getDomain(): string + { + return $this->domain; + } + + /** + * {@inheritDoc} + */ + public function isSecure(): bool + { + return $this->secure; + } + + /** + * {@inheritDoc} + */ + public function isHTTPOnly(): bool + { + return $this->httponly; + } + + /** + * {@inheritDoc} + */ + public function getSameSite(): string + { + return $this->samesite; + } + + /** + * {@inheritDoc} + */ + public function isRaw(): bool + { + return $this->raw; + } + + /** + * {@inheritDoc} + */ + public function getOptions(): array + { + // This is the order of options in `setcookie`. DO NOT CHANGE. + return [ + 'expires' => $this->expires, + 'path' => $this->path, + 'domain' => $this->domain, + 'secure' => $this->secure, + 'httponly' => $this->httponly, + 'samesite' => $this->samesite ?: ucfirst(self::SAMESITE_LAX), + ]; + } + + //========================================================================= + // CLONING + //========================================================================= + + /** + * {@inheritDoc} + */ + public function withPrefix(string $prefix = '') + { + $this->validatePrefix($prefix, $this->secure, $this->path, $this->domain); + + $cookie = clone $this; + + $cookie->prefix = $prefix; + + return $cookie; + } + + /** + * {@inheritDoc} + */ + public function withName(string $name) + { + $this->validateName($name, $this->raw); + + $cookie = clone $this; + + $cookie->name = $name; + + return $cookie; + } + + /** + * {@inheritDoc} + */ + public function withValue(string $value) + { + $cookie = clone $this; + + $cookie->value = $value; + + return $cookie; + } + + /** + * {@inheritDoc} + */ + public function withExpires($expires) + { + $cookie = clone $this; + + $cookie->expires = static::convertExpiresTimestamp($expires); + + return $cookie; + } + + /** + * {@inheritDoc} + */ + public function withExpired() + { + $cookie = clone $this; + + $cookie->expires = 0; + + return $cookie; + } + + /** + * {@inheritDoc} + */ + public function withNeverExpiring() + { + $cookie = clone $this; + + $cookie->expires = time() + 5 * YEAR; + + return $cookie; + } + + /** + * {@inheritDoc} + */ + public function withPath(?string $path) + { + $path = $path ?: self::$defaults['path']; + $this->validatePrefix($this->prefix, $this->secure, $path, $this->domain); + + $cookie = clone $this; + + $cookie->path = $path; + + return $cookie; + } + + /** + * {@inheritDoc} + */ + public function withDomain(?string $domain) + { + $domain = $domain ?? self::$defaults['domain']; + $this->validatePrefix($this->prefix, $this->secure, $this->path, $domain); + + $cookie = clone $this; + + $cookie->domain = $domain; + + return $cookie; + } + + /** + * {@inheritDoc} + */ + public function withSecure(bool $secure = true) + { + $this->validatePrefix($this->prefix, $secure, $this->path, $this->domain); + $this->validateSameSite($this->samesite, $secure); + + $cookie = clone $this; + + $cookie->secure = $secure; + + return $cookie; + } + + /** + * {@inheritDoc} + */ + public function withHTTPOnly(bool $httponly = true) + { + $cookie = clone $this; + + $cookie->httponly = $httponly; + + return $cookie; + } + + /** + * {@inheritDoc} + */ + public function withSameSite(string $samesite) + { + $this->validateSameSite($samesite, $this->secure); + + $cookie = clone $this; + + $cookie->samesite = ucfirst(strtolower($samesite)); + + return $cookie; + } + + /** + * {@inheritDoc} + */ + public function withRaw(bool $raw = true) + { + $this->validateName($this->name, $raw); + + $cookie = clone $this; + + $cookie->raw = $raw; + + return $cookie; + } + + //========================================================================= + // ARRAY ACCESS FOR BC + //========================================================================= + + /** + * Whether an offset exists. + * + * @param mixed $offset + */ + public function offsetExists($offset): bool + { + return $offset === 'expire' ? true : property_exists($this, $offset); + } + + /** + * Offset to retrieve. + * + * @param mixed $offset + * + * @throws InvalidArgumentException + * + * @return mixed + */ + #[ReturnTypeWillChange] + public function offsetGet($offset) + { + if (! $this->offsetExists($offset)) { + throw new InvalidArgumentException(sprintf('Undefined offset "%s".', $offset)); + } + + return $offset === 'expire' ? $this->expires : $this->{$offset}; + } + + /** + * Offset to set. + * + * @param mixed $offset + * @param mixed $value + * + * @throws LogicException + */ + public function offsetSet($offset, $value): void + { + throw new LogicException(sprintf('Cannot set values of properties of %s as it is immutable.', static::class)); + } + + /** + * Offset to unset. + * + * @param mixed $offset + * + * @throws LogicException + */ + public function offsetUnset($offset): void + { + throw new LogicException(sprintf('Cannot unset values of properties of %s as it is immutable.', static::class)); + } + + //========================================================================= + // CONVERTERS + //========================================================================= + + /** + * {@inheritDoc} + */ + public function toHeaderString(): string + { + return $this->__toString(); + } + + /** + * {@inheritDoc} + */ + public function __toString() + { + $cookieHeader = []; + + if ($this->getValue() === '') { + $cookieHeader[] = $this->getPrefixedName() . '=deleted'; + $cookieHeader[] = 'Expires=' . gmdate(self::EXPIRES_FORMAT, 0); + $cookieHeader[] = 'Max-Age=0'; + } else { + $value = $this->isRaw() ? $this->getValue() : rawurlencode($this->getValue()); + + $cookieHeader[] = sprintf('%s=%s', $this->getPrefixedName(), $value); + + if ($this->getExpiresTimestamp() !== 0) { + $cookieHeader[] = 'Expires=' . $this->getExpiresString(); + $cookieHeader[] = 'Max-Age=' . $this->getMaxAge(); + } + } + + if ($this->getPath() !== '') { + $cookieHeader[] = 'Path=' . $this->getPath(); + } + + if ($this->getDomain() !== '') { + $cookieHeader[] = 'Domain=' . $this->getDomain(); + } + + if ($this->isSecure()) { + $cookieHeader[] = 'Secure'; + } + + if ($this->isHTTPOnly()) { + $cookieHeader[] = 'HttpOnly'; + } + + $samesite = $this->getSameSite(); + + if ($samesite === '') { + // modern browsers warn in console logs that an empty SameSite attribute + // will be given the `Lax` value + $samesite = self::SAMESITE_LAX; + } + + $cookieHeader[] = 'SameSite=' . ucfirst(strtolower($samesite)); + + return implode('; ', $cookieHeader); + } + + /** + * {@inheritDoc} + */ + public function toArray(): array + { + return [ + 'name' => $this->name, + 'value' => $this->value, + 'prefix' => $this->prefix, + 'raw' => $this->raw, + ] + $this->getOptions(); + } + + /** + * Converts expires time to Unix format. + * + * @param DateTimeInterface|int|string $expires + */ + protected static function convertExpiresTimestamp($expires = 0): int + { + if ($expires instanceof DateTimeInterface) { + $expires = $expires->format('U'); + } + + if (! is_string($expires) && ! is_int($expires)) { + throw CookieException::forInvalidExpiresTime(gettype($expires)); + } + + if (! is_numeric($expires)) { + $expires = strtotime($expires); + + if ($expires === false) { + throw CookieException::forInvalidExpiresValue(); + } + } + + return $expires > 0 ? (int) $expires : 0; + } + + //========================================================================= + // VALIDATION + //========================================================================= + + /** + * Validates the cookie name per RFC 2616. + * + * If `$raw` is true, names should not contain invalid characters + * as `setrawcookie()` will reject this. + * + * @throws CookieException + */ + protected function validateName(string $name, bool $raw): void + { + if ($raw && strpbrk($name, self::$reservedCharsList) !== false) { + throw CookieException::forInvalidCookieName($name); + } + + if ($name === '') { + throw CookieException::forEmptyCookieName(); + } + } + + /** + * Validates the special prefixes if some attribute requirements are met. + * + * @throws CookieException + */ + protected function validatePrefix(string $prefix, bool $secure, string $path, string $domain): void + { + if (strpos($prefix, '__Secure-') === 0 && ! $secure) { + throw CookieException::forInvalidSecurePrefix(); + } + + if (strpos($prefix, '__Host-') === 0 && (! $secure || $domain !== '' || $path !== '/')) { + throw CookieException::forInvalidHostPrefix(); + } + } + + /** + * Validates the `SameSite` to be within the allowed types. + * + * @throws CookieException + * + * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite + */ + protected function validateSameSite(string $samesite, bool $secure): void + { + if ($samesite === '') { + $samesite = self::$defaults['samesite']; + } + + if ($samesite === '') { + $samesite = self::SAMESITE_LAX; + } + + if (! in_array(strtolower($samesite), self::ALLOWED_SAMESITE_VALUES, true)) { + throw CookieException::forInvalidSameSite($samesite); + } + + if (strtolower($samesite) === self::SAMESITE_NONE && ! $secure) { + throw CookieException::forInvalidSameSiteNone(); + } + } +} diff --git a/system/Cookie/CookieInterface.php b/system/Cookie/CookieInterface.php new file mode 100644 index 0000000..0b2b757 --- /dev/null +++ b/system/Cookie/CookieInterface.php @@ -0,0 +1,168 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Cookie; + +/** + * Interface for a value object representation of an HTTP cookie. + * + * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie + */ +interface CookieInterface +{ + /** + * Cookies will be sent in all contexts, i.e in responses to both + * first-party and cross-origin requests. If `SameSite=None` is set, + * the cookie `Secure` attribute must also be set (or the cookie will be blocked). + */ + public const SAMESITE_NONE = 'none'; + + /** + * Cookies are not sent on normal cross-site subrequests (for example to + * load images or frames into a third party site), but are sent when a + * user is navigating to the origin site (i.e. when following a link). + */ + public const SAMESITE_LAX = 'lax'; + + /** + * Cookies will only be sent in a first-party context and not be sent + * along with requests initiated by third party websites. + */ + public const SAMESITE_STRICT = 'strict'; + + /** + * RFC 6265 allowed values for the "SameSite" attribute. + * + * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite + */ + public const ALLOWED_SAMESITE_VALUES = [ + self::SAMESITE_NONE, + self::SAMESITE_LAX, + self::SAMESITE_STRICT, + ]; + + /** + * Expires date format. + * + * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Date + * @see https://tools.ietf.org/html/rfc7231#section-7.1.1.2 + */ + public const EXPIRES_FORMAT = 'D, d-M-Y H:i:s T'; + + /** + * Returns a unique identifier for the cookie consisting + * of its prefixed name, path, and domain. + */ + public function getId(): string; + + /** + * Gets the cookie prefix. + */ + public function getPrefix(): string; + + /** + * Gets the cookie name. + */ + public function getName(): string; + + /** + * Gets the cookie name prepended with the prefix, if any. + */ + public function getPrefixedName(): string; + + /** + * Gets the cookie value. + */ + public function getValue(): string; + + /** + * Gets the time in Unix timestamp the cookie expires. + */ + public function getExpiresTimestamp(): int; + + /** + * Gets the formatted expires time. + */ + public function getExpiresString(): string; + + /** + * Checks if the cookie is expired. + */ + public function isExpired(): bool; + + /** + * Gets the "Max-Age" cookie attribute. + */ + public function getMaxAge(): int; + + /** + * Gets the "Path" cookie attribute. + */ + public function getPath(): string; + + /** + * Gets the "Domain" cookie attribute. + */ + public function getDomain(): string; + + /** + * Gets the "Secure" cookie attribute. + * + * Checks if the cookie is only sent to the server when a request is made + * with the `https:` scheme (except on `localhost`), and therefore is more + * resistent to man-in-the-middle attacks. + */ + public function isSecure(): bool; + + /** + * Gets the "HttpOnly" cookie attribute. + * + * Checks if JavaScript is forbidden from accessing the cookie. + */ + public function isHTTPOnly(): bool; + + /** + * Gets the "SameSite" cookie attribute. + */ + public function getSameSite(): string; + + /** + * Checks if the cookie should be sent with no URL encoding. + */ + public function isRaw(): bool; + + /** + * Gets the options that are passable to the `setcookie` variant + * available on PHP 7.3+ + * + * @return array + */ + public function getOptions(): array; + + /** + * Returns the Cookie as a header value. + */ + public function toHeaderString(): string; + + /** + * Returns the string representation of the Cookie object. + * + * @return string + */ + public function __toString(); + + /** + * Returns the array representation of the Cookie object. + * + * @return array + */ + public function toArray(): array; +} diff --git a/system/Cookie/CookieStore.php b/system/Cookie/CookieStore.php new file mode 100644 index 0000000..af7dd2f --- /dev/null +++ b/system/Cookie/CookieStore.php @@ -0,0 +1,256 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Cookie; + +use ArrayIterator; +use CodeIgniter\Cookie\Exceptions\CookieException; +use Countable; +use IteratorAggregate; +use Traversable; + +/** + * The CookieStore object represents an immutable collection of `Cookie` value objects. + * + * @implements IteratorAggregate + */ +class CookieStore implements Countable, IteratorAggregate +{ + /** + * The cookie collection. + * + * @var array + */ + protected $cookies = []; + + /** + * Creates a CookieStore from an array of `Set-Cookie` headers. + * + * @param string[] $headers + * + * @throws CookieException + * + * @return static + */ + public static function fromCookieHeaders(array $headers, bool $raw = false) + { + /** + * @var Cookie[] $cookies + */ + $cookies = array_filter(array_map(static function (string $header) use ($raw) { + try { + return Cookie::fromHeaderString($header, $raw); + } catch (CookieException $e) { + log_message('error', $e->getMessage()); + + return false; + } + }, $headers)); + + return new static($cookies); + } + + /** + * @param Cookie[] $cookies + * + * @throws CookieException + */ + final public function __construct(array $cookies) + { + $this->validateCookies($cookies); + + foreach ($cookies as $cookie) { + $this->cookies[$cookie->getId()] = $cookie; + } + } + + /** + * Checks if a `Cookie` object identified by name and + * prefix is present in the collection. + */ + public function has(string $name, string $prefix = '', ?string $value = null): bool + { + $name = $prefix . $name; + + foreach ($this->cookies as $cookie) { + if ($cookie->getPrefixedName() !== $name) { + continue; + } + + if ($value === null) { + return true; // for BC + } + + return $cookie->getValue() === $value; + } + + return false; + } + + /** + * Retrieves an instance of `Cookie` identified by a name and prefix. + * This throws an exception if not found. + * + * @throws CookieException + */ + public function get(string $name, string $prefix = ''): Cookie + { + $name = $prefix . $name; + + foreach ($this->cookies as $cookie) { + if ($cookie->getPrefixedName() === $name) { + return $cookie; + } + } + + throw CookieException::forUnknownCookieInstance([$name, $prefix]); + } + + /** + * Store a new cookie and return a new collection. The original collection + * is left unchanged. + * + * @return static + */ + public function put(Cookie $cookie) + { + $store = clone $this; + + $store->cookies[$cookie->getId()] = $cookie; + + return $store; + } + + /** + * Removes a cookie from a collection and returns an updated collection. + * The original collection is left unchanged. + * + * Removing a cookie from the store **DOES NOT** delete it from the browser. + * If you intend to delete a cookie *from the browser*, you must put an empty + * value cookie with the same name to the store. + * + * @return static + */ + public function remove(string $name, string $prefix = '') + { + $default = Cookie::setDefaults(); + + $id = implode(';', [$prefix . $name, $default['path'], $default['domain']]); + + $store = clone $this; + + foreach (array_keys($store->cookies) as $index) { + if ($index === $id) { + unset($store->cookies[$index]); + } + } + + return $store; + } + + /** + * Dispatches all cookies in store. + * + * @deprecated Response should dispatch cookies. + */ + public function dispatch(): void + { + foreach ($this->cookies as $cookie) { + $name = $cookie->getPrefixedName(); + $value = $cookie->getValue(); + $options = $cookie->getOptions(); + + if ($cookie->isRaw()) { + $this->setRawCookie($name, $value, $options); + } else { + $this->setCookie($name, $value, $options); + } + } + + $this->clear(); + } + + /** + * Returns all cookie instances in store. + * + * @return array + */ + public function display(): array + { + return $this->cookies; + } + + /** + * Clears the cookie collection. + */ + public function clear(): void + { + $this->cookies = []; + } + + /** + * Gets the Cookie count in this collection. + */ + public function count(): int + { + return count($this->cookies); + } + + /** + * Gets the iterator for the cookie collection. + * + * @return Traversable + */ + public function getIterator(): Traversable + { + return new ArrayIterator($this->cookies); + } + + /** + * Validates all cookies passed to be instances of Cookie. + * + * @throws CookieException + */ + protected function validateCookies(array $cookies): void + { + foreach ($cookies as $index => $cookie) { + $type = is_object($cookie) ? get_class($cookie) : gettype($cookie); + + if (! $cookie instanceof Cookie) { + throw CookieException::forInvalidCookieInstance([static::class, Cookie::class, $type, $index]); + } + } + } + + /** + * Extracted call to `setrawcookie()` in order to run unit tests on it. + * + * @codeCoverageIgnore + * + * @deprecated + */ + protected function setRawCookie(string $name, string $value, array $options): void + { + setrawcookie($name, $value, $options); + } + + /** + * Extracted call to `setcookie()` in order to run unit tests on it. + * + * @codeCoverageIgnore + * + * @deprecated + */ + protected function setCookie(string $name, string $value, array $options): void + { + setcookie($name, $value, $options); + } +} diff --git a/system/Cookie/Exceptions/CookieException.php b/system/Cookie/Exceptions/CookieException.php new file mode 100644 index 0000000..2e69a0e --- /dev/null +++ b/system/Cookie/Exceptions/CookieException.php @@ -0,0 +1,127 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Cookie\Exceptions; + +use CodeIgniter\Exceptions\FrameworkException; + +/** + * CookieException is thrown for invalid cookies initialization and management. + */ +class CookieException extends FrameworkException +{ + /** + * Thrown for invalid type given for the "Expires" attribute. + * + * @return static + */ + public static function forInvalidExpiresTime(string $type) + { + return new static(lang('Cookie.invalidExpiresTime', [$type])); + } + + /** + * Thrown when the value provided for "Expires" is invalid. + * + * @return static + */ + public static function forInvalidExpiresValue() + { + return new static(lang('Cookie.invalidExpiresValue')); + } + + /** + * Thrown when the cookie name contains invalid characters per RFC 2616. + * + * @return static + */ + public static function forInvalidCookieName(string $name) + { + return new static(lang('Cookie.invalidCookieName', [$name])); + } + + /** + * Thrown when the cookie name is empty. + * + * @return static + */ + public static function forEmptyCookieName() + { + return new static(lang('Cookie.emptyCookieName')); + } + + /** + * Thrown when using the `__Secure-` prefix but the `Secure` attribute + * is not set to true. + * + * @return static + */ + public static function forInvalidSecurePrefix() + { + return new static(lang('Cookie.invalidSecurePrefix')); + } + + /** + * Thrown when using the `__Host-` prefix but the `Secure` flag is not + * set, the `Domain` is set, and the `Path` is not `/`. + * + * @return static + */ + public static function forInvalidHostPrefix() + { + return new static(lang('Cookie.invalidHostPrefix')); + } + + /** + * Thrown when the `SameSite` attribute given is not of the valid types. + * + * @return static + */ + public static function forInvalidSameSite(string $sameSite) + { + return new static(lang('Cookie.invalidSameSite', [$sameSite])); + } + + /** + * Thrown when the `SameSite` attribute is set to `None` but the `Secure` + * attribute is not set. + * + * @return static + */ + public static function forInvalidSameSiteNone() + { + return new static(lang('Cookie.invalidSameSiteNone')); + } + + /** + * Thrown when the `CookieStore` class is filled with invalid Cookie objects. + * + * @param array $data + * + * @return static + */ + public static function forInvalidCookieInstance(array $data) + { + return new static(lang('Cookie.invalidCookieInstance', $data)); + } + + /** + * Thrown when the queried Cookie object does not exist in the cookie collection. + * + * @param string[] $data + * + * @return static + */ + public static function forUnknownCookieInstance(array $data) + { + return new static(lang('Cookie.unknownCookieInstance', $data)); + } +} diff --git a/system/Database/BaseBuilder.php b/system/Database/BaseBuilder.php new file mode 100644 index 0000000..2a431ac --- /dev/null +++ b/system/Database/BaseBuilder.php @@ -0,0 +1,2758 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Database; + +use Closure; +use CodeIgniter\Database\Exceptions\DatabaseException; +use CodeIgniter\Database\Exceptions\DataException; +use InvalidArgumentException; + +/** + * Class BaseBuilder + * + * Provides the core Query Builder methods. + * Database-specific Builders might need to override + * certain methods to make them work. + */ +class BaseBuilder +{ + /** + * Reset DELETE data flag + * + * @var bool + */ + protected $resetDeleteData = false; + + /** + * QB SELECT data + * + * @var array + */ + protected $QBSelect = []; + + /** + * QB DISTINCT flag + * + * @var bool + */ + protected $QBDistinct = false; + + /** + * QB FROM data + * + * @var array + */ + protected $QBFrom = []; + + /** + * QB JOIN data + * + * @var array + */ + protected $QBJoin = []; + + /** + * QB WHERE data + * + * @var array + */ + protected $QBWhere = []; + + /** + * QB GROUP BY data + * + * @var array + */ + public $QBGroupBy = []; + + /** + * QB HAVING data + * + * @var array + */ + protected $QBHaving = []; + + /** + * QB keys + * + * @var array + */ + protected $QBKeys = []; + + /** + * QB LIMIT data + * + * @var bool|int + */ + protected $QBLimit = false; + + /** + * QB OFFSET data + * + * @var bool|int + */ + protected $QBOffset = false; + + /** + * QB ORDER BY data + * + * @var array|string|null + */ + public $QBOrderBy = []; + + /** + * QB NO ESCAPE data + * + * @var array + */ + public $QBNoEscape = []; + + /** + * QB data sets + * + * @var array + */ + protected $QBSet = []; + + /** + * QB WHERE group started flag + * + * @var bool + */ + protected $QBWhereGroupStarted = false; + + /** + * QB WHERE group count + * + * @var int + */ + protected $QBWhereGroupCount = 0; + + /** + * Ignore data that cause certain + * exceptions, for example in case of + * duplicate keys. + * + * @var bool + */ + protected $QBIgnore = false; + + /** + * A reference to the database connection. + * + * @var BaseConnection + */ + protected $db; + + /** + * Name of the primary table for this instance. + * Tracked separately because $QBFrom gets escaped + * and prefixed. + * + * When $tableName to the constructor has multiple tables, + * the value is empty string. + * + * @var string + */ + protected $tableName; + + /** + * ORDER BY random keyword + * + * @var array + */ + protected $randomKeyword = [ + 'RAND()', + 'RAND(%d)', + ]; + + /** + * COUNT string + * + * @used-by CI_DB_driver::count_all() + * @used-by BaseBuilder::count_all_results() + * + * @var string + */ + protected $countString = 'SELECT COUNT(*) AS '; + + /** + * Collects the named parameters and + * their values for later binding + * in the Query object. + * + * @var array + */ + protected $binds = []; + + /** + * Collects the key count for named parameters + * in the Query object. + * + * @var array + */ + protected $bindsKeyCount = []; + + /** + * Some databases, like SQLite, do not by default + * allow limiting of delete clauses. + * + * @var bool + */ + protected $canLimitDeletes = true; + + /** + * Some databases do not by default + * allow limit update queries with WHERE. + * + * @var bool + */ + protected $canLimitWhereUpdates = true; + + /** + * Specifies which sql statements + * support the ignore option. + * + * @var array + */ + protected $supportedIgnoreStatements = []; + + /** + * Builder testing mode status. + * + * @var bool + */ + protected $testMode = false; + + /** + * Tables relation types + * + * @var array + */ + protected $joinTypes = [ + 'LEFT', + 'RIGHT', + 'OUTER', + 'INNER', + 'LEFT OUTER', + 'RIGHT OUTER', + ]; + + /** + * Strings that determine if a string represents a literal value or a field name + * + * @var string[] + */ + protected $isLiteralStr = []; + + /** + * RegExp used to get operators + * + * @var string[] + */ + protected $pregOperators = []; + + /** + * Constructor + * + * @param array|string $tableName tablename or tablenames with or without aliases + * + * Examples of $tableName: `mytable`, `jobs j`, `jobs j, users u`, `['jobs j','users u']` + * + * @throws DatabaseException + */ + public function __construct($tableName, ConnectionInterface &$db, ?array $options = null) + { + if (empty($tableName)) { + throw new DatabaseException('A table must be specified when creating a new Query Builder.'); + } + + /** + * @var BaseConnection $db + */ + $this->db = $db; + + // If it contains `,`, it has multiple tables + if (is_string($tableName) && strpos($tableName, ',') === false) { + $this->tableName = $tableName; // @TODO remove alias if exists + } else { + $this->tableName = ''; + } + + $this->from($tableName); + + if (! empty($options)) { + foreach ($options as $key => $value) { + if (property_exists($this, $key)) { + $this->{$key} = $value; + } + } + } + } + + /** + * Returns the current database connection + * + * @return BaseConnection|ConnectionInterface + */ + public function db(): ConnectionInterface + { + return $this->db; + } + + /** + * Sets a test mode status. + * + * @return $this + */ + public function testMode(bool $mode = true) + { + $this->testMode = $mode; + + return $this; + } + + /** + * Gets the name of the primary table. + */ + public function getTable(): string + { + return $this->tableName; + } + + /** + * Returns an array of bind values and their + * named parameters for binding in the Query object later. + */ + public function getBinds(): array + { + return $this->binds; + } + + /** + * Ignore + * + * Set ignore Flag for next insert, + * update or delete query. + * + * @return $this + */ + public function ignore(bool $ignore = true) + { + $this->QBIgnore = $ignore; + + return $this; + } + + /** + * Generates the SELECT portion of the query + * + * @param array|string $select + * + * @return $this + */ + public function select($select = '*', ?bool $escape = null) + { + if (is_string($select)) { + $select = explode(',', $select); + } + + // If the escape value was not set, we will base it on the global setting + if (! is_bool($escape)) { + $escape = $this->db->protectIdentifiers; + } + + foreach ($select as $val) { + $val = trim($val); + + if ($val !== '') { + $this->QBSelect[] = $val; + + /* + * When doing 'SELECT NULL as field_alias FROM table' + * null gets taken as a field, and therefore escaped + * with backticks. + * This prevents NULL being escaped + * @see https://github.com/codeigniter4/CodeIgniter4/issues/1169 + */ + if (mb_stripos(trim($val), 'NULL') === 0) { + $escape = false; + } + + $this->QBNoEscape[] = $escape; + } + } + + return $this; + } + + /** + * Generates a SELECT MAX(field) portion of a query + * + * @return $this + */ + public function selectMax(string $select = '', string $alias = '') + { + return $this->maxMinAvgSum($select, $alias); + } + + /** + * Generates a SELECT MIN(field) portion of a query + * + * @return $this + */ + public function selectMin(string $select = '', string $alias = '') + { + return $this->maxMinAvgSum($select, $alias, 'MIN'); + } + + /** + * Generates a SELECT AVG(field) portion of a query + * + * @return $this + */ + public function selectAvg(string $select = '', string $alias = '') + { + return $this->maxMinAvgSum($select, $alias, 'AVG'); + } + + /** + * Generates a SELECT SUM(field) portion of a query + * + * @return $this + */ + public function selectSum(string $select = '', string $alias = '') + { + return $this->maxMinAvgSum($select, $alias, 'SUM'); + } + + /** + * Generates a SELECT COUNT(field) portion of a query + * + * @return $this + */ + public function selectCount(string $select = '', string $alias = '') + { + return $this->maxMinAvgSum($select, $alias, 'COUNT'); + } + + /** + * SELECT [MAX|MIN|AVG|SUM|COUNT]() + * + * @used-by selectMax() + * @used-by selectMin() + * @used-by selectAvg() + * @used-by selectSum() + * + * @throws DatabaseException + * @throws DataException + * + * @return $this + */ + protected function maxMinAvgSum(string $select = '', string $alias = '', string $type = 'MAX') + { + if ($select === '') { + throw DataException::forEmptyInputGiven('Select'); + } + + if (strpos($select, ',') !== false) { + throw DataException::forInvalidArgument('column name not separated by comma'); + } + + $type = strtoupper($type); + + if (! in_array($type, ['MAX', 'MIN', 'AVG', 'SUM', 'COUNT'], true)) { + throw new DatabaseException('Invalid function type: ' . $type); + } + + if ($alias === '') { + $alias = $this->createAliasFromTable(trim($select)); + } + + $sql = $type . '(' . $this->db->protectIdentifiers(trim($select)) . ') AS ' . $this->db->escapeIdentifiers(trim($alias)); + + $this->QBSelect[] = $sql; + $this->QBNoEscape[] = null; + + return $this; + } + + /** + * Determines the alias name based on the table + */ + protected function createAliasFromTable(string $item): string + { + if (strpos($item, '.') !== false) { + $item = explode('.', $item); + + return end($item); + } + + return $item; + } + + /** + * Sets a flag which tells the query string compiler to add DISTINCT + * + * @return $this + */ + public function distinct(bool $val = true) + { + $this->QBDistinct = $val; + + return $this; + } + + /** + * Generates the FROM portion of the query + * + * @param array|string $from + * + * @return $this + */ + public function from($from, bool $overwrite = false) + { + if ($overwrite === true) { + $this->QBFrom = []; + $this->db->setAliasedTables([]); + } + + foreach ((array) $from as $val) { + if (strpos($val, ',') !== false) { + foreach (explode(',', $val) as $v) { + $v = trim($v); + $this->trackAliases($v); + + $this->QBFrom[] = $this->db->protectIdentifiers($v, true, null, false); + } + } else { + $val = trim($val); + + // Extract any aliases that might exist. We use this information + // in the protectIdentifiers to know whether to add a table prefix + $this->trackAliases($val); + + $this->QBFrom[] = $this->db->protectIdentifiers($val, true, null, false); + } + } + + return $this; + } + + /** + * Generates the JOIN portion of the query + * + * @return $this + */ + public function join(string $table, string $cond, string $type = '', ?bool $escape = null) + { + if ($type !== '') { + $type = strtoupper(trim($type)); + + if (! in_array($type, $this->joinTypes, true)) { + $type = ''; + } else { + $type .= ' '; + } + } + + // Extract any aliases that might exist. We use this information + // in the protectIdentifiers to know whether to add a table prefix + $this->trackAliases($table); + + if (! is_bool($escape)) { + $escape = $this->db->protectIdentifiers; + } + + if (! $this->hasOperator($cond)) { + $cond = ' USING (' . ($escape ? $this->db->escapeIdentifiers($cond) : $cond) . ')'; + } elseif ($escape === false) { + $cond = ' ON ' . $cond; + } else { + // Split multiple conditions + if (preg_match_all('/\sAND\s|\sOR\s/i', $cond, $joints, PREG_OFFSET_CAPTURE)) { + $conditions = []; + $joints = $joints[0]; + array_unshift($joints, ['', 0]); + + for ($i = count($joints) - 1, $pos = strlen($cond); $i >= 0; $i--) { + $joints[$i][1] += strlen($joints[$i][0]); // offset + $conditions[$i] = substr($cond, $joints[$i][1], $pos - $joints[$i][1]); + $pos = $joints[$i][1] - strlen($joints[$i][0]); + $joints[$i] = $joints[$i][0]; + } + ksort($conditions); + } else { + $conditions = [$cond]; + $joints = ['']; + } + + $cond = ' ON '; + + foreach ($conditions as $i => $condition) { + $operator = $this->getOperator($condition); + + $cond .= $joints[$i]; + $cond .= preg_match('/(\(*)?([\[\]\w\.\'-]+)' . preg_quote($operator, '/') . '(.*)/i', $condition, $match) ? $match[1] . $this->db->protectIdentifiers($match[2]) . $operator . $this->db->protectIdentifiers($match[3]) : $condition; + } + } + + // Do we want to escape the table name? + if ($escape === true) { + $table = $this->db->protectIdentifiers($table, true, null, false); + } + + // Assemble the JOIN statement + $this->QBJoin[] = $type . 'JOIN ' . $table . $cond; + + return $this; + } + + /** + * Generates the WHERE portion of the query. + * Separates multiple calls with 'AND'. + * + * @param mixed $key + * @param mixed $value + * + * @return $this + */ + public function where($key, $value = null, ?bool $escape = null) + { + return $this->whereHaving('QBWhere', $key, $value, 'AND ', $escape); + } + + /** + * OR WHERE + * + * Generates the WHERE portion of the query. + * Separates multiple calls with 'OR'. + * + * @param mixed $key + * @param mixed $value + * @param bool $escape + * + * @return $this + */ + public function orWhere($key, $value = null, ?bool $escape = null) + { + return $this->whereHaving('QBWhere', $key, $value, 'OR ', $escape); + } + + /** + * @used-by where() + * @used-by orWhere() + * @used-by having() + * @used-by orHaving() + * + * @param mixed $key + * @param mixed $value + * + * @return $this + */ + protected function whereHaving(string $qbKey, $key, $value = null, string $type = 'AND ', ?bool $escape = null) + { + if (! is_array($key)) { + $key = [$key => $value]; + } + + // If the escape value was not set will base it on the global setting + if (! is_bool($escape)) { + $escape = $this->db->protectIdentifiers; + } + + foreach ($key as $k => $v) { + $prefix = empty($this->{$qbKey}) ? $this->groupGetType('') : $this->groupGetType($type); + + if ($v !== null) { + $op = $this->getOperator($k, true); + + if (! empty($op)) { + $k = trim($k); + + end($op); + + $op = trim(current($op)); + + if (substr($k, -strlen($op)) === $op) { + $k = rtrim(substr($k, 0, -strlen($op))); + $op = " {$op}"; + } else { + $op = ''; + } + } else { + $op = ' ='; + } + + if ($this->isSubquery($v)) { + $v = $this->buildSubquery($v, true); + } else { + $bind = $this->setBind($k, $v, $escape); + $v = " :{$bind}:"; + } + } elseif (! $this->hasOperator($k) && $qbKey !== 'QBHaving') { + // value appears not to have been set, assign the test to IS NULL + $op = ' IS NULL'; + } elseif (preg_match('/\s*(!?=|<>|IS(?:\s+NOT)?)\s*$/i', $k, $match, PREG_OFFSET_CAPTURE)) { + $k = substr($k, 0, $match[0][1]); + $op = $match[1][0] === '=' ? ' IS NULL' : ' IS NOT NULL'; + } else { + $op = ''; + } + + $this->{$qbKey}[] = [ + 'condition' => $prefix . $k . $op . $v, + 'escape' => $escape, + ]; + } + + return $this; + } + + /** + * Generates a WHERE field IN('item', 'item') SQL query, + * joined with 'AND' if appropriate. + * + * @param array|BaseBuilder|Closure|string $values The values searched on, or anonymous function with subquery + * + * @return $this + */ + public function whereIn(?string $key = null, $values = null, ?bool $escape = null) + { + return $this->_whereIn($key, $values, false, 'AND ', $escape); + } + + /** + * Generates a WHERE field IN('item', 'item') SQL query, + * joined with 'OR' if appropriate. + * + * @param array|BaseBuilder|Closure|string $values The values searched on, or anonymous function with subquery + * + * @return $this + */ + public function orWhereIn(?string $key = null, $values = null, ?bool $escape = null) + { + return $this->_whereIn($key, $values, false, 'OR ', $escape); + } + + /** + * Generates a WHERE field NOT IN('item', 'item') SQL query, + * joined with 'AND' if appropriate. + * + * @param array|BaseBuilder|Closure|string $values The values searched on, or anonymous function with subquery + * + * @return $this + */ + public function whereNotIn(?string $key = null, $values = null, ?bool $escape = null) + { + return $this->_whereIn($key, $values, true, 'AND ', $escape); + } + + /** + * Generates a WHERE field NOT IN('item', 'item') SQL query, + * joined with 'OR' if appropriate. + * + * @param array|BaseBuilder|Closure|string $values The values searched on, or anonymous function with subquery + * + * @return $this + */ + public function orWhereNotIn(?string $key = null, $values = null, ?bool $escape = null) + { + return $this->_whereIn($key, $values, true, 'OR ', $escape); + } + + /** + * Generates a HAVING field IN('item', 'item') SQL query, + * joined with 'AND' if appropriate. + * + * @param array|BaseBuilder|Closure|string $values The values searched on, or anonymous function with subquery + * + * @return $this + */ + public function havingIn(?string $key = null, $values = null, ?bool $escape = null) + { + return $this->_whereIn($key, $values, false, 'AND ', $escape, 'QBHaving'); + } + + /** + * Generates a HAVING field IN('item', 'item') SQL query, + * joined with 'OR' if appropriate. + * + * @param array|BaseBuilder|Closure|string $values The values searched on, or anonymous function with subquery + * + * @return $this + */ + public function orHavingIn(?string $key = null, $values = null, ?bool $escape = null) + { + return $this->_whereIn($key, $values, false, 'OR ', $escape, 'QBHaving'); + } + + /** + * Generates a HAVING field NOT IN('item', 'item') SQL query, + * joined with 'AND' if appropriate. + * + * @param array|BaseBuilder|Closure|string $values The values searched on, or anonymous function with subquery + * + * @return $this + */ + public function havingNotIn(?string $key = null, $values = null, ?bool $escape = null) + { + return $this->_whereIn($key, $values, true, 'AND ', $escape, 'QBHaving'); + } + + /** + * Generates a HAVING field NOT IN('item', 'item') SQL query, + * joined with 'OR' if appropriate. + * + * @param array|BaseBuilder|Closure|string $values The values searched on, or anonymous function with subquery + * + * @return $this + */ + public function orHavingNotIn(?string $key = null, $values = null, ?bool $escape = null) + { + return $this->_whereIn($key, $values, true, 'OR ', $escape, 'QBHaving'); + } + + /** + * @used-by WhereIn() + * @used-by orWhereIn() + * @used-by whereNotIn() + * @used-by orWhereNotIn() + * + * @param array|BaseBuilder|Closure|null $values The values searched on, or anonymous function with subquery + * + * @throws InvalidArgumentException + * + * @return $this + */ + protected function _whereIn(?string $key = null, $values = null, bool $not = false, string $type = 'AND ', ?bool $escape = null, string $clause = 'QBWhere') + { + if (empty($key) || ! is_string($key)) { + if (CI_DEBUG) { + throw new InvalidArgumentException(sprintf('%s() expects $key to be a non-empty string', debug_backtrace(0, 2)[1]['function'])); + } + + return $this; // @codeCoverageIgnore + } + + if ($values === null || (! is_array($values) && ! $this->isSubquery($values))) { + if (CI_DEBUG) { + throw new InvalidArgumentException(sprintf('%s() expects $values to be of type array or closure', debug_backtrace(0, 2)[1]['function'])); + } + + return $this; // @codeCoverageIgnore + } + + if (! is_bool($escape)) { + $escape = $this->db->protectIdentifiers; + } + + $ok = $key; + + if ($escape === true) { + $key = $this->db->protectIdentifiers($key); + } + + $not = ($not) ? ' NOT' : ''; + + if ($this->isSubquery($values)) { + $whereIn = $this->buildSubquery($values, true); + $escape = false; + } else { + $whereIn = array_values($values); + } + + $ok = $this->setBind($ok, $whereIn, $escape); + + $prefix = empty($this->{$clause}) ? $this->groupGetType('') : $this->groupGetType($type); + + $whereIn = [ + 'condition' => "{$prefix}{$key}{$not} IN :{$ok}:", + 'escape' => false, + ]; + + $this->{$clause}[] = $whereIn; + + return $this; + } + + /** + * Generates a %LIKE% portion of the query. + * Separates multiple calls with 'AND'. + * + * @param mixed $field + * + * @return $this + */ + public function like($field, string $match = '', string $side = 'both', ?bool $escape = null, bool $insensitiveSearch = false) + { + return $this->_like($field, $match, 'AND ', $side, '', $escape, $insensitiveSearch); + } + + /** + * Generates a NOT LIKE portion of the query. + * Separates multiple calls with 'AND'. + * + * @param mixed $field + * + * @return $this + */ + public function notLike($field, string $match = '', string $side = 'both', ?bool $escape = null, bool $insensitiveSearch = false) + { + return $this->_like($field, $match, 'AND ', $side, 'NOT', $escape, $insensitiveSearch); + } + + /** + * Generates a %LIKE% portion of the query. + * Separates multiple calls with 'OR'. + * + * @param mixed $field + * + * @return $this + */ + public function orLike($field, string $match = '', string $side = 'both', ?bool $escape = null, bool $insensitiveSearch = false) + { + return $this->_like($field, $match, 'OR ', $side, '', $escape, $insensitiveSearch); + } + + /** + * Generates a NOT LIKE portion of the query. + * Separates multiple calls with 'OR'. + * + * @param mixed $field + * + * @return $this + */ + public function orNotLike($field, string $match = '', string $side = 'both', ?bool $escape = null, bool $insensitiveSearch = false) + { + return $this->_like($field, $match, 'OR ', $side, 'NOT', $escape, $insensitiveSearch); + } + + /** + * Generates a %LIKE% portion of the query. + * Separates multiple calls with 'AND'. + * + * @param mixed $field + * + * @return $this + */ + public function havingLike($field, string $match = '', string $side = 'both', ?bool $escape = null, bool $insensitiveSearch = false) + { + return $this->_like($field, $match, 'AND ', $side, '', $escape, $insensitiveSearch, 'QBHaving'); + } + + /** + * Generates a NOT LIKE portion of the query. + * Separates multiple calls with 'AND'. + * + * @param mixed $field + * + * @return $this + */ + public function notHavingLike($field, string $match = '', string $side = 'both', ?bool $escape = null, bool $insensitiveSearch = false) + { + return $this->_like($field, $match, 'AND ', $side, 'NOT', $escape, $insensitiveSearch, 'QBHaving'); + } + + /** + * Generates a %LIKE% portion of the query. + * Separates multiple calls with 'OR'. + * + * @param mixed $field + * + * @return $this + */ + public function orHavingLike($field, string $match = '', string $side = 'both', ?bool $escape = null, bool $insensitiveSearch = false) + { + return $this->_like($field, $match, 'OR ', $side, '', $escape, $insensitiveSearch, 'QBHaving'); + } + + /** + * Generates a NOT LIKE portion of the query. + * Separates multiple calls with 'OR'. + * + * @param mixed $field + * + * @return $this + */ + public function orNotHavingLike($field, string $match = '', string $side = 'both', ?bool $escape = null, bool $insensitiveSearch = false) + { + return $this->_like($field, $match, 'OR ', $side, 'NOT', $escape, $insensitiveSearch, 'QBHaving'); + } + + /** + * @used-by like() + * @used-by orLike() + * @used-by notLike() + * @used-by orNotLike() + * @used-by havingLike() + * @used-by orHavingLike() + * @used-by notHavingLike() + * @used-by orNotHavingLike() + * + * @param mixed $field + * + * @return $this + */ + protected function _like($field, string $match = '', string $type = 'AND ', string $side = 'both', string $not = '', ?bool $escape = null, bool $insensitiveSearch = false, string $clause = 'QBWhere') + { + if (! is_array($field)) { + $field = [$field => $match]; + } + + $escape = is_bool($escape) ? $escape : $this->db->protectIdentifiers; + $side = strtolower($side); + + foreach ($field as $k => $v) { + if ($insensitiveSearch === true) { + $v = strtolower($v); + } + + $prefix = empty($this->{$clause}) ? $this->groupGetType('') : $this->groupGetType($type); + + if ($side === 'none') { + $bind = $this->setBind($k, $v, $escape); + } elseif ($side === 'before') { + $bind = $this->setBind($k, "%{$v}", $escape); + } elseif ($side === 'after') { + $bind = $this->setBind($k, "{$v}%", $escape); + } else { + $bind = $this->setBind($k, "%{$v}%", $escape); + } + + $likeStatement = $this->_like_statement($prefix, $this->db->protectIdentifiers($k, false, $escape), $not, $bind, $insensitiveSearch); + + // some platforms require an escape sequence definition for LIKE wildcards + if ($escape === true && $this->db->likeEscapeStr !== '') { + $likeStatement .= sprintf($this->db->likeEscapeStr, $this->db->likeEscapeChar); + } + + $this->{$clause}[] = [ + 'condition' => $likeStatement, + 'escape' => $escape, + ]; + } + + return $this; + } + + /** + * Platform independent LIKE statement builder. + */ + protected function _like_statement(?string $prefix, string $column, ?string $not, string $bind, bool $insensitiveSearch = false): string + { + if ($insensitiveSearch === true) { + return "{$prefix} LOWER({$column}) {$not} LIKE :{$bind}:"; + } + + return "{$prefix} {$column} {$not} LIKE :{$bind}:"; + } + + /** + * Starts a query group. + * + * @return $this + */ + public function groupStart() + { + return $this->groupStartPrepare(); + } + + /** + * Starts a query group, but ORs the group + * + * @return $this + */ + public function orGroupStart() + { + return $this->groupStartPrepare('', 'OR '); + } + + /** + * Starts a query group, but NOTs the group + * + * @return $this + */ + public function notGroupStart() + { + return $this->groupStartPrepare('NOT '); + } + + /** + * Starts a query group, but OR NOTs the group + * + * @return $this + */ + public function orNotGroupStart() + { + return $this->groupStartPrepare('NOT ', 'OR '); + } + + /** + * Ends a query group + * + * @return $this + */ + public function groupEnd() + { + return $this->groupEndPrepare(); + } + + /** + * Starts a query group for HAVING clause. + * + * @return $this + */ + public function havingGroupStart() + { + return $this->groupStartPrepare('', 'AND ', 'QBHaving'); + } + + /** + * Starts a query group for HAVING clause, but ORs the group. + * + * @return $this + */ + public function orHavingGroupStart() + { + return $this->groupStartPrepare('', 'OR ', 'QBHaving'); + } + + /** + * Starts a query group for HAVING clause, but NOTs the group. + * + * @return $this + */ + public function notHavingGroupStart() + { + return $this->groupStartPrepare('NOT ', 'AND ', 'QBHaving'); + } + + /** + * Starts a query group for HAVING clause, but OR NOTs the group. + * + * @return $this + */ + public function orNotHavingGroupStart() + { + return $this->groupStartPrepare('NOT ', 'OR ', 'QBHaving'); + } + + /** + * Ends a query group for HAVING clause. + * + * @return $this + */ + public function havingGroupEnd() + { + return $this->groupEndPrepare('QBHaving'); + } + + /** + * Prepate a query group start. + * + * @return $this + */ + protected function groupStartPrepare(string $not = '', string $type = 'AND ', string $clause = 'QBWhere') + { + $type = $this->groupGetType($type); + + $this->QBWhereGroupStarted = true; + $prefix = empty($this->{$clause}) ? '' : $type; + $where = [ + 'condition' => $prefix . $not . str_repeat(' ', ++$this->QBWhereGroupCount) . ' (', + 'escape' => false, + ]; + + $this->{$clause}[] = $where; + + return $this; + } + + /** + * Prepate a query group end. + * + * @return $this + */ + protected function groupEndPrepare(string $clause = 'QBWhere') + { + $this->QBWhereGroupStarted = false; + $where = [ + 'condition' => str_repeat(' ', $this->QBWhereGroupCount--) . ')', + 'escape' => false, + ]; + + $this->{$clause}[] = $where; + + return $this; + } + + /** + * @used-by groupStart() + * @used-by _like() + * @used-by whereHaving() + * @used-by _whereIn() + * @used-by havingGroupStart() + */ + protected function groupGetType(string $type): string + { + if ($this->QBWhereGroupStarted) { + $type = ''; + $this->QBWhereGroupStarted = false; + } + + return $type; + } + + /** + * @param array|string $by + * + * @return $this + */ + public function groupBy($by, ?bool $escape = null) + { + if (! is_bool($escape)) { + $escape = $this->db->protectIdentifiers; + } + + if (is_string($by)) { + $by = ($escape === true) ? explode(',', $by) : [$by]; + } + + foreach ($by as $val) { + $val = trim($val); + + if ($val !== '') { + $val = [ + 'field' => $val, + 'escape' => $escape, + ]; + + $this->QBGroupBy[] = $val; + } + } + + return $this; + } + + /** + * Separates multiple calls with 'AND'. + * + * @param array|string $key + * @param mixed $value + * + * @return $this + */ + public function having($key, $value = null, ?bool $escape = null) + { + return $this->whereHaving('QBHaving', $key, $value, 'AND ', $escape); + } + + /** + * Separates multiple calls with 'OR'. + * + * @param array|string $key + * @param mixed $value + * + * @return $this + */ + public function orHaving($key, $value = null, ?bool $escape = null) + { + return $this->whereHaving('QBHaving', $key, $value, 'OR ', $escape); + } + + /** + * @param string $direction ASC, DESC or RANDOM + * + * @return $this + */ + public function orderBy(string $orderBy, string $direction = '', ?bool $escape = null) + { + if (empty($orderBy)) { + return $this; + } + + $direction = strtoupper(trim($direction)); + + if ($direction === 'RANDOM') { + $direction = ''; + $orderBy = ctype_digit($orderBy) ? sprintf($this->randomKeyword[1], $orderBy) : $this->randomKeyword[0]; + $escape = false; + } elseif ($direction !== '') { + $direction = in_array($direction, ['ASC', 'DESC'], true) ? ' ' . $direction : ''; + } + + if (! is_bool($escape)) { + $escape = $this->db->protectIdentifiers; + } + + if ($escape === false) { + $qbOrderBy[] = [ + 'field' => $orderBy, + 'direction' => $direction, + 'escape' => false, + ]; + } else { + $qbOrderBy = []; + + foreach (explode(',', $orderBy) as $field) { + $qbOrderBy[] = ($direction === '' && preg_match('/\s+(ASC|DESC)$/i', rtrim($field), $match, PREG_OFFSET_CAPTURE)) + ? [ + 'field' => ltrim(substr($field, 0, $match[0][1])), + 'direction' => ' ' . $match[1][0], + 'escape' => true, + ] + : [ + 'field' => trim($field), + 'direction' => $direction, + 'escape' => true, + ]; + } + } + + $this->QBOrderBy = array_merge($this->QBOrderBy, $qbOrderBy); + + return $this; + } + + /** + * @return $this + */ + public function limit(?int $value = null, ?int $offset = 0) + { + if ($value !== null) { + $this->QBLimit = $value; + } + + if (! empty($offset)) { + $this->QBOffset = $offset; + } + + return $this; + } + + /** + * Sets the OFFSET value + * + * @return $this + */ + public function offset(int $offset) + { + if (! empty($offset)) { + $this->QBOffset = (int) $offset; + } + + return $this; + } + + /** + * Generates a platform-specific LIMIT clause. + */ + protected function _limit(string $sql, bool $offsetIgnore = false): string + { + return $sql . ' LIMIT ' . ($offsetIgnore === false && $this->QBOffset ? $this->QBOffset . ', ' : '') . $this->QBLimit; + } + + /** + * Allows key/value pairs to be set for insert(), update() or replace(). + * + * @param array|object|string $key Field name, or an array of field/value pairs + * @param mixed $value Field value, if $key is a single field + * @param bool|null $escape Whether to escape values + * + * @return $this + */ + public function set($key, $value = '', ?bool $escape = null) + { + $key = $this->objectToArray($key); + + if (! is_array($key)) { + $key = [$key => $value]; + } + + $escape = is_bool($escape) ? $escape : $this->db->protectIdentifiers; + + foreach ($key as $k => $v) { + if ($escape) { + $bind = $this->setBind($k, $v, $escape); + + $this->QBSet[$this->db->protectIdentifiers($k, false)] = ":{$bind}:"; + } else { + $this->QBSet[$this->db->protectIdentifiers($k, false)] = $v; + } + } + + return $this; + } + + /** + * Returns the previously set() data, alternatively resetting it if needed. + */ + public function getSetData(bool $clean = false): array + { + $data = $this->QBSet; + + if ($clean) { + $this->QBSet = []; + } + + return $data; + } + + /** + * Compiles a SELECT query string and returns the sql. + */ + public function getCompiledSelect(bool $reset = true): string + { + $select = $this->compileSelect(); + + if ($reset === true) { + $this->resetSelect(); + } + + return $this->compileFinalQuery($select); + } + + /** + * Returns a finalized, compiled query string with the bindings + * inserted and prefixes swapped out. + */ + protected function compileFinalQuery(string $sql): string + { + $query = new Query($this->db); + $query->setQuery($sql, $this->binds, false); + + if (! empty($this->db->swapPre) && ! empty($this->db->DBPrefix)) { + $query->swapPrefix($this->db->DBPrefix, $this->db->swapPre); + } + + return $query->getQuery(); + } + + /** + * Compiles the select statement based on the other functions called + * and runs the query + * + * @return false|ResultInterface + */ + public function get(?int $limit = null, int $offset = 0, bool $reset = true) + { + if ($limit !== null) { + $this->limit($limit, $offset); + } + + $result = $this->testMode + ? $this->getCompiledSelect($reset) + : $this->db->query($this->compileSelect(), $this->binds, false); + + if ($reset === true) { + $this->resetSelect(); + + // Clear our binds so we don't eat up memory + $this->binds = []; + } + + return $result; + } + + /** + * Generates a platform-specific query string that counts all records in + * the particular table + * + * @return int|string + */ + public function countAll(bool $reset = true) + { + $table = $this->QBFrom[0]; + + $sql = $this->countString . $this->db->escapeIdentifiers('numrows') . ' FROM ' . + $this->db->protectIdentifiers($table, true, null, false); + + if ($this->testMode) { + return $sql; + } + + $query = $this->db->query($sql, null, false); + + if (empty($query->getResult())) { + return 0; + } + + $query = $query->getRow(); + + if ($reset === true) { + $this->resetSelect(); + } + + return (int) $query->numrows; + } + + /** + * Generates a platform-specific query string that counts all records + * returned by an Query Builder query. + * + * @return int|string + */ + public function countAllResults(bool $reset = true) + { + // ORDER BY usage is often problematic here (most notably + // on Microsoft SQL Server) and ultimately unnecessary + // for selecting COUNT(*) ... + $orderBy = []; + + if (! empty($this->QBOrderBy)) { + $orderBy = $this->QBOrderBy; + + $this->QBOrderBy = null; + } + + // We cannot use a LIMIT when getting the single row COUNT(*) result + $limit = $this->QBLimit; + + $this->QBLimit = false; + + if ($this->QBDistinct === true || ! empty($this->QBGroupBy)) { + // We need to backup the original SELECT in case DBPrefix is used + $select = $this->QBSelect; + $sql = $this->countString . $this->db->protectIdentifiers('numrows') . "\nFROM (\n" . $this->compileSelect() . "\n) CI_count_all_results"; + + // Restore SELECT part + $this->QBSelect = $select; + unset($select); + } else { + $sql = $this->compileSelect($this->countString . $this->db->protectIdentifiers('numrows')); + } + + if ($this->testMode) { + return $sql; + } + + $result = $this->db->query($sql, $this->binds, false); + + if ($reset === true) { + $this->resetSelect(); + } elseif (! isset($this->QBOrderBy)) { + $this->QBOrderBy = $orderBy; + } + + // Restore the LIMIT setting + $this->QBLimit = $limit; + + $row = ! $result instanceof ResultInterface ? null : $result->getRow(); + + if (empty($row)) { + return 0; + } + + return (int) $row->numrows; + } + + /** + * Compiles the set conditions and returns the sql statement + * + * @return array + */ + public function getCompiledQBWhere() + { + return $this->QBWhere; + } + + /** + * Allows the where clause, limit and offset to be added directly + * + * @param array|string $where + * + * @return ResultInterface + */ + public function getWhere($where = null, ?int $limit = null, ?int $offset = 0, bool $reset = true) + { + if ($where !== null) { + $this->where($where); + } + + if (! empty($limit)) { + $this->limit($limit, $offset); + } + + $result = $this->testMode + ? $this->getCompiledSelect($reset) + : $this->db->query($this->compileSelect(), $this->binds, false); + + if ($reset === true) { + $this->resetSelect(); + + // Clear our binds so we don't eat up memory + $this->binds = []; + } + + return $result; + } + + /** + * Compiles batch insert strings and runs the queries + * + * @throws DatabaseException + * + * @return false|int|string[] Number of rows inserted or FALSE on failure, SQL array when testMode + */ + public function insertBatch(?array $set = null, ?bool $escape = null, int $batchSize = 100) + { + if ($set === null) { + if (empty($this->QBSet)) { + if (CI_DEBUG) { + throw new DatabaseException('You must use the "set" method to update an entry.'); + } + + return false; // @codeCoverageIgnore + } + } elseif (empty($set)) { + if (CI_DEBUG) { + throw new DatabaseException('insertBatch() called with no data'); + } + + return false; // @codeCoverageIgnore + } + + $hasQBSet = $set === null; + + $table = $this->QBFrom[0]; + + $affectedRows = 0; + $savedSQL = []; + + if ($hasQBSet) { + $set = $this->QBSet; + } + + for ($i = 0, $total = count($set); $i < $total; $i += $batchSize) { + if ($hasQBSet) { + $QBSet = array_slice($this->QBSet, $i, $batchSize); + } else { + $this->setInsertBatch(array_slice($set, $i, $batchSize), '', $escape); + $QBSet = $this->QBSet; + } + $sql = $this->_insertBatch($this->db->protectIdentifiers($table, true, null, false), $this->QBKeys, $QBSet); + + if ($this->testMode) { + $savedSQL[] = $sql; + } else { + $this->db->query($sql, null, false); + $affectedRows += $this->db->affectedRows(); + } + + if (! $hasQBSet) { + $this->resetWrite(); + } + } + + $this->resetWrite(); + + return $this->testMode ? $savedSQL : $affectedRows; + } + + /** + * Generates a platform-specific insert string from the supplied data. + */ + protected function _insertBatch(string $table, array $keys, array $values): string + { + return 'INSERT ' . $this->compileIgnore('insert') . 'INTO ' . $table . ' (' . implode(', ', $keys) . ') VALUES ' . implode(', ', $values); + } + + /** + * Allows key/value pairs to be set for batch inserts + * + * @param mixed $key + * + * @return $this|null + */ + public function setInsertBatch($key, string $value = '', ?bool $escape = null) + { + $key = $this->batchObjectToArray($key); + + if (! is_array($key)) { + $key = [$key => $value]; + } + + $escape = is_bool($escape) ? $escape : $this->db->protectIdentifiers; + + $keys = array_keys($this->objectToArray(current($key))); + sort($keys); + + foreach ($key as $row) { + $row = $this->objectToArray($row); + if (array_diff($keys, array_keys($row)) !== [] || array_diff(array_keys($row), $keys) !== []) { + // batch function above returns an error on an empty array + $this->QBSet[] = []; + + return null; + } + + ksort($row); // puts $row in the same order as our keys + + $clean = []; + + foreach ($row as $rowValue) { + $clean[] = $escape ? $this->db->escape($rowValue) : $rowValue; + } + + $row = $clean; + + $this->QBSet[] = '(' . implode(',', $row) . ')'; + } + + foreach ($keys as $k) { + $this->QBKeys[] = $this->db->protectIdentifiers($k, false); + } + + return $this; + } + + /** + * Compiles an insert query and returns the sql + * + * @throws DatabaseException + * + * @return bool|string + */ + public function getCompiledInsert(bool $reset = true) + { + if ($this->validateInsert() === false) { + return false; + } + + $sql = $this->_insert( + $this->db->protectIdentifiers($this->QBFrom[0], true, null, false), + array_keys($this->QBSet), + array_values($this->QBSet) + ); + + if ($reset === true) { + $this->resetWrite(); + } + + return $this->compileFinalQuery($sql); + } + + /** + * Compiles an insert string and runs the query + * + * @throws DatabaseException + * + * @return bool|Query + */ + public function insert(?array $set = null, ?bool $escape = null) + { + if ($set !== null) { + $this->set($set, '', $escape); + } + + if ($this->validateInsert() === false) { + return false; + } + + $sql = $this->_insert( + $this->db->protectIdentifiers($this->QBFrom[0], true, $escape, false), + array_keys($this->QBSet), + array_values($this->QBSet) + ); + + if (! $this->testMode) { + $this->resetWrite(); + + $result = $this->db->query($sql, $this->binds, false); + + // Clear our binds so we don't eat up memory + $this->binds = []; + + return $result; + } + + return false; + } + + /** + * This method is used by both insert() and getCompiledInsert() to + * validate that the there data is actually being set and that table + * has been chosen to be inserted into. + * + * @throws DatabaseException + */ + protected function validateInsert(): bool + { + if (empty($this->QBSet)) { + if (CI_DEBUG) { + throw new DatabaseException('You must use the "set" method to update an entry.'); + } + + return false; // @codeCoverageIgnore + } + + return true; + } + + /** + * Generates a platform-specific insert string from the supplied data + */ + protected function _insert(string $table, array $keys, array $unescapedKeys): string + { + return 'INSERT ' . $this->compileIgnore('insert') . 'INTO ' . $table . ' (' . implode(', ', $keys) . ') VALUES (' . implode(', ', $unescapedKeys) . ')'; + } + + /** + * Compiles an replace into string and runs the query + * + * @throws DatabaseException + * + * @return BaseResult|false|Query|string + */ + public function replace(?array $set = null) + { + if ($set !== null) { + $this->set($set); + } + + if (empty($this->QBSet)) { + if (CI_DEBUG) { + throw new DatabaseException('You must use the "set" method to update an entry.'); + } + + return false; // @codeCoverageIgnore + } + + $table = $this->QBFrom[0]; + + $sql = $this->_replace($table, array_keys($this->QBSet), array_values($this->QBSet)); + + $this->resetWrite(); + + return $this->testMode ? $sql : $this->db->query($sql, $this->binds, false); + } + + /** + * Generates a platform-specific replace string from the supplied data + */ + protected function _replace(string $table, array $keys, array $values): string + { + return 'REPLACE INTO ' . $table . ' (' . implode(', ', $keys) . ') VALUES (' . implode(', ', $values) . ')'; + } + + /** + * Groups tables in FROM clauses if needed, so there is no confusion + * about operator precedence. + * + * Note: This is only used (and overridden) by MySQL and SQLSRV. + */ + protected function _fromTables(): string + { + return implode(', ', $this->QBFrom); + } + + /** + * Compiles an update query and returns the sql + * + * @return bool|string + */ + public function getCompiledUpdate(bool $reset = true) + { + if ($this->validateUpdate() === false) { + return false; + } + + $sql = $this->_update($this->QBFrom[0], $this->QBSet); + + if ($reset === true) { + $this->resetWrite(); + } + + return $this->compileFinalQuery($sql); + } + + /** + * Compiles an update string and runs the query. + * + * @param mixed $where + * + * @throws DatabaseException + */ + public function update(?array $set = null, $where = null, ?int $limit = null): bool + { + if ($set !== null) { + $this->set($set); + } + + if ($this->validateUpdate() === false) { + return false; + } + + if ($where !== null) { + $this->where($where); + } + + if (! empty($limit)) { + if (! $this->canLimitWhereUpdates) { + throw new DatabaseException('This driver does not allow LIMITs on UPDATE queries using WHERE.'); + } + + $this->limit($limit); + } + + $sql = $this->_update($this->QBFrom[0], $this->QBSet); + + if (! $this->testMode) { + $this->resetWrite(); + + $result = $this->db->query($sql, $this->binds, false); + + if ($result !== false) { + // Clear our binds so we don't eat up memory + $this->binds = []; + + return true; + } + + return false; + } + + return true; + } + + /** + * Generates a platform-specific update string from the supplied data + */ + protected function _update(string $table, array $values): string + { + $valStr = []; + + foreach ($values as $key => $val) { + $valStr[] = $key . ' = ' . $val; + } + + return 'UPDATE ' . $this->compileIgnore('update') . $table . ' SET ' . implode(', ', $valStr) + . $this->compileWhereHaving('QBWhere') + . $this->compileOrderBy() + . ($this->QBLimit ? $this->_limit(' ', true) : ''); + } + + /** + * This method is used by both update() and getCompiledUpdate() to + * validate that data is actually being set and that a table has been + * chosen to be update. + * + * @throws DatabaseException + */ + protected function validateUpdate(): bool + { + if (empty($this->QBSet)) { + if (CI_DEBUG) { + throw new DatabaseException('You must use the "set" method to update an entry.'); + } + + return false; // @codeCoverageIgnore + } + + return true; + } + + /** + * Compiles an update string and runs the query + * + * @throws DatabaseException + * + * @return false|int|string[] Number of rows affected or FALSE on failure, SQL array when testMode + */ + public function updateBatch(?array $set = null, ?string $index = null, int $batchSize = 100) + { + if ($index === null) { + if (CI_DEBUG) { + throw new DatabaseException('You must specify an index to match on for batch updates.'); + } + + return false; // @codeCoverageIgnore + } + + if ($set === null) { + if (empty($this->QBSet)) { + if (CI_DEBUG) { + throw new DatabaseException('You must use the "set" method to update an entry.'); + } + + return false; // @codeCoverageIgnore + } + } elseif (empty($set)) { + if (CI_DEBUG) { + throw new DatabaseException('updateBatch() called with no data'); + } + + return false; // @codeCoverageIgnore + } + + $hasQBSet = $set === null; + + $table = $this->QBFrom[0]; + + $affectedRows = 0; + $savedSQL = []; + $savedQBWhere = $this->QBWhere; + + if ($hasQBSet) { + $set = $this->QBSet; + } + + for ($i = 0, $total = count($set); $i < $total; $i += $batchSize) { + if ($hasQBSet) { + $QBSet = array_slice($this->QBSet, $i, $batchSize); + } else { + $this->setUpdateBatch(array_slice($set, $i, $batchSize), $index); + $QBSet = $this->QBSet; + } + + $sql = $this->_updateBatch( + $table, + $QBSet, + $this->db->protectIdentifiers($index) + ); + + if ($this->testMode) { + $savedSQL[] = $sql; + } else { + $this->db->query($sql, $this->binds, false); + $affectedRows += $this->db->affectedRows(); + } + + if (! $hasQBSet) { + $this->resetWrite(); + } + + $this->QBWhere = $savedQBWhere; + } + + $this->resetWrite(); + + return $this->testMode ? $savedSQL : $affectedRows; + } + + /** + * Generates a platform-specific batch update string from the supplied data + */ + protected function _updateBatch(string $table, array $values, string $index): string + { + $ids = []; + $final = []; + + foreach ($values as $val) { + $ids[] = $val[$index]; + + foreach (array_keys($val) as $field) { + if ($field !== $index) { + $final[$field][] = 'WHEN ' . $index . ' = ' . $val[$index] . ' THEN ' . $val[$field]; + } + } + } + + $cases = ''; + + foreach ($final as $k => $v) { + $cases .= $k . " = CASE \n" + . implode("\n", $v) . "\n" + . 'ELSE ' . $k . ' END, '; + } + + $this->where($index . ' IN(' . implode(',', $ids) . ')', null, false); + + return 'UPDATE ' . $this->compileIgnore('update') . $table . ' SET ' . substr($cases, 0, -2) . $this->compileWhereHaving('QBWhere'); + } + + /** + * Allows key/value pairs to be set for batch updating + * + * @param array|object $key + * + * @throws DatabaseException + * + * @return $this|null + */ + public function setUpdateBatch($key, string $index = '', ?bool $escape = null) + { + $key = $this->batchObjectToArray($key); + + if (! is_array($key)) { + return null; + } + + if (! is_bool($escape)) { + $escape = $this->db->protectIdentifiers; + } + + foreach ($key as $v) { + $indexSet = false; + $clean = []; + + foreach ($v as $k2 => $v2) { + if ($k2 === $index) { + $indexSet = true; + } + + $clean[$this->db->protectIdentifiers($k2, false)] + = $escape ? $this->db->escape($v2) : $v2; + } + + if ($indexSet === false) { + throw new DatabaseException('One or more rows submitted for batch updating is missing the specified index.'); + } + + $this->QBSet[] = $clean; + } + + return $this; + } + + /** + * Compiles a delete string and runs "DELETE FROM table" + * + * @return bool|string TRUE on success, FALSE on failure, string on testMode + */ + public function emptyTable() + { + $table = $this->QBFrom[0]; + + $sql = $this->_delete($table); + + if ($this->testMode) { + return $sql; + } + + $this->resetWrite(); + + return $this->db->query($sql, null, false); + } + + /** + * Compiles a truncate string and runs the query + * If the database does not support the truncate() command + * This function maps to "DELETE FROM table" + * + * @return bool|string TRUE on success, FALSE on failure, string on testMode + */ + public function truncate() + { + $table = $this->QBFrom[0]; + + $sql = $this->_truncate($table); + + if ($this->testMode) { + return $sql; + } + + $this->resetWrite(); + + return $this->db->query($sql, null, false); + } + + /** + * Generates a platform-specific truncate string from the supplied data + * + * If the database does not support the truncate() command, + * then this method maps to 'DELETE FROM table' + */ + protected function _truncate(string $table): string + { + return 'TRUNCATE ' . $table; + } + + /** + * Compiles a delete query string and returns the sql + */ + public function getCompiledDelete(bool $reset = true): string + { + $sql = $this->testMode()->delete('', null, $reset); + $this->testMode(false); + + return $this->compileFinalQuery($sql); + } + + /** + * Compiles a delete string and runs the query + * + * @param mixed $where + * + * @throws DatabaseException + * + * @return bool|string + */ + public function delete($where = '', ?int $limit = null, bool $resetData = true) + { + $table = $this->db->protectIdentifiers($this->QBFrom[0], true, null, false); + + if ($where !== '') { + $this->where($where); + } + + if (empty($this->QBWhere)) { + if (CI_DEBUG) { + throw new DatabaseException('Deletes are not allowed unless they contain a "where" or "like" clause.'); + } + + return false; // @codeCoverageIgnore + } + + $sql = $this->_delete($table); + + if (! empty($limit)) { + $this->QBLimit = $limit; + } + + if (! empty($this->QBLimit)) { + if (! $this->canLimitDeletes) { + throw new DatabaseException('SQLite3 does not allow LIMITs on DELETE queries.'); + } + + $sql = $this->_limit($sql, true); + } + + if ($resetData) { + $this->resetWrite(); + } + + return $this->testMode ? $sql : $this->db->query($sql, $this->binds, false); + } + + /** + * Increments a numeric column by the specified value. + * + * @return bool + */ + public function increment(string $column, int $value = 1) + { + $column = $this->db->protectIdentifiers($column); + + $sql = $this->_update($this->QBFrom[0], [$column => "{$column} + {$value}"]); + + return $this->db->query($sql, $this->binds, false); + } + + /** + * Decrements a numeric column by the specified value. + * + * @return bool + */ + public function decrement(string $column, int $value = 1) + { + $column = $this->db->protectIdentifiers($column); + + $sql = $this->_update($this->QBFrom[0], [$column => "{$column}-{$value}"]); + + return $this->db->query($sql, $this->binds, false); + } + + /** + * Generates a platform-specific delete string from the supplied data + */ + protected function _delete(string $table): string + { + return 'DELETE ' . $this->compileIgnore('delete') . 'FROM ' . $table . $this->compileWhereHaving('QBWhere'); + } + + /** + * Used to track SQL statements written with aliased tables. + * + * @param array|string $table The table to inspect + * + * @return string|void + */ + protected function trackAliases($table) + { + if (is_array($table)) { + foreach ($table as $t) { + $this->trackAliases($t); + } + + return; + } + + // Does the string contain a comma? If so, we need to separate + // the string into discreet statements + if (strpos($table, ',') !== false) { + return $this->trackAliases(explode(',', $table)); + } + + // if a table alias is used we can recognize it by a space + if (strpos($table, ' ') !== false) { + // if the alias is written with the AS keyword, remove it + $table = preg_replace('/\s+AS\s+/i', ' ', $table); + + // Grab the alias + $table = trim(strrchr($table, ' ')); + + // Store the alias, if it doesn't already exist + $this->db->addTableAlias($table); + } + } + + /** + * Compile the SELECT statement + * + * Generates a query string based on which functions were used. + * Should not be called directly. + * + * @param mixed $selectOverride + */ + protected function compileSelect($selectOverride = false): string + { + if ($selectOverride !== false) { + $sql = $selectOverride; + } else { + $sql = (! $this->QBDistinct) ? 'SELECT ' : 'SELECT DISTINCT '; + + if (empty($this->QBSelect)) { + $sql .= '*'; + } else { + // Cycle through the "select" portion of the query and prep each column name. + // The reason we protect identifiers here rather than in the select() function + // is because until the user calls the from() function we don't know if there are aliases + foreach ($this->QBSelect as $key => $val) { + $noEscape = $this->QBNoEscape[$key] ?? null; + $this->QBSelect[$key] = $this->db->protectIdentifiers($val, false, $noEscape); + } + + $sql .= implode(', ', $this->QBSelect); + } + } + + if (! empty($this->QBFrom)) { + $sql .= "\nFROM " . $this->_fromTables(); + } + + if (! empty($this->QBJoin)) { + $sql .= "\n" . implode("\n", $this->QBJoin); + } + + $sql .= $this->compileWhereHaving('QBWhere') + . $this->compileGroupBy() + . $this->compileWhereHaving('QBHaving') + . $this->compileOrderBy(); + + if ($this->QBLimit) { + return $this->_limit($sql . "\n"); + } + + return $sql; + } + + /** + * Checks if the ignore option is supported by + * the Database Driver for the specific statement. + * + * @return string + */ + protected function compileIgnore(string $statement) + { + if ($this->QBIgnore && isset($this->supportedIgnoreStatements[$statement])) { + return trim($this->supportedIgnoreStatements[$statement]) . ' '; + } + + return ''; + } + + /** + * Escapes identifiers in WHERE and HAVING statements at execution time. + * + * Required so that aliases are tracked properly, regardless of whether + * where(), orWhere(), having(), orHaving are called prior to from(), + * join() and prefixTable is added only if needed. + * + * @param string $qbKey 'QBWhere' or 'QBHaving' + * + * @return string SQL statement + */ + protected function compileWhereHaving(string $qbKey): string + { + if (! empty($this->{$qbKey})) { + foreach ($this->{$qbKey} as &$qbkey) { + // Is this condition already compiled? + if (is_string($qbkey)) { + continue; + } + + if ($qbkey['escape'] === false) { + $qbkey = $qbkey['condition']; + + continue; + } + + // Split multiple conditions + $conditions = preg_split( + '/((?:^|\s+)AND\s+|(?:^|\s+)OR\s+)/i', + $qbkey['condition'], + -1, + PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY + ); + + foreach ($conditions as &$condition) { + if (($op = $this->getOperator($condition)) === false + || ! preg_match('/^(\(?)(.*)(' . preg_quote($op, '/') . ')\s*(.*(? '(test <= foo)', /* the whole thing */ + // 1 => '(', /* optional */ + // 2 => 'test', /* the field name */ + // 3 => ' <= ', /* $op */ + // 4 => 'foo', /* optional, if $op is e.g. 'IS NULL' */ + // 5 => ')' /* optional */ + // ); + + if (! empty($matches[4])) { + $protectIdentifiers = false; + if (strpos($matches[4], '.') !== false) { + $protectIdentifiers = true; + } + + if (strpos($matches[4], ':') === false) { + $matches[4] = $this->db->protectIdentifiers(trim($matches[4]), false, $protectIdentifiers); + } + + $matches[4] = ' ' . $matches[4]; + } + + $condition = $matches[1] . $this->db->protectIdentifiers(trim($matches[2])) + . ' ' . trim($matches[3]) . $matches[4] . $matches[5]; + } + + $qbkey = implode('', $conditions); + } + + return ($qbKey === 'QBHaving' ? "\nHAVING " : "\nWHERE ") + . implode("\n", $this->{$qbKey}); + } + + return ''; + } + + /** + * Escapes identifiers in GROUP BY statements at execution time. + * + * Required so that aliases are tracked properly, regardless of whether + * groupBy() is called prior to from(), join() and prefixTable is added + * only if needed. + */ + protected function compileGroupBy(): string + { + if (! empty($this->QBGroupBy)) { + foreach ($this->QBGroupBy as &$groupBy) { + // Is it already compiled? + if (is_string($groupBy)) { + continue; + } + + $groupBy = ($groupBy['escape'] === false || $this->isLiteral($groupBy['field'])) + ? $groupBy['field'] + : $this->db->protectIdentifiers($groupBy['field']); + } + + return "\nGROUP BY " . implode(', ', $this->QBGroupBy); + } + + return ''; + } + + /** + * Escapes identifiers in ORDER BY statements at execution time. + * + * Required so that aliases are tracked properly, regardless of whether + * orderBy() is called prior to from(), join() and prefixTable is added + * only if needed. + */ + protected function compileOrderBy(): string + { + if (is_array($this->QBOrderBy) && ! empty($this->QBOrderBy)) { + foreach ($this->QBOrderBy as &$orderBy) { + if ($orderBy['escape'] !== false && ! $this->isLiteral($orderBy['field'])) { + $orderBy['field'] = $this->db->protectIdentifiers($orderBy['field']); + } + + $orderBy = $orderBy['field'] . $orderBy['direction']; + } + + return $this->QBOrderBy = "\nORDER BY " . implode(', ', $this->QBOrderBy); + } + + if (is_string($this->QBOrderBy)) { + return $this->QBOrderBy; + } + + return ''; + } + + /** + * Takes an object as input and converts the class variables to array key/vals + * + * @param object $object + * + * @return array + */ + protected function objectToArray($object) + { + if (! is_object($object)) { + return $object; + } + + $array = []; + + foreach (get_object_vars($object) as $key => $val) { + // There are some built in keys we need to ignore for this conversion + if (! is_object($val) && ! is_array($val) && $key !== '_parent_name') { + $array[$key] = $val; + } + } + + return $array; + } + + /** + * Takes an object as input and converts the class variables to array key/vals + * + * @param object $object + * + * @return array + */ + protected function batchObjectToArray($object) + { + if (! is_object($object)) { + return $object; + } + + $array = []; + $out = get_object_vars($object); + $fields = array_keys($out); + + foreach ($fields as $val) { + // There are some built in keys we need to ignore for this conversion + if ($val !== '_parent_name') { + $i = 0; + + foreach ($out[$val] as $data) { + $array[$i++][$val] = $data; + } + } + } + + return $array; + } + + /** + * Determines if a string represents a literal value or a field name + */ + protected function isLiteral(string $str): bool + { + $str = trim($str); + + if (empty($str) + || ctype_digit($str) + || (string) (float) $str === $str + || in_array(strtoupper($str), ['TRUE', 'FALSE'], true) + ) { + return true; + } + + if ($this->isLiteralStr === []) { + $this->isLiteralStr = $this->db->escapeChar !== '"' ? ['"', "'"] : ["'"]; + } + + return in_array($str[0], $this->isLiteralStr, true); + } + + /** + * Publicly-visible method to reset the QB values. + * + * @return $this + */ + public function resetQuery() + { + $this->resetSelect(); + $this->resetWrite(); + + return $this; + } + + /** + * Resets the query builder values. Called by the get() function + * + * @param array $qbResetItems An array of fields to reset + */ + protected function resetRun(array $qbResetItems) + { + foreach ($qbResetItems as $item => $defaultValue) { + $this->{$item} = $defaultValue; + } + } + + /** + * Resets the query builder values. Called by the get() function + */ + protected function resetSelect() + { + $this->resetRun([ + 'QBSelect' => [], + 'QBJoin' => [], + 'QBWhere' => [], + 'QBGroupBy' => [], + 'QBHaving' => [], + 'QBOrderBy' => [], + 'QBNoEscape' => [], + 'QBDistinct' => false, + 'QBLimit' => false, + 'QBOffset' => false, + ]); + + if (! empty($this->db)) { + $this->db->setAliasedTables([]); + } + + // Reset QBFrom part + if (! empty($this->QBFrom)) { + $this->from(array_shift($this->QBFrom), true); + } + } + + /** + * Resets the query builder "write" values. + * + * Called by the insert() update() insertBatch() updateBatch() and delete() functions + */ + protected function resetWrite() + { + $this->resetRun([ + 'QBSet' => [], + 'QBJoin' => [], + 'QBWhere' => [], + 'QBOrderBy' => [], + 'QBKeys' => [], + 'QBLimit' => false, + 'QBIgnore' => false, + ]); + } + + /** + * Tests whether the string has an SQL operator + */ + protected function hasOperator(string $str): bool + { + return preg_match( + '/(<|>|!|=|\sIS NULL|\sIS NOT NULL|\sEXISTS|\sBETWEEN|\sLIKE|\sIN\s*\(|\s)/i', + trim($str) + ) === 1; + } + + /** + * Returns the SQL string operator + * + * @return mixed + */ + protected function getOperator(string $str, bool $list = false) + { + if ($this->pregOperators === []) { + $_les = $this->db->likeEscapeStr !== '' + ? '\s+' . preg_quote(trim(sprintf($this->db->likeEscapeStr, $this->db->likeEscapeChar)), '/') + : ''; + $this->pregOperators = [ + '\s*(?:<|>|!)?=\s*', // =, <=, >=, != + '\s*<>?\s*', // <, <> + '\s*>\s*', // > + '\s+IS NULL', // IS NULL + '\s+IS NOT NULL', // IS NOT NULL + '\s+EXISTS\s*\(.*\)', // EXISTS(sql) + '\s+NOT EXISTS\s*\(.*\)', // NOT EXISTS(sql) + '\s+BETWEEN\s+', // BETWEEN value AND value + '\s+IN\s*\(.*\)', // IN(list) + '\s+NOT IN\s*\(.*\)', // NOT IN (list) + '\s+LIKE\s+\S.*(' . $_les . ')?', // LIKE 'expr'[ ESCAPE '%s'] + '\s+NOT LIKE\s+\S.*(' . $_les . ')?', // NOT LIKE 'expr'[ ESCAPE '%s'] + ]; + } + + return preg_match_all( + '/' . implode('|', $this->pregOperators) . '/i', + $str, + $match + ) ? ($list ? $match[0] : $match[0][0]) : false; + } + + /** + * Stores a bind value after ensuring that it's unique. + * While it might be nicer to have named keys for our binds array + * with PHP 7+ we get a huge memory/performance gain with indexed + * arrays instead, so lets take advantage of that here. + * + * @param mixed $value + */ + protected function setBind(string $key, $value = null, bool $escape = true): string + { + if (! array_key_exists($key, $this->binds)) { + $this->binds[$key] = [ + $value, + $escape, + ]; + + return $key; + } + + if (! array_key_exists($key, $this->bindsKeyCount)) { + $this->bindsKeyCount[$key] = 1; + } + + $count = $this->bindsKeyCount[$key]++; + + $this->binds[$key . '.' . $count] = [ + $value, + $escape, + ]; + + return $key . '.' . $count; + } + + /** + * Returns a clone of a Base Builder with reset query builder values. + * + * @return $this + * + * @deprecated + */ + protected function cleanClone() + { + return (clone $this)->from([], true)->resetQuery(); + } + + /** + * @param mixed $value + */ + protected function isSubquery($value): bool + { + return $value instanceof BaseBuilder || $value instanceof Closure; + } + + /** + * @param BaseBuilder|Closure $builder + * @param bool $wrapped Wrap the subquery in brackets + */ + protected function buildSubquery($builder, bool $wrapped = false): string + { + if ($builder instanceof Closure) { + $instance = (clone $this)->from([], true)->resetQuery(); + $builder = $builder($instance); + } + + $subquery = strtr($builder->getCompiledSelect(), "\n", ' '); + + return $wrapped ? '(' . $subquery . ')' : $subquery; + } +} diff --git a/system/Database/BaseConnection.php b/system/Database/BaseConnection.php new file mode 100644 index 0000000..53e5dad --- /dev/null +++ b/system/Database/BaseConnection.php @@ -0,0 +1,1588 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Database; + +use Closure; +use CodeIgniter\Database\Exceptions\DatabaseException; +use CodeIgniter\Events\Events; +use Throwable; + +/** + * @property array $aliasedTables + * @property string $charset + * @property bool $compress + * @property float $connectDuration + * @property float $connectTime + * @property string $database + * @property string $DBCollat + * @property bool $DBDebug + * @property string $DBDriver + * @property string $DBPrefix + * @property string $DSN + * @property mixed $encrypt + * @property array $failover + * @property string $hostname + * @property mixed $lastQuery + * @property string $password + * @property bool $pConnect + * @property int|string $port + * @property bool $pretend + * @property string $queryClass + * @property array $reservedIdentifiers + * @property bool $strictOn + * @property string $subdriver + * @property string $swapPre + * @property int $transDepth + * @property bool $transFailure + * @property bool $transStatus + */ +abstract class BaseConnection implements ConnectionInterface +{ + /** + * Data Source Name / Connect string + * + * @var string + */ + protected $DSN; + + /** + * Database port + * + * @var int|string + */ + protected $port = ''; + + /** + * Hostname + * + * @var string + */ + protected $hostname; + + /** + * Username + * + * @var string + */ + protected $username; + + /** + * Password + * + * @var string + */ + protected $password; + + /** + * Database name + * + * @var string + */ + protected $database; + + /** + * Database driver + * + * @var string + */ + protected $DBDriver = 'MySQLi'; + + /** + * Sub-driver + * + * @used-by CI_DB_pdo_driver + * + * @var string + */ + protected $subdriver; + + /** + * Table prefix + * + * @var string + */ + protected $DBPrefix = ''; + + /** + * Persistent connection flag + * + * @var bool + */ + protected $pConnect = false; + + /** + * Debug flag + * + * Whether to display error messages. + * + * @var bool + */ + protected $DBDebug = false; + + /** + * Character set + * + * @var string + */ + protected $charset = 'utf8'; + + /** + * Collation + * + * @var string + */ + protected $DBCollat = 'utf8_general_ci'; + + /** + * Swap Prefix + * + * @var string + */ + protected $swapPre = ''; + + /** + * Encryption flag/data + * + * @var mixed + */ + protected $encrypt = false; + + /** + * Compression flag + * + * @var bool + */ + protected $compress = false; + + /** + * Strict ON flag + * + * Whether we're running in strict SQL mode. + * + * @var bool + */ + protected $strictOn; + + /** + * Settings for a failover connection. + * + * @var array + */ + protected $failover = []; + + /** + * The last query object that was executed + * on this connection. + * + * @var mixed + */ + protected $lastQuery; + + /** + * Connection ID + * + * @var bool|object|resource + */ + public $connID = false; + + /** + * Result ID + * + * @var bool|object|resource + */ + public $resultID = false; + + /** + * Protect identifiers flag + * + * @var bool + */ + public $protectIdentifiers = true; + + /** + * List of reserved identifiers + * + * Identifiers that must NOT be escaped. + * + * @var array + */ + protected $reservedIdentifiers = ['*']; + + /** + * Identifier escape character + * + * @var array|string + */ + public $escapeChar = '"'; + + /** + * ESCAPE statement string + * + * @var string + */ + public $likeEscapeStr = " ESCAPE '%s' "; + + /** + * ESCAPE character + * + * @var string + */ + public $likeEscapeChar = '!'; + + /** + * RegExp used to escape identifiers + * + * @var array + */ + protected $pregEscapeChar = []; + + /** + * Holds previously looked up data + * for performance reasons. + * + * @var array + */ + public $dataCache = []; + + /** + * Microtime when connection was made + * + * @var float + */ + protected $connectTime = 0.0; + + /** + * How long it took to establish connection. + * + * @var float + */ + protected $connectDuration = 0.0; + + /** + * If true, no queries will actually be + * ran against the database. + * + * @var bool + */ + protected $pretend = false; + + /** + * Transaction enabled flag + * + * @var bool + */ + public $transEnabled = true; + + /** + * Strict transaction mode flag + * + * @var bool + */ + public $transStrict = true; + + /** + * Transaction depth level + * + * @var int + */ + protected $transDepth = 0; + + /** + * Transaction status flag + * + * Used with transactions to determine if a rollback should occur. + * + * @var bool + */ + protected $transStatus = true; + + /** + * Transaction failure flag + * + * Used with transactions to determine if a transaction has failed. + * + * @var bool + */ + protected $transFailure = false; + + /** + * Array of table aliases. + * + * @var array + */ + protected $aliasedTables = []; + + /** + * Query Class + * + * @var string + */ + protected $queryClass = 'CodeIgniter\\Database\\Query'; + + /** + * Saves our connection settings. + */ + public function __construct(array $params) + { + foreach ($params as $key => $value) { + $this->{$key} = $value; + } + + $queryClass = str_replace('Connection', 'Query', static::class); + + if (class_exists($queryClass)) { + $this->queryClass = $queryClass; + } + } + + /** + * Initializes the database connection/settings. + * + * @throws DatabaseException + * + * @return mixed + */ + public function initialize() + { + /* If an established connection is available, then there's + * no need to connect and select the database. + * + * Depending on the database driver, conn_id can be either + * boolean TRUE, a resource or an object. + */ + if ($this->connID) { + return; + } + + $this->connectTime = microtime(true); + $connectionErrors = []; + + try { + // Connect to the database and set the connection ID + $this->connID = $this->connect($this->pConnect); + } catch (Throwable $e) { + $connectionErrors[] = sprintf('Main connection [%s]: %s', $this->DBDriver, $e->getMessage()); + log_message('error', 'Error connecting to the database: ' . $e->getMessage()); + } + + // No connection resource? Check if there is a failover else throw an error + if (! $this->connID) { + // Check if there is a failover set + if (! empty($this->failover) && is_array($this->failover)) { + // Go over all the failovers + foreach ($this->failover as $index => $failover) { + // Replace the current settings with those of the failover + foreach ($failover as $key => $val) { + if (property_exists($this, $key)) { + $this->{$key} = $val; + } + } + + try { + // Try to connect + $this->connID = $this->connect($this->pConnect); + } catch (Throwable $e) { + $connectionErrors[] = sprintf('Failover #%d [%s]: %s', ++$index, $this->DBDriver, $e->getMessage()); + log_message('error', 'Error connecting to the database: ' . $e->getMessage()); + } + + // If a connection is made break the foreach loop + if ($this->connID) { + break; + } + } + } + + // We still don't have a connection? + if (! $this->connID) { + throw new DatabaseException(sprintf( + 'Unable to connect to the database.%s%s', + PHP_EOL, + implode(PHP_EOL, $connectionErrors) + )); + } + } + + $this->connectDuration = microtime(true) - $this->connectTime; + } + + /** + * Connect to the database. + * + * @return mixed + */ + abstract public function connect(bool $persistent = false); + + /** + * Close the database connection. + */ + public function close() + { + if ($this->connID) { + $this->_close(); + $this->connID = false; + } + } + + /** + * Platform dependent way method for closing the connection. + * + * @return mixed + */ + abstract protected function _close(); + + /** + * Create a persistent database connection. + * + * @return mixed + */ + public function persistentConnect() + { + return $this->connect(true); + } + + /** + * Keep or establish the connection if no queries have been sent for + * a length of time exceeding the server's idle timeout. + * + * @return mixed + */ + abstract public function reconnect(); + + /** + * Returns the actual connection object. If both a 'read' and 'write' + * connection has been specified, you can pass either term in to + * get that connection. If you pass either alias in and only a single + * connection is present, it must return the sole connection. + * + * @return mixed + */ + public function getConnection(?string $alias = null) + { + // @todo work with read/write connections + return $this->connID; + } + + /** + * Select a specific database table to use. + * + * @return mixed + */ + abstract public function setDatabase(string $databaseName); + + /** + * Returns the name of the current database being used. + */ + public function getDatabase(): string + { + return empty($this->database) ? '' : $this->database; + } + + /** + * Set DB Prefix + * + * Set's the DB Prefix to something new without needing to reconnect + * + * @param string $prefix The prefix + */ + public function setPrefix(string $prefix = ''): string + { + return $this->DBPrefix = $prefix; + } + + /** + * Returns the database prefix. + */ + public function getPrefix(): string + { + return $this->DBPrefix; + } + + /** + * The name of the platform in use (MySQLi, mssql, etc) + */ + public function getPlatform(): string + { + return $this->DBDriver; + } + + /** + * Returns a string containing the version of the database being used. + */ + abstract public function getVersion(): string; + + /** + * Sets the Table Aliases to use. These are typically + * collected during use of the Builder, and set here + * so queries are built correctly. + * + * @return $this + */ + public function setAliasedTables(array $aliases) + { + $this->aliasedTables = $aliases; + + return $this; + } + + /** + * Add a table alias to our list. + * + * @return $this + */ + public function addTableAlias(string $table) + { + if (! in_array($table, $this->aliasedTables, true)) { + $this->aliasedTables[] = $table; + } + + return $this; + } + + /** + * Executes the query against the database. + * + * @return mixed + */ + abstract protected function execute(string $sql); + + /** + * Orchestrates a query against the database. Queries must use + * Database\Statement objects to store the query and build it. + * This method works with the cache. + * + * Should automatically handle different connections for read/write + * queries if needed. + * + * @param mixed ...$binds + * + * @return BaseResult|bool|Query BaseResult when ā€œreadā€ type query, bool when ā€œwriteā€ type query, Query when prepared query + * + * @todo BC set $queryClass default as null in 4.1 + */ + public function query(string $sql, $binds = null, bool $setEscapeFlags = true, string $queryClass = '') + { + $queryClass = $queryClass ?: $this->queryClass; + + if (empty($this->connID)) { + $this->initialize(); + } + + /** + * @var Query $query + */ + $query = new $queryClass($this); + + $query->setQuery($sql, $binds, $setEscapeFlags); + + if (! empty($this->swapPre) && ! empty($this->DBPrefix)) { + $query->swapPrefix($this->DBPrefix, $this->swapPre); + } + + $startTime = microtime(true); + + // Always save the last query so we can use + // the getLastQuery() method. + $this->lastQuery = $query; + + // Run the query for real + if (! $this->pretend && false === ($this->resultID = $this->simpleQuery($query->getQuery()))) { + $query->setDuration($startTime, $startTime); + + // This will trigger a rollback if transactions are being used + if ($this->transDepth !== 0) { + $this->transStatus = false; + } + + if ($this->DBDebug) { + // We call this function in order to roll-back queries + // if transactions are enabled. If we don't call this here + // the error message will trigger an exit, causing the + // transactions to remain in limbo. + while ($this->transDepth !== 0) { + $transDepth = $this->transDepth; + $this->transComplete(); + + if ($transDepth === $this->transDepth) { + log_message('error', 'Database: Failure during an automated transaction commit/rollback!'); + break; + } + } + + return false; + } + + if (! $this->pretend) { + // Let others do something with this query. + Events::trigger('DBQuery', $query); + } + + return false; + } + + $query->setDuration($startTime); + + if (! $this->pretend) { + // Let others do something with this query + Events::trigger('DBQuery', $query); + } + + // If $pretend is true, then we just want to return + // the actual query object here. There won't be + // any results to return. + if ($this->pretend) { + return $query; + } + + // resultID is not false, so it must be successful + if ($this->isWriteType($sql)) { + return true; + } + + // query is not write-type, so it must be read-type query; return QueryResult + $resultClass = str_replace('Connection', 'Result', static::class); + + return new $resultClass($this->connID, $this->resultID); + } + + /** + * Performs a basic query against the database. No binding or caching + * is performed, nor are transactions handled. Simply takes a raw + * query string and returns the database-specific result id. + * + * @return mixed + */ + public function simpleQuery(string $sql) + { + if (empty($this->connID)) { + $this->initialize(); + } + + return $this->execute($sql); + } + + /** + * Disable Transactions + * + * This permits transactions to be disabled at run-time. + */ + public function transOff() + { + $this->transEnabled = false; + } + + /** + * Enable/disable Transaction Strict Mode + * + * When strict mode is enabled, if you are running multiple groups of + * transactions, if one group fails all subsequent groups will be + * rolled back. + * + * If strict mode is disabled, each group is treated autonomously, + * meaning a failure of one group will not affect any others + * + * @param bool $mode = true + * + * @return $this + */ + public function transStrict(bool $mode = true) + { + $this->transStrict = $mode; + + return $this; + } + + /** + * Start Transaction + */ + public function transStart(bool $testMode = false): bool + { + if (! $this->transEnabled) { + return false; + } + + return $this->transBegin($testMode); + } + + /** + * Complete Transaction + */ + public function transComplete(): bool + { + if (! $this->transEnabled) { + return false; + } + + // The query() function will set this flag to FALSE in the event that a query failed + if ($this->transStatus === false || $this->transFailure === true) { + $this->transRollback(); + + // If we are NOT running in strict mode, we will reset + // the _trans_status flag so that subsequent groups of + // transactions will be permitted. + if ($this->transStrict === false) { + $this->transStatus = true; + } + + return false; + } + + return $this->transCommit(); + } + + /** + * Lets you retrieve the transaction flag to determine if it has failed + */ + public function transStatus(): bool + { + return $this->transStatus; + } + + /** + * Begin Transaction + */ + public function transBegin(bool $testMode = false): bool + { + if (! $this->transEnabled) { + return false; + } + + // When transactions are nested we only begin/commit/rollback the outermost ones + if ($this->transDepth > 0) { + $this->transDepth++; + + return true; + } + + if (empty($this->connID)) { + $this->initialize(); + } + + // Reset the transaction failure flag. + // If the $test_mode flag is set to TRUE transactions will be rolled back + // even if the queries produce a successful result. + $this->transFailure = ($testMode === true); + + if ($this->_transBegin()) { + $this->transDepth++; + + return true; + } + + return false; + } + + /** + * Commit Transaction + */ + public function transCommit(): bool + { + if (! $this->transEnabled || $this->transDepth === 0) { + return false; + } + + // When transactions are nested we only begin/commit/rollback the outermost ones + if ($this->transDepth > 1 || $this->_transCommit()) { + $this->transDepth--; + + return true; + } + + return false; + } + + /** + * Rollback Transaction + */ + public function transRollback(): bool + { + if (! $this->transEnabled || $this->transDepth === 0) { + return false; + } + + // When transactions are nested we only begin/commit/rollback the outermost ones + if ($this->transDepth > 1 || $this->_transRollback()) { + $this->transDepth--; + + return true; + } + + return false; + } + + /** + * Begin Transaction + */ + abstract protected function _transBegin(): bool; + + /** + * Commit Transaction + */ + abstract protected function _transCommit(): bool; + + /** + * Rollback Transaction + */ + abstract protected function _transRollback(): bool; + + /** + * Returns a non-shared new instance of the query builder for this connection. + * + * @param array|string $tableName + * + * @throws DatabaseException + * + * @return BaseBuilder + */ + public function table($tableName) + { + if (empty($tableName)) { + throw new DatabaseException('You must set the database table to be used with your query.'); + } + + $className = str_replace('Connection', 'Builder', static::class); + + return new $className($tableName, $this); + } + + /** + * Creates a prepared statement with the database that can then + * be used to execute multiple statements against. Within the + * closure, you would build the query in any normal way, though + * the Query Builder is the expected manner. + * + * Example: + * $stmt = $db->prepare(function($db) + * { + * return $db->table('users') + * ->where('id', 1) + * ->get(); + * }) + * + * @return BasePreparedQuery|null + */ + public function prepare(Closure $func, array $options = []) + { + if (empty($this->connID)) { + $this->initialize(); + } + + $this->pretend(); + + $sql = $func($this); + + $this->pretend(false); + + if ($sql instanceof QueryInterface) { + $sql = $sql->getOriginalQuery(); + } + + $class = str_ireplace('Connection', 'PreparedQuery', static::class); + /** @var BasePreparedQuery $class */ + $class = new $class($this); + + return $class->prepare($sql, $options); + } + + /** + * Returns the last query's statement object. + * + * @return mixed + */ + public function getLastQuery() + { + return $this->lastQuery; + } + + /** + * Returns a string representation of the last query's statement object. + */ + public function showLastQuery(): string + { + return (string) $this->lastQuery; + } + + /** + * Returns the time we started to connect to this database in + * seconds with microseconds. + * + * Used by the Debug Toolbar's timeline. + */ + public function getConnectStart(): ?float + { + return $this->connectTime; + } + + /** + * Returns the number of seconds with microseconds that it took + * to connect to the database. + * + * Used by the Debug Toolbar's timeline. + */ + public function getConnectDuration(int $decimals = 6): string + { + return number_format($this->connectDuration, $decimals); + } + + /** + * Protect Identifiers + * + * This function is used extensively by the Query Builder class, and by + * a couple functions in this class. + * It takes a column or table name (optionally with an alias) and inserts + * the table prefix onto it. Some logic is necessary in order to deal with + * column names that include the path. Consider a query like this: + * + * SELECT hostname.database.table.column AS c FROM hostname.database.table + * + * Or a query with aliasing: + * + * SELECT m.member_id, m.member_name FROM members AS m + * + * Since the column name can include up to four segments (host, DB, table, column) + * or also have an alias prefix, we need to do a bit of work to figure this out and + * insert the table prefix (if it exists) in the proper position, and escape only + * the correct identifiers. + * + * @param array|string $item + * @param bool $prefixSingle Prefix an item with no segments? + * @param bool $fieldExists Supplied $item contains a field name? + * + * @return array|string + */ + public function protectIdentifiers($item, bool $prefixSingle = false, ?bool $protectIdentifiers = null, bool $fieldExists = true) + { + if (! is_bool($protectIdentifiers)) { + $protectIdentifiers = $this->protectIdentifiers; + } + + if (is_array($item)) { + $escapedArray = []; + + foreach ($item as $k => $v) { + $escapedArray[$this->protectIdentifiers($k)] = $this->protectIdentifiers($v, $prefixSingle, $protectIdentifiers, $fieldExists); + } + + return $escapedArray; + } + + // This is basically a bug fix for queries that use MAX, MIN, etc. + // If a parenthesis is found we know that we do not need to + // escape the data or add a prefix. There's probably a more graceful + // way to deal with this, but I'm not thinking of it + // + // Added exception for single quotes as well, we don't want to alter + // literal strings. + if (strcspn($item, "()'") !== strlen($item)) { + return $item; + } + + // Convert tabs or multiple spaces into single spaces + $item = preg_replace('/\s+/', ' ', trim($item)); + + // If the item has an alias declaration we remove it and set it aside. + // Note: strripos() is used in order to support spaces in table names + if ($offset = strripos($item, ' AS ')) { + $alias = ($protectIdentifiers) ? substr($item, $offset, 4) . $this->escapeIdentifiers(substr($item, $offset + 4)) : substr($item, $offset); + $item = substr($item, 0, $offset); + } elseif ($offset = strrpos($item, ' ')) { + $alias = ($protectIdentifiers) ? ' ' . $this->escapeIdentifiers(substr($item, $offset + 1)) : substr($item, $offset); + $item = substr($item, 0, $offset); + } else { + $alias = ''; + } + + // Break the string apart if it contains periods, then insert the table prefix + // in the correct location, assuming the period doesn't indicate that we're dealing + // with an alias. While we're at it, we will escape the components + if (strpos($item, '.') !== false) { + $parts = explode('.', $item); + + // Does the first segment of the exploded item match + // one of the aliases previously identified? If so, + // we have nothing more to do other than escape the item + // + // NOTE: The ! empty() condition prevents this method + // from breaking when QB isn't enabled. + $firstSegment = trim($parts[0], $this->escapeChar); + if (! empty($this->aliasedTables) && in_array($firstSegment, $this->aliasedTables, true)) { + if ($protectIdentifiers === true) { + foreach ($parts as $key => $val) { + if (! in_array($val, $this->reservedIdentifiers, true)) { + $parts[$key] = $this->escapeIdentifiers($val); + } + } + + $item = implode('.', $parts); + } + + return $item . $alias; + } + + // Is there a table prefix defined in the config file? If not, no need to do anything + if ($this->DBPrefix !== '') { + // We now add the table prefix based on some logic. + // Do we have 4 segments (hostname.database.table.column)? + // If so, we add the table prefix to the column name in the 3rd segment. + if (isset($parts[3])) { + $i = 2; + } + // Do we have 3 segments (database.table.column)? + // If so, we add the table prefix to the column name in 2nd position + elseif (isset($parts[2])) { + $i = 1; + } + // Do we have 2 segments (table.column)? + // If so, we add the table prefix to the column name in 1st segment + else { + $i = 0; + } + + // This flag is set when the supplied $item does not contain a field name. + // This can happen when this function is being called from a JOIN. + if ($fieldExists === false) { + $i++; + } + + // Verify table prefix and replace if necessary + if ($this->swapPre !== '' && strpos($parts[$i], $this->swapPre) === 0) { + $parts[$i] = preg_replace('/^' . $this->swapPre . '(\S+?)/', $this->DBPrefix . '\\1', $parts[$i]); + } + // We only add the table prefix if it does not already exist + elseif (strpos($parts[$i], $this->DBPrefix) !== 0) { + $parts[$i] = $this->DBPrefix . $parts[$i]; + } + + // Put the parts back together + $item = implode('.', $parts); + } + + if ($protectIdentifiers === true) { + $item = $this->escapeIdentifiers($item); + } + + return $item . $alias; + } + + // In some cases, especially 'from', we end up running through + // protect_identifiers twice. This algorithm won't work when + // it contains the escapeChar so strip it out. + $item = trim($item, $this->escapeChar); + + // Is there a table prefix? If not, no need to insert it + if ($this->DBPrefix !== '') { + // Verify table prefix and replace if necessary + if ($this->swapPre !== '' && strpos($item, $this->swapPre) === 0) { + $item = preg_replace('/^' . $this->swapPre . '(\S+?)/', $this->DBPrefix . '\\1', $item); + } + // Do we prefix an item with no segments? + elseif ($prefixSingle === true && strpos($item, $this->DBPrefix) !== 0) { + $item = $this->DBPrefix . $item; + } + } + + if ($protectIdentifiers === true && ! in_array($item, $this->reservedIdentifiers, true)) { + $item = $this->escapeIdentifiers($item); + } + + return $item . $alias; + } + + /** + * Escape the SQL Identifiers + * + * This function escapes column and table names + * + * @param mixed $item + * + * @return mixed + */ + public function escapeIdentifiers($item) + { + if ($this->escapeChar === '' || empty($item) || in_array($item, $this->reservedIdentifiers, true)) { + return $item; + } + + if (is_array($item)) { + foreach ($item as $key => $value) { + $item[$key] = $this->escapeIdentifiers($value); + } + + return $item; + } + + // Avoid breaking functions and literal values inside queries + if (ctype_digit($item) + || $item[0] === "'" + || ($this->escapeChar !== '"' && $item[0] === '"') + || strpos($item, '(') !== false) { + return $item; + } + + if ($this->pregEscapeChar === []) { + if (is_array($this->escapeChar)) { + $this->pregEscapeChar = [ + preg_quote($this->escapeChar[0], '/'), + preg_quote($this->escapeChar[1], '/'), + $this->escapeChar[0], + $this->escapeChar[1], + ]; + } else { + $this->pregEscapeChar[0] = $this->pregEscapeChar[1] = preg_quote($this->escapeChar, '/'); + $this->pregEscapeChar[2] = $this->pregEscapeChar[3] = $this->escapeChar; + } + } + + foreach ($this->reservedIdentifiers as $id) { + if (strpos($item, '.' . $id) !== false) { + return preg_replace( + '/' . $this->pregEscapeChar[0] . '?([^' . $this->pregEscapeChar[1] . '\.]+)' . $this->pregEscapeChar[1] . '?\./i', + $this->pregEscapeChar[2] . '$1' . $this->pregEscapeChar[3] . '.', + $item + ); + } + } + + return preg_replace( + '/' . $this->pregEscapeChar[0] . '?([^' . $this->pregEscapeChar[1] . '\.]+)' . $this->pregEscapeChar[1] . '?(\.)?/i', + $this->pregEscapeChar[2] . '$1' . $this->pregEscapeChar[3] . '$2', + $item + ); + } + + /** + * Prepends a database prefix if one exists in configuration + * + * @throws DatabaseException + */ + public function prefixTable(string $table = ''): string + { + if ($table === '') { + throw new DatabaseException('A table name is required for that operation.'); + } + + return $this->DBPrefix . $table; + } + + /** + * Returns the total number of rows affected by this query. + */ + abstract public function affectedRows(): int; + + /** + * "Smart" Escape String + * + * Escapes data based on type. + * Sets boolean and null types + * + * @param mixed $str + * + * @return mixed + */ + public function escape($str) + { + if (is_array($str)) { + return array_map([&$this, 'escape'], $str); + } + + if (is_string($str) || (is_object($str) && method_exists($str, '__toString'))) { + return "'" . $this->escapeString($str) . "'"; + } + + if (is_bool($str)) { + return ($str === false) ? 0 : 1; + } + + return $str ?? 'NULL'; + } + + /** + * Escape String + * + * @param string|string[] $str Input string + * @param bool $like Whether or not the string will be used in a LIKE condition + * + * @return string|string[] + */ + public function escapeString($str, bool $like = false) + { + if (is_array($str)) { + foreach ($str as $key => $val) { + $str[$key] = $this->escapeString($val, $like); + } + + return $str; + } + + $str = $this->_escapeString($str); + + // escape LIKE condition wildcards + if ($like === true) { + return str_replace( + [ + $this->likeEscapeChar, + '%', + '_', + ], + [ + $this->likeEscapeChar . $this->likeEscapeChar, + $this->likeEscapeChar . '%', + $this->likeEscapeChar . '_', + ], + $str + ); + } + + return $str; + } + + /** + * Escape LIKE String + * + * Calls the individual driver for platform + * specific escaping for LIKE conditions + * + * @param string|string[] $str + * + * @return string|string[] + */ + public function escapeLikeString($str) + { + return $this->escapeString($str, true); + } + + /** + * Platform independent string escape. + * + * Will likely be overridden in child classes. + */ + protected function _escapeString(string $str): string + { + return str_replace("'", "''", remove_invisible_characters($str, false)); + } + + /** + * This function enables you to call PHP database functions that are not natively included + * in CodeIgniter, in a platform independent manner. + * + * @param array ...$params + * + * @throws DatabaseException + */ + public function callFunction(string $functionName, ...$params): bool + { + $driver = $this->getDriverFunctionPrefix(); + + if (strpos($driver, $functionName) === false) { + $functionName = $driver . $functionName; + } + + if (! function_exists($functionName)) { + if ($this->DBDebug) { + throw new DatabaseException('This feature is not available for the database you are using.'); + } + + return false; + } + + return $functionName(...$params); + } + + /** + * Get the prefix of the function to access the DB. + */ + protected function getDriverFunctionPrefix(): string + { + return strtolower($this->DBDriver) . '_'; + } + + //-------------------------------------------------------------------- + // META Methods + //-------------------------------------------------------------------- + + /** + * Returns an array of table names + * + * @throws DatabaseException + * + * @return array|bool + */ + public function listTables(bool $constrainByPrefix = false) + { + // Is there a cached result? + if (isset($this->dataCache['table_names']) && $this->dataCache['table_names']) { + return $constrainByPrefix ? + preg_grep("/^{$this->DBPrefix}/", $this->dataCache['table_names']) + : $this->dataCache['table_names']; + } + + if (false === ($sql = $this->_listTables($constrainByPrefix))) { + if ($this->DBDebug) { + throw new DatabaseException('This feature is not available for the database you are using.'); + } + + return false; + } + + $this->dataCache['table_names'] = []; + + $query = $this->query($sql); + + foreach ($query->getResultArray() as $row) { + // Do we know from which column to get the table name? + if (! isset($key)) { + if (isset($row['table_name'])) { + $key = 'table_name'; + } elseif (isset($row['TABLE_NAME'])) { + $key = 'TABLE_NAME'; + } else { + /* We have no other choice but to just get the first element's key. + * Due to array_shift() accepting its argument by reference, if + * E_STRICT is on, this would trigger a warning. So we'll have to + * assign it first. + */ + $key = array_keys($row); + $key = array_shift($key); + } + } + + $this->dataCache['table_names'][] = $row[$key]; + } + + return $this->dataCache['table_names']; + } + + /** + * Determine if a particular table exists + */ + public function tableExists(string $tableName): bool + { + return in_array($this->protectIdentifiers($tableName, true, false, false), $this->listTables(), true); + } + + /** + * Fetch Field Names + * + * @throws DatabaseException + * + * @return array|false + */ + public function getFieldNames(string $table) + { + // Is there a cached result? + if (isset($this->dataCache['field_names'][$table])) { + return $this->dataCache['field_names'][$table]; + } + + if (empty($this->connID)) { + $this->initialize(); + } + + if (false === ($sql = $this->_listColumns($table))) { + if ($this->DBDebug) { + throw new DatabaseException('This feature is not available for the database you are using.'); + } + + return false; + } + + $query = $this->query($sql); + + $this->dataCache['field_names'][$table] = []; + + foreach ($query->getResultArray() as $row) { + // Do we know from where to get the column's name? + if (! isset($key)) { + if (isset($row['column_name'])) { + $key = 'column_name'; + } elseif (isset($row['COLUMN_NAME'])) { + $key = 'COLUMN_NAME'; + } else { + // We have no other choice but to just get the first element's key. + $key = key($row); + } + } + + $this->dataCache['field_names'][$table][] = $row[$key]; + } + + return $this->dataCache['field_names'][$table]; + } + + /** + * Determine if a particular field exists + */ + public function fieldExists(string $fieldName, string $tableName): bool + { + return in_array($fieldName, $this->getFieldNames($tableName), true); + } + + /** + * Returns an object with field data + * + * @return array + */ + public function getFieldData(string $table) + { + return $this->_fieldData($this->protectIdentifiers($table, true, false, false)); + } + + /** + * Returns an object with key data + * + * @return array + */ + public function getIndexData(string $table) + { + return $this->_indexData($this->protectIdentifiers($table, true, false, false)); + } + + /** + * Returns an object with foreign key data + * + * @return array + */ + public function getForeignKeyData(string $table) + { + return $this->_foreignKeyData($this->protectIdentifiers($table, true, false, false)); + } + + /** + * Disables foreign key checks temporarily. + */ + public function disableForeignKeyChecks() + { + $sql = $this->_disableForeignKeyChecks(); + + return $this->query($sql); + } + + /** + * Enables foreign key checks temporarily. + */ + public function enableForeignKeyChecks() + { + $sql = $this->_enableForeignKeyChecks(); + + return $this->query($sql); + } + + /** + * Allows the engine to be set into a mode where queries are not + * actually executed, but they are still generated, timed, etc. + * + * This is primarily used by the prepared query functionality. + * + * @return $this + */ + public function pretend(bool $pretend = true) + { + $this->pretend = $pretend; + + return $this; + } + + /** + * Empties our data cache. Especially helpful during testing. + * + * @return $this + */ + public function resetDataCache() + { + $this->dataCache = []; + + return $this; + } + + /** + * Determines if the statement is a write-type query or not. + * + * @param string $sql + */ + public function isWriteType($sql): bool + { + return (bool) preg_match('/^\s*"?(SET|INSERT|UPDATE|DELETE|REPLACE|CREATE|DROP|TRUNCATE|LOAD|COPY|ALTER|RENAME|GRANT|REVOKE|LOCK|UNLOCK|REINDEX|MERGE)\s/i', $sql); + } + + /** + * Returns the last error code and message. + * + * Must return an array with keys 'code' and 'message': + * + * return ['code' => null, 'message' => null); + */ + abstract public function error(): array; + + /** + * Insert ID + * + * @return int|string + */ + abstract public function insertID(); + + /** + * Generates the SQL for listing tables in a platform-dependent manner. + * + * @return false|string + */ + abstract protected function _listTables(bool $constrainByPrefix = false); + + /** + * Generates a platform-specific query string so that the column names can be fetched. + * + * @return false|string + */ + abstract protected function _listColumns(string $table = ''); + + /** + * Platform-specific field data information. + * + * @see getFieldData() + */ + abstract protected function _fieldData(string $table): array; + + /** + * Platform-specific index data. + * + * @see getIndexData() + */ + abstract protected function _indexData(string $table): array; + + /** + * Platform-specific foreign keys data. + * + * @see getForeignKeyData() + */ + abstract protected function _foreignKeyData(string $table): array; + + /** + * Accessor for properties if they exist. + * + * @return mixed + */ + public function __get(string $key) + { + if (property_exists($this, $key)) { + return $this->{$key}; + } + + return null; + } + + /** + * Checker for properties existence. + */ + public function __isset(string $key): bool + { + return property_exists($this, $key); + } +} diff --git a/system/Database/BasePreparedQuery.php b/system/Database/BasePreparedQuery.php new file mode 100644 index 0000000..ba36915 --- /dev/null +++ b/system/Database/BasePreparedQuery.php @@ -0,0 +1,189 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Database; + +use BadMethodCallException; +use CodeIgniter\Events\Events; + +/** + * Base prepared query + */ +abstract class BasePreparedQuery implements PreparedQueryInterface +{ + /** + * The prepared statement itself. + * + * @var object|resource + */ + protected $statement; + + /** + * The error code, if any. + * + * @var int + */ + protected $errorCode; + + /** + * The error message, if any. + * + * @var string + */ + protected $errorString; + + /** + * Holds the prepared query object + * that is cloned during execute. + * + * @var Query + */ + protected $query; + + /** + * A reference to the db connection to use. + * + * @var BaseConnection + */ + protected $db; + + public function __construct(BaseConnection $db) + { + $this->db = &$db; + } + + /** + * Prepares the query against the database, and saves the connection + * info necessary to execute the query later. + * + * NOTE: This version is based on SQL code. Child classes should + * override this method. + * + * @return mixed + */ + public function prepare(string $sql, array $options = [], string $queryClass = 'CodeIgniter\\Database\\Query') + { + // We only supports positional placeholders (?) + // in order to work with the execute method below, so we + // need to replace our named placeholders (:name) + $sql = preg_replace('/:[^\s,)]+/', '?', $sql); + + /** @var Query $query */ + $query = new $queryClass($this->db); + + $query->setQuery($sql); + + if (! empty($this->db->swapPre) && ! empty($this->db->DBPrefix)) { + $query->swapPrefix($this->db->DBPrefix, $this->db->swapPre); + } + + $this->query = $query; + + return $this->_prepare($query->getOriginalQuery(), $options); + } + + /** + * The database-dependent portion of the prepare statement. + * + * @return mixed + */ + abstract public function _prepare(string $sql, array $options = []); + + /** + * Takes a new set of data and runs it against the currently + * prepared query. Upon success, will return a Results object. + * + * @return ResultInterface + */ + public function execute(...$data) + { + // Execute the Query. + $startTime = microtime(true); + + $this->_execute($data); + + // Update our query object + $query = clone $this->query; + $query->setBinds($data); + + $query->setDuration($startTime); + + // Let others do something with this query + Events::trigger('DBQuery', $query); + + // Return a result object + $resultClass = str_replace('PreparedQuery', 'Result', static::class); + + $resultID = $this->_getResult(); + + return new $resultClass($this->db->connID, $resultID); + } + + /** + * The database dependant version of the execute method. + */ + abstract public function _execute(array $data): bool; + + /** + * Returns the result object for the prepared query. + * + * @return mixed + */ + abstract public function _getResult(); + + /** + * Explicitly closes the statement. + */ + public function close() + { + if (! is_object($this->statement) || ! method_exists($this->statement, 'close')) { + return; + } + + $this->statement->close(); + } + + /** + * Returns the SQL that has been prepared. + */ + public function getQueryString(): string + { + if (! $this->query instanceof QueryInterface) { + throw new BadMethodCallException('Cannot call getQueryString on a prepared query until after the query has been prepared.'); + } + + return $this->query->getQuery(); + } + + /** + * A helper to determine if any error exists. + */ + public function hasError(): bool + { + return ! empty($this->errorString); + } + + /** + * Returns the error code created while executing this statement. + */ + public function getErrorCode(): int + { + return $this->errorCode; + } + + /** + * Returns the error message created while executing this statement. + */ + public function getErrorMessage(): string + { + return $this->errorString; + } +} diff --git a/system/Database/BaseResult.php b/system/Database/BaseResult.php new file mode 100644 index 0000000..5d223c7 --- /dev/null +++ b/system/Database/BaseResult.php @@ -0,0 +1,512 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Database; + +use CodeIgniter\Entity\Entity; + +/** + * Class BaseResult + */ +abstract class BaseResult implements ResultInterface +{ + /** + * Connection ID + * + * @var object|resource + */ + public $connID; + + /** + * Result ID + * + * @var false|object|resource + */ + public $resultID; + + /** + * Result Array + * + * @var array[] + */ + public $resultArray = []; + + /** + * Result Object + * + * @var object[] + */ + public $resultObject = []; + + /** + * Custom Result Object + * + * @var array + */ + public $customResultObject = []; + + /** + * Current Row index + * + * @var int + */ + public $currentRow = 0; + + /** + * The number of records in the query result + * + * @var int|null + */ + protected $numRows; + + /** + * Row data + * + * @var array|null + */ + public $rowData; + + /** + * Constructor + * + * @param object|resource $connID + * @param object|resource $resultID + */ + public function __construct(&$connID, &$resultID) + { + $this->connID = $connID; + $this->resultID = $resultID; + } + + /** + * Retrieve the results of the query. Typically an array of + * individual data rows, which can be either an 'array', an + * 'object', or a custom class name. + * + * @param string $type The row type. Either 'array', 'object', or a class name to use + */ + public function getResult(string $type = 'object'): array + { + if ($type === 'array') { + return $this->getResultArray(); + } + + if ($type === 'object') { + return $this->getResultObject(); + } + + return $this->getCustomResultObject($type); + } + + /** + * Returns the results as an array of custom objects. + * + * @return mixed + */ + public function getCustomResultObject(string $className) + { + if (isset($this->customResultObject[$className])) { + return $this->customResultObject[$className]; + } + + if (is_bool($this->resultID) || ! $this->resultID) { + return []; + } + + // Don't fetch the result set again if we already have it + $_data = null; + if (($c = count($this->resultArray)) > 0) { + $_data = 'resultArray'; + } elseif (($c = count($this->resultObject)) > 0) { + $_data = 'resultObject'; + } + + if ($_data !== null) { + for ($i = 0; $i < $c; $i++) { + $this->customResultObject[$className][$i] = new $className(); + + foreach ($this->{$_data}[$i] as $key => $value) { + $this->customResultObject[$className][$i]->{$key} = $value; + } + } + + return $this->customResultObject[$className]; + } + + if ($this->rowData !== null) { + $this->dataSeek(); + } + $this->customResultObject[$className] = []; + + while ($row = $this->fetchObject($className)) { + if (! is_subclass_of($row, Entity::class) && method_exists($row, 'syncOriginal')) { + $row->syncOriginal(); + } + + $this->customResultObject[$className][] = $row; + } + + return $this->customResultObject[$className]; + } + + /** + * Returns the results as an array of arrays. + * + * If no results, an empty array is returned. + */ + public function getResultArray(): array + { + if (! empty($this->resultArray)) { + return $this->resultArray; + } + + // In the event that query caching is on, the result_id variable + // will not be a valid resource so we'll simply return an empty + // array. + if (is_bool($this->resultID) || ! $this->resultID) { + return []; + } + + if ($this->resultObject) { + foreach ($this->resultObject as $row) { + $this->resultArray[] = (array) $row; + } + + return $this->resultArray; + } + + if ($this->rowData !== null) { + $this->dataSeek(); + } + + while ($row = $this->fetchAssoc()) { + $this->resultArray[] = $row; + } + + return $this->resultArray; + } + + /** + * Returns the results as an array of objects. + * + * If no results, an empty array is returned. + */ + public function getResultObject(): array + { + if (! empty($this->resultObject)) { + return $this->resultObject; + } + + // In the event that query caching is on, the result_id variable + // will not be a valid resource so we'll simply return an empty + // array. + if (is_bool($this->resultID) || ! $this->resultID) { + return []; + } + + if ($this->resultArray) { + foreach ($this->resultArray as $row) { + $this->resultObject[] = (object) $row; + } + + return $this->resultObject; + } + + if ($this->rowData !== null) { + $this->dataSeek(); + } + + while ($row = $this->fetchObject()) { + if (! is_subclass_of($row, Entity::class) && method_exists($row, 'syncOriginal')) { + $row->syncOriginal(); + } + + $this->resultObject[] = $row; + } + + return $this->resultObject; + } + + /** + * Wrapper object to return a row as either an array, an object, or + * a custom class. + * + * If row doesn't exist, returns null. + * + * @param mixed $n The index of the results to return + * @param string $type The type of result object. 'array', 'object' or class name. + * + * @return mixed + */ + public function getRow($n = 0, string $type = 'object') + { + if (! is_numeric($n)) { + // We cache the row data for subsequent uses + if (! is_array($this->rowData)) { + $this->rowData = $this->getRowArray(); + } + + // array_key_exists() instead of isset() to allow for NULL values + if (empty($this->rowData) || ! array_key_exists($n, $this->rowData)) { + return null; + } + + return $this->rowData[$n]; + } + + if ($type === 'object') { + return $this->getRowObject($n); + } + + if ($type === 'array') { + return $this->getRowArray($n); + } + + return $this->getCustomRowObject($n, $type); + } + + /** + * Returns a row as a custom class instance. + * + * If row doesn't exists, returns null. + * + * @return mixed + */ + public function getCustomRowObject(int $n, string $className) + { + if (! isset($this->customResultObject[$className])) { + $this->getCustomResultObject($className); + } + + if (empty($this->customResultObject[$className])) { + return null; + } + + if ($n !== $this->currentRow && isset($this->customResultObject[$className][$n])) { + $this->currentRow = $n; + } + + return $this->customResultObject[$className][$this->currentRow]; + } + + /** + * Returns a single row from the results as an array. + * + * If row doesn't exist, returns null. + * + * @return mixed + */ + public function getRowArray(int $n = 0) + { + $result = $this->getResultArray(); + if (empty($result)) { + return null; + } + + if ($n !== $this->currentRow && isset($result[$n])) { + $this->currentRow = $n; + } + + return $result[$this->currentRow]; + } + + /** + * Returns a single row from the results as an object. + * + * If row doesn't exist, returns null. + * + * @return mixed + */ + public function getRowObject(int $n = 0) + { + $result = $this->getResultObject(); + if (empty($result)) { + return null; + } + + if ($n !== $this->customResultObject && isset($result[$n])) { + $this->currentRow = $n; + } + + return $result[$this->currentRow]; + } + + /** + * Assigns an item into a particular column slot. + * + * @param mixed $key + * @param mixed $value + * + * @return mixed + */ + public function setRow($key, $value = null) + { + // We cache the row data for subsequent uses + if (! is_array($this->rowData)) { + $this->rowData = $this->getRowArray(); + } + + if (is_array($key)) { + foreach ($key as $k => $v) { + $this->rowData[$k] = $v; + } + + return; + } + + if ($key !== '' && $value !== null) { + $this->rowData[$key] = $value; + } + } + + /** + * Returns the "first" row of the current results. + * + * @return mixed + */ + public function getFirstRow(string $type = 'object') + { + $result = $this->getResult($type); + + return (empty($result)) ? null : $result[0]; + } + + /** + * Returns the "last" row of the current results. + * + * @return mixed + */ + public function getLastRow(string $type = 'object') + { + $result = $this->getResult($type); + + return (empty($result)) ? null : $result[count($result) - 1]; + } + + /** + * Returns the "next" row of the current results. + * + * @return mixed + */ + public function getNextRow(string $type = 'object') + { + $result = $this->getResult($type); + if (empty($result)) { + return null; + } + + return isset($result[$this->currentRow + 1]) ? $result[++$this->currentRow] : null; + } + + /** + * Returns the "previous" row of the current results. + * + * @return mixed + */ + public function getPreviousRow(string $type = 'object') + { + $result = $this->getResult($type); + if (empty($result)) { + return null; + } + + if (isset($result[$this->currentRow - 1])) { + $this->currentRow--; + } + + return $result[$this->currentRow]; + } + + /** + * Returns an unbuffered row and move the pointer to the next row. + * + * @return mixed + */ + public function getUnbufferedRow(string $type = 'object') + { + if ($type === 'array') { + return $this->fetchAssoc(); + } + + if ($type === 'object') { + return $this->fetchObject(); + } + + return $this->fetchObject($type); + } + + /** + * Number of rows in the result set; checks for previous count, falls + * back on counting resultArray or resultObject, finally fetching resultArray + * if nothing was previously fetched + */ + public function getNumRows(): int + { + if (is_int($this->numRows)) { + return $this->numRows; + } + if ($this->resultArray !== []) { + return $this->numRows = count($this->resultArray); + } + if ($this->resultObject !== []) { + return $this->numRows = count($this->resultObject); + } + + return $this->numRows = count($this->getResultArray()); + } + + /** + * Gets the number of fields in the result set. + */ + abstract public function getFieldCount(): int; + + /** + * Generates an array of column names in the result set. + */ + abstract public function getFieldNames(): array; + + /** + * Generates an array of objects representing field meta-data. + */ + abstract public function getFieldData(): array; + + /** + * Frees the current result. + */ + abstract public function freeResult(); + + /** + * Moves the internal pointer to the desired offset. This is called + * internally before fetching results to make sure the result set + * starts at zero. + * + * @return mixed + */ + abstract public function dataSeek(int $n = 0); + + /** + * Returns the result set as an array. + * + * Overridden by driver classes. + * + * @return mixed + */ + abstract protected function fetchAssoc(); + + /** + * Returns the result set as an object. + * + * Overridden by child classes. + * + * @return object + */ + abstract protected function fetchObject(string $className = 'stdClass'); +} diff --git a/system/Database/BaseUtils.php b/system/Database/BaseUtils.php new file mode 100644 index 0000000..7848ae7 --- /dev/null +++ b/system/Database/BaseUtils.php @@ -0,0 +1,321 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Database; + +use CodeIgniter\Database\Exceptions\DatabaseException; + +/** + * Class BaseUtils + */ +abstract class BaseUtils +{ + /** + * Database object + * + * @var object + */ + protected $db; + + /** + * List databases statement + * + * @var bool|string + */ + protected $listDatabases = false; + + /** + * OPTIMIZE TABLE statement + * + * @var bool|string + */ + protected $optimizeTable = false; + + /** + * REPAIR TABLE statement + * + * @var bool|string + */ + protected $repairTable = false; + + /** + * Class constructor + */ + public function __construct(ConnectionInterface &$db) + { + $this->db = &$db; + } + + /** + * List databases + * + * @throws DatabaseException + * + * @return array|bool + */ + public function listDatabases() + { + // Is there a cached result? + if (isset($this->db->dataCache['db_names'])) { + return $this->db->dataCache['db_names']; + } + + if ($this->listDatabases === false) { + if ($this->db->DBDebug) { + throw new DatabaseException('Unsupported feature of the database platform you are using.'); + } + + return false; + } + + $this->db->dataCache['db_names'] = []; + + $query = $this->db->query($this->listDatabases); + if ($query === false) { + return $this->db->dataCache['db_names']; + } + + for ($i = 0, $query = $query->getResultArray(), $c = count($query); $i < $c; $i++) { + $this->db->dataCache['db_names'][] = current($query[$i]); + } + + return $this->db->dataCache['db_names']; + } + + /** + * Determine if a particular database exists + */ + public function databaseExists(string $databaseName): bool + { + return in_array($databaseName, $this->listDatabases(), true); + } + + /** + * Optimize Table + * + * @throws DatabaseException + * + * @return bool + */ + public function optimizeTable(string $tableName) + { + if ($this->optimizeTable === false) { + if ($this->db->DBDebug) { + throw new DatabaseException('Unsupported feature of the database platform you are using.'); + } + + return false; + } + + $query = $this->db->query(sprintf($this->optimizeTable, $this->db->escapeIdentifiers($tableName))); + + return $query !== false; + } + + /** + * Optimize Database + * + * @throws DatabaseException + * + * @return mixed + */ + public function optimizeDatabase() + { + if ($this->optimizeTable === false) { + if ($this->db->DBDebug) { + throw new DatabaseException('Unsupported feature of the database platform you are using.'); + } + + return false; + } + + $result = []; + + foreach ($this->db->listTables() as $tableName) { + $res = $this->db->query(sprintf($this->optimizeTable, $this->db->escapeIdentifiers($tableName))); + if (is_bool($res)) { + return $res; + } + + // Build the result array... + + $res = $res->getResultArray(); + + // Postgre & SQLite3 returns empty array + if (empty($res)) { + $key = $tableName; + } else { + $res = current($res); + $key = str_replace($this->db->database . '.', '', current($res)); + $keys = array_keys($res); + unset($res[$keys[0]]); + } + + $result[$key] = $res; + } + + return $result; + } + + /** + * Repair Table + * + * @throws DatabaseException + * + * @return mixed + */ + public function repairTable(string $tableName) + { + if ($this->repairTable === false) { + if ($this->db->DBDebug) { + throw new DatabaseException('Unsupported feature of the database platform you are using.'); + } + + return false; + } + + $query = $this->db->query(sprintf($this->repairTable, $this->db->escapeIdentifiers($tableName))); + if (is_bool($query)) { + return $query; + } + + $query = $query->getResultArray(); + + return current($query); + } + + /** + * Generate CSV from a query result object + * + * @return string + */ + public function getCSVFromResult(ResultInterface $query, string $delim = ',', string $newline = "\n", string $enclosure = '"') + { + $out = ''; + + foreach ($query->getFieldNames() as $name) { + $out .= $enclosure . str_replace($enclosure, $enclosure . $enclosure, $name) . $enclosure . $delim; + } + + $out = substr($out, 0, -strlen($delim)) . $newline; + + // Next blast through the result array and build out the rows + while ($row = $query->getUnbufferedRow('array')) { + $line = []; + + foreach ($row as $item) { + $line[] = $enclosure . str_replace($enclosure, $enclosure . $enclosure, $item ?? '') . $enclosure; + } + + $out .= implode($delim, $line) . $newline; + } + + return $out; + } + + /** + * Generate XML data from a query result object + */ + public function getXMLFromResult(ResultInterface $query, array $params = []): string + { + foreach (['root' => 'root', 'element' => 'element', 'newline' => "\n", 'tab' => "\t"] as $key => $val) { + if (! isset($params[$key])) { + $params[$key] = $val; + } + } + + $root = $params['root']; + $newline = $params['newline']; + $tab = $params['tab']; + $element = $params['element']; + + helper('xml'); + $xml = '<' . $root . '>' . $newline; + + while ($row = $query->getUnbufferedRow()) { + $xml .= $tab . '<' . $element . '>' . $newline; + + foreach ($row as $key => $val) { + $val = (! empty($val)) ? xml_convert($val) : ''; + + $xml .= $tab . $tab . '<' . $key . '>' . $val . '' . $newline; + } + + $xml .= $tab . '' . $newline; + } + + return $xml . '' . $newline; + } + + /** + * Database Backup + * + * @param array|string $params + * + * @throws DatabaseException + * + * @return mixed + */ + public function backup($params = []) + { + if (is_string($params)) { + $params = ['tables' => $params]; + } + + $prefs = [ + 'tables' => [], + 'ignore' => [], + 'filename' => '', + 'format' => 'gzip', // gzip, txt + 'add_drop' => true, + 'add_insert' => true, + 'newline' => "\n", + 'foreign_key_checks' => true, + ]; + + if (! empty($params)) { + foreach (array_keys($prefs) as $key) { + if (isset($params[$key])) { + $prefs[$key] = $params[$key]; + } + } + } + + if (empty($prefs['tables'])) { + $prefs['tables'] = $this->db->listTables(); + } + + if (! in_array($prefs['format'], ['gzip', 'txt'], true)) { + $prefs['format'] = 'txt'; + } + + if ($prefs['format'] === 'gzip' && ! function_exists('gzencode')) { + if ($this->db->DBDebug) { + throw new DatabaseException('The file compression format you chose is not supported by your server.'); + } + + $prefs['format'] = 'txt'; + } + + if ($prefs['format'] === 'txt') { + return $this->_backup($prefs); + } + + return gzencode($this->_backup($prefs)); + } + + /** + * Platform dependent version of the backup function. + * + * @return mixed + */ + abstract public function _backup(?array $prefs = null); +} diff --git a/system/Database/Config.php b/system/Database/Config.php new file mode 100644 index 0000000..6d2e82b --- /dev/null +++ b/system/Database/Config.php @@ -0,0 +1,145 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Database; + +use CodeIgniter\Config\BaseConfig; +use InvalidArgumentException; + +/** + * Class Config + */ +class Config extends BaseConfig +{ + /** + * Cache for instance of any connections that + * have been requested as a "shared" instance. + * + * @var array + */ + protected static $instances = []; + + /** + * The main instance used to manage all of + * our open database connections. + * + * @var Database|null + */ + protected static $factory; + + /** + * Creates the default + * + * @param array|string $group The name of the connection group to use, or an array of configuration settings. + * @param bool $getShared Whether to return a shared instance of the connection. + * + * @return BaseConnection + */ + public static function connect($group = null, bool $getShared = true) + { + // If a DB connection is passed in, just pass it back + if ($group instanceof BaseConnection) { + return $group; + } + + if (is_array($group)) { + $config = $group; + $group = 'custom-' . md5(json_encode($config)); + } + + $config = $config ?? config('Database'); + + if (empty($group)) { + $group = ENVIRONMENT === 'testing' ? 'tests' : $config->defaultGroup; + } + + if (is_string($group) && ! isset($config->{$group}) && strpos($group, 'custom-') !== 0) { + throw new InvalidArgumentException($group . ' is not a valid database connection group.'); + } + + if ($getShared && isset(static::$instances[$group])) { + return static::$instances[$group]; + } + + static::ensureFactory(); + + if (isset($config->{$group})) { + $config = $config->{$group}; + } + + $connection = static::$factory->load($config, $group); + + static::$instances[$group] = &$connection; + + return $connection; + } + + /** + * Returns an array of all db connections currently made. + */ + public static function getConnections(): array + { + return static::$instances; + } + + /** + * Loads and returns an instance of the Forge for the specified + * database group, and loads the group if it hasn't been loaded yet. + * + * @param array|ConnectionInterface|string|null $group + * + * @return Forge + */ + public static function forge($group = null) + { + $db = static::connect($group); + + return static::$factory->loadForge($db); + } + + /** + * Returns a new instance of the Database Utilities class. + * + * @param array|string|null $group + * + * @return BaseUtils + */ + public static function utils($group = null) + { + $db = static::connect($group); + + return static::$factory->loadUtils($db); + } + + /** + * Returns a new instance of the Database Seeder. + * + * @return Seeder + */ + public static function seeder(?string $group = null) + { + $config = config('Database'); + + return new Seeder($config, static::connect($group)); + } + + /** + * Ensures the database Connection Manager/Factory is loaded and ready to use. + */ + protected static function ensureFactory() + { + if (static::$factory instanceof Database) { + return; + } + + static::$factory = new Database(); + } +} diff --git a/system/Database/ConnectionInterface.php b/system/Database/ConnectionInterface.php new file mode 100644 index 0000000..a937800 --- /dev/null +++ b/system/Database/ConnectionInterface.php @@ -0,0 +1,156 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Database; + +/** + * Interface ConnectionInterface + */ +interface ConnectionInterface +{ + /** + * Initializes the database connection/settings. + * + * @return mixed + */ + public function initialize(); + + /** + * Connect to the database. + * + * @return mixed + */ + public function connect(bool $persistent = false); + + /** + * Create a persistent database connection. + * + * @return mixed + */ + public function persistentConnect(); + + /** + * Keep or establish the connection if no queries have been sent for + * a length of time exceeding the server's idle timeout. + * + * @return mixed + */ + public function reconnect(); + + /** + * Returns the actual connection object. If both a 'read' and 'write' + * connection has been specified, you can pass either term in to + * get that connection. If you pass either alias in and only a single + * connection is present, it must return the sole connection. + * + * @return mixed + */ + public function getConnection(?string $alias = null); + + /** + * Select a specific database table to use. + * + * @return mixed + */ + public function setDatabase(string $databaseName); + + /** + * Returns the name of the current database being used. + */ + public function getDatabase(): string; + + /** + * Returns the last error encountered by this connection. + * Must return this format: ['code' => string|int, 'message' => string] + * intval(code) === 0 means "no error". + * + * @return array + */ + public function error(): array; + + /** + * The name of the platform in use (MySQLi, mssql, etc) + */ + public function getPlatform(): string; + + /** + * Returns a string containing the version of the database being used. + */ + public function getVersion(): string; + + /** + * Orchestrates a query against the database. Queries must use + * Database\Statement objects to store the query and build it. + * This method works with the cache. + * + * Should automatically handle different connections for read/write + * queries if needed. + * + * @param mixed ...$binds + * + * @return BaseResult|bool|Query + */ + public function query(string $sql, $binds = null); + + /** + * Performs a basic query against the database. No binding or caching + * is performed, nor are transactions handled. Simply takes a raw + * query string and returns the database-specific result id. + * + * @return mixed + */ + public function simpleQuery(string $sql); + + /** + * Returns an instance of the query builder for this connection. + * + * @param array|string $tableName Table name. + * + * @return BaseBuilder Builder. + */ + public function table($tableName); + + /** + * Returns the last query's statement object. + * + * @return mixed + */ + public function getLastQuery(); + + /** + * "Smart" Escaping + * + * Escapes data based on type. + * Sets boolean and null types. + * + * @param mixed $str + * + * @return mixed + */ + public function escape($str); + + /** + * Allows for custom calls to the database engine that are not + * supported through our database layer. + * + * @param array ...$params + * + * @return mixed + */ + public function callFunction(string $functionName, ...$params); + + /** + * Determines if the statement is a write-type query or not. + * + * @param string $sql + */ + public function isWriteType($sql): bool; +} diff --git a/system/Database/Database.php b/system/Database/Database.php new file mode 100644 index 0000000..0d3c26c --- /dev/null +++ b/system/Database/Database.php @@ -0,0 +1,138 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Database; + +use InvalidArgumentException; + +/** + * Database Connection Factory + * + * Creates and returns an instance of the appropriate DatabaseConnection + */ +class Database +{ + /** + * Maintains an array of the instances of all connections that have + * been created. + * + * Helps to keep track of all open connections for performance + * monitoring, logging, etc. + * + * @var array + */ + protected $connections = []; + + /** + * Parses the connection binds and returns an instance of the driver + * ready to go. + * + * @throws InvalidArgumentException + * + * @return mixed + */ + public function load(array $params = [], string $alias = '') + { + if ($alias === '') { + throw new InvalidArgumentException('You must supply the parameter: alias.'); + } + + if (! empty($params['DSN']) && strpos($params['DSN'], '://') !== false) { + $params = $this->parseDSN($params); + } + + if (empty($params['DBDriver'])) { + throw new InvalidArgumentException('You have not selected a database type to connect to.'); + } + + $this->connections[$alias] = $this->initDriver($params['DBDriver'], 'Connection', $params); + + return $this->connections[$alias]; + } + + /** + * Creates a Forge instance for the current database type. + */ + public function loadForge(ConnectionInterface $db): object + { + if (! $db->connID) { + $db->initialize(); + } + + return $this->initDriver($db->DBDriver, 'Forge', $db); + } + + /** + * Creates a Utils instance for the current database type. + */ + public function loadUtils(ConnectionInterface $db): object + { + if (! $db->connID) { + $db->initialize(); + } + + return $this->initDriver($db->DBDriver, 'Utils', $db); + } + + /** + * Parse universal DSN string + * + * @throws InvalidArgumentException + */ + protected function parseDSN(array $params): array + { + $dsn = parse_url($params['DSN']); + + if (! $dsn) { + throw new InvalidArgumentException('Your DSN connection string is invalid.'); + } + + $dsnParams = [ + 'DSN' => '', + 'DBDriver' => $dsn['scheme'], + 'hostname' => isset($dsn['host']) ? rawurldecode($dsn['host']) : '', + 'port' => isset($dsn['port']) ? rawurldecode((string) $dsn['port']) : '', + 'username' => isset($dsn['user']) ? rawurldecode($dsn['user']) : '', + 'password' => isset($dsn['pass']) ? rawurldecode($dsn['pass']) : '', + 'database' => isset($dsn['path']) ? rawurldecode(substr($dsn['path'], 1)) : '', + ]; + + if (! empty($dsn['query'])) { + parse_str($dsn['query'], $extra); + + foreach ($extra as $key => $val) { + if (is_string($val) && in_array(strtolower($val), ['true', 'false', 'null'], true)) { + $val = $val === 'null' ? null : filter_var($val, FILTER_VALIDATE_BOOLEAN); + } + + $dsnParams[$key] = $val; + } + } + + return array_merge($params, $dsnParams); + } + + /** + * Initialize database driver. + * + * @param array|object $argument + */ + protected function initDriver(string $driver, string $class, $argument): object + { + $class = $driver . '\\' . $class; + + if (strpos($driver, '\\') === false) { + $class = "CodeIgniter\\Database\\{$class}"; + } + + return new $class($argument); + } +} diff --git a/system/Database/Exceptions/DataException.php b/system/Database/Exceptions/DataException.php new file mode 100644 index 0000000..09b9ff3 --- /dev/null +++ b/system/Database/Exceptions/DataException.php @@ -0,0 +1,85 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Database\Exceptions; + +use CodeIgniter\Exceptions\DebugTraceableTrait; +use RuntimeException; + +class DataException extends RuntimeException implements ExceptionInterface +{ + use DebugTraceableTrait; + + /** + * Used by the Model's trigger() method when the callback cannot be found. + * + * @return DataException + */ + public static function forInvalidMethodTriggered(string $method) + { + return new static(lang('Database.invalidEvent', [$method])); + } + + /** + * Used by Model's insert/update methods when there isn't + * any data to actually work with. + * + * @return DataException + */ + public static function forEmptyDataset(string $mode) + { + return new static(lang('Database.emptyDataset', [$mode])); + } + + /** + * Used by Model's insert/update methods when there is no + * primary key defined and Model has option `useAutoIncrement` + * set to false. + * + * @return DataException + */ + public static function forEmptyPrimaryKey(string $mode) + { + return new static(lang('Database.emptyPrimaryKey', [$mode])); + } + + /** + * Thrown when an argument for one of the Model's methods + * were empty or otherwise invalid, and they could not be + * to work correctly for that method. + * + * @return DataException + */ + public static function forInvalidArgument(string $argument) + { + return new static(lang('Database.invalidArgument', [$argument])); + } + + public static function forInvalidAllowedFields(string $model) + { + return new static(lang('Database.invalidAllowedFields', [$model])); + } + + public static function forTableNotFound(string $table) + { + return new static(lang('Database.tableNotFound', [$table])); + } + + public static function forEmptyInputGiven(string $argument) + { + return new static(lang('Database.forEmptyInputGiven', [$argument])); + } + + public static function forFindColumnHaveMultipleColumns() + { + return new static(lang('Database.forFindColumnHaveMultipleColumns')); + } +} diff --git a/system/Database/Exceptions/DatabaseException.php b/system/Database/Exceptions/DatabaseException.php new file mode 100644 index 0000000..a2b3b76 --- /dev/null +++ b/system/Database/Exceptions/DatabaseException.php @@ -0,0 +1,24 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Database\Exceptions; + +use Error; + +class DatabaseException extends Error implements ExceptionInterface +{ + /** + * Exit status code + * + * @var int + */ + protected $code = 8; +} diff --git a/system/Database/Exceptions/ExceptionInterface.php b/system/Database/Exceptions/ExceptionInterface.php new file mode 100644 index 0000000..8156523 --- /dev/null +++ b/system/Database/Exceptions/ExceptionInterface.php @@ -0,0 +1,22 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Database\Exceptions; + +/** + * Provides a domain-level interface for broad capture + * of all database-related exceptions. + * + * catch (\CodeIgniter\Database\Exceptions\ExceptionInterface) { ... } + */ +interface ExceptionInterface extends \CodeIgniter\Exceptions\ExceptionInterface +{ +} diff --git a/system/Database/Forge.php b/system/Database/Forge.php new file mode 100644 index 0000000..406f75b --- /dev/null +++ b/system/Database/Forge.php @@ -0,0 +1,1099 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Database; + +use CodeIgniter\Database\Exceptions\DatabaseException; +use InvalidArgumentException; +use RuntimeException; +use Throwable; + +/** + * The Forge class transforms migrations to executable + * SQL statements. + */ +class Forge +{ + /** + * The active database connection. + * + * @var BaseConnection + */ + protected $db; + + /** + * List of fields. + * + * @var array + */ + protected $fields = []; + + /** + * List of keys. + * + * @var array + */ + protected $keys = []; + + /** + * List of unique keys. + * + * @var array + */ + protected $uniqueKeys = []; + + /** + * List of primary keys. + * + * @var array + */ + protected $primaryKeys = []; + + /** + * List of foreign keys. + * + * @var array + */ + protected $foreignKeys = []; + + /** + * Character set used. + * + * @var string + */ + protected $charset = ''; + + /** + * CREATE DATABASE statement + * + * @var false|string + */ + protected $createDatabaseStr = 'CREATE DATABASE %s'; + + /** + * CREATE DATABASE IF statement + * + * @var string + */ + protected $createDatabaseIfStr; + + /** + * CHECK DATABASE EXIST statement + * + * @var string + */ + protected $checkDatabaseExistStr; + + /** + * DROP DATABASE statement + * + * @var false|string + */ + protected $dropDatabaseStr = 'DROP DATABASE %s'; + + /** + * CREATE TABLE statement + * + * @var string + */ + protected $createTableStr = "%s %s (%s\n)"; + + /** + * CREATE TABLE IF statement + * + * @var bool|string + */ + protected $createTableIfStr = 'CREATE TABLE IF NOT EXISTS'; + + /** + * CREATE TABLE keys flag + * + * Whether table keys are created from within the + * CREATE TABLE statement. + * + * @var bool + */ + protected $createTableKeys = false; + + /** + * DROP TABLE IF EXISTS statement + * + * @var bool|string + */ + protected $dropTableIfStr = 'DROP TABLE IF EXISTS'; + + /** + * RENAME TABLE statement + * + * @var false|string + */ + protected $renameTableStr = 'ALTER TABLE %s RENAME TO %s'; + + /** + * UNSIGNED support + * + * @var array|bool + */ + protected $unsigned = true; + + /** + * NULL value representation in CREATE/ALTER TABLE statements + * + * @var string + * + * @internal Used for marking nullable fields. Not covered by BC promise. + */ + protected $null = ''; + + /** + * DEFAULT value representation in CREATE/ALTER TABLE statements + * + * @var false|string + */ + protected $default = ' DEFAULT '; + + /** + * DROP CONSTRAINT statement + * + * @var string + */ + protected $dropConstraintStr; + + /** + * DROP INDEX statement + * + * @var string + */ + protected $dropIndexStr = 'DROP INDEX %s ON %s'; + + /** + * Constructor. + */ + public function __construct(BaseConnection $db) + { + $this->db = &$db; + } + + /** + * Provides access to the forge's current database connection. + * + * @return ConnectionInterface + */ + public function getConnection() + { + return $this->db; + } + + /** + * Create database + * + * @param bool $ifNotExists Whether to add IF NOT EXISTS condition + * + * @throws DatabaseException + */ + public function createDatabase(string $dbName, bool $ifNotExists = false): bool + { + if ($ifNotExists && $this->createDatabaseIfStr === null) { + if ($this->databaseExists($dbName)) { + return true; + } + + $ifNotExists = false; + } + + if ($this->createDatabaseStr === false) { + if ($this->db->DBDebug) { + throw new DatabaseException('This feature is not available for the database you are using.'); + } + + return false; // @codeCoverageIgnore + } + + try { + if (! $this->db->query(sprintf($ifNotExists ? $this->createDatabaseIfStr : $this->createDatabaseStr, $dbName, $this->db->charset, $this->db->DBCollat))) { + // @codeCoverageIgnoreStart + if ($this->db->DBDebug) { + throw new DatabaseException('Unable to create the specified database.'); + } + + return false; + // @codeCoverageIgnoreEnd + } + + if (! empty($this->db->dataCache['db_names'])) { + $this->db->dataCache['db_names'][] = $dbName; + } + + return true; + } catch (Throwable $e) { + if ($this->db->DBDebug) { + throw new DatabaseException('Unable to create the specified database.', 0, $e); + } + + return false; // @codeCoverageIgnore + } + } + + /** + * Determine if a database exists + * + * @throws DatabaseException + */ + private function databaseExists(string $dbName): bool + { + if ($this->checkDatabaseExistStr === null) { + if ($this->db->DBDebug) { + throw new DatabaseException('This feature is not available for the database you are using.'); + } + + return false; + } + + return $this->db->query($this->checkDatabaseExistStr, $dbName)->getRow() !== null; + } + + /** + * Drop database + * + * @throws DatabaseException + */ + public function dropDatabase(string $dbName): bool + { + if ($this->dropDatabaseStr === false) { + if ($this->db->DBDebug) { + throw new DatabaseException('This feature is not available for the database you are using.'); + } + + return false; + } + + if (! $this->db->query(sprintf($this->dropDatabaseStr, $dbName))) { + if ($this->db->DBDebug) { + throw new DatabaseException('Unable to drop the specified database.'); + } + + return false; + } + + if (! empty($this->db->dataCache['db_names'])) { + $key = array_search(strtolower($dbName), array_map('strtolower', $this->db->dataCache['db_names']), true); + if ($key !== false) { + unset($this->db->dataCache['db_names'][$key]); + } + } + + return true; + } + + /** + * Add Key + * + * @param array|string $key + * + * @return Forge + */ + public function addKey($key, bool $primary = false, bool $unique = false) + { + if ($primary) { + foreach ((array) $key as $one) { + $this->primaryKeys[] = $one; + } + } else { + $this->keys[] = $key; + + if ($unique) { + $this->uniqueKeys[] = count($this->keys) - 1; + } + } + + return $this; + } + + /** + * Add Primary Key + * + * @param array|string $key + * + * @return Forge + */ + public function addPrimaryKey($key) + { + return $this->addKey($key, true); + } + + /** + * Add Unique Key + * + * @param array|string $key + * + * @return Forge + */ + public function addUniqueKey($key) + { + return $this->addKey($key, false, true); + } + + /** + * Add Field + * + * @param array|string $field + * + * @return Forge + */ + public function addField($field) + { + if (is_string($field)) { + if ($field === 'id') { + $this->addField([ + 'id' => [ + 'type' => 'INT', + 'constraint' => 9, + 'auto_increment' => true, + ], + ]); + $this->addKey('id', true); + } else { + if (strpos($field, ' ') === false) { + throw new InvalidArgumentException('Field information is required for that operation.'); + } + + $fieldName = explode(' ', $field, 2)[0]; + $fieldName = trim($fieldName, '`\'"'); + + $this->fields[$fieldName] = $field; + } + } + + if (is_array($field)) { + foreach ($field as $idx => $f) { + if (is_string($f)) { + $this->addField($f); + + continue; + } + + if (is_array($f)) { + $this->fields = array_merge($this->fields, [$idx => $f]); + } + } + } + + return $this; + } + + /** + * Add Foreign Key + * + * @param string|string[] $fieldName + * @param string|string[] $tableField + * + * @throws DatabaseException + * + * @return Forge + */ + public function addForeignKey($fieldName = '', string $tableName = '', $tableField = '', string $onUpdate = '', string $onDelete = '') + { + $fieldName = (array) $fieldName; + $tableField = (array) $tableField; + $errorNames = []; + + foreach ($fieldName as $name) { + if (! isset($this->fields[$name])) { + $errorNames[] = $name; + } + } + + if ($errorNames !== []) { + $errorNames[0] = implode(', ', $errorNames); + + throw new DatabaseException(lang('Database.fieldNotExists', $errorNames)); + } + + $this->foreignKeys[] = [ + 'field' => $fieldName, + 'referenceTable' => $tableName, + 'referenceField' => $tableField, + 'onDelete' => strtoupper($onDelete), + 'onUpdate' => strtoupper($onUpdate), + ]; + + return $this; + } + + /** + * Drop Key + * + * @throws DatabaseException + * + * @return bool + */ + public function dropKey(string $table, string $keyName) + { + $sql = sprintf( + $this->dropIndexStr, + $this->db->escapeIdentifiers($this->db->DBPrefix . $keyName), + $this->db->escapeIdentifiers($this->db->DBPrefix . $table), + ); + + if ($sql === '') { + if ($this->db->DBDebug) { + throw new DatabaseException('This feature is not available for the database you are using.'); + } + + return false; + } + + return $this->db->query($sql); + } + + /** + * @throws DatabaseException + * + * @return BaseResult|bool|false|mixed|Query + */ + public function dropForeignKey(string $table, string $foreignName) + { + $sql = sprintf( + (string) $this->dropConstraintStr, + $this->db->escapeIdentifiers($this->db->DBPrefix . $table), + $this->db->escapeIdentifiers($this->db->DBPrefix . $foreignName) + ); + + if ($sql === '') { + if ($this->db->DBDebug) { + throw new DatabaseException('This feature is not available for the database you are using.'); + } + + return false; + } + + return $this->db->query($sql); + } + + /** + * @throws DatabaseException + * + * @return mixed + */ + public function createTable(string $table, bool $ifNotExists = false, array $attributes = []) + { + if ($table === '') { + throw new InvalidArgumentException('A table name is required for that operation.'); + } + + $table = $this->db->DBPrefix . $table; + + if ($this->fields === []) { + throw new RuntimeException('Field information is required.'); + } + + $sql = $this->_createTable($table, $ifNotExists, $attributes); + + if (is_bool($sql)) { + $this->reset(); + if ($sql === false) { + if ($this->db->DBDebug) { + throw new DatabaseException('This feature is not available for the database you are using.'); + } + + return false; + } + + return true; + } + + if (($result = $this->db->query($sql)) !== false) { + if (isset($this->db->dataCache['table_names']) && ! in_array($table, $this->db->dataCache['table_names'], true)) { + $this->db->dataCache['table_names'][] = $table; + } + + // Most databases don't support creating indexes from within the CREATE TABLE statement + if (! empty($this->keys)) { + for ($i = 0, $sqls = $this->_processIndexes($table), $c = count($sqls); $i < $c; $i++) { + $this->db->query($sqls[$i]); + } + } + } + + $this->reset(); + + return $result; + } + + /** + * @return bool|string + */ + protected function _createTable(string $table, bool $ifNotExists, array $attributes) + { + // For any platforms that don't support Create If Not Exists... + if ($ifNotExists === true && $this->createTableIfStr === false) { + if ($this->db->tableExists($table)) { + return true; + } + + $ifNotExists = false; + } + + $sql = ($ifNotExists) ? sprintf($this->createTableIfStr, $this->db->escapeIdentifiers($table)) + : 'CREATE TABLE'; + + $columns = $this->_processFields(true); + + for ($i = 0, $c = count($columns); $i < $c; $i++) { + $columns[$i] = ($columns[$i]['_literal'] !== false) ? "\n\t" . $columns[$i]['_literal'] + : "\n\t" . $this->_processColumn($columns[$i]); + } + + $columns = implode(',', $columns); + + $columns .= $this->_processPrimaryKeys($table); + $columns .= $this->_processForeignKeys($table); + + if ($this->createTableKeys === true) { + $indexes = $this->_processIndexes($table); + if (is_string($indexes)) { + $columns .= $indexes; + } + } + + return sprintf( + $this->createTableStr . '%s', + $sql, + $this->db->escapeIdentifiers($table), + $columns, + $this->_createTableAttributes($attributes) + ); + } + + protected function _createTableAttributes(array $attributes): string + { + $sql = ''; + + foreach (array_keys($attributes) as $key) { + if (is_string($key)) { + $sql .= ' ' . strtoupper($key) . ' ' . $this->db->escape($attributes[$key]); + } + } + + return $sql; + } + + /** + * @throws DatabaseException + * + * @return mixed + */ + public function dropTable(string $tableName, bool $ifExists = false, bool $cascade = false) + { + if ($tableName === '') { + if ($this->db->DBDebug) { + throw new DatabaseException('A table name is required for that operation.'); + } + + return false; + } + + if ($this->db->DBPrefix && strpos($tableName, $this->db->DBPrefix) === 0) { + $tableName = substr($tableName, strlen($this->db->DBPrefix)); + } + + if (($query = $this->_dropTable($this->db->DBPrefix . $tableName, $ifExists, $cascade)) === true) { + return true; + } + + $this->db->disableForeignKeyChecks(); + + $query = $this->db->query($query); + + $this->db->enableForeignKeyChecks(); + + if ($query && ! empty($this->db->dataCache['table_names'])) { + $key = array_search( + strtolower($this->db->DBPrefix . $tableName), + array_map('strtolower', $this->db->dataCache['table_names']), + true + ); + + if ($key !== false) { + unset($this->db->dataCache['table_names'][$key]); + } + } + + return $query; + } + + /** + * Generates a platform-specific DROP TABLE string + * + * @return bool|string + */ + protected function _dropTable(string $table, bool $ifExists, bool $cascade) + { + $sql = 'DROP TABLE'; + + if ($ifExists) { + if ($this->dropTableIfStr === false) { + if (! $this->db->tableExists($table)) { + return true; + } + } else { + $sql = sprintf($this->dropTableIfStr, $this->db->escapeIdentifiers($table)); + } + } + + return $sql . ' ' . $this->db->escapeIdentifiers($table); + } + + /** + * @throws DatabaseException + * + * @return mixed + */ + public function renameTable(string $tableName, string $newTableName) + { + if ($tableName === '' || $newTableName === '') { + throw new InvalidArgumentException('A table name is required for that operation.'); + } + + if ($this->renameTableStr === false) { + if ($this->db->DBDebug) { + throw new DatabaseException('This feature is not available for the database you are using.'); + } + + return false; + } + + $result = $this->db->query(sprintf( + $this->renameTableStr, + $this->db->escapeIdentifiers($this->db->DBPrefix . $tableName), + $this->db->escapeIdentifiers($this->db->DBPrefix . $newTableName) + )); + + if ($result && ! empty($this->db->dataCache['table_names'])) { + $key = array_search( + strtolower($this->db->DBPrefix . $tableName), + array_map('strtolower', $this->db->dataCache['table_names']), + true + ); + + if ($key !== false) { + $this->db->dataCache['table_names'][$key] = $this->db->DBPrefix . $newTableName; + } + } + + return $result; + } + + /** + * @param array|string $field + * + * @throws DatabaseException + */ + public function addColumn(string $table, $field): bool + { + // Work-around for literal column definitions + if (! is_array($field)) { + $field = [$field]; + } + + foreach (array_keys($field) as $k) { + $this->addField([$k => $field[$k]]); + } + + $sqls = $this->_alterTable('ADD', $this->db->DBPrefix . $table, $this->_processFields()); + $this->reset(); + if ($sqls === false) { + if ($this->db->DBDebug) { + throw new DatabaseException('This feature is not available for the database you are using.'); + } + + return false; + } + + foreach ($sqls as $sql) { + if ($this->db->query($sql) === false) { + return false; + } + } + + return true; + } + + /** + * @param array|string $columnName + * + * @throws DatabaseException + * + * @return mixed + */ + public function dropColumn(string $table, $columnName) + { + $sql = $this->_alterTable('DROP', $this->db->DBPrefix . $table, $columnName); + if ($sql === false) { + if ($this->db->DBDebug) { + throw new DatabaseException('This feature is not available for the database you are using.'); + } + + return false; + } + + return $this->db->query($sql); + } + + /** + * @param array|string $field + * + * @throws DatabaseException + */ + public function modifyColumn(string $table, $field): bool + { + // Work-around for literal column definitions + if (! is_array($field)) { + $field = [$field]; + } + + foreach (array_keys($field) as $k) { + $this->addField([$k => $field[$k]]); + } + + if ($this->fields === []) { + throw new RuntimeException('Field information is required'); + } + + $sqls = $this->_alterTable('CHANGE', $this->db->DBPrefix . $table, $this->_processFields()); + $this->reset(); + if ($sqls === false) { + if ($this->db->DBDebug) { + throw new DatabaseException('This feature is not available for the database you are using.'); + } + + return false; + } + + if ($sqls !== null) { + foreach ($sqls as $sql) { + if ($this->db->query($sql) === false) { + return false; + } + } + } + + return true; + } + + /** + * @param mixed $fields + * + * @return false|string|string[] + */ + protected function _alterTable(string $alterType, string $table, $fields) + { + $sql = 'ALTER TABLE ' . $this->db->escapeIdentifiers($table) . ' '; + + // DROP has everything it needs now. + if ($alterType === 'DROP') { + if (is_string($fields)) { + $fields = explode(',', $fields); + } + + $fields = array_map(function ($field) { + return 'DROP COLUMN ' . $this->db->escapeIdentifiers(trim($field)); + }, $fields); + + return $sql . implode(', ', $fields); + } + + $sql .= ($alterType === 'ADD') ? 'ADD ' : $alterType . ' COLUMN '; + + $sqls = []; + + foreach ($fields as $data) { + $sqls[] = $sql . ($data['_literal'] !== false + ? $data['_literal'] + : $this->_processColumn($data)); + } + + return $sqls; + } + + /** + * Process fields + */ + protected function _processFields(bool $createTable = false): array + { + $fields = []; + + foreach ($this->fields as $key => $attributes) { + if (! is_array($attributes)) { + $fields[] = ['_literal' => $attributes]; + + continue; + } + + $attributes = array_change_key_case($attributes, CASE_UPPER); + + if ($createTable === true && empty($attributes['TYPE'])) { + continue; + } + + if (isset($attributes['TYPE'])) { + $this->_attributeType($attributes); + } + + $field = [ + 'name' => $key, + 'new_name' => $attributes['NAME'] ?? null, + 'type' => $attributes['TYPE'] ?? null, + 'length' => '', + 'unsigned' => '', + 'null' => '', + 'unique' => '', + 'default' => '', + 'auto_increment' => '', + '_literal' => false, + ]; + + if (isset($attributes['TYPE'])) { + $this->_attributeUnsigned($attributes, $field); + } + + if ($createTable === false) { + if (isset($attributes['AFTER'])) { + $field['after'] = $attributes['AFTER']; + } elseif (isset($attributes['FIRST'])) { + $field['first'] = (bool) $attributes['FIRST']; + } + } + + $this->_attributeDefault($attributes, $field); + + if (isset($attributes['NULL'])) { + if ($attributes['NULL'] === true) { + $field['null'] = empty($this->null) ? '' : ' ' . $this->null; + } else { + $field['null'] = ' NOT NULL'; + } + } elseif ($createTable === true) { + $field['null'] = ' NOT NULL'; + } + + $this->_attributeAutoIncrement($attributes, $field); + $this->_attributeUnique($attributes, $field); + + if (isset($attributes['COMMENT'])) { + $field['comment'] = $this->db->escape($attributes['COMMENT']); + } + + if (isset($attributes['TYPE']) && ! empty($attributes['CONSTRAINT'])) { + if (is_array($attributes['CONSTRAINT'])) { + $attributes['CONSTRAINT'] = $this->db->escape($attributes['CONSTRAINT']); + $attributes['CONSTRAINT'] = implode(',', $attributes['CONSTRAINT']); + } + + $field['length'] = '(' . $attributes['CONSTRAINT'] . ')'; + } + + $fields[] = $field; + } + + return $fields; + } + + /** + * Process column + */ + protected function _processColumn(array $field): string + { + return $this->db->escapeIdentifiers($field['name']) + . ' ' . $field['type'] . $field['length'] + . $field['unsigned'] + . $field['default'] + . $field['null'] + . $field['auto_increment'] + . $field['unique']; + } + + /** + * Performs a data type mapping between different databases. + */ + protected function _attributeType(array &$attributes) + { + // Usually overridden by drivers + } + + /** + * Depending on the unsigned property value: + * + * - TRUE will always set $field['unsigned'] to 'UNSIGNED' + * - FALSE will always set $field['unsigned'] to '' + * - array(TYPE) will set $field['unsigned'] to 'UNSIGNED', + * if $attributes['TYPE'] is found in the array + * - array(TYPE => UTYPE) will change $field['type'], + * from TYPE to UTYPE in case of a match + */ + protected function _attributeUnsigned(array &$attributes, array &$field) + { + if (empty($attributes['UNSIGNED']) || $attributes['UNSIGNED'] !== true) { + return; + } + + // Reset the attribute in order to avoid issues if we do type conversion + $attributes['UNSIGNED'] = false; + + if (is_array($this->unsigned)) { + foreach (array_keys($this->unsigned) as $key) { + if (is_int($key) && strcasecmp($attributes['TYPE'], $this->unsigned[$key]) === 0) { + $field['unsigned'] = ' UNSIGNED'; + + return; + } + + if (is_string($key) && strcasecmp($attributes['TYPE'], $key) === 0) { + $field['type'] = $key; + + return; + } + } + + return; + } + + $field['unsigned'] = ($this->unsigned === true) ? ' UNSIGNED' : ''; + } + + protected function _attributeDefault(array &$attributes, array &$field) + { + if ($this->default === false) { + return; + } + + if (array_key_exists('DEFAULT', $attributes)) { + if ($attributes['DEFAULT'] === null) { + $field['default'] = empty($this->null) ? '' : $this->default . $this->null; + + // Override the NULL attribute if that's our default + $attributes['NULL'] = true; + $field['null'] = empty($this->null) ? '' : ' ' . $this->null; + } else { + $field['default'] = $this->default . $this->db->escape($attributes['DEFAULT']); + } + } + } + + protected function _attributeUnique(array &$attributes, array &$field) + { + if (! empty($attributes['UNIQUE']) && $attributes['UNIQUE'] === true) { + $field['unique'] = ' UNIQUE'; + } + } + + protected function _attributeAutoIncrement(array &$attributes, array &$field) + { + if (! empty($attributes['AUTO_INCREMENT']) && $attributes['AUTO_INCREMENT'] === true + && stripos($field['type'], 'int') !== false + ) { + $field['auto_increment'] = ' AUTO_INCREMENT'; + } + } + + protected function _processPrimaryKeys(string $table): string + { + $sql = ''; + + for ($i = 0, $c = count($this->primaryKeys); $i < $c; $i++) { + if (! isset($this->fields[$this->primaryKeys[$i]])) { + unset($this->primaryKeys[$i]); + } + } + + if ($this->primaryKeys !== []) { + $sql .= ",\n\tCONSTRAINT " . $this->db->escapeIdentifiers('pk_' . $table) + . ' PRIMARY KEY(' . implode(', ', $this->db->escapeIdentifiers($this->primaryKeys)) . ')'; + } + + return $sql; + } + + protected function _processIndexes(string $table) + { + $sqls = []; + + for ($i = 0, $c = count($this->keys); $i < $c; $i++) { + $this->keys[$i] = (array) $this->keys[$i]; + + for ($i2 = 0, $c2 = count($this->keys[$i]); $i2 < $c2; $i2++) { + if (! isset($this->fields[$this->keys[$i][$i2]])) { + unset($this->keys[$i][$i2]); + } + } + + if (count($this->keys[$i]) <= 0) { + continue; + } + + if (in_array($i, $this->uniqueKeys, true)) { + $sqls[] = 'ALTER TABLE ' . $this->db->escapeIdentifiers($table) + . ' ADD CONSTRAINT ' . $this->db->escapeIdentifiers($table . '_' . implode('_', $this->keys[$i])) + . ' UNIQUE (' . implode(', ', $this->db->escapeIdentifiers($this->keys[$i])) . ')'; + + continue; + } + + $sqls[] = 'CREATE INDEX ' . $this->db->escapeIdentifiers($table . '_' . implode('_', $this->keys[$i])) + . ' ON ' . $this->db->escapeIdentifiers($table) + . ' (' . implode(', ', $this->db->escapeIdentifiers($this->keys[$i])) . ')'; + } + + return $sqls; + } + + protected function _processForeignKeys(string $table): string + { + $sql = ''; + + $allowActions = [ + 'CASCADE', + 'SET NULL', + 'NO ACTION', + 'RESTRICT', + 'SET DEFAULT', + ]; + + foreach ($this->foreignKeys as $fkey) { + $nameIndex = $table . '_' . implode('_', $fkey['field']) . '_foreign'; + $nameIndexFilled = $this->db->escapeIdentifiers($nameIndex); + $foreignKeyFilled = implode(', ', $this->db->escapeIdentifiers($fkey['field'])); + $referenceTableFilled = $this->db->escapeIdentifiers($this->db->DBPrefix . $fkey['referenceTable']); + $referenceFieldFilled = implode(', ', $this->db->escapeIdentifiers($fkey['referenceField'])); + + $formatSql = ",\n\tCONSTRAINT %s FOREIGN KEY (%s) REFERENCES %s(%s)"; + $sql .= sprintf($formatSql, $nameIndexFilled, $foreignKeyFilled, $referenceTableFilled, $referenceFieldFilled); + + if ($fkey['onDelete'] !== false && in_array($fkey['onDelete'], $allowActions, true)) { + $sql .= ' ON DELETE ' . $fkey['onDelete']; + } + + if ($fkey['onUpdate'] !== false && in_array($fkey['onUpdate'], $allowActions, true)) { + $sql .= ' ON UPDATE ' . $fkey['onUpdate']; + } + } + + return $sql; + } + + /** + * Resets table creation vars + */ + public function reset() + { + $this->fields = $this->keys = $this->uniqueKeys = $this->primaryKeys = $this->foreignKeys = []; + } +} diff --git a/system/Database/Migration.php b/system/Database/Migration.php new file mode 100644 index 0000000..6b1cf82 --- /dev/null +++ b/system/Database/Migration.php @@ -0,0 +1,73 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Database; + +use Config\Database; + +/** + * Class Migration + */ +abstract class Migration +{ + /** + * The name of the database group to use. + * + * @var string + */ + protected $DBGroup; + + /** + * Database Connection instance + * + * @var ConnectionInterface + */ + protected $db; + + /** + * Database Forge instance. + * + * @var Forge + */ + protected $forge; + + /** + * Constructor. + * + * @param Forge $forge + */ + public function __construct(?Forge $forge = null) + { + $this->forge = $forge ?? Database::forge($this->DBGroup ?? config('Database')->defaultGroup); + + $this->db = $this->forge->getConnection(); + } + + /** + * Returns the database group name this migration uses. + * + * @return string + */ + public function getDBGroup(): ?string + { + return $this->DBGroup; + } + + /** + * Perform a migration step. + */ + abstract public function up(); + + /** + * Revert a migration step. + */ + abstract public function down(); +} diff --git a/system/Database/MigrationRunner.php b/system/Database/MigrationRunner.php new file mode 100644 index 0000000..5176888 --- /dev/null +++ b/system/Database/MigrationRunner.php @@ -0,0 +1,867 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Database; + +use CodeIgniter\CLI\CLI; +use CodeIgniter\Events\Events; +use CodeIgniter\Exceptions\ConfigException; +use Config\Database; +use Config\Migrations as MigrationsConfig; +use Config\Services; +use RuntimeException; +use stdClass; + +/** + * Class MigrationRunner + */ +class MigrationRunner +{ + /** + * Whether or not migrations are allowed to run. + * + * @var bool + */ + protected $enabled = false; + + /** + * Name of table to store meta information + * + * @var string + */ + protected $table; + + /** + * The Namespace where migrations can be found. + * + * @var string|null + */ + protected $namespace; + + /** + * The database Group to migrate. + * + * @var string + */ + protected $group; + + /** + * The migration name. + * + * @var string + */ + protected $name; + + /** + * The pattern used to locate migration file versions. + * + * @var string + */ + protected $regex = '/^\d{4}[_-]?\d{2}[_-]?\d{2}[_-]?\d{6}_(\w+)$/'; + + /** + * The main database connection. Used to store + * migration information in. + * + * @var BaseConnection + */ + protected $db; + + /** + * If true, will continue instead of throwing + * exceptions. + * + * @var bool + */ + protected $silent = false; + + /** + * used to return messages for CLI. + * + * @var array + */ + protected $cliMessages = []; + + /** + * Tracks whether we have already ensured + * the table exists or not. + * + * @var bool + */ + protected $tableChecked = false; + + /** + * The full path to locate migration files. + * + * @var string + */ + protected $path; + + /** + * The database Group filter. + * + * @var string|null + */ + protected $groupFilter; + + /** + * Used to skip current migration. + * + * @var bool + */ + protected $groupSkip = false; + + /** + * Constructor. + * + * When passing in $db, you may pass any of the following to connect: + * - group name + * - existing connection instance + * - array of database configuration values + * + * @param array|ConnectionInterface|string|null $db + * + * @throws ConfigException + */ + public function __construct(MigrationsConfig $config, $db = null) + { + $this->enabled = $config->enabled ?? false; + $this->table = $config->table ?? 'migrations'; + + // Default name space is the app namespace + $this->namespace = APP_NAMESPACE; + + // get default database group + $config = config('Database'); + $this->group = $config->defaultGroup; + unset($config); + + // If no db connection passed in, use + // default database group. + $this->db = db_connect($db); + } + + /** + * Locate and run all new migrations + * + * @throws ConfigException + * @throws RuntimeException + * + * @return bool + */ + public function latest(?string $group = null) + { + if (! $this->enabled) { + throw ConfigException::forDisabledMigrations(); + } + + $this->ensureTable(); + + if ($group !== null) { + $this->groupFilter = $group; + $this->setGroup($group); + } + + $migrations = $this->findMigrations(); + + if (empty($migrations)) { + return true; + } + + foreach ($this->getHistory((string) $group) as $history) { + unset($migrations[$this->getObjectUid($history)]); + } + + $batch = $this->getLastBatch() + 1; + + foreach ($migrations as $migration) { + if ($this->migrate('up', $migration)) { + if ($this->groupSkip === true) { + $this->groupSkip = false; + + continue; + } + + $this->addHistory($migration, $batch); + } else { + $this->regress(-1); + + $message = lang('Migrations.generalFault'); + + if ($this->silent) { + $this->cliMessages[] = "\t" . CLI::color($message, 'red'); + + return false; + } + + throw new RuntimeException($message); + } + } + + $data = get_object_vars($this); + $data['method'] = 'latest'; + Events::trigger('migrate', $data); + + return true; + } + + /** + * Migrate down to a previous batch + * + * Calls each migration step required to get to the provided batch + * + * @param int $targetBatch Target batch number, or negative for a relative batch, 0 for all + * + * @throws ConfigException + * @throws RuntimeException + * + * @return mixed Current batch number on success, FALSE on failure or no migrations are found + */ + public function regress(int $targetBatch = 0, ?string $group = null) + { + if (! $this->enabled) { + throw ConfigException::forDisabledMigrations(); + } + + // Set database group if not null + if ($group !== null) { + $this->setGroup($group); + } + + $this->ensureTable(); + + $batches = $this->getBatches(); + + if ($targetBatch < 0) { + $targetBatch = $batches[count($batches) - 1 + $targetBatch] ?? 0; + } + + if (empty($batches) && $targetBatch === 0) { + return true; + } + + if ($targetBatch !== 0 && ! in_array($targetBatch, $batches, true)) { + $message = lang('Migrations.batchNotFound') . $targetBatch; + + if ($this->silent) { + $this->cliMessages[] = "\t" . CLI::color($message, 'red'); + + return false; + } + + throw new RuntimeException($message); + } + + $tmpNamespace = $this->namespace; + + $this->namespace = null; + $allMigrations = $this->findMigrations(); + + $migrations = []; + + while ($batch = array_pop($batches)) { + if ($batch <= $targetBatch) { + break; + } + + foreach ($this->getBatchHistory($batch, 'desc') as $history) { + $uid = $this->getObjectUid($history); + + if (! isset($allMigrations[$uid])) { + $message = lang('Migrations.gap') . ' ' . $history->version; + + if ($this->silent) { + $this->cliMessages[] = "\t" . CLI::color($message, 'red'); + + return false; + } + + throw new RuntimeException($message); + } + + $migration = $allMigrations[$uid]; + $migration->history = $history; + $migrations[] = $migration; + } + } + + foreach ($migrations as $migration) { + if ($this->migrate('down', $migration)) { + $this->removeHistory($migration->history); + } else { + $message = lang('Migrations.generalFault'); + + if ($this->silent) { + $this->cliMessages[] = "\t" . CLI::color($message, 'red'); + + return false; + } + + throw new RuntimeException($message); + } + } + + $data = get_object_vars($this); + $data['method'] = 'regress'; + Events::trigger('migrate', $data); + + $this->namespace = $tmpNamespace; + + return true; + } + + /** + * Migrate a single file regardless of order or batches. + * Method "up" or "down" determined by presence in history. + * NOTE: This is not recommended and provided mostly for testing. + * + * @param string $path Full path to a valid migration file + * @param string $path Namespace of the target migration + */ + public function force(string $path, string $namespace, ?string $group = null) + { + if (! $this->enabled) { + throw ConfigException::forDisabledMigrations(); + } + + $this->ensureTable(); + + if ($group !== null) { + $this->groupFilter = $group; + $this->setGroup($group); + } + + $migration = $this->migrationFromFile($path, $namespace); + if (empty($migration)) { + $message = lang('Migrations.notFound'); + + if ($this->silent) { + $this->cliMessages[] = "\t" . CLI::color($message, 'red'); + + return false; + } + + throw new RuntimeException($message); + } + + $method = 'up'; + $this->setNamespace($migration->namespace); + + foreach ($this->getHistory($this->group) as $history) { + if ($this->getObjectUid($history) === $migration->uid) { + $method = 'down'; + $migration->history = $history; + break; + } + } + + if ($method === 'up') { + $batch = $this->getLastBatch() + 1; + + if ($this->migrate('up', $migration) && $this->groupSkip === false) { + $this->addHistory($migration, $batch); + + return true; + } + + $this->groupSkip = false; + } elseif ($this->migrate('down', $migration)) { + $this->removeHistory($migration->history); + + return true; + } + + $message = lang('Migrations.generalFault'); + + if ($this->silent) { + $this->cliMessages[] = "\t" . CLI::color($message, 'red'); + + return false; + } + + throw new RuntimeException($message); + } + + /** + * Retrieves list of available migration scripts + * + * @return array List of all located migrations by their UID + */ + public function findMigrations(): array + { + $namespaces = $this->namespace ? [$this->namespace] : array_keys(Services::autoloader()->getNamespace()); + $migrations = []; + + foreach ($namespaces as $namespace) { + foreach ($this->findNamespaceMigrations($namespace) as $migration) { + $migrations[$migration->uid] = $migration; + } + } + + // Sort migrations ascending by their UID (version) + ksort($migrations); + + return $migrations; + } + + /** + * Retrieves a list of available migration scripts for one namespace + */ + public function findNamespaceMigrations(string $namespace): array + { + $migrations = []; + $locator = Services::locator(true); + + if (! empty($this->path)) { + helper('filesystem'); + $dir = rtrim($this->path, DIRECTORY_SEPARATOR) . '/'; + $files = get_filenames($dir, true); + } else { + $files = $locator->listNamespaceFiles($namespace, '/Database/Migrations/'); + } + + foreach ($files as $file) { + $file = empty($this->path) ? $file : $this->path . str_replace($this->path, '', $file); + + if ($migration = $this->migrationFromFile($file, $namespace)) { + $migrations[] = $migration; + } + } + + return $migrations; + } + + /** + * Create a migration object from a file path. + * + * @return false|object Returns the migration object, or false on failure + */ + protected function migrationFromFile(string $path, string $namespace) + { + if (substr($path, -4) !== '.php') { + return false; + } + + $name = basename($path, '.php'); + + if (! preg_match($this->regex, $name)) { + return false; + } + + $locator = Services::locator(true); + + $migration = new stdClass(); + + $migration->version = $this->getMigrationNumber($name); + $migration->name = $this->getMigrationName($name); + $migration->path = $path; + $migration->class = $locator->getClassname($path); + $migration->namespace = $namespace; + $migration->uid = $this->getObjectUid($migration); + + return $migration; + } + + /** + * Allows other scripts to modify on the fly as needed. + * + * @return MigrationRunner + */ + public function setNamespace(?string $namespace) + { + $this->namespace = $namespace; + + return $this; + } + + /** + * Allows other scripts to modify on the fly as needed. + * + * @return MigrationRunner + */ + public function setGroup(string $group) + { + $this->group = $group; + + return $this; + } + + /** + * @return MigrationRunner + */ + public function setName(string $name) + { + $this->name = $name; + + return $this; + } + + /** + * If $silent == true, then will not throw exceptions and will + * attempt to continue gracefully. + * + * @return MigrationRunner + */ + public function setSilent(bool $silent) + { + $this->silent = $silent; + + return $this; + } + + /** + * Extracts the migration number from a filename + */ + protected function getMigrationNumber(string $migration): string + { + preg_match('/^\d{4}[_-]?\d{2}[_-]?\d{2}[_-]?\d{6}/', $migration, $matches); + + return count($matches) ? $matches[0] : '0'; + } + + /** + * Extracts the migration class name from a filename + */ + protected function getMigrationName(string $migration): string + { + $parts = explode('_', $migration); + array_shift($parts); + + return implode('_', $parts); + } + + /** + * Uses the non-repeatable portions of a migration or history + * to create a sortable unique key + * + * @param object $object migration or $history + */ + public function getObjectUid($object): string + { + return preg_replace('/[^0-9]/', '', $object->version) . $object->class; + } + + /** + * Retrieves messages formatted for CLI output + */ + public function getCliMessages(): array + { + return $this->cliMessages; + } + + /** + * Clears any CLI messages. + * + * @return MigrationRunner + */ + public function clearCliMessages() + { + $this->cliMessages = []; + + return $this; + } + + /** + * Truncates the history table. + */ + public function clearHistory() + { + if ($this->db->tableExists($this->table)) { + $this->db->table($this->table)->truncate(); + } + } + + /** + * Add a history to the table. + * + * @param object $migration + */ + protected function addHistory($migration, int $batch) + { + $this->db->table($this->table)->insert([ + 'version' => $migration->version, + 'class' => $migration->class, + 'group' => $this->group, + 'namespace' => $migration->namespace, + 'time' => time(), + 'batch' => $batch, + ]); + + if (is_cli()) { + $this->cliMessages[] = sprintf( + "\t%s(%s) %s_%s", + CLI::color(lang('Migrations.added'), 'yellow'), + $migration->namespace, + $migration->version, + $migration->class + ); + } + } + + /** + * Removes a single history + * + * @param object $history + */ + protected function removeHistory($history) + { + $this->db->table($this->table)->where('id', $history->id)->delete(); + + if (is_cli()) { + $this->cliMessages[] = sprintf( + "\t%s(%s) %s_%s", + CLI::color(lang('Migrations.removed'), 'yellow'), + $history->namespace, + $history->version, + $history->class + ); + } + } + + /** + * Grabs the full migration history from the database for a group + */ + public function getHistory(string $group = 'default'): array + { + $this->ensureTable(); + + $builder = $this->db->table($this->table); + + // If group was specified then use it + if (! empty($group)) { + $builder->where('group', $group); + } + + // If a namespace was specified then use it + if ($this->namespace) { + $builder->where('namespace', $this->namespace); + } + + $query = $builder->orderBy('id', 'ASC')->get(); + + return ! empty($query) ? $query->getResultObject() : []; + } + + /** + * Returns the migration history for a single batch. + * + * @param string $order + */ + public function getBatchHistory(int $batch, $order = 'asc'): array + { + $this->ensureTable(); + + $query = $this->db->table($this->table) + ->where('batch', $batch) + ->orderBy('id', $order) + ->get(); + + return ! empty($query) ? $query->getResultObject() : []; + } + + /** + * Returns all the batches from the database history in order + */ + public function getBatches(): array + { + $this->ensureTable(); + + $batches = $this->db->table($this->table) + ->select('batch') + ->distinct() + ->orderBy('batch', 'asc') + ->get() + ->getResultArray(); + + return array_map('intval', array_column($batches, 'batch')); + } + + /** + * Returns the value of the last batch in the database. + */ + public function getLastBatch(): int + { + $this->ensureTable(); + + $batch = $this->db->table($this->table) + ->selectMax('batch') + ->get() + ->getResultObject(); + + $batch = is_array($batch) && count($batch) + ? end($batch)->batch + : 0; + + return (int) $batch; + } + + /** + * Returns the version number of the first migration for a batch. + * Mostly just for tests. + */ + public function getBatchStart(int $batch): string + { + if ($batch < 0) { + $batches = $this->getBatches(); + $batch = $batches[count($batches) - 1] ?? 0; + } + + $migration = $this->db->table($this->table) + ->where('batch', $batch) + ->orderBy('id', 'asc') + ->limit(1) + ->get() + ->getResultObject(); + + return count($migration) ? $migration[0]->version : '0'; + } + + /** + * Returns the version number of the last migration for a batch. + * Mostly just for tests. + */ + public function getBatchEnd(int $batch): string + { + if ($batch < 0) { + $batches = $this->getBatches(); + $batch = $batches[count($batches) - 1] ?? 0; + } + + $migration = $this->db->table($this->table) + ->where('batch', $batch) + ->orderBy('id', 'desc') + ->limit(1) + ->get() + ->getResultObject(); + + return count($migration) ? $migration[0]->version : 0; + } + + /** + * Ensures that we have created our migrations table + * in the database. + */ + public function ensureTable() + { + if ($this->tableChecked || $this->db->tableExists($this->table)) { + return; + } + + $forge = Database::forge($this->db); + + $forge->addField([ + 'id' => [ + 'type' => 'BIGINT', + 'constraint' => 20, + 'unsigned' => true, + 'auto_increment' => true, + ], + 'version' => [ + 'type' => 'VARCHAR', + 'constraint' => 255, + 'null' => false, + ], + 'class' => [ + 'type' => 'VARCHAR', + 'constraint' => 255, + 'null' => false, + ], + 'group' => [ + 'type' => 'VARCHAR', + 'constraint' => 255, + 'null' => false, + ], + 'namespace' => [ + 'type' => 'VARCHAR', + 'constraint' => 255, + 'null' => false, + ], + 'time' => [ + 'type' => 'INT', + 'constraint' => 11, + 'null' => false, + ], + 'batch' => [ + 'type' => 'INT', + 'constraint' => 11, + 'unsigned' => true, + 'null' => false, + ], + ]); + + $forge->addPrimaryKey('id'); + $forge->createTable($this->table, true); + + $this->tableChecked = true; + } + + /** + * Handles the actual running of a migration. + * + * @param string $direction "up" or "down" + * @param object $migration The migration to run + */ + protected function migrate($direction, $migration): bool + { + include_once $migration->path; + + $class = $migration->class; + $this->setName($migration->name); + + // Validate the migration file structure + if (! class_exists($class, false)) { + $message = sprintf(lang('Migrations.classNotFound'), $class); + + if ($this->silent) { + $this->cliMessages[] = "\t" . CLI::color($message, 'red'); + + return false; + } + + throw new RuntimeException($message); + } + + $instance = new $class(); + $group = $instance->getDBGroup() ?? config('Database')->defaultGroup; + + if (ENVIRONMENT !== 'testing' && $group === 'tests' && $this->groupFilter !== 'tests') { + // @codeCoverageIgnoreStart + $this->groupSkip = true; + + return true; + // @codeCoverageIgnoreEnd + } + + if ($direction === 'up' && $this->groupFilter !== null && $this->groupFilter !== $group) { + $this->groupSkip = true; + + return true; + } + + $this->setGroup($group); + + if (! is_callable([$instance, $direction])) { + $message = sprintf(lang('Migrations.missingMethod'), $direction); + + if ($this->silent) { + $this->cliMessages[] = "\t" . CLI::color($message, 'red'); + + return false; + } + + throw new RuntimeException($message); + } + + $instance->{$direction}(); + + return true; + } +} diff --git a/system/Database/ModelFactory.php b/system/Database/ModelFactory.php new file mode 100644 index 0000000..ae08812 --- /dev/null +++ b/system/Database/ModelFactory.php @@ -0,0 +1,52 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Database; + +use CodeIgniter\Config\Factories; + +/** + * Returns new or shared Model instances + * + * @deprecated Use CodeIgniter\Config\Factories::models() + * + * @codeCoverageIgnore + */ +class ModelFactory +{ + /** + * Creates new Model instances or returns a shared instance + * + * @return mixed + */ + public static function get(string $name, bool $getShared = true, ?ConnectionInterface $connection = null) + { + return Factories::models($name, ['getShared' => $getShared], $connection); + } + + /** + * Helper method for injecting mock instances while testing. + * + * @param object $instance + */ + public static function injectMock(string $name, $instance) + { + Factories::injectMock('models', $name, $instance); + } + + /** + * Resets the static arrays + */ + public static function reset() + { + Factories::reset('models'); + } +} diff --git a/system/Database/MySQLi/Builder.php b/system/Database/MySQLi/Builder.php new file mode 100644 index 0000000..abeb83f --- /dev/null +++ b/system/Database/MySQLi/Builder.php @@ -0,0 +1,56 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Database\MySQLi; + +use CodeIgniter\Database\BaseBuilder; + +/** + * Builder for MySQLi + */ +class Builder extends BaseBuilder +{ + /** + * Identifier escape character + * + * @var string + */ + protected $escapeChar = '`'; + + /** + * Specifies which sql statements + * support the ignore option. + * + * @var array + */ + protected $supportedIgnoreStatements = [ + 'update' => 'IGNORE', + 'insert' => 'IGNORE', + 'delete' => 'IGNORE', + ]; + + /** + * FROM tables + * + * Groups tables in FROM clauses if needed, so there is no confusion + * about operator precedence. + * + * Note: This is only used (and overridden) by MySQL. + */ + protected function _fromTables(): string + { + if (! empty($this->QBJoin) && count($this->QBFrom) > 1) { + return '(' . implode(', ', $this->QBFrom) . ')'; + } + + return implode(', ', $this->QBFrom); + } +} diff --git a/system/Database/MySQLi/Connection.php b/system/Database/MySQLi/Connection.php new file mode 100644 index 0000000..5badaf1 --- /dev/null +++ b/system/Database/MySQLi/Connection.php @@ -0,0 +1,605 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Database\MySQLi; + +use CodeIgniter\Database\BaseConnection; +use CodeIgniter\Database\Exceptions\DatabaseException; +use LogicException; +use MySQLi; +use mysqli_sql_exception; +use stdClass; +use Throwable; + +/** + * Connection for MySQLi + */ +class Connection extends BaseConnection +{ + /** + * Database driver + * + * @var string + */ + public $DBDriver = 'MySQLi'; + + /** + * DELETE hack flag + * + * Whether to use the MySQL "delete hack" which allows the number + * of affected rows to be shown. Uses a preg_replace when enabled, + * adding a bit more processing to all queries. + * + * @var bool + */ + public $deleteHack = true; + + /** + * Identifier escape character + * + * @var string + */ + public $escapeChar = '`'; + + /** + * MySQLi object + * + * Has to be preserved without being assigned to $conn_id. + * + * @var MySQLi + */ + public $mysqli; + + /** + * MySQLi constant + * + * For unbuffered queries use `MYSQLI_USE_RESULT`. + * + * Default mode for buffered queries uses `MYSQLI_STORE_RESULT`. + * + * @var int + */ + public $resultMode = MYSQLI_STORE_RESULT; + + /** + * Connect to the database. + * + * @throws DatabaseException + * + * @return mixed + */ + public function connect(bool $persistent = false) + { + // Do we have a socket path? + if ($this->hostname[0] === '/') { + $hostname = null; + $port = null; + $socket = $this->hostname; + } else { + $hostname = ($persistent === true) ? 'p:' . $this->hostname : $this->hostname; + $port = empty($this->port) ? null : $this->port; + $socket = ''; + } + + $clientFlags = ($this->compress === true) ? MYSQLI_CLIENT_COMPRESS : 0; + $this->mysqli = mysqli_init(); + + mysqli_report(MYSQLI_REPORT_ALL & ~MYSQLI_REPORT_INDEX); + + $this->mysqli->options(MYSQLI_OPT_CONNECT_TIMEOUT, 10); + + if (isset($this->strictOn)) { + if ($this->strictOn) { + $this->mysqli->options( + MYSQLI_INIT_COMMAND, + "SET SESSION sql_mode = CONCAT(@@sql_mode, ',', 'STRICT_ALL_TABLES')" + ); + } else { + $this->mysqli->options( + MYSQLI_INIT_COMMAND, + "SET SESSION sql_mode = REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE( + @@sql_mode, + 'STRICT_ALL_TABLES,', ''), + ',STRICT_ALL_TABLES', ''), + 'STRICT_ALL_TABLES', ''), + 'STRICT_TRANS_TABLES,', ''), + ',STRICT_TRANS_TABLES', ''), + 'STRICT_TRANS_TABLES', '')" + ); + } + } + + if (is_array($this->encrypt)) { + $ssl = []; + + if (! empty($this->encrypt['ssl_key'])) { + $ssl['key'] = $this->encrypt['ssl_key']; + } + if (! empty($this->encrypt['ssl_cert'])) { + $ssl['cert'] = $this->encrypt['ssl_cert']; + } + if (! empty($this->encrypt['ssl_ca'])) { + $ssl['ca'] = $this->encrypt['ssl_ca']; + } + if (! empty($this->encrypt['ssl_capath'])) { + $ssl['capath'] = $this->encrypt['ssl_capath']; + } + if (! empty($this->encrypt['ssl_cipher'])) { + $ssl['cipher'] = $this->encrypt['ssl_cipher']; + } + + if (! empty($ssl)) { + if (isset($this->encrypt['ssl_verify'])) { + if ($this->encrypt['ssl_verify']) { + if (defined('MYSQLI_OPT_SSL_VERIFY_SERVER_CERT')) { + $this->mysqli->options(MYSQLI_OPT_SSL_VERIFY_SERVER_CERT, 1); + } + } + // Apparently (when it exists), setting MYSQLI_OPT_SSL_VERIFY_SERVER_CERT + // to FALSE didn't do anything, so PHP 5.6.16 introduced yet another + // constant ... + // + // https://secure.php.net/ChangeLog-5.php#5.6.16 + // https://bugs.php.net/bug.php?id=68344 + elseif (defined('MYSQLI_CLIENT_SSL_DONT_VERIFY_SERVER_CERT') && version_compare($this->mysqli->client_info, 'mysqlnd 5.6', '>=')) { + $clientFlags += MYSQLI_CLIENT_SSL_DONT_VERIFY_SERVER_CERT; + } + } + + $this->mysqli->ssl_set( + $ssl['key'] ?? null, + $ssl['cert'] ?? null, + $ssl['ca'] ?? null, + $ssl['capath'] ?? null, + $ssl['cipher'] ?? null + ); + } + + $clientFlags += MYSQLI_CLIENT_SSL; + } + + try { + if ($this->mysqli->real_connect( + $hostname, + $this->username, + $this->password, + $this->database, + $port, + $socket, + $clientFlags + )) { + // Prior to version 5.7.3, MySQL silently downgrades to an unencrypted connection if SSL setup fails + if (($clientFlags & MYSQLI_CLIENT_SSL) && version_compare($this->mysqli->client_info, 'mysqlnd 5.7.3', '<=') + && empty($this->mysqli->query("SHOW STATUS LIKE 'ssl_cipher'")->fetch_object()->Value) + ) { + $this->mysqli->close(); + $message = 'MySQLi was configured for an SSL connection, but got an unencrypted connection instead!'; + log_message('error', $message); + + if ($this->DBDebug) { + throw new DatabaseException($message); + } + + return false; + } + + if (! $this->mysqli->set_charset($this->charset)) { + log_message('error', "Database: Unable to set the configured connection charset ('{$this->charset}')."); + + $this->mysqli->close(); + + if ($this->DBDebug) { + throw new DatabaseException('Unable to set client connection character set: ' . $this->charset); + } + + return false; + } + + return $this->mysqli; + } + } catch (Throwable $e) { + // Clean sensitive information from errors. + $msg = $e->getMessage(); + + $msg = str_replace($this->username, '****', $msg); + $msg = str_replace($this->password, '****', $msg); + + throw new DatabaseException($msg, $e->getCode(), $e); + } + + return false; + } + + /** + * Keep or establish the connection if no queries have been sent for + * a length of time exceeding the server's idle timeout. + */ + public function reconnect() + { + $this->close(); + $this->initialize(); + } + + /** + * Close the database connection. + */ + protected function _close() + { + $this->connID->close(); + } + + /** + * Select a specific database table to use. + */ + public function setDatabase(string $databaseName): bool + { + if ($databaseName === '') { + $databaseName = $this->database; + } + + if (empty($this->connID)) { + $this->initialize(); + } + + if ($this->connID->select_db($databaseName)) { + $this->database = $databaseName; + + return true; + } + + return false; + } + + /** + * Returns a string containing the version of the database being used. + */ + public function getVersion(): string + { + if (isset($this->dataCache['version'])) { + return $this->dataCache['version']; + } + + if (empty($this->mysqli)) { + $this->initialize(); + } + + return $this->dataCache['version'] = $this->mysqli->server_info; + } + + /** + * Executes the query against the database. + * + * @return mixed + */ + protected function execute(string $sql) + { + while ($this->connID->more_results()) { + $this->connID->next_result(); + if ($res = $this->connID->store_result()) { + $res->free(); + } + } + + try { + return $this->connID->query($this->prepQuery($sql), $this->resultMode); + } catch (mysqli_sql_exception $e) { + log_message('error', $e->getMessage()); + + if ($this->DBDebug) { + throw $e; + } + } + + return false; + } + + /** + * Prep the query. If needed, each database adapter can prep the query string + */ + protected function prepQuery(string $sql): string + { + // mysqli_affected_rows() returns 0 for "DELETE FROM TABLE" queries. This hack + // modifies the query so that it a proper number of affected rows is returned. + if ($this->deleteHack === true && preg_match('/^\s*DELETE\s+FROM\s+(\S+)\s*$/i', $sql)) { + return trim($sql) . ' WHERE 1=1'; + } + + return $sql; + } + + /** + * Returns the total number of rows affected by this query. + */ + public function affectedRows(): int + { + return $this->connID->affected_rows ?? 0; + } + + /** + * Platform-dependant string escape + */ + protected function _escapeString(string $str): string + { + if (! $this->connID) { + $this->initialize(); + } + + return $this->connID->real_escape_string($str); + } + + /** + * Escape Like String Direct + * There are a few instances where MySQLi queries cannot take the + * additional "ESCAPE x" parameter for specifying the escape character + * in "LIKE" strings, and this handles those directly with a backslash. + * + * @param string|string[] $str Input string + * + * @return string|string[] + */ + public function escapeLikeStringDirect($str) + { + if (is_array($str)) { + foreach ($str as $key => $val) { + $str[$key] = $this->escapeLikeStringDirect($val); + } + + return $str; + } + + $str = $this->_escapeString($str); + + // Escape LIKE condition wildcards + return str_replace( + [$this->likeEscapeChar, '%', '_'], + ['\\' . $this->likeEscapeChar, '\\' . '%', '\\' . '_'], + $str + ); + } + + /** + * Generates the SQL for listing tables in a platform-dependent manner. + * Uses escapeLikeStringDirect(). + */ + protected function _listTables(bool $prefixLimit = false): string + { + $sql = 'SHOW TABLES FROM ' . $this->escapeIdentifiers($this->database); + + if ($prefixLimit !== false && $this->DBPrefix !== '') { + return $sql . " LIKE '" . $this->escapeLikeStringDirect($this->DBPrefix) . "%'"; + } + + return $sql; + } + + /** + * Generates a platform-specific query string so that the column names can be fetched. + */ + protected function _listColumns(string $table = ''): string + { + return 'SHOW COLUMNS FROM ' . $this->protectIdentifiers($table, true, null, false); + } + + /** + * Returns an array of objects with field data + * + * @throws DatabaseException + * + * @return stdClass[] + */ + protected function _fieldData(string $table): array + { + $table = $this->protectIdentifiers($table, true, null, false); + + if (($query = $this->query('SHOW COLUMNS FROM ' . $table)) === false) { + throw new DatabaseException(lang('Database.failGetFieldData')); + } + $query = $query->getResultObject(); + + $retVal = []; + + for ($i = 0, $c = count($query); $i < $c; $i++) { + $retVal[$i] = new stdClass(); + $retVal[$i]->name = $query[$i]->Field; + + sscanf($query[$i]->Type, '%[a-z](%d)', $retVal[$i]->type, $retVal[$i]->max_length); + + $retVal[$i]->nullable = $query[$i]->Null === 'YES'; + $retVal[$i]->default = $query[$i]->Default; + $retVal[$i]->primary_key = (int) ($query[$i]->Key === 'PRI'); + } + + return $retVal; + } + + /** + * Returns an array of objects with index data + * + * @throws DatabaseException + * @throws LogicException + * + * @return stdClass[] + */ + protected function _indexData(string $table): array + { + $table = $this->protectIdentifiers($table, true, null, false); + + if (($query = $this->query('SHOW INDEX FROM ' . $table)) === false) { + throw new DatabaseException(lang('Database.failGetIndexData')); + } + + if (! $indexes = $query->getResultArray()) { + return []; + } + + $keys = []; + + foreach ($indexes as $index) { + if (empty($keys[$index['Key_name']])) { + $keys[$index['Key_name']] = new stdClass(); + $keys[$index['Key_name']]->name = $index['Key_name']; + + if ($index['Key_name'] === 'PRIMARY') { + $type = 'PRIMARY'; + } elseif ($index['Index_type'] === 'FULLTEXT') { + $type = 'FULLTEXT'; + } elseif ($index['Non_unique']) { + $type = $index['Index_type'] === 'SPATIAL' ? 'SPATIAL' : 'INDEX'; + } else { + $type = 'UNIQUE'; + } + + $keys[$index['Key_name']]->type = $type; + } + + $keys[$index['Key_name']]->fields[] = $index['Column_name']; + } + + return $keys; + } + + /** + * Returns an array of objects with Foreign key data + * + * @throws DatabaseException + * + * @return stdClass[] + */ + protected function _foreignKeyData(string $table): array + { + $sql = ' + SELECT + tc.CONSTRAINT_NAME, + tc.TABLE_NAME, + kcu.COLUMN_NAME, + rc.REFERENCED_TABLE_NAME, + kcu.REFERENCED_COLUMN_NAME + FROM information_schema.TABLE_CONSTRAINTS AS tc + INNER JOIN information_schema.REFERENTIAL_CONSTRAINTS AS rc + ON tc.CONSTRAINT_NAME = rc.CONSTRAINT_NAME + AND tc.CONSTRAINT_SCHEMA = rc.CONSTRAINT_SCHEMA + INNER JOIN information_schema.KEY_COLUMN_USAGE AS kcu + ON tc.CONSTRAINT_NAME = kcu.CONSTRAINT_NAME + AND tc.CONSTRAINT_SCHEMA = kcu.CONSTRAINT_SCHEMA + WHERE + tc.CONSTRAINT_TYPE = ' . $this->escape('FOREIGN KEY') . ' AND + tc.TABLE_SCHEMA = ' . $this->escape($this->database) . ' AND + tc.TABLE_NAME = ' . $this->escape($table); + + if (($query = $this->query($sql)) === false) { + throw new DatabaseException(lang('Database.failGetForeignKeyData')); + } + $query = $query->getResultObject(); + + $retVal = []; + + foreach ($query as $row) { + $obj = new stdClass(); + $obj->constraint_name = $row->CONSTRAINT_NAME; + $obj->table_name = $row->TABLE_NAME; + $obj->column_name = $row->COLUMN_NAME; + $obj->foreign_table_name = $row->REFERENCED_TABLE_NAME; + $obj->foreign_column_name = $row->REFERENCED_COLUMN_NAME; + + $retVal[] = $obj; + } + + return $retVal; + } + + /** + * Returns platform-specific SQL to disable foreign key checks. + * + * @return string + */ + protected function _disableForeignKeyChecks() + { + return 'SET FOREIGN_KEY_CHECKS=0'; + } + + /** + * Returns platform-specific SQL to enable foreign key checks. + * + * @return string + */ + protected function _enableForeignKeyChecks() + { + return 'SET FOREIGN_KEY_CHECKS=1'; + } + + /** + * Returns the last error code and message. + * Must return this format: ['code' => string|int, 'message' => string] + * intval(code) === 0 means "no error". + * + * @return array + */ + public function error(): array + { + if (! empty($this->mysqli->connect_errno)) { + return [ + 'code' => $this->mysqli->connect_errno, + 'message' => $this->mysqli->connect_error, + ]; + } + + return [ + 'code' => $this->connID->errno, + 'message' => $this->connID->error, + ]; + } + + /** + * Insert ID + */ + public function insertID(): int + { + return $this->connID->insert_id; + } + + /** + * Begin Transaction + */ + protected function _transBegin(): bool + { + $this->connID->autocommit(false); + + return $this->connID->begin_transaction(); + } + + /** + * Commit Transaction + */ + protected function _transCommit(): bool + { + if ($this->connID->commit()) { + $this->connID->autocommit(true); + + return true; + } + + return false; + } + + /** + * Rollback Transaction + */ + protected function _transRollback(): bool + { + if ($this->connID->rollback()) { + $this->connID->autocommit(true); + + return true; + } + + return false; + } +} diff --git a/system/Database/MySQLi/Forge.php b/system/Database/MySQLi/Forge.php new file mode 100644 index 0000000..d00c26d --- /dev/null +++ b/system/Database/MySQLi/Forge.php @@ -0,0 +1,239 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Database\MySQLi; + +use CodeIgniter\Database\Forge as BaseForge; + +/** + * Forge for MySQLi + */ +class Forge extends BaseForge +{ + /** + * CREATE DATABASE statement + * + * @var string + */ + protected $createDatabaseStr = 'CREATE DATABASE %s CHARACTER SET %s COLLATE %s'; + + /** + * CREATE DATABASE IF statement + * + * @var string + */ + protected $createDatabaseIfStr = 'CREATE DATABASE IF NOT EXISTS %s CHARACTER SET %s COLLATE %s'; + + /** + * DROP CONSTRAINT statement + * + * @var string + */ + protected $dropConstraintStr = 'ALTER TABLE %s DROP FOREIGN KEY %s'; + + /** + * CREATE TABLE keys flag + * + * Whether table keys are created from within the + * CREATE TABLE statement. + * + * @var bool + */ + protected $createTableKeys = true; + + /** + * UNSIGNED support + * + * @var array + */ + protected $_unsigned = [ + 'TINYINT', + 'SMALLINT', + 'MEDIUMINT', + 'INT', + 'INTEGER', + 'BIGINT', + 'REAL', + 'DOUBLE', + 'DOUBLE PRECISION', + 'FLOAT', + 'DECIMAL', + 'NUMERIC', + ]; + + /** + * Table Options list which required to be quoted + * + * @var array + */ + protected $_quoted_table_options = [ + 'COMMENT', + 'COMPRESSION', + 'CONNECTION', + 'DATA DIRECTORY', + 'INDEX DIRECTORY', + 'ENCRYPTION', + 'PASSWORD', + ]; + + /** + * NULL value representation in CREATE/ALTER TABLE statements + * + * @var string + * + * @internal + */ + protected $null = 'NULL'; + + /** + * CREATE TABLE attributes + * + * @param array $attributes Associative array of table attributes + */ + protected function _createTableAttributes(array $attributes): string + { + $sql = ''; + + foreach (array_keys($attributes) as $key) { + if (is_string($key)) { + $sql .= ' ' . strtoupper($key) . ' = '; + + if (in_array(strtoupper($key), $this->_quoted_table_options, true)) { + $sql .= $this->db->escape($attributes[$key]); + } else { + $sql .= $this->db->escapeString($attributes[$key]); + } + } + } + + if (! empty($this->db->charset) && ! strpos($sql, 'CHARACTER SET') && ! strpos($sql, 'CHARSET')) { + $sql .= ' DEFAULT CHARACTER SET = ' . $this->db->escapeString($this->db->charset); + } + + if (! empty($this->db->DBCollat) && ! strpos($sql, 'COLLATE')) { + $sql .= ' COLLATE = ' . $this->db->escapeString($this->db->DBCollat); + } + + return $sql; + } + + /** + * ALTER TABLE + * + * @param string $alterType ALTER type + * @param string $table Table name + * @param mixed $field Column definition + * + * @return string|string[] + */ + protected function _alterTable(string $alterType, string $table, $field) + { + if ($alterType === 'DROP') { + return parent::_alterTable($alterType, $table, $field); + } + + $sql = 'ALTER TABLE ' . $this->db->escapeIdentifiers($table); + + foreach ($field as $i => $data) { + if ($data['_literal'] !== false) { + $field[$i] = ($alterType === 'ADD') ? "\n\tADD " . $data['_literal'] : "\n\tMODIFY " . $data['_literal']; + } else { + if ($alterType === 'ADD') { + $field[$i]['_literal'] = "\n\tADD "; + } else { + $field[$i]['_literal'] = empty($data['new_name']) ? "\n\tMODIFY " : "\n\tCHANGE "; + } + + $field[$i] = $field[$i]['_literal'] . $this->_processColumn($field[$i]); + } + } + + return [$sql . implode(',', $field)]; + } + + /** + * Process column + */ + protected function _processColumn(array $field): string + { + $extraClause = isset($field['after']) ? ' AFTER ' . $this->db->escapeIdentifiers($field['after']) : ''; + + if (empty($extraClause) && isset($field['first']) && $field['first'] === true) { + $extraClause = ' FIRST'; + } + + return $this->db->escapeIdentifiers($field['name']) + . (empty($field['new_name']) ? '' : ' ' . $this->db->escapeIdentifiers($field['new_name'])) + . ' ' . $field['type'] . $field['length'] + . $field['unsigned'] + . $field['null'] + . $field['default'] + . $field['auto_increment'] + . $field['unique'] + . (empty($field['comment']) ? '' : ' COMMENT ' . $field['comment']) + . $extraClause; + } + + /** + * Process indexes + * + * @param string $table (ignored) + */ + protected function _processIndexes(string $table): string + { + $sql = ''; + + for ($i = 0, $c = count($this->keys); $i < $c; $i++) { + if (is_array($this->keys[$i])) { + for ($i2 = 0, $c2 = count($this->keys[$i]); $i2 < $c2; $i2++) { + if (! isset($this->fields[$this->keys[$i][$i2]])) { + unset($this->keys[$i][$i2]); + + continue; + } + } + } elseif (! isset($this->fields[$this->keys[$i]])) { + unset($this->keys[$i]); + + continue; + } + + if (! is_array($this->keys[$i])) { + $this->keys[$i] = [$this->keys[$i]]; + } + + $unique = in_array($i, $this->uniqueKeys, true) ? 'UNIQUE ' : ''; + + $sql .= ",\n\t{$unique}KEY " . $this->db->escapeIdentifiers(implode('_', $this->keys[$i])) + . ' (' . implode(', ', $this->db->escapeIdentifiers($this->keys[$i])) . ')'; + } + + $this->keys = []; + + return $sql; + } + + /** + * Drop Key + * + * @return bool + */ + public function dropKey(string $table, string $keyName) + { + $sql = sprintf( + $this->dropIndexStr, + $this->db->escapeIdentifiers($keyName), + $this->db->escapeIdentifiers($this->db->DBPrefix . $table), + ); + + return $this->db->query($sql); + } +} diff --git a/system/Database/MySQLi/PreparedQuery.php b/system/Database/MySQLi/PreparedQuery.php new file mode 100644 index 0000000..cd351f2 --- /dev/null +++ b/system/Database/MySQLi/PreparedQuery.php @@ -0,0 +1,87 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Database\MySQLi; + +use BadMethodCallException; +use CodeIgniter\Database\BasePreparedQuery; + +/** + * Prepared query for MySQLi + */ +class PreparedQuery extends BasePreparedQuery +{ + /** + * Prepares the query against the database, and saves the connection + * info necessary to execute the query later. + * + * NOTE: This version is based on SQL code. Child classes should + * override this method. + * + * @param array $options Passed to the connection's prepare statement. + * Unused in the MySQLi driver. + * + * @return mixed + */ + public function _prepare(string $sql, array $options = []) + { + // Mysqli driver doesn't like statements + // with terminating semicolons. + $sql = rtrim($sql, ';'); + + if (! $this->statement = $this->db->mysqli->prepare($sql)) { + $this->errorCode = $this->db->mysqli->errno; + $this->errorString = $this->db->mysqli->error; + } + + return $this; + } + + /** + * Takes a new set of data and runs it against the currently + * prepared query. Upon success, will return a Results object. + */ + public function _execute(array $data): bool + { + if (! isset($this->statement)) { + throw new BadMethodCallException('You must call prepare before trying to execute a prepared statement.'); + } + + // First off -bind the parameters + $bindTypes = ''; + + // Determine the type string + foreach ($data as $item) { + if (is_int($item)) { + $bindTypes .= 'i'; + } elseif (is_numeric($item)) { + $bindTypes .= 'd'; + } else { + $bindTypes .= 's'; + } + } + + // Bind it + $this->statement->bind_param($bindTypes, ...$data); + + return $this->statement->execute(); + } + + /** + * Returns the result object for the prepared query. + * + * @return mixed + */ + public function _getResult() + { + return $this->statement->get_result(); + } +} diff --git a/system/Database/MySQLi/Result.php b/system/Database/MySQLi/Result.php new file mode 100644 index 0000000..7eab7d8 --- /dev/null +++ b/system/Database/MySQLi/Result.php @@ -0,0 +1,162 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Database\MySQLi; + +use CodeIgniter\Database\BaseResult; +use CodeIgniter\Entity\Entity; +use stdClass; + +/** + * Result for MySQLi + */ +class Result extends BaseResult +{ + /** + * Gets the number of fields in the result set. + */ + public function getFieldCount(): int + { + return $this->resultID->field_count; + } + + /** + * Generates an array of column names in the result set. + */ + public function getFieldNames(): array + { + $fieldNames = []; + $this->resultID->field_seek(0); + + while ($field = $this->resultID->fetch_field()) { + $fieldNames[] = $field->name; + } + + return $fieldNames; + } + + /** + * Generates an array of objects representing field meta-data. + */ + public function getFieldData(): array + { + static $dataTypes = [ + MYSQLI_TYPE_DECIMAL => 'decimal', + MYSQLI_TYPE_NEWDECIMAL => 'newdecimal', + MYSQLI_TYPE_FLOAT => 'float', + MYSQLI_TYPE_DOUBLE => 'double', + + MYSQLI_TYPE_BIT => 'bit', + MYSQLI_TYPE_SHORT => 'short', + MYSQLI_TYPE_LONG => 'long', + MYSQLI_TYPE_LONGLONG => 'longlong', + MYSQLI_TYPE_INT24 => 'int24', + + MYSQLI_TYPE_YEAR => 'year', + + MYSQLI_TYPE_TIMESTAMP => 'timestamp', + MYSQLI_TYPE_DATE => 'date', + MYSQLI_TYPE_TIME => 'time', + MYSQLI_TYPE_DATETIME => 'datetime', + MYSQLI_TYPE_NEWDATE => 'newdate', + + MYSQLI_TYPE_SET => 'set', + + MYSQLI_TYPE_VAR_STRING => 'var_string', + MYSQLI_TYPE_STRING => 'string', + + MYSQLI_TYPE_GEOMETRY => 'geometry', + MYSQLI_TYPE_TINY_BLOB => 'tiny_blob', + MYSQLI_TYPE_MEDIUM_BLOB => 'medium_blob', + MYSQLI_TYPE_LONG_BLOB => 'long_blob', + MYSQLI_TYPE_BLOB => 'blob', + ]; + + $retVal = []; + $fieldData = $this->resultID->fetch_fields(); + + foreach ($fieldData as $i => $data) { + $retVal[$i] = new stdClass(); + $retVal[$i]->name = $data->name; + $retVal[$i]->type = $data->type; + $retVal[$i]->type_name = in_array($data->type, [1, 247], true) ? 'char' : ($dataTypes[$data->type] ?? null); + $retVal[$i]->max_length = $data->max_length; + $retVal[$i]->primary_key = $data->flags & 2; + $retVal[$i]->length = $data->length; + $retVal[$i]->default = $data->def; + } + + return $retVal; + } + + /** + * Frees the current result. + */ + public function freeResult() + { + if (is_object($this->resultID)) { + $this->resultID->free(); + $this->resultID = false; + } + } + + /** + * Moves the internal pointer to the desired offset. This is called + * internally before fetching results to make sure the result set + * starts at zero. + * + * @return mixed + */ + public function dataSeek(int $n = 0) + { + return $this->resultID->data_seek($n); + } + + /** + * Returns the result set as an array. + * + * Overridden by driver classes. + * + * @return mixed + */ + protected function fetchAssoc() + { + return $this->resultID->fetch_assoc(); + } + + /** + * Returns the result set as an object. + * + * Overridden by child classes. + * + * @return bool|Entity|object + */ + protected function fetchObject(string $className = 'stdClass') + { + if (is_subclass_of($className, Entity::class)) { + return empty($data = $this->fetchAssoc()) ? false : (new $className())->setAttributes($data); + } + + return $this->resultID->fetch_object($className); + } + + /** + * Returns the number of rows in the resultID (i.e., mysqli_result object) + */ + public function getNumRows(): int + { + if (! is_int($this->numRows)) { + $this->numRows = $this->resultID->num_rows; + } + + return $this->numRows; + } +} diff --git a/system/Database/MySQLi/Utils.php b/system/Database/MySQLi/Utils.php new file mode 100644 index 0000000..3fea64a --- /dev/null +++ b/system/Database/MySQLi/Utils.php @@ -0,0 +1,45 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Database\MySQLi; + +use CodeIgniter\Database\BaseUtils; +use CodeIgniter\Database\Exceptions\DatabaseException; + +/** + * Utils for MySQLi + */ +class Utils extends BaseUtils +{ + /** + * List databases statement + * + * @var string + */ + protected $listDatabases = 'SHOW DATABASES'; + + /** + * OPTIMIZE TABLE statement + * + * @var string + */ + protected $optimizeTable = 'OPTIMIZE TABLE %s'; + + /** + * Platform dependent version of the backup function. + * + * @return mixed + */ + public function _backup(?array $prefs = null) + { + throw new DatabaseException('Unsupported feature of the database platform you are using.'); + } +} diff --git a/system/Database/Postgre/Builder.php b/system/Database/Postgre/Builder.php new file mode 100644 index 0000000..1006ab2 --- /dev/null +++ b/system/Database/Postgre/Builder.php @@ -0,0 +1,313 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Database\Postgre; + +use CodeIgniter\Database\BaseBuilder; +use CodeIgniter\Database\Exceptions\DatabaseException; + +/** + * Builder for Postgre + */ +class Builder extends BaseBuilder +{ + /** + * ORDER BY random keyword + * + * @var array + */ + protected $randomKeyword = [ + 'RANDOM()', + ]; + + /** + * Specifies which sql statements + * support the ignore option. + * + * @var array + */ + protected $supportedIgnoreStatements = [ + 'insert' => 'ON CONFLICT DO NOTHING', + ]; + + /** + * Checks if the ignore option is supported by + * the Database Driver for the specific statement. + * + * @return string + */ + protected function compileIgnore(string $statement) + { + $sql = parent::compileIgnore($statement); + + if (! empty($sql)) { + $sql = ' ' . trim($sql); + } + + return $sql; + } + + /** + * ORDER BY + * + * @param string $direction ASC, DESC or RANDOM + * + * @return BaseBuilder + */ + public function orderBy(string $orderBy, string $direction = '', ?bool $escape = null) + { + $direction = strtoupper(trim($direction)); + if ($direction === 'RANDOM') { + if (ctype_digit($orderBy)) { + $orderBy = (float) ($orderBy > 1 ? "0.{$orderBy}" : $orderBy); + } + + if (is_float($orderBy)) { + $this->db->simpleQuery("SET SEED {$orderBy}"); + } + + $orderBy = $this->randomKeyword[0]; + $direction = ''; + $escape = false; + } + + return parent::orderBy($orderBy, $direction, $escape); + } + + /** + * Increments a numeric column by the specified value. + * + * @throws DatabaseException + * + * @return mixed + */ + public function increment(string $column, int $value = 1) + { + $column = $this->db->protectIdentifiers($column); + + $sql = $this->_update($this->QBFrom[0], [$column => "to_number({$column}, '9999999') + {$value}"]); + + return $this->db->query($sql, $this->binds, false); + } + + /** + * Decrements a numeric column by the specified value. + * + * @throws DatabaseException + * + * @return mixed + */ + public function decrement(string $column, int $value = 1) + { + $column = $this->db->protectIdentifiers($column); + + $sql = $this->_update($this->QBFrom[0], [$column => "to_number({$column}, '9999999') - {$value}"]); + + return $this->db->query($sql, $this->binds, false); + } + + /** + * Compiles an replace into string and runs the query. + * Because PostgreSQL doesn't support the replace into command, + * we simply do a DELETE and an INSERT on the first key/value + * combo, assuming that it's either the primary key or a unique key. + * + * @param array|null $set An associative array of insert values + * + * @throws DatabaseException + * + * @return mixed + */ + public function replace(?array $set = null) + { + if ($set !== null) { + $this->set($set); + } + + if (! $this->QBSet) { + if (CI_DEBUG) { + throw new DatabaseException('You must use the "set" method to update an entry.'); + } + + return false; // @codeCoverageIgnore + } + + $table = $this->QBFrom[0]; + $set = $this->binds; + + array_walk($set, static function (array &$item) { + $item = $item[0]; + }); + + $key = array_key_first($set); + $value = $set[$key]; + + $builder = $this->db->table($table); + $exists = $builder->where($key, $value, true)->get()->getFirstRow(); + + if (empty($exists) && $this->testMode) { + $result = $this->getCompiledInsert(); + } elseif (empty($exists)) { + $result = $builder->insert($set); + } elseif ($this->testMode) { + $result = $this->where($key, $value, true)->getCompiledUpdate(); + } else { + array_shift($set); + $result = $builder->where($key, $value, true)->update($set); + } + + unset($builder); + $this->resetWrite(); + + return $result; + } + + /** + * Generates a platform-specific insert string from the supplied data + */ + protected function _insert(string $table, array $keys, array $unescapedKeys): string + { + return trim(sprintf('INSERT INTO %s (%s) VALUES (%s) %s', $table, implode(', ', $keys), implode(', ', $unescapedKeys), $this->compileIgnore('insert'))); + } + + /** + * Generates a platform-specific insert string from the supplied data. + */ + protected function _insertBatch(string $table, array $keys, array $values): string + { + return trim(sprintf('INSERT INTO %s (%s) VALUES %s %s', $table, implode(', ', $keys), implode(', ', $values), $this->compileIgnore('insert'))); + } + + /** + * Compiles a delete string and runs the query + * + * @param mixed $where + * + * @throws DatabaseException + * + * @return mixed + */ + public function delete($where = '', ?int $limit = null, bool $resetData = true) + { + if (! empty($limit) || ! empty($this->QBLimit)) { + throw new DatabaseException('PostgreSQL does not allow LIMITs on DELETE queries.'); + } + + return parent::delete($where, $limit, $resetData); + } + + /** + * Generates a platform-specific LIMIT clause. + */ + protected function _limit(string $sql, bool $offsetIgnore = false): string + { + return $sql . ' LIMIT ' . $this->QBLimit . ($this->QBOffset ? " OFFSET {$this->QBOffset}" : ''); + } + + /** + * Generates a platform-specific update string from the supplied data + * + * @throws DatabaseException + */ + protected function _update(string $table, array $values): string + { + if (! empty($this->QBLimit)) { + throw new DatabaseException('Postgres does not support LIMITs with UPDATE queries.'); + } + + $this->QBOrderBy = []; + + return parent::_update($table, $values); + } + + /** + * Generates a platform-specific batch update string from the supplied data + */ + protected function _updateBatch(string $table, array $values, string $index): string + { + $ids = []; + $final = []; + + foreach ($values as $val) { + $ids[] = $val[$index]; + + foreach (array_keys($val) as $field) { + if ($field !== $index) { + $final[$field] = $final[$field] ?? []; + + $final[$field][] = "WHEN {$val[$index]} THEN {$val[$field]}"; + } + } + } + + $cases = ''; + + foreach ($final as $k => $v) { + $cases .= "{$k} = (CASE {$index}\n" + . implode("\n", $v) + . "\nELSE {$k} END), "; + } + + $this->where("{$index} IN(" . implode(',', $ids) . ')', null, false); + + return "UPDATE {$table} SET " . substr($cases, 0, -2) . $this->compileWhereHaving('QBWhere'); + } + + /** + * Generates a platform-specific delete string from the supplied data + */ + protected function _delete(string $table): string + { + $this->QBLimit = false; + + return parent::_delete($table); + } + + /** + * Generates a platform-specific truncate string from the supplied data + * + * If the database does not support the truncate() command, + * then this method maps to 'DELETE FROM table' + */ + protected function _truncate(string $table): string + { + return 'TRUNCATE ' . $table . ' RESTART IDENTITY'; + } + + /** + * Platform independent LIKE statement builder. + * + * In PostgreSQL, the ILIKE operator will perform case insensitive + * searches according to the current locale. + * + * @see https://www.postgresql.org/docs/9.2/static/functions-matching.html + */ + protected function _like_statement(?string $prefix, string $column, ?string $not, string $bind, bool $insensitiveSearch = false): string + { + $op = $insensitiveSearch === true ? 'ILIKE' : 'LIKE'; + + return "{$prefix} {$column} {$not} {$op} :{$bind}:"; + } + + /** + * Generates the JOIN portion of the query + * + * @return BaseBuilder + */ + public function join(string $table, string $cond, string $type = '', ?bool $escape = null) + { + if (! in_array('FULL OUTER', $this->joinTypes, true)) { + $this->joinTypes = array_merge($this->joinTypes, ['FULL OUTER']); + } + + return parent::join($table, $cond, $type, $escape); + } +} diff --git a/system/Database/Postgre/Connection.php b/system/Database/Postgre/Connection.php new file mode 100644 index 0000000..57b4c78 --- /dev/null +++ b/system/Database/Postgre/Connection.php @@ -0,0 +1,517 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Database\Postgre; + +use CodeIgniter\Database\BaseConnection; +use CodeIgniter\Database\Exceptions\DatabaseException; +use ErrorException; +use stdClass; + +/** + * Connection for Postgre + */ +class Connection extends BaseConnection +{ + /** + * Database driver + * + * @var string + */ + public $DBDriver = 'Postgre'; + + /** + * Database schema + * + * @var string + */ + public $schema = 'public'; + + /** + * Identifier escape character + * + * @var string + */ + public $escapeChar = '"'; + + /** + * Connect to the database. + * + * @return mixed + */ + public function connect(bool $persistent = false) + { + if (empty($this->DSN)) { + $this->buildDSN(); + } + + // Strip pgsql if exists + if (mb_strpos($this->DSN, 'pgsql:') === 0) { + $this->DSN = mb_substr($this->DSN, 6); + } + + // Convert semicolons to spaces. + $this->DSN = str_replace(';', ' ', $this->DSN); + + $this->connID = $persistent === true ? pg_pconnect($this->DSN) : pg_connect($this->DSN); + + if ($this->connID !== false) { + if ($persistent === true && pg_connection_status($this->connID) === PGSQL_CONNECTION_BAD && pg_ping($this->connID) === false + ) { + return false; + } + + if (! empty($this->schema)) { + $this->simpleQuery("SET search_path TO {$this->schema},public"); + } + + if ($this->setClientEncoding($this->charset) === false) { + return false; + } + } + + return $this->connID; + } + + /** + * Keep or establish the connection if no queries have been sent for + * a length of time exceeding the server's idle timeout. + */ + public function reconnect() + { + if (pg_ping($this->connID) === false) { + $this->connID = false; + } + } + + /** + * Close the database connection. + */ + protected function _close() + { + pg_close($this->connID); + } + + /** + * Select a specific database table to use. + */ + public function setDatabase(string $databaseName): bool + { + return false; + } + + /** + * Returns a string containing the version of the database being used. + */ + public function getVersion(): string + { + if (isset($this->dataCache['version'])) { + return $this->dataCache['version']; + } + + if (! $this->connID || ($pgVersion = pg_version($this->connID)) === false) { + $this->initialize(); + } + + return isset($pgVersion['server']) ? $this->dataCache['version'] = $pgVersion['server'] : false; + } + + /** + * Executes the query against the database. + * + * @return mixed + */ + protected function execute(string $sql) + { + try { + return pg_query($this->connID, $sql); + } catch (ErrorException $e) { + log_message('error', $e); + if ($this->DBDebug) { + throw $e; + } + } + + return false; + } + + /** + * Get the prefix of the function to access the DB. + */ + protected function getDriverFunctionPrefix(): string + { + return 'pg_'; + } + + /** + * Returns the total number of rows affected by this query. + */ + public function affectedRows(): int + { + return pg_affected_rows($this->resultID); + } + + /** + * "Smart" Escape String + * + * Escapes data based on type + * + * @param mixed $str + * + * @return mixed + */ + public function escape($str) + { + if (! $this->connID) { + $this->initialize(); + } + + if (is_string($str) || (is_object($str) && method_exists($str, '__toString'))) { + return pg_escape_literal($this->connID, $str); + } + + if (is_bool($str)) { + return $str ? 'TRUE' : 'FALSE'; + } + + return parent::escape($str); + } + + /** + * Platform-dependant string escape + */ + protected function _escapeString(string $str): string + { + if (! $this->connID) { + $this->initialize(); + } + + return pg_escape_string($this->connID, $str); + } + + /** + * Generates the SQL for listing tables in a platform-dependent manner. + */ + protected function _listTables(bool $prefixLimit = false): string + { + $sql = 'SELECT "table_name" FROM "information_schema"."tables" WHERE "table_schema" = \'' . $this->schema . "'"; + + if ($prefixLimit !== false && $this->DBPrefix !== '') { + return $sql . ' AND "table_name" LIKE \'' + . $this->escapeLikeString($this->DBPrefix) . "%' " + . sprintf($this->likeEscapeStr, $this->likeEscapeChar); + } + + return $sql; + } + + /** + * Generates a platform-specific query string so that the column names can be fetched. + */ + protected function _listColumns(string $table = ''): string + { + return 'SELECT "column_name" + FROM "information_schema"."columns" + WHERE LOWER("table_name") = ' + . $this->escape($this->DBPrefix . strtolower($table)) + . ' ORDER BY "ordinal_position"'; + } + + /** + * Returns an array of objects with field data + * + * @throws DatabaseException + * + * @return stdClass[] + */ + protected function _fieldData(string $table): array + { + $sql = 'SELECT "column_name", "data_type", "character_maximum_length", "numeric_precision", "column_default" + FROM "information_schema"."columns" + WHERE LOWER("table_name") = ' + . $this->escape(strtolower($table)) + . ' ORDER BY "ordinal_position"'; + + if (($query = $this->query($sql)) === false) { + throw new DatabaseException(lang('Database.failGetFieldData')); + } + $query = $query->getResultObject(); + + $retVal = []; + + for ($i = 0, $c = count($query); $i < $c; $i++) { + $retVal[$i] = new stdClass(); + + $retVal[$i]->name = $query[$i]->column_name; + $retVal[$i]->type = $query[$i]->data_type; + $retVal[$i]->default = $query[$i]->column_default; + $retVal[$i]->max_length = $query[$i]->character_maximum_length > 0 ? $query[$i]->character_maximum_length : $query[$i]->numeric_precision; + } + + return $retVal; + } + + /** + * Returns an array of objects with index data + * + * @throws DatabaseException + * + * @return stdClass[] + */ + protected function _indexData(string $table): array + { + $sql = 'SELECT "indexname", "indexdef" + FROM "pg_indexes" + WHERE LOWER("tablename") = ' . $this->escape(strtolower($table)) . ' + AND "schemaname" = ' . $this->escape('public'); + + if (($query = $this->query($sql)) === false) { + throw new DatabaseException(lang('Database.failGetIndexData')); + } + $query = $query->getResultObject(); + + $retVal = []; + + foreach ($query as $row) { + $obj = new stdClass(); + $obj->name = $row->indexname; + $_fields = explode(',', preg_replace('/^.*\((.+?)\)$/', '$1', trim($row->indexdef))); + $obj->fields = array_map(static function ($v) { + return trim($v); + }, $_fields); + + if (strpos($row->indexdef, 'CREATE UNIQUE INDEX pk') === 0) { + $obj->type = 'PRIMARY'; + } else { + $obj->type = (strpos($row->indexdef, 'CREATE UNIQUE') === 0) ? 'UNIQUE' : 'INDEX'; + } + + $retVal[$obj->name] = $obj; + } + + return $retVal; + } + + /** + * Returns an array of objects with Foreign key data + * + * @throws DatabaseException + * + * @return stdClass[] + */ + protected function _foreignKeyData(string $table): array + { + $sql = 'SELECT + tc.constraint_name, tc.table_name, kcu.column_name, + ccu.table_name AS foreign_table_name, + ccu.column_name AS foreign_column_name + FROM information_schema.table_constraints AS tc + JOIN information_schema.key_column_usage AS kcu + ON tc.constraint_name = kcu.constraint_name + JOIN information_schema.constraint_column_usage AS ccu + ON ccu.constraint_name = tc.constraint_name + WHERE constraint_type = ' . $this->escape('FOREIGN KEY') . ' AND + tc.table_name = ' . $this->escape($table); + + if (($query = $this->query($sql)) === false) { + throw new DatabaseException(lang('Database.failGetForeignKeyData')); + } + + $query = $query->getResultObject(); + $retVal = []; + + foreach ($query as $row) { + $obj = new stdClass(); + + $obj->constraint_name = $row->constraint_name; + $obj->table_name = $row->table_name; + $obj->column_name = $row->column_name; + $obj->foreign_table_name = $row->foreign_table_name; + $obj->foreign_column_name = $row->foreign_column_name; + + $retVal[] = $obj; + } + + return $retVal; + } + + /** + * Returns platform-specific SQL to disable foreign key checks. + * + * @return string + */ + protected function _disableForeignKeyChecks() + { + return 'SET CONSTRAINTS ALL DEFERRED'; + } + + /** + * Returns platform-specific SQL to enable foreign key checks. + * + * @return string + */ + protected function _enableForeignKeyChecks() + { + return 'SET CONSTRAINTS ALL IMMEDIATE;'; + } + + /** + * Returns the last error code and message. + * Must return this format: ['code' => string|int, 'message' => string] + * intval(code) === 0 means "no error". + * + * @return array + */ + public function error(): array + { + return [ + 'code' => '', + 'message' => pg_last_error($this->connID) ?: '', + ]; + } + + /** + * @return int|string + */ + public function insertID() + { + $v = pg_version($this->connID); + // 'server' key is only available since PostgreSQL 7.4 + $v = explode(' ', $v['server'])[0] ?? 0; + + $table = func_num_args() > 0 ? func_get_arg(0) : null; + $column = func_num_args() > 1 ? func_get_arg(1) : null; + + if ($table === null && $v >= '8.1') { + $sql = 'SELECT LASTVAL() AS ins_id'; + } elseif ($table !== null) { + if ($column !== null && $v >= '8.0') { + $sql = "SELECT pg_get_serial_sequence('{$table}', '{$column}') AS seq"; + $query = $this->query($sql); + $query = $query->getRow(); + $seq = $query->seq; + } else { + // seq_name passed in table parameter + $seq = $table; + } + + $sql = "SELECT CURRVAL('{$seq}') AS ins_id"; + } else { + return pg_last_oid($this->resultID); + } + + $query = $this->query($sql); + $query = $query->getRow(); + + return (int) $query->ins_id; + } + + /** + * Build a DSN from the provided parameters + */ + protected function buildDSN() + { + if ($this->DSN !== '') { + $this->DSN = ''; + } + + // If UNIX sockets are used, we shouldn't set a port + if (strpos($this->hostname, '/') !== false) { + $this->port = ''; + } + + if ($this->hostname !== '') { + $this->DSN = "host={$this->hostname} "; + } + + // ctype_digit only accepts strings + $port = (string) $this->port; + + if ($port !== '' && ctype_digit($port)) { + $this->DSN .= "port={$port} "; + } + + if ($this->username !== '') { + $this->DSN .= "user={$this->username} "; + + // An empty password is valid! + // password must be set to null to ignore it. + if ($this->password !== null) { + $this->DSN .= "password='{$this->password}' "; + } + } + + if ($this->database !== '') { + $this->DSN .= "dbname={$this->database} "; + } + + // We don't have these options as elements in our standard configuration + // array, but they might be set by parse_url() if the configuration was + // provided via string> Example: + // + // Postgre://username:password@localhost:5432/database?connect_timeout=5&sslmode=1 + foreach (['connect_timeout', 'options', 'sslmode', 'service'] as $key) { + if (isset($this->{$key}) && is_string($this->{$key}) && $this->{$key} !== '') { + $this->DSN .= "{$key}='{$this->{$key}}' "; + } + } + + $this->DSN = rtrim($this->DSN); + } + + /** + * Set client encoding + */ + protected function setClientEncoding(string $charset): bool + { + return pg_set_client_encoding($this->connID, $charset) === 0; + } + + /** + * Begin Transaction + */ + protected function _transBegin(): bool + { + return (bool) pg_query($this->connID, 'BEGIN'); + } + + /** + * Commit Transaction + */ + protected function _transCommit(): bool + { + return (bool) pg_query($this->connID, 'COMMIT'); + } + + /** + * Rollback Transaction + */ + protected function _transRollback(): bool + { + return (bool) pg_query($this->connID, 'ROLLBACK'); + } + + /** + * Determines if a query is a "write" type. + * + * Overrides BaseConnection::isWriteType, adding additional read query types. + * + * @param mixed $sql + */ + public function isWriteType($sql): bool + { + if (preg_match('#^(INSERT|UPDATE).*RETURNING\s.+(\,\s?.+)*$#is', $sql)) { + return false; + } + + return parent::isWriteType($sql); + } +} diff --git a/system/Database/Postgre/Forge.php b/system/Database/Postgre/Forge.php new file mode 100644 index 0000000..a050c68 --- /dev/null +++ b/system/Database/Postgre/Forge.php @@ -0,0 +1,193 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Database\Postgre; + +use CodeIgniter\Database\Forge as BaseForge; + +/** + * Forge for Postgre + */ +class Forge extends BaseForge +{ + /** + * CHECK DATABASE EXIST statement + * + * @var string + */ + protected $checkDatabaseExistStr = 'SELECT 1 FROM pg_database WHERE datname = ?'; + + /** + * DROP CONSTRAINT statement + * + * @var string + */ + protected $dropConstraintStr = 'ALTER TABLE %s DROP CONSTRAINT %s'; + + /** + * DROP INDEX statement + * + * @var string + */ + protected $dropIndexStr = 'DROP INDEX %s'; + + /** + * UNSIGNED support + * + * @var array + */ + protected $_unsigned = [ + 'INT2' => 'INTEGER', + 'SMALLINT' => 'INTEGER', + 'INT' => 'BIGINT', + 'INT4' => 'BIGINT', + 'INTEGER' => 'BIGINT', + 'INT8' => 'NUMERIC', + 'BIGINT' => 'NUMERIC', + 'REAL' => 'DOUBLE PRECISION', + 'FLOAT' => 'DOUBLE PRECISION', + ]; + + /** + * NULL value representation in CREATE/ALTER TABLE statements + * + * @var string + * + * @internal + */ + protected $null = 'NULL'; + + /** + * CREATE TABLE attributes + * + * @param array $attributes Associative array of table attributes + */ + protected function _createTableAttributes(array $attributes): string + { + return ''; + } + + /** + * @param mixed $field + * + * @return array|bool|string + */ + protected function _alterTable(string $alterType, string $table, $field) + { + if (in_array($alterType, ['DROP', 'ADD'], true)) { + return parent::_alterTable($alterType, $table, $field); + } + + $sql = 'ALTER TABLE ' . $this->db->escapeIdentifiers($table); + $sqls = []; + + foreach ($field as $data) { + if ($data['_literal'] !== false) { + return false; + } + + if (version_compare($this->db->getVersion(), '8', '>=') && isset($data['type'])) { + $sqls[] = $sql . ' ALTER COLUMN ' . $this->db->escapeIdentifiers($data['name']) + . " TYPE {$data['type']}{$data['length']}"; + } + + if (! empty($data['default'])) { + $sqls[] = $sql . ' ALTER COLUMN ' . $this->db->escapeIdentifiers($data['name']) + . " SET DEFAULT {$data['default']}"; + } + + if (isset($data['null'])) { + $sqls[] = $sql . ' ALTER COLUMN ' . $this->db->escapeIdentifiers($data['name']) + . ($data['null'] === true ? ' DROP' : ' SET') . ' NOT NULL'; + } + + if (! empty($data['new_name'])) { + $sqls[] = $sql . ' RENAME COLUMN ' . $this->db->escapeIdentifiers($data['name']) + . ' TO ' . $this->db->escapeIdentifiers($data['new_name']); + } + + if (! empty($data['comment'])) { + $sqls[] = 'COMMENT ON COLUMN' . $this->db->escapeIdentifiers($table) + . '.' . $this->db->escapeIdentifiers($data['name']) + . " IS {$data['comment']}"; + } + } + + return $sqls; + } + + /** + * Process column + */ + protected function _processColumn(array $field): string + { + return $this->db->escapeIdentifiers($field['name']) + . ' ' . $field['type'] . $field['length'] + . $field['default'] + . $field['null'] + . $field['auto_increment'] + . $field['unique']; + } + + /** + * Performs a data type mapping between different databases. + */ + protected function _attributeType(array &$attributes) + { + // Reset field lengths for data types that don't support it + if (isset($attributes['CONSTRAINT']) && stripos($attributes['TYPE'], 'int') !== false) { + $attributes['CONSTRAINT'] = null; + } + + switch (strtoupper($attributes['TYPE'])) { + case 'TINYINT': + $attributes['TYPE'] = 'SMALLINT'; + $attributes['UNSIGNED'] = false; + break; + + case 'MEDIUMINT': + $attributes['TYPE'] = 'INTEGER'; + $attributes['UNSIGNED'] = false; + break; + + case 'DATETIME': + $attributes['TYPE'] = 'TIMESTAMP'; + break; + + default: + break; + } + } + + /** + * Field attribute AUTO_INCREMENT + */ + protected function _attributeAutoIncrement(array &$attributes, array &$field) + { + if (! empty($attributes['AUTO_INCREMENT']) && $attributes['AUTO_INCREMENT'] === true) { + $field['type'] = $field['type'] === 'NUMERIC' || $field['type'] === 'BIGINT' ? 'BIGSERIAL' : 'SERIAL'; + } + } + + /** + * Generates a platform-specific DROP TABLE string + */ + protected function _dropTable(string $table, bool $ifExists, bool $cascade): string + { + $sql = parent::_dropTable($table, $ifExists, $cascade); + + if ($cascade === true) { + $sql .= ' CASCADE'; + } + + return $sql; + } +} diff --git a/system/Database/Postgre/PreparedQuery.php b/system/Database/Postgre/PreparedQuery.php new file mode 100644 index 0000000..53e42b8 --- /dev/null +++ b/system/Database/Postgre/PreparedQuery.php @@ -0,0 +1,111 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Database\Postgre; + +use BadMethodCallException; +use CodeIgniter\Database\BasePreparedQuery; +use Exception; + +/** + * Prepared query for Postgre + */ +class PreparedQuery extends BasePreparedQuery +{ + /** + * Stores the name this query can be + * used under by postgres. Only used internally. + * + * @var string + */ + protected $name; + + /** + * The result resource from a successful + * pg_exec. Or false. + * + * @var bool|Result + */ + protected $result; + + /** + * Prepares the query against the database, and saves the connection + * info necessary to execute the query later. + * + * NOTE: This version is based on SQL code. Child classes should + * override this method. + * + * @param array $options Passed to the connection's prepare statement. + * Unused in the MySQLi driver. + * + * @throws Exception + * + * @return mixed + */ + public function _prepare(string $sql, array $options = []) + { + $this->name = (string) random_int(1, 10000000000000000); + + $sql = $this->parameterize($sql); + + // Update the query object since the parameters are slightly different + // than what was put in. + $this->query->setQuery($sql); + + if (! $this->statement = pg_prepare($this->db->connID, $this->name, $sql)) { + $this->errorCode = 0; + $this->errorString = pg_last_error($this->db->connID); + } + + return $this; + } + + /** + * Takes a new set of data and runs it against the currently + * prepared query. Upon success, will return a Results object. + */ + public function _execute(array $data): bool + { + if (! isset($this->statement)) { + throw new BadMethodCallException('You must call prepare before trying to execute a prepared statement.'); + } + + $this->result = pg_execute($this->db->connID, $this->name, $data); + + return (bool) $this->result; + } + + /** + * Returns the result object for the prepared query. + * + * @return mixed + */ + public function _getResult() + { + return $this->result; + } + + /** + * Replaces the ? placeholders with $1, $2, etc parameters for use + * within the prepared query. + */ + public function parameterize(string $sql): string + { + // Track our current value + $count = 0; + + return preg_replace_callback('/\?/', static function () use (&$count) { + $count++; + + return "\${$count}"; + }, $sql); + } +} diff --git a/system/Database/Postgre/Result.php b/system/Database/Postgre/Result.php new file mode 100644 index 0000000..76a0dd9 --- /dev/null +++ b/system/Database/Postgre/Result.php @@ -0,0 +1,128 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Database\Postgre; + +use CodeIgniter\Database\BaseResult; +use CodeIgniter\Entity\Entity; +use stdClass; + +/** + * Result for Postgre + */ +class Result extends BaseResult +{ + /** + * Gets the number of fields in the result set. + */ + public function getFieldCount(): int + { + return pg_num_fields($this->resultID); + } + + /** + * Generates an array of column names in the result set. + */ + public function getFieldNames(): array + { + $fieldNames = []; + + for ($i = 0, $c = $this->getFieldCount(); $i < $c; $i++) { + $fieldNames[] = pg_field_name($this->resultID, $i); + } + + return $fieldNames; + } + + /** + * Generates an array of objects representing field meta-data. + */ + public function getFieldData(): array + { + $retVal = []; + + for ($i = 0, $c = $this->getFieldCount(); $i < $c; $i++) { + $retVal[$i] = new stdClass(); + $retVal[$i]->name = pg_field_name($this->resultID, $i); + $retVal[$i]->type = pg_field_type_oid($this->resultID, $i); + $retVal[$i]->type_name = pg_field_type($this->resultID, $i); + $retVal[$i]->max_length = pg_field_size($this->resultID, $i); + $retVal[$i]->length = $retVal[$i]->max_length; + // $retVal[$i]->primary_key = (int)($fieldData[$i]->flags & 2); + // $retVal[$i]->default = $fieldData[$i]->def; + } + + return $retVal; + } + + /** + * Frees the current result. + */ + public function freeResult() + { + if ($this->resultID !== false) { + pg_free_result($this->resultID); + $this->resultID = false; + } + } + + /** + * Moves the internal pointer to the desired offset. This is called + * internally before fetching results to make sure the result set + * starts at zero. + * + * @return mixed + */ + public function dataSeek(int $n = 0) + { + return pg_result_seek($this->resultID, $n); + } + + /** + * Returns the result set as an array. + * + * Overridden by driver classes. + * + * @return mixed + */ + protected function fetchAssoc() + { + return pg_fetch_assoc($this->resultID); + } + + /** + * Returns the result set as an object. + * + * Overridden by child classes. + * + * @return bool|Entity|object + */ + protected function fetchObject(string $className = 'stdClass') + { + if (is_subclass_of($className, Entity::class)) { + return empty($data = $this->fetchAssoc()) ? false : (new $className())->setAttributes($data); + } + + return pg_fetch_object($this->resultID, null, $className); + } + + /** + * Returns the number of rows in the resultID (i.e., PostgreSQL query result resource) + */ + public function getNumRows(): int + { + if (! is_int($this->numRows)) { + $this->numRows = pg_num_rows($this->resultID); + } + + return $this->numRows; + } +} diff --git a/system/Database/Postgre/Utils.php b/system/Database/Postgre/Utils.php new file mode 100644 index 0000000..ba1df5d --- /dev/null +++ b/system/Database/Postgre/Utils.php @@ -0,0 +1,45 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Database\Postgre; + +use CodeIgniter\Database\BaseUtils; +use CodeIgniter\Database\Exceptions\DatabaseException; + +/** + * Utils for Postgre + */ +class Utils extends BaseUtils +{ + /** + * List databases statement + * + * @var string + */ + protected $listDatabases = 'SELECT datname FROM pg_database'; + + /** + * OPTIMIZE TABLE statement + * + * @var string + */ + protected $optimizeTable = 'REINDEX TABLE %s'; + + /** + * Platform dependent version of the backup function. + * + * @return mixed + */ + public function _backup(?array $prefs = null) + { + throw new DatabaseException('Unsupported feature of the database platform you are using.'); + } +} diff --git a/system/Database/PreparedQueryInterface.php b/system/Database/PreparedQueryInterface.php new file mode 100644 index 0000000..3181410 --- /dev/null +++ b/system/Database/PreparedQueryInterface.php @@ -0,0 +1,54 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Database; + +/** + * Prepared query interface + */ +interface PreparedQueryInterface +{ + /** + * Takes a new set of data and runs it against the currently + * prepared query. Upon success, will return a Results object. + * + * @return ResultInterface + */ + public function execute(...$data); + + /** + * Prepares the query against the database, and saves the connection + * info necessary to execute the query later. + * + * @return mixed + */ + public function prepare(string $sql, array $options = []); + + /** + * Explicity closes the statement. + */ + public function close(); + + /** + * Returns the SQL that has been prepared. + */ + public function getQueryString(): string; + + /** + * Returns the error code created while executing this statement. + */ + public function getErrorCode(): int; + + /** + * Returns the error message created while executing this statement. + */ + public function getErrorMessage(): string; +} diff --git a/system/Database/Query.php b/system/Database/Query.php new file mode 100644 index 0000000..91b98c7 --- /dev/null +++ b/system/Database/Query.php @@ -0,0 +1,418 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Database; + +/** + * Query builder + */ +class Query implements QueryInterface +{ + /** + * The query string, as provided by the user. + * + * @var string + */ + protected $originalQueryString; + + /** + * The final query string after binding, etc. + * + * @var string + */ + protected $finalQueryString; + + /** + * The binds and their values used for binding. + * + * @var array + */ + protected $binds = []; + + /** + * Bind marker + * + * Character used to identify values in a prepared statement. + * + * @var string + */ + protected $bindMarker = '?'; + + /** + * The start time in seconds with microseconds + * for when this query was executed. + * + * @var float|string + */ + protected $startTime; + + /** + * The end time in seconds with microseconds + * for when this query was executed. + * + * @var float + */ + protected $endTime; + + /** + * The error code, if any. + * + * @var int + */ + protected $errorCode; + + /** + * The error message, if any. + * + * @var string + */ + protected $errorString; + + /** + * Pointer to database connection. + * Mainly for escaping features. + * + * @var ConnectionInterface + */ + public $db; + + public function __construct(ConnectionInterface &$db) + { + $this->db = $db; + } + + /** + * Sets the raw query string to use for this statement. + * + * @param mixed $binds + * + * @return $this + */ + public function setQuery(string $sql, $binds = null, bool $setEscape = true) + { + $this->originalQueryString = $sql; + + if ($binds !== null) { + if (! is_array($binds)) { + $binds = [$binds]; + } + + if ($setEscape) { + array_walk($binds, static function (&$item) { + $item = [ + $item, + true, + ]; + }); + } + $this->binds = $binds; + } + + return $this; + } + + /** + * Will store the variables to bind into the query later. + * + * @return $this + */ + public function setBinds(array $binds, bool $setEscape = true) + { + if ($setEscape) { + array_walk($binds, static function (&$item) { + $item = [$item, true]; + }); + } + + $this->binds = $binds; + + return $this; + } + + /** + * Returns the final, processed query string after binding, etal + * has been performed. + */ + public function getQuery(): string + { + if (empty($this->finalQueryString)) { + $this->finalQueryString = $this->originalQueryString; + } + + $this->compileBinds(); + + return $this->finalQueryString; + } + + /** + * Records the execution time of the statement using microtime(true) + * for it's start and end values. If no end value is present, will + * use the current time to determine total duration. + * + * @param float $end + * + * @return $this + */ + public function setDuration(float $start, ?float $end = null) + { + $this->startTime = $start; + + if ($end === null) { + $end = microtime(true); + } + + $this->endTime = $end; + + return $this; + } + + /** + * Returns the start time in seconds with microseconds. + * + * @return float|string + */ + public function getStartTime(bool $returnRaw = false, int $decimals = 6) + { + if ($returnRaw) { + return $this->startTime; + } + + return number_format($this->startTime, $decimals); + } + + /** + * Returns the duration of this query during execution, or null if + * the query has not been executed yet. + * + * @param int $decimals The accuracy of the returned time. + */ + public function getDuration(int $decimals = 6): string + { + return number_format(($this->endTime - $this->startTime), $decimals); + } + + /** + * Stores the error description that happened for this query. + * + * @return $this + */ + public function setError(int $code, string $error) + { + $this->errorCode = $code; + $this->errorString = $error; + + return $this; + } + + /** + * Reports whether this statement created an error not. + */ + public function hasError(): bool + { + return ! empty($this->errorString); + } + + /** + * Returns the error code created while executing this statement. + */ + public function getErrorCode(): int + { + return $this->errorCode; + } + + /** + * Returns the error message created while executing this statement. + */ + public function getErrorMessage(): string + { + return $this->errorString; + } + + /** + * Determines if the statement is a write-type query or not. + */ + public function isWriteType(): bool + { + return $this->db->isWriteType($this->originalQueryString); + } + + /** + * Swaps out one table prefix for a new one. + * + * @return $this + */ + public function swapPrefix(string $orig, string $swap) + { + $sql = empty($this->finalQueryString) ? $this->originalQueryString : $this->finalQueryString; + + $this->finalQueryString = preg_replace('/(\W)' . $orig . '(\S+?)/', '\\1' . $swap . '\\2', $sql); + + return $this; + } + + /** + * Returns the original SQL that was passed into the system. + */ + public function getOriginalQuery(): string + { + return $this->originalQueryString; + } + + /** + * Escapes and inserts any binds into the finalQueryString object. + * + * @see https://regex101.com/r/EUEhay/5 + */ + protected function compileBinds() + { + $sql = $this->finalQueryString; + $binds = $this->binds; + + if (empty($binds)) { + return; + } + + if (is_int(array_key_first($binds))) { + $bindCount = count($binds); + $ml = strlen($this->bindMarker); + + $this->finalQueryString = $this->matchSimpleBinds($sql, $binds, $bindCount, $ml); + } else { + // Reverse the binds so that duplicate named binds + // will be processed prior to the original binds. + $binds = array_reverse($binds); + + $this->finalQueryString = $this->matchNamedBinds($sql, $binds); + } + } + + /** + * Match bindings + */ + protected function matchNamedBinds(string $sql, array $binds): string + { + $replacers = []; + + foreach ($binds as $placeholder => $value) { + // $value[1] contains the boolean whether should be escaped or not + $escapedValue = $value[1] ? $this->db->escape($value[0]) : $value[0]; + + // In order to correctly handle backlashes in saved strings + // we will need to preg_quote, so remove the wrapping escape characters + // otherwise it will get escaped. + if (is_array($value[0])) { + $escapedValue = '(' . implode(',', $escapedValue) . ')'; + } + + $replacers[":{$placeholder}:"] = $escapedValue; + } + + return strtr($sql, $replacers); + } + + /** + * Match bindings + */ + protected function matchSimpleBinds(string $sql, array $binds, int $bindCount, int $ml): string + { + if ($c = preg_match_all("/'[^']*'/", $sql, $matches)) { + $c = preg_match_all('/' . preg_quote($this->bindMarker, '/') . '/i', str_replace($matches[0], str_replace($this->bindMarker, str_repeat(' ', $ml), $matches[0]), $sql, $c), $matches, PREG_OFFSET_CAPTURE); + + // Bind values' count must match the count of markers in the query + if ($bindCount !== $c) { + return $sql; + } + } elseif (($c = preg_match_all('/' . preg_quote($this->bindMarker, '/') . '/i', $sql, $matches, PREG_OFFSET_CAPTURE)) !== $bindCount) { + return $sql; + } + + do { + $c--; + $escapedValue = $binds[$c][1] ? $this->db->escape($binds[$c][0]) : $binds[$c][0]; + + if (is_array($escapedValue)) { + $escapedValue = '(' . implode(',', $escapedValue) . ')'; + } + + $sql = substr_replace($sql, $escapedValue, $matches[0][$c][1], $ml); + } while ($c !== 0); + + return $sql; + } + + /** + * Returns string to display in debug toolbar + */ + public function debugToolbarDisplay(): string + { + // Key words we want bolded + static $highlight = [ + 'AND', + 'AS', + 'ASC', + 'AVG', + 'BY', + 'COUNT', + 'DESC', + 'DISTINCT', + 'FROM', + 'GROUP', + 'HAVING', + 'IN', + 'INNER', + 'INSERT', + 'INTO', + 'IS', + 'JOIN', + 'LEFT', + 'LIKE', + 'LIMIT', + 'MAX', + 'MIN', + 'NOT', + 'NULL', + 'OFFSET', + 'ON', + 'OR', + 'ORDER', + 'RIGHT', + 'SELECT', + 'SUM', + 'UPDATE', + 'VALUES', + 'WHERE', + ]; + + if (empty($this->finalQueryString)) { + $this->compileBinds(); // @codeCoverageIgnore + } + + $sql = esc($this->finalQueryString); + + /** + * @see https://stackoverflow.com/a/20767160 + * @see https://regex101.com/r/hUlrGN/4 + */ + $search = '/\b(?:' . implode('|', $highlight) . ')\b(?![^(')]*'(?:(?:[^(')]*'){2})*[^(')]*$)/'; + + return preg_replace_callback($search, static function ($matches) { + return '' . str_replace(' ', ' ', $matches[0]) . ''; + }, $sql); + } + + /** + * Return text representation of the query + */ + public function __toString(): string + { + return $this->getQuery(); + } +} diff --git a/system/Database/QueryInterface.php b/system/Database/QueryInterface.php new file mode 100644 index 0000000..4f40f00 --- /dev/null +++ b/system/Database/QueryInterface.php @@ -0,0 +1,87 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Database; + +/** + * Interface QueryInterface + * + * Represents a single statement that can be executed against the database. + * Statements are platform-specific and can handle binding of binds. + */ +interface QueryInterface +{ + /** + * Sets the raw query string to use for this statement. + * + * @param mixed $binds + * + * @return mixed + */ + public function setQuery(string $sql, $binds = null, bool $setEscape = true); + + /** + * Returns the final, processed query string after binding, etal + * has been performed. + * + * @return mixed + */ + public function getQuery(); + + /** + * Records the execution time of the statement using microtime(true) + * for it's start and end values. If no end value is present, will + * use the current time to determine total duration. + * + * @return mixed + */ + public function setDuration(float $start, ?float $end = null); + + /** + * Returns the duration of this query during execution, or null if + * the query has not been executed yet. + * + * @param int $decimals The accuracy of the returned time. + */ + public function getDuration(int $decimals = 6): string; + + /** + * Stores the error description that happened for this query. + */ + public function setError(int $code, string $error); + + /** + * Reports whether this statement created an error not. + */ + public function hasError(): bool; + + /** + * Returns the error code created while executing this statement. + */ + public function getErrorCode(): int; + + /** + * Returns the error message created while executing this statement. + */ + public function getErrorMessage(): string; + + /** + * Determines if the statement is a write-type query or not. + */ + public function isWriteType(): bool; + + /** + * Swaps out one table prefix for a new one. + * + * @return mixed + */ + public function swapPrefix(string $orig, string $swap); +} diff --git a/system/Database/ResultInterface.php b/system/Database/ResultInterface.php new file mode 100644 index 0000000..b676ea0 --- /dev/null +++ b/system/Database/ResultInterface.php @@ -0,0 +1,164 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Database; + +/** + * Interface ResultInterface + */ +interface ResultInterface +{ + /** + * Retrieve the results of the query. Typically an array of + * individual data rows, which can be either an 'array', an + * 'object', or a custom class name. + * + * @param string $type The row type. Either 'array', 'object', or a class name to use + */ + public function getResult(string $type = 'object'): array; + + /** + * Returns the results as an array of custom objects. + * + * @param string $className The name of the class to use. + * + * @return mixed + */ + public function getCustomResultObject(string $className); + + /** + * Returns the results as an array of arrays. + * + * If no results, an empty array is returned. + */ + public function getResultArray(): array; + + /** + * Returns the results as an array of objects. + * + * If no results, an empty array is returned. + */ + public function getResultObject(): array; + + /** + * Wrapper object to return a row as either an array, an object, or + * a custom class. + * + * If row doesn't exist, returns null. + * + * @param mixed $n The index of the results to return + * @param string $type The type of result object. 'array', 'object' or class name. + * + * @return mixed + */ + public function getRow($n = 0, string $type = 'object'); + + /** + * Returns a row as a custom class instance. + * + * If row doesn't exists, returns null. + * + * @return mixed + */ + public function getCustomRowObject(int $n, string $className); + + /** + * Returns a single row from the results as an array. + * + * If row doesn't exist, returns null. + * + * @return mixed + */ + public function getRowArray(int $n = 0); + + /** + * Returns a single row from the results as an object. + * + * If row doesn't exist, returns null. + * + * @return mixed + */ + public function getRowObject(int $n = 0); + + /** + * Assigns an item into a particular column slot. + * + * @param string $key + * @param mixed $value + * + * @return mixed + */ + public function setRow($key, $value = null); + + /** + * Returns the "first" row of the current results. + * + * @return mixed + */ + public function getFirstRow(string $type = 'object'); + + /** + * Returns the "last" row of the current results. + * + * @return mixed + */ + public function getLastRow(string $type = 'object'); + + /** + * Returns the "next" row of the current results. + * + * @return mixed + */ + public function getNextRow(string $type = 'object'); + + /** + * Returns the "previous" row of the current results. + * + * @return mixed + */ + public function getPreviousRow(string $type = 'object'); + + /** + * Returns an unbuffered row and move the pointer to the next row. + * + * @return mixed + */ + public function getUnbufferedRow(string $type = 'object'); + + /** + * Gets the number of fields in the result set. + */ + public function getFieldCount(): int; + + /** + * Generates an array of column names in the result set. + */ + public function getFieldNames(): array; + + /** + * Generates an array of objects representing field meta-data. + */ + public function getFieldData(): array; + + /** + * Frees the current result. + */ + public function freeResult(); + + /** + * Moves the internal pointer to the desired offset. This is called + * internally before fetching results to make sure the result set + * starts at zero. + * + * @return mixed + */ + public function dataSeek(int $n = 0); +} diff --git a/system/Database/SQLSRV/Builder.php b/system/Database/SQLSRV/Builder.php new file mode 100644 index 0000000..17d8bd5 --- /dev/null +++ b/system/Database/SQLSRV/Builder.php @@ -0,0 +1,625 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Database\SQLSRV; + +use CodeIgniter\Database\BaseBuilder; +use CodeIgniter\Database\Exceptions\DatabaseException; +use CodeIgniter\Database\Exceptions\DataException; +use CodeIgniter\Database\ResultInterface; + +/** + * Builder for SQLSRV + * + * @todo auto check for TextCastToInt + * @todo auto check for InsertIndexValue + * @todo replace: delete index entries before insert + */ +class Builder extends BaseBuilder +{ + /** + * ORDER BY random keyword + * + * @var array + */ + protected $randomKeyword = [ + 'NEWID()', + 'RAND(%d)', + ]; + + /** + * Quoted identifier flag + * + * Whether to use SQL-92 standard quoted identifier + * (double quotes) or brackets for identifier escaping. + * + * @var bool + */ + protected $_quoted_identifier = true; + + /** + * Handle increment/decrement on text + * + * @var bool + */ + public $castTextToInt = true; + + /** + * Handle IDENTITY_INSERT property/ + * + * @var bool + */ + public $keyPermission = false; + + /** + * Groups tables in FROM clauses if needed, so there is no confusion + * about operator precedence. + */ + protected function _fromTables(): string + { + $from = []; + + foreach ($this->QBFrom as $value) { + $from[] = $this->getFullName($value); + } + + return implode(', ', $from); + } + + /** + * Generates a platform-specific truncate string from the supplied data + * + * If the database does not support the truncate() command, + * then this method maps to 'DELETE FROM table' + */ + protected function _truncate(string $table): string + { + return 'TRUNCATE TABLE ' . $this->getFullName($table); + } + + /** + * Generates the JOIN portion of the query + * + * @return $this + */ + public function join(string $table, string $cond, string $type = '', ?bool $escape = null) + { + if ($type !== '') { + $type = strtoupper(trim($type)); + + if (! in_array($type, $this->joinTypes, true)) { + $type = ''; + } else { + $type .= ' '; + } + } + + // Extract any aliases that might exist. We use this information + // in the protectIdentifiers to know whether to add a table prefix + $this->trackAliases($table); + + if (! is_bool($escape)) { + $escape = $this->db->protectIdentifiers; + } + + if (! $this->hasOperator($cond)) { + $cond = ' USING (' . ($escape ? $this->db->escapeIdentifiers($cond) : $cond) . ')'; + } elseif ($escape === false) { + $cond = ' ON ' . $cond; + } else { + // Split multiple conditions + if (preg_match_all('/\sAND\s|\sOR\s/i', $cond, $joints, PREG_OFFSET_CAPTURE)) { + $conditions = []; + $joints = $joints[0]; + array_unshift($joints, ['', 0]); + + for ($i = count($joints) - 1, $pos = strlen($cond); $i >= 0; $i--) { + $joints[$i][1] += strlen($joints[$i][0]); // offset + $conditions[$i] = substr($cond, $joints[$i][1], $pos - $joints[$i][1]); + $pos = $joints[$i][1] - strlen($joints[$i][0]); + $joints[$i] = $joints[$i][0]; + } + + ksort($conditions); + } else { + $conditions = [$cond]; + $joints = ['']; + } + + $cond = ' ON '; + + foreach ($conditions as $i => $condition) { + $operator = $this->getOperator($condition); + + $cond .= $joints[$i]; + $cond .= preg_match('/(\(*)?([\[\]\w\.\'-]+)' . preg_quote($operator, '/') . '(.*)/i', $condition, $match) ? $match[1] . $this->db->protectIdentifiers($match[2]) . $operator . $this->db->protectIdentifiers($match[3]) : $condition; + } + } + + // Do we want to escape the table name? + if ($escape === true) { + $table = $this->db->protectIdentifiers($table, true, null, false); + } + + // Assemble the JOIN statement + $this->QBJoin[] = $type . 'JOIN ' . $this->getFullName($table) . $cond; + + return $this; + } + + /** + * Generates a platform-specific insert string from the supplied data + * + * @todo implement check for this instead static $insertKeyPermission + */ + protected function _insert(string $table, array $keys, array $unescapedKeys): string + { + $fullTableName = $this->getFullName($table); + + // insert statement + $statement = 'INSERT INTO ' . $fullTableName . ' (' . implode(',', $keys) . ') VALUES (' . implode(', ', $unescapedKeys) . ')'; + + return $this->keyPermission ? $this->addIdentity($fullTableName, $statement) : $statement; + } + + /** + * Insert batch statement + * + * Generates a platform-specific insert string from the supplied data. + */ + protected function _insertBatch(string $table, array $keys, array $values): string + { + return 'INSERT ' . $this->compileIgnore('insert') . 'INTO ' . $this->getFullName($table) . ' (' . implode(', ', $keys) . ') VALUES ' . implode(', ', $values); + } + + /** + * Generates a platform-specific update string from the supplied data + */ + protected function _update(string $table, array $values): string + { + $valstr = []; + + foreach ($values as $key => $val) { + $valstr[] = $key . ' = ' . $val; + } + + $fullTableName = $this->getFullName($table); + + $statement = sprintf('UPDATE %s%s SET ', empty($this->QBLimit) ? '' : 'TOP(' . $this->QBLimit . ') ', $fullTableName); + + $statement .= implode(', ', $valstr) + . $this->compileWhereHaving('QBWhere') + . $this->compileOrderBy(); + + return $this->keyPermission ? $this->addIdentity($fullTableName, $statement) : $statement; + } + + /** + * Update_Batch statement + * + * Generates a platform-specific batch update string from the supplied data + */ + protected function _updateBatch(string $table, array $values, string $index): string + { + $ids = []; + $final = []; + + foreach ($values as $val) { + $ids[] = $val[$index]; + + foreach (array_keys($val) as $field) { + if ($field !== $index) { + $final[$field][] = 'WHEN ' . $index . ' = ' . $val[$index] . ' THEN ' . $val[$field]; + } + } + } + + $cases = ''; + + foreach ($final as $k => $v) { + $cases .= $k . " = CASE \n" + . implode("\n", $v) . "\n" + . 'ELSE ' . $k . ' END, '; + } + + $this->where($index . ' IN(' . implode(',', $ids) . ')', null, false); + + return 'UPDATE ' . $this->compileIgnore('update') . ' ' . $this->getFullName($table) . ' SET ' . substr($cases, 0, -2) . $this->compileWhereHaving('QBWhere'); + } + + /** + * Increments a numeric column by the specified value. + * + * @return bool + */ + public function increment(string $column, int $value = 1) + { + $column = $this->db->protectIdentifiers($column); + + if ($this->castTextToInt) { + $values = [$column => "CONVERT(VARCHAR(MAX),CONVERT(INT,CONVERT(VARCHAR(MAX), {$column})) + {$value})"]; + } else { + $values = [$column => "{$column} + {$value}"]; + } + + $sql = $this->_update($this->QBFrom[0], $values); + + return $this->db->query($sql, $this->binds, false); + } + + /** + * Decrements a numeric column by the specified value. + * + * @return bool + */ + public function decrement(string $column, int $value = 1) + { + $column = $this->db->protectIdentifiers($column); + + if ($this->castTextToInt) { + $values = [$column => "CONVERT(VARCHAR(MAX),CONVERT(INT,CONVERT(VARCHAR(MAX), {$column})) - {$value})"]; + } else { + $values = [$column => "{$column} + {$value}"]; + } + + $sql = $this->_update($this->QBFrom[0], $values); + + return $this->db->query($sql, $this->binds, false); + } + + /** + * Get full name of the table + */ + private function getFullName(string $table): string + { + $alias = ''; + + if (strpos($table, ' ') !== false) { + $alias = explode(' ', $table); + $table = array_shift($alias); + $alias = ' ' . implode(' ', $alias); + } + + if ($this->db->escapeChar === '"') { + return '"' . $this->db->getDatabase() . '"."' . $this->db->schema . '"."' . str_replace('"', '', $table) . '"' . $alias; + } + + return '[' . $this->db->getDatabase() . '].[' . $this->db->schema . '].[' . str_replace('"', '', $table) . ']' . str_replace('"', '', $alias); + } + + /** + * Add permision statements for index value inserts + */ + private function addIdentity(string $fullTable, string $insert): string + { + return 'SET IDENTITY_INSERT ' . $fullTable . " ON\n" . $insert . "\nSET IDENTITY_INSERT " . $fullTable . ' OFF'; + } + + /** + * Local implementation of limit + */ + protected function _limit(string $sql, bool $offsetIgnore = false): string + { + if (empty($this->QBOrderBy)) { + $sql .= ' ORDER BY (SELECT NULL) '; + } + + if ($offsetIgnore) { + $sql .= ' OFFSET 0 '; + } else { + $sql .= is_int($this->QBOffset) ? ' OFFSET ' . $this->QBOffset : ' OFFSET 0 '; + } + + return $sql . ' ROWS FETCH NEXT ' . $this->QBLimit . ' ROWS ONLY '; + } + + /** + * Compiles a replace into string and runs the query + * + * @throws DatabaseException + * + * @return mixed + */ + public function replace(?array $set = null) + { + if ($set !== null) { + $this->set($set); + } + + if (empty($this->QBSet)) { + if (CI_DEBUG) { + throw new DatabaseException('You must use the "set" method to update an entry.'); + } + + return false; // @codeCoverageIgnore + } + + $table = $this->QBFrom[0]; + + $sql = $this->_replace($table, array_keys($this->QBSet), array_values($this->QBSet)); + + $this->resetWrite(); + + if ($this->testMode) { + return $sql; + } + + $this->db->simpleQuery('SET IDENTITY_INSERT ' . $this->getFullName($table) . ' ON'); + + $result = $this->db->query($sql, $this->binds, false); + $this->db->simpleQuery('SET IDENTITY_INSERT ' . $this->getFullName($table) . ' OFF'); + + return $result; + } + + /** + * Generates a platform-specific replace string from the supplied data + * on match delete and insert + */ + protected function _replace(string $table, array $keys, array $values): string + { + // check whether the existing keys are part of the primary key. + // if so then use them for the "ON" part and exclude them from the $values and $keys + $pKeys = $this->db->getIndexData($table); + $keyFields = []; + + foreach ($pKeys as $key) { + if ($key->type === 'PRIMARY') { + $keyFields = array_merge($keyFields, $key->fields); + } + + if ($key->type === 'UNIQUE') { + $keyFields = array_merge($keyFields, $key->fields); + } + } + + // Get the unique field names + $escKeyFields = array_map(function (string $field): string { + return $this->db->protectIdentifiers($field); + }, array_values(array_unique($keyFields))); + + // Get the binds + $binds = $this->binds; + array_walk($binds, static function (&$item) { + $item = $item[0]; + }); + + // Get the common field and values from the keys data and index fields + $common = array_intersect($keys, $escKeyFields); + $bingo = []; + + foreach ($common as $v) { + $k = array_search($v, $keys, true); + + $bingo[$keys[$k]] = $binds[trim($values[$k], ':')]; + } + + // Querying existing data + $builder = $this->db->table($table); + + foreach ($bingo as $k => $v) { + $builder->where($k, $v); + } + + $q = $builder->get()->getResult(); + + // Delete entries if we find them + if ($q !== []) { + $delete = $this->db->table($table); + + foreach ($bingo as $k => $v) { + $delete->where($k, $v); + } + + $delete->delete(); + } + + return sprintf('INSERT INTO %s (%s) VALUES (%s);', $this->getFullName($table), implode(',', $keys), implode(',', $values)); + } + + /** + * SELECT [MAX|MIN|AVG|SUM|COUNT]() + * + * Handle float return value + * + * @return BaseBuilder + */ + protected function maxMinAvgSum(string $select = '', string $alias = '', string $type = 'MAX') + { + // int functions can be handled by parent + if ($type !== 'AVG') { + return parent::maxMinAvgSum($select, $alias, $type); + } + + if ($select === '') { + throw DataException::forEmptyInputGiven('Select'); + } + + if (strpos($select, ',') !== false) { + throw DataException::forInvalidArgument('Column name not separated by comma'); + } + + if ($alias === '') { + $alias = $this->createAliasFromTable(trim($select)); + } + + $sql = $type . '( CAST( ' . $this->db->protectIdentifiers(trim($select)) . ' AS FLOAT ) ) AS ' . $this->db->escapeIdentifiers(trim($alias)); + + $this->QBSelect[] = $sql; + $this->QBNoEscape[] = null; + + return $this; + } + + /** + * "Count All" query + * + * Generates a platform-specific query string that counts all records in + * the particular table + * + * @param bool $reset Are we want to clear query builder values? + * + * @return int|string when $test = true + */ + public function countAll(bool $reset = true) + { + $table = $this->QBFrom[0]; + + $sql = $this->countString . $this->db->escapeIdentifiers('numrows') . ' FROM ' . $this->getFullName($table); + + if ($this->testMode) { + return $sql; + } + + $query = $this->db->query($sql, null, false); + if (empty($query->getResult())) { + return 0; + } + + $query = $query->getRow(); + + if ($reset === true) { + $this->resetSelect(); + } + + return (int) $query->numrows; + } + + /** + * Delete statement + */ + protected function _delete(string $table): string + { + return 'DELETE' . (empty($this->QBLimit) ? '' : ' TOP (' . $this->QBLimit . ') ') . ' FROM ' . $this->getFullName($table) . $this->compileWhereHaving('QBWhere'); + } + + /** + * Compiles a delete string and runs the query + * + * @param mixed $where + * + * @throws DatabaseException + * + * @return mixed + */ + public function delete($where = '', ?int $limit = null, bool $resetData = true) + { + $table = $this->db->protectIdentifiers($this->QBFrom[0], true, null, false); + + if ($where !== '') { + $this->where($where); + } + + if (empty($this->QBWhere)) { + if (CI_DEBUG) { + throw new DatabaseException('Deletes are not allowed unless they contain a "where" or "like" clause.'); + } + + return false; // @codeCoverageIgnore + } + + if (! empty($limit)) { + $this->QBLimit = $limit; + } + + $sql = $this->_delete($table); + + if ($resetData) { + $this->resetWrite(); + } + + return $this->testMode ? $sql : $this->db->query($sql, $this->binds, false); + } + + /** + * Compile the SELECT statement + * + * Generates a query string based on which functions were used. + * + * @param bool $selectOverride + */ + protected function compileSelect($selectOverride = false): string + { + // Write the "select" portion of the query + if ($selectOverride !== false) { + $sql = $selectOverride; + } else { + $sql = (! $this->QBDistinct) ? 'SELECT ' : 'SELECT DISTINCT '; + + // SQL Server can't work with select * if group by is specified + if (empty($this->QBSelect) && ! empty($this->QBGroupBy) && is_array($this->QBGroupBy)) { + foreach ($this->QBGroupBy as $field) { + $this->QBSelect[] = is_array($field) ? $field['field'] : $field; + } + } + + if (empty($this->QBSelect)) { + $sql .= '*'; + } else { + // Cycle through the "select" portion of the query and prep each column name. + // The reason we protect identifiers here rather than in the select() function + // is because until the user calls the from() function we don't know if there are aliases + foreach ($this->QBSelect as $key => $val) { + $noEscape = $this->QBNoEscape[$key] ?? null; + $this->QBSelect[$key] = $this->db->protectIdentifiers($val, false, $noEscape); + } + + $sql .= implode(', ', $this->QBSelect); + } + } + + // Write the "FROM" portion of the query + if (! empty($this->QBFrom)) { + $sql .= "\nFROM " . $this->_fromTables(); + } + + // Write the "JOIN" portion of the query + if (! empty($this->QBJoin)) { + $sql .= "\n" . implode("\n", $this->QBJoin); + } + + $sql .= $this->compileWhereHaving('QBWhere') + . $this->compileGroupBy() + . $this->compileWhereHaving('QBHaving') + . $this->compileOrderBy(); // ORDER BY + + // LIMIT + if ($this->QBLimit) { + $sql = $this->_limit($sql . "\n"); + } + + return $sql; + } + + /** + * Compiles the select statement based on the other functions called + * and runs the query + * + * @return ResultInterface + */ + public function get(?int $limit = null, int $offset = 0, bool $reset = true) + { + if ($limit !== null) { + $this->limit($limit, $offset); + } + + $result = $this->testMode ? $this->getCompiledSelect($reset) : $this->db->query($this->compileSelect(), $this->binds, false); + + if ($reset) { + $this->resetSelect(); + + // Clear our binds so we don't eat up memory + $this->binds = []; + } + + return $result; + } +} diff --git a/system/Database/SQLSRV/Connection.php b/system/Database/SQLSRV/Connection.php new file mode 100644 index 0000000..3c86839 --- /dev/null +++ b/system/Database/SQLSRV/Connection.php @@ -0,0 +1,537 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Database\SQLSRV; + +use CodeIgniter\Database\BaseConnection; +use CodeIgniter\Database\Exceptions\DatabaseException; +use Exception; +use stdClass; + +/** + * Connection for SQLSRV + */ +class Connection extends BaseConnection +{ + /** + * Database driver + * + * @var string + */ + public $DBDriver = 'SQLSRV'; + + /** + * Database name + * + * @var string + */ + public $database; + + /** + * Scrollable flag + * + * Determines what cursor type to use when executing queries. + * + * FALSE or SQLSRV_CURSOR_FORWARD would increase performance, + * but would disable num_rows() (and possibly insert_id()) + * + * @var mixed + */ + public $scrollable; + + /** + * Identifier escape character + * + * @var string + */ + public $escapeChar = '"'; + + /** + * Database schema + * + * @var string + */ + public $schema = 'dbo'; + + /** + * Quoted identifier flag + * + * Whether to use SQL-92 standard quoted identifier + * (double quotes) or brackets for identifier escaping. + * + * @var bool + */ + protected $_quoted_identifier = true; + + /** + * List of reserved identifiers + * + * Identifiers that must NOT be escaped. + * + * @var string[] + */ + protected $_reserved_identifiers = ['*']; + + /** + * Class constructor + */ + public function __construct(array $params) + { + parent::__construct($params); + + // This is only supported as of SQLSRV 3.0 + if ($this->scrollable === null) { + $this->scrollable = defined('SQLSRV_CURSOR_CLIENT_BUFFERED') ? SQLSRV_CURSOR_CLIENT_BUFFERED : false; + } + } + + /** + * Connect to the database. + * + * @throws DatabaseException + * + * @return mixed + */ + public function connect(bool $persistent = false) + { + $charset = in_array(strtolower($this->charset), ['utf-8', 'utf8'], true) ? 'UTF-8' : SQLSRV_ENC_CHAR; + + $connection = [ + 'UID' => empty($this->username) ? '' : $this->username, + 'PWD' => empty($this->password) ? '' : $this->password, + 'Database' => $this->database, + 'ConnectionPooling' => $persistent ? 1 : 0, + 'CharacterSet' => $charset, + 'Encrypt' => $this->encrypt === true ? 1 : 0, + 'ReturnDatesAsStrings' => 1, + ]; + + // If the username and password are both empty, assume this is a + // 'Windows Authentication Mode' connection. + if (empty($connection['UID']) && empty($connection['PWD'])) { + unset($connection['UID'], $connection['PWD']); + } + + sqlsrv_configure('WarningsReturnAsErrors', 0); + $this->connID = sqlsrv_connect($this->hostname, $connection); + + if ($this->connID !== false) { + // Determine how identifiers are escaped + $query = $this->query('SELECT CASE WHEN (@@OPTIONS | 256) = @@OPTIONS THEN 1 ELSE 0 END AS qi'); + $query = $query->getResultObject(); + + $this->_quoted_identifier = empty($query) ? false : (bool) $query[0]->qi; + $this->escapeChar = ($this->_quoted_identifier) ? '"' : ['[', ']']; + + return $this->connID; + } + + $errors = []; + + foreach (sqlsrv_errors(SQLSRV_ERR_ERRORS) as $error) { + $errors[] = preg_replace('/(\[.+\]\[.+\](?:\[.+\])?)(.+)/', '$2', $error['message']); + } + + throw new DatabaseException(implode("\n", $errors)); + } + + /** + * Keep or establish the connection if no queries have been sent for + * a length of time exceeding the server's idle timeout. + */ + public function reconnect() + { + $this->close(); + $this->initialize(); + } + + /** + * Close the database connection. + */ + protected function _close() + { + sqlsrv_close($this->connID); + } + + /** + * Platform-dependant string escape + */ + protected function _escapeString(string $str): string + { + return str_replace("'", "''", remove_invisible_characters($str, false)); + } + + /** + * Insert ID + */ + public function insertID(): int + { + return $this->query('SELECT SCOPE_IDENTITY() AS insert_id')->getRow()->insert_id ?? 0; + } + + /** + * Generates the SQL for listing tables in a platform-dependent manner. + */ + protected function _listTables(bool $prefixLimit = false): string + { + $sql = 'SELECT [TABLE_NAME] AS "name"' + . ' FROM [INFORMATION_SCHEMA].[TABLES] ' + . ' WHERE ' + . " [TABLE_SCHEMA] = '" . $this->schema . "' "; + + if ($prefixLimit === true && $this->DBPrefix !== '') { + $sql .= " AND [TABLE_NAME] LIKE '" . $this->escapeLikeString($this->DBPrefix) . "%' " + . sprintf($this->likeEscapeStr, $this->likeEscapeChar); + } + + return $sql; + } + + /** + * Generates a platform-specific query string so that the column names can be fetched. + */ + protected function _listColumns(string $table = ''): string + { + return 'SELECT [COLUMN_NAME] ' + . ' FROM [INFORMATION_SCHEMA].[COLUMNS]' + . ' WHERE [TABLE_NAME] = ' . $this->escape($this->DBPrefix . $table) + . ' AND [TABLE_SCHEMA] = ' . $this->escape($this->schema); + } + + /** + * Returns an array of objects with index data + * + * @throws DatabaseException + * + * @return stdClass[] + */ + protected function _indexData(string $table): array + { + $sql = 'EXEC sp_helpindex ' . $this->escape($this->schema . '.' . $table); + + if (($query = $this->query($sql)) === false) { + throw new DatabaseException(lang('Database.failGetIndexData')); + } + $query = $query->getResultObject(); + + $retVal = []; + + foreach ($query as $row) { + $obj = new stdClass(); + $obj->name = $row->index_name; + + $_fields = explode(',', trim($row->index_keys)); + $obj->fields = array_map(static function ($v) { + return trim($v); + }, $_fields); + + if (strpos($row->index_description, 'primary key located on') !== false) { + $obj->type = 'PRIMARY'; + } else { + $obj->type = (strpos($row->index_description, 'nonclustered, unique') !== false) ? 'UNIQUE' : 'INDEX'; + } + + $retVal[$obj->name] = $obj; + } + + return $retVal; + } + + /** + * Returns an array of objects with Foreign key data + * referenced_object_id parent_object_id + * + * @throws DatabaseException + * + * @return stdClass[] + */ + protected function _foreignKeyData(string $table): array + { + $sql = 'SELECT ' + . 'f.name as constraint_name, ' + . 'OBJECT_NAME (f.parent_object_id) as table_name, ' + . 'COL_NAME(fc.parent_object_id,fc.parent_column_id) column_name, ' + . 'OBJECT_NAME(f.referenced_object_id) foreign_table_name, ' + . 'COL_NAME(fc.referenced_object_id,fc.referenced_column_id) foreign_column_name ' + . 'FROM ' + . 'sys.foreign_keys AS f ' + . 'INNER JOIN ' + . 'sys.foreign_key_columns AS fc ' + . 'ON f.OBJECT_ID = fc.constraint_object_id ' + . 'INNER JOIN ' + . 'sys.tables t ' + . 'ON t.OBJECT_ID = fc.referenced_object_id ' + . 'WHERE ' + . 'OBJECT_NAME (f.parent_object_id) = ' . $this->escape($table); + + if (($query = $this->query($sql)) === false) { + throw new DatabaseException(lang('Database.failGetForeignKeyData')); + } + + $query = $query->getResultObject(); + $retVal = []; + + foreach ($query as $row) { + $obj = new stdClass(); + + $obj->constraint_name = $row->constraint_name; + $obj->table_name = $row->table_name; + $obj->column_name = $row->column_name; + $obj->foreign_table_name = $row->foreign_table_name; + $obj->foreign_column_name = $row->foreign_column_name; + + $retVal[] = $obj; + } + + return $retVal; + } + + /** + * Disables foreign key checks temporarily. + * + * @return string + */ + protected function _disableForeignKeyChecks() + { + return 'EXEC sp_MSforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT ALL"'; + } + + /** + * Enables foreign key checks temporarily. + * + * @return string + */ + protected function _enableForeignKeyChecks() + { + return 'EXEC sp_MSforeachtable "ALTER TABLE ? WITH CHECK CHECK CONSTRAINT ALL"'; + } + + /** + * Returns an array of objects with field data + * + * @throws DatabaseException + * + * @return stdClass[] + */ + protected function _fieldData(string $table): array + { + $sql = 'SELECT COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, NUMERIC_PRECISION, COLUMN_DEFAULT + FROM INFORMATION_SCHEMA.COLUMNS + WHERE TABLE_NAME= ' . $this->escape(($table)); + + if (($query = $this->query($sql)) === false) { + throw new DatabaseException(lang('Database.failGetFieldData')); + } + + $query = $query->getResultObject(); + $retVal = []; + + for ($i = 0, $c = count($query); $i < $c; $i++) { + $retVal[$i] = new stdClass(); + + $retVal[$i]->name = $query[$i]->COLUMN_NAME; + $retVal[$i]->type = $query[$i]->DATA_TYPE; + $retVal[$i]->default = $query[$i]->COLUMN_DEFAULT; + + $retVal[$i]->max_length = $query[$i]->CHARACTER_MAXIMUM_LENGTH > 0 + ? $query[$i]->CHARACTER_MAXIMUM_LENGTH + : $query[$i]->NUMERIC_PRECISION; + } + + return $retVal; + } + + /** + * Begin Transaction + */ + protected function _transBegin(): bool + { + return sqlsrv_begin_transaction($this->connID); + } + + /** + * Commit Transaction + */ + protected function _transCommit(): bool + { + return sqlsrv_commit($this->connID); + } + + /** + * Rollback Transaction + */ + protected function _transRollback(): bool + { + return sqlsrv_rollback($this->connID); + } + + /** + * Returns the last error code and message. + * Must return this format: ['code' => string|int, 'message' => string] + * intval(code) === 0 means "no error". + * + * @return array + */ + public function error(): array + { + $error = [ + 'code' => '00000', + 'message' => '', + ]; + + $sqlsrvErrors = sqlsrv_errors(SQLSRV_ERR_ERRORS); + + if (! is_array($sqlsrvErrors)) { + return $error; + } + + $sqlsrvError = array_shift($sqlsrvErrors); + if (isset($sqlsrvError['SQLSTATE'])) { + $error['code'] = isset($sqlsrvError['code']) ? $sqlsrvError['SQLSTATE'] . '/' . $sqlsrvError['code'] : $sqlsrvError['SQLSTATE']; + } elseif (isset($sqlsrvError['code'])) { + $error['code'] = $sqlsrvError['code']; + } + + if (isset($sqlsrvError['message'])) { + $error['message'] = $sqlsrvError['message']; + } + + return $error; + } + + /** + * Returns the total number of rows affected by this query. + */ + public function affectedRows(): int + { + return sqlsrv_rows_affected($this->resultID); + } + + /** + * Select a specific database table to use. + * + * @return mixed + */ + public function setDatabase(?string $databaseName = null) + { + if (empty($databaseName)) { + $databaseName = $this->database; + } + + if (empty($this->connID)) { + $this->initialize(); + } + + if ($this->execute('USE ' . $this->_escapeString($databaseName))) { + $this->database = $databaseName; + $this->dataCache = []; + + return true; + } + + return false; + } + + /** + * Executes the query against the database. + * + * @return mixed + */ + protected function execute(string $sql) + { + $stmt = ($this->scrollable === false || $this->isWriteType($sql)) ? + sqlsrv_query($this->connID, $sql) : + sqlsrv_query($this->connID, $sql, [], ['Scrollable' => $this->scrollable]); + + if ($stmt === false) { + $error = $this->error(); + + log_message('error', $error['message']); + if ($this->DBDebug) { + throw new Exception($error['message']); + } + } + + return $stmt; + } + + /** + * Returns the last error encountered by this connection. + * + * @return mixed + */ + public function getError() + { + $error = [ + 'code' => '00000', + 'message' => '', + ]; + + $sqlsrvErrors = sqlsrv_errors(SQLSRV_ERR_ERRORS); + + if (! is_array($sqlsrvErrors)) { + return $error; + } + + $sqlsrvError = array_shift($sqlsrvErrors); + if (isset($sqlsrvError['SQLSTATE'])) { + $error['code'] = isset($sqlsrvError['code']) ? $sqlsrvError['SQLSTATE'] . '/' . $sqlsrvError['code'] : $sqlsrvError['SQLSTATE']; + } elseif (isset($sqlsrvError['code'])) { + $error['code'] = $sqlsrvError['code']; + } + + if (isset($sqlsrvError['message'])) { + $error['message'] = $sqlsrvError['message']; + } + + return $error; + } + + /** + * The name of the platform in use (MySQLi, mssql, etc) + */ + public function getPlatform(): string + { + return $this->DBDriver; + } + + /** + * Returns a string containing the version of the database being used. + */ + public function getVersion(): string + { + if (isset($this->dataCache['version'])) { + return $this->dataCache['version']; + } + + if (! $this->connID || empty($info = sqlsrv_server_info($this->connID))) { + $this->initialize(); + } + + return isset($info['SQLServerVersion']) ? $this->dataCache['version'] = $info['SQLServerVersion'] : false; + } + + /** + * Determines if a query is a "write" type. + * + * Overrides BaseConnection::isWriteType, adding additional read query types. + * + * @param mixed $sql + */ + public function isWriteType($sql): bool + { + if (preg_match('/^\s*"?(EXEC\s*sp_rename)\s/i', $sql)) { + return true; + } + + return parent::isWriteType($sql); + } +} diff --git a/system/Database/SQLSRV/Forge.php b/system/Database/SQLSRV/Forge.php new file mode 100644 index 0000000..14d2976 --- /dev/null +++ b/system/Database/SQLSRV/Forge.php @@ -0,0 +1,405 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Database\SQLSRV; + +use CodeIgniter\Database\BaseConnection; +use CodeIgniter\Database\Forge as BaseForge; + +/** + * Forge for SQLSRV + */ +class Forge extends BaseForge +{ + /** + * DROP CONSTRAINT statement + * + * @var string + */ + protected $dropConstraintStr; + + /** + * DROP INDEX statement + * + * @var string + */ + protected $dropIndexStr; + + /** + * CREATE DATABASE IF statement + * + * @todo missing charset, collat & check for existent + * + * @var string + */ + protected $createDatabaseIfStr = "DECLARE @DBName VARCHAR(255) = '%s'\nDECLARE @SQL VARCHAR(max) = 'IF DB_ID( ''' + @DBName + ''' ) IS NULL CREATE DATABASE ' + @DBName\nEXEC( @SQL )"; + + /** + * CREATE DATABASE IF statement + * + * @todo missing charset & collat + * + * @var string + */ + protected $createDatabaseStr = 'CREATE DATABASE %s '; + + /** + * CHECK DATABASE EXIST statement + * + * @var string + */ + protected $checkDatabaseExistStr = 'IF DB_ID( %s ) IS NOT NULL SELECT 1'; + + /** + * RENAME TABLE statement + * + * While the below statement would work, it returns an error. + * Also MS recommends dropping and dropping and re-creating the table. + * + * @see https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-rename-transact-sql?view=sql-server-2017 + * 'EXEC sp_rename %s , %s ;' + * + * @var string + */ + protected $renameTableStr; + + /** + * UNSIGNED support + * + * @var array + */ + protected $unsigned = [ + 'TINYINT' => 'SMALLINT', + 'SMALLINT' => 'INT', + 'INT' => 'BIGINT', + 'REAL' => 'FLOAT', + ]; + + /** + * CREATE TABLE IF statement + * + * @var string + */ + protected $createTableIfStr; + + /** + * CREATE TABLE statement + * + * @var string + */ + protected $createTableStr; + + public function __construct(BaseConnection $db) + { + parent::__construct($db); + + $this->createTableIfStr = 'IF NOT EXISTS' + . '(SELECT t.name, s.name as schema_name, t.type_desc ' + . 'FROM sys.tables t ' + . 'INNER JOIN sys.schemas s on s.schema_id = t.schema_id ' + . "WHERE s.name=N'" . $this->db->schema . "' " + . "AND t.name=REPLACE(N'%s', '\"', '') " + . "AND t.type_desc='USER_TABLE')\nCREATE TABLE "; + + $this->createTableStr = '%s ' . $this->db->escapeIdentifiers($this->db->schema) . ".%s (%s\n) "; + $this->renameTableStr = 'EXEC sp_rename [' . $this->db->escapeIdentifiers($this->db->schema) . '.%s] , %s ;'; + + $this->dropConstraintStr = 'ALTER TABLE ' . $this->db->escapeIdentifiers($this->db->schema) . '.%s DROP CONSTRAINT %s'; + $this->dropIndexStr = 'DROP INDEX %s ON ' . $this->db->escapeIdentifiers($this->db->schema) . '.%s'; + } + + /** + * CREATE TABLE attributes + */ + protected function _createTableAttributes(array $attributes): string + { + return ''; + } + + /** + * @param mixed $field + * + * @return false|string|string[] + */ + protected function _alterTable(string $alterType, string $table, $field) + { + + // Handle DROP here + if ($alterType === 'DROP') { + // check if fields are part of any indexes + $indexData = $this->db->getIndexData($table); + + foreach ($indexData as $index) { + if (is_string($field)) { + $field = explode(',', $field); + } + + $fld = array_intersect($field, $index->fields); + + // Drop index if field is part of an index + if (! empty($fld)) { + $this->_dropIndex($table, $index); + } + } + + $sql = 'ALTER TABLE ' . $this->db->escapeIdentifiers($this->db->schema) . '.' . $this->db->escapeIdentifiers($table) . ' DROP '; + + $fields = array_map(static function ($item) { + return 'COLUMN [' . trim($item) . ']'; + }, (array) $field); + + return $sql . implode(',', $fields); + } + + $sql = 'ALTER TABLE ' . $this->db->escapeIdentifiers($this->db->schema) . '.' . $this->db->escapeIdentifiers($table); + $sql .= ($alterType === 'ADD') ? 'ADD ' : ' '; + + $sqls = []; + + if ($alterType === 'ADD') { + foreach ($field as $data) { + $sqls[] = $sql . ($data['_literal'] !== false ? $data['_literal'] : $this->_processColumn($data)); + } + + return $sqls; + } + + foreach ($field as $data) { + if ($data['_literal'] !== false) { + return false; + } + + if (isset($data['type'])) { + $sqls[] = $sql . ' ALTER COLUMN ' . $this->db->escapeIdentifiers($data['name']) + . " {$data['type']}{$data['length']}"; + } + + if (! empty($data['default'])) { + $sqls[] = $sql . ' ALTER COLUMN ADD CONSTRAINT ' . $this->db->escapeIdentifiers($data['name']) . '_def' + . " DEFAULT {$data['default']} FOR " . $this->db->escapeIdentifiers($data['name']); + } + + if (isset($data['null'])) { + $sqls[] = $sql . ' ALTER COLUMN ' . $this->db->escapeIdentifiers($data['name']) + . ($data['null'] === true ? ' DROP' : '') . " {$data['type']}{$data['length']} NOT NULL"; + } + + if (! empty($data['comment'])) { + $sqls[] = 'EXEC sys.sp_addextendedproperty ' + . "@name=N'Caption', @value=N'" . $data['comment'] . "' , " + . "@level0type=N'SCHEMA',@level0name=N'" . $this->db->schema . "', " + . "@level1type=N'TABLE',@level1name=N'" . $this->db->escapeIdentifiers($table) . "', " + . "@level2type=N'COLUMN',@level2name=N'" . $this->db->escapeIdentifiers($data['name']) . "'"; + } + + if (! empty($data['new_name'])) { + $sqls[] = "EXEC sp_rename '[" . $this->db->schema . '].[' . $table . '].[' . $data['name'] . "]' , '" . $data['new_name'] . "', 'COLUMN';"; + } + } + + return $sqls; + } + + /** + * Drop index for table + * + * @return mixed + */ + protected function _dropIndex(string $table, object $indexData) + { + if ($indexData->type === 'PRIMARY') { + $sql = 'ALTER TABLE [' . $this->db->schema . '].[' . $table . '] DROP [' . $indexData->name . ']'; + } else { + $sql = 'DROP INDEX [' . $indexData->name . '] ON [' . $this->db->schema . '].[' . $table . ']'; + } + + return $this->db->simpleQuery($sql); + } + + /** + * Process indexes + * + * @return array|string + */ + protected function _processIndexes(string $table) + { + $sqls = []; + + for ($i = 0, $c = count($this->keys); $i < $c; $i++) { + $this->keys[$i] = (array) $this->keys[$i]; + + for ($i2 = 0, $c2 = count($this->keys[$i]); $i2 < $c2; $i2++) { + if (! isset($this->fields[$this->keys[$i][$i2]])) { + unset($this->keys[$i][$i2]); + } + } + + if (count($this->keys[$i]) <= 0) { + continue; + } + + if (in_array($i, $this->uniqueKeys, true)) { + $sqls[] = 'ALTER TABLE ' + . $this->db->escapeIdentifiers($this->db->schema) . '.' . $this->db->escapeIdentifiers($table) + . ' ADD CONSTRAINT ' . $this->db->escapeIdentifiers($table . '_' . implode('_', $this->keys[$i])) + . ' UNIQUE (' . implode(', ', $this->db->escapeIdentifiers($this->keys[$i])) . ');'; + + continue; + } + + $sqls[] = 'CREATE INDEX ' + . $this->db->escapeIdentifiers($table . '_' . implode('_', $this->keys[$i])) + . ' ON ' . $this->db->escapeIdentifiers($this->db->schema) . '.' . $this->db->escapeIdentifiers($table) + . ' (' . implode(', ', $this->db->escapeIdentifiers($this->keys[$i])) . ');'; + } + + return $sqls; + } + + /** + * Process column + */ + protected function _processColumn(array $field): string + { + return $this->db->escapeIdentifiers($field['name']) + . (empty($field['new_name']) ? '' : ' ' . $this->db->escapeIdentifiers($field['new_name'])) + . ' ' . $field['type'] . $field['length'] + . $field['default'] + . $field['null'] + . $field['auto_increment'] + . '' + . $field['unique']; + } + + /** + * Process foreign keys + * + * @param string $table Table name + */ + protected function _processForeignKeys(string $table): string + { + $sql = ''; + + $allowActions = ['CASCADE', 'SET NULL', 'NO ACTION', 'RESTRICT', 'SET DEFAULT']; + + foreach ($this->foreignKeys as $fkey) { + $nameIndex = $table . '_' . implode('_', $fkey['field']) . '_foreign'; + $nameIndexFilled = $this->db->escapeIdentifiers($nameIndex); + $foreignKeyFilled = implode(', ', $this->db->escapeIdentifiers($fkey['field'])); + $referenceTableFilled = $this->db->escapeIdentifiers($this->db->DBPrefix . $fkey['referenceTable']); + $referenceFieldFilled = implode(', ', $this->db->escapeIdentifiers($fkey['referenceField'])); + + $formatSql = ",\n\tCONSTRAINT %s FOREIGN KEY (%s) REFERENCES %s(%s)"; + $sql .= sprintf($formatSql, $nameIndexFilled, $foreignKeyFilled, $referenceTableFilled, $referenceFieldFilled); + + if ($fkey['onDelete'] !== false && in_array($fkey['onDelete'], $allowActions, true)) { + $sql .= ' ON DELETE ' . $fkey['onDelete']; + } + + if ($fkey['onUpdate'] !== false && in_array($fkey['onUpdate'], $allowActions, true)) { + $sql .= ' ON UPDATE ' . $fkey['onUpdate']; + } + } + + return $sql; + } + + /** + * Process primary keys + */ + protected function _processPrimaryKeys(string $table): string + { + for ($i = 0, $c = count($this->primaryKeys); $i < $c; $i++) { + if (! isset($this->fields[$this->primaryKeys[$i]])) { + unset($this->primaryKeys[$i]); + } + } + + if ($this->primaryKeys !== []) { + $sql = ",\n\tCONSTRAINT " . $this->db->escapeIdentifiers('pk_' . $table) + . ' PRIMARY KEY(' . implode(', ', $this->db->escapeIdentifiers($this->primaryKeys)) . ')'; + } + + return $sql ?? ''; + } + + /** + * Performs a data type mapping between different databases. + */ + protected function _attributeType(array &$attributes) + { + // Reset field lengths for data types that don't support it + if (isset($attributes['CONSTRAINT']) && stripos($attributes['TYPE'], 'int') !== false) { + $attributes['CONSTRAINT'] = null; + } + + switch (strtoupper($attributes['TYPE'])) { + case 'MEDIUMINT': + $attributes['TYPE'] = 'INTEGER'; + $attributes['UNSIGNED'] = false; + break; + + case 'INTEGER': + $attributes['TYPE'] = 'INT'; + break; + + case 'ENUM': + $attributes['TYPE'] = 'TEXT'; + $attributes['CONSTRAINT'] = null; + break; + + case 'TIMESTAMP': + $attributes['TYPE'] = 'DATETIME'; + break; + + case 'BOOLEAN': + $attributes['TYPE'] = 'BIT'; + break; + + default: + break; + } + } + + /** + * Field attribute AUTO_INCREMENT + */ + protected function _attributeAutoIncrement(array &$attributes, array &$field) + { + if (! empty($attributes['AUTO_INCREMENT']) && $attributes['AUTO_INCREMENT'] === true && stripos($field['type'], 'INT') !== false) { + $field['auto_increment'] = ' IDENTITY(1,1)'; + } + } + + /** + * Generates a platform-specific DROP TABLE string + * + * @todo Support for cascade + */ + protected function _dropTable(string $table, bool $ifExists, bool $cascade): string + { + $sql = 'DROP TABLE'; + + if ($ifExists) { + $sql .= ' IF EXISTS '; + } + + $table = ' [' . $this->db->database . '].[' . $this->db->schema . '].[' . $table . '] '; + + $sql .= $table; + + if ($cascade) { + $sql .= ''; + } + + return $sql; + } +} diff --git a/system/Database/SQLSRV/PreparedQuery.php b/system/Database/SQLSRV/PreparedQuery.php new file mode 100644 index 0000000..e91fa78 --- /dev/null +++ b/system/Database/SQLSRV/PreparedQuery.php @@ -0,0 +1,114 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Database\SQLSRV; + +use BadMethodCallException; +use CodeIgniter\Database\BasePreparedQuery; +use Exception; + +/** + * Prepared query for Postgre + */ +class PreparedQuery extends BasePreparedQuery +{ + /** + * Parameters array used to store the dynamic variables. + * + * @var array + */ + protected $parameters = []; + + /** + * The result boolean from a sqlsrv_execute. + * + * @var bool + */ + protected $result; + + /** + * Prepares the query against the database, and saves the connection + * info necessary to execute the query later. + * + * NOTE: This version is based on SQL code. Child classes should + * override this method. + * + * @param array $options Options takes an associative array; + * + * @throws Exception + * + * @return mixed + */ + public function _prepare(string $sql, array $options = []) + { + // Prepare parameters for the query + $queryString = $this->getQueryString(); + + $parameters = $this->parameterize($queryString); + + // Prepare the query + $this->statement = sqlsrv_prepare($this->db->connID, $sql, $parameters); + + if (! $this->statement) { + $info = $this->db->error(); + $this->errorCode = $info['code']; + $this->errorString = $info['message']; + } + + return $this; + } + + /** + * Takes a new set of data and runs it against the currently + * prepared query. Upon success, will return a Results object. + */ + public function _execute(array $data): bool + { + if (! isset($this->statement)) { + throw new BadMethodCallException('You must call prepare before trying to execute a prepared statement.'); + } + + foreach ($data as $key => $value) { + $this->parameters[$key] = $value; + } + + $this->result = sqlsrv_execute($this->statement); + + return (bool) $this->result; + } + + /** + * Returns the result object for the prepared query. + * + * @return mixed + */ + public function _getResult() + { + return $this->result; + } + + /** + * Handle parameters + */ + protected function parameterize(string $queryString): array + { + $numberOfVariables = substr_count($queryString, '?'); + + $params = []; + + for ($c = 0; $c < $numberOfVariables; $c++) { + $this->parameters[$c] = null; + $params[] = &$this->parameters[$c]; + } + + return $params; + } +} diff --git a/system/Database/SQLSRV/Result.php b/system/Database/SQLSRV/Result.php new file mode 100644 index 0000000..2a55e45 --- /dev/null +++ b/system/Database/SQLSRV/Result.php @@ -0,0 +1,170 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Database\SQLSRV; + +use CodeIgniter\Database\BaseResult; +use CodeIgniter\Entity\Entity; +use stdClass; + +/** + * Result for SQLSRV + */ +class Result extends BaseResult +{ + /** + * Gets the number of fields in the result set. + */ + public function getFieldCount(): int + { + return @sqlsrv_num_fields($this->resultID); + } + + /** + * Generates an array of column names in the result set. + */ + public function getFieldNames(): array + { + $fieldNames = []; + + foreach (sqlsrv_field_metadata($this->resultID) as $field) { + $fieldNames[] = $field['Name']; + } + + return $fieldNames; + } + + /** + * Generates an array of objects representing field meta-data. + */ + public function getFieldData(): array + { + static $dataTypes = [ + SQLSRV_SQLTYPE_BIGINT => 'bigint', + SQLSRV_SQLTYPE_BIT => 'bit', + SQLSRV_SQLTYPE_CHAR => 'char', + + SQLSRV_SQLTYPE_DATE => 'date', + SQLSRV_SQLTYPE_DATETIME => 'datetime', + SQLSRV_SQLTYPE_DATETIME2 => 'datetime2', + SQLSRV_SQLTYPE_DATETIMEOFFSET => 'datetimeoffset', + + SQLSRV_SQLTYPE_DECIMAL => 'decimal', + SQLSRV_SQLTYPE_FLOAT => 'float', + + SQLSRV_SQLTYPE_IMAGE => 'image', + SQLSRV_SQLTYPE_INT => 'int', + SQLSRV_SQLTYPE_MONEY => 'money', + SQLSRV_SQLTYPE_NCHAR => 'nchar', + SQLSRV_SQLTYPE_NUMERIC => 'numeric', + + SQLSRV_SQLTYPE_NVARCHAR => 'nvarchar', + SQLSRV_SQLTYPE_NTEXT => 'ntext', + + SQLSRV_SQLTYPE_REAL => 'real', + SQLSRV_SQLTYPE_SMALLDATETIME => 'smalldatetime', + SQLSRV_SQLTYPE_SMALLINT => 'smallint', + SQLSRV_SQLTYPE_SMALLMONEY => 'smallmoney', + SQLSRV_SQLTYPE_TEXT => 'text', + + SQLSRV_SQLTYPE_TIME => 'time', + SQLSRV_SQLTYPE_TIMESTAMP => 'timestamp', + SQLSRV_SQLTYPE_TINYINT => 'tinyint', + SQLSRV_SQLTYPE_UNIQUEIDENTIFIER => 'uniqueidentifier', + SQLSRV_SQLTYPE_UDT => 'udt', + SQLSRV_SQLTYPE_VARBINARY => 'varbinary', + SQLSRV_SQLTYPE_VARCHAR => 'varchar', + SQLSRV_SQLTYPE_XML => 'xml', + ]; + + $retVal = []; + + foreach (sqlsrv_field_metadata($this->resultID) as $i => $field) { + $retVal[$i] = new stdClass(); + + $retVal[$i]->name = $field['Name']; + $retVal[$i]->type = $field['Type']; + $retVal[$i]->type_name = $dataTypes[$field['Type']] ?? null; + $retVal[$i]->max_length = $field['Size']; + } + + return $retVal; + } + + /** + * Frees the current result. + */ + public function freeResult() + { + if (is_resource($this->resultID)) { + sqlsrv_free_stmt($this->resultID); + $this->resultID = false; + } + } + + /** + * Moves the internal pointer to the desired offset. This is called + * internally before fetching results to make sure the result set + * starts at zero. + * + * @return mixed + */ + public function dataSeek(int $n = 0) + { + if ($n > 0) { + for ($i = 0; $i < $n; $i++) { + if (sqlsrv_fetch($this->resultID) === false) { + return false; + } + } + } + + return true; + } + + /** + * Returns the result set as an array. + * + * Overridden by driver classes. + * + * @return mixed + */ + protected function fetchAssoc() + { + return sqlsrv_fetch_array($this->resultID, SQLSRV_FETCH_ASSOC); + } + + /** + * Returns the result set as an object. + * + * @return bool|Entity|object + */ + protected function fetchObject(string $className = 'stdClass') + { + if (is_subclass_of($className, Entity::class)) { + return empty($data = $this->fetchAssoc()) ? false : (new $className())->setAttributes($data); + } + + return sqlsrv_fetch_object($this->resultID, $className); + } + + /** + * Returns the number of rows in the resultID (i.e., SQLSRV query result resource) + */ + public function getNumRows(): int + { + if (! is_int($this->numRows)) { + $this->numRows = sqlsrv_num_rows($this->resultID); + } + + return $this->numRows; + } +} diff --git a/system/Database/SQLSRV/Utils.php b/system/Database/SQLSRV/Utils.php new file mode 100644 index 0000000..cf94d3d --- /dev/null +++ b/system/Database/SQLSRV/Utils.php @@ -0,0 +1,53 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Database\SQLSRV; + +use CodeIgniter\Database\BaseUtils; +use CodeIgniter\Database\ConnectionInterface; +use CodeIgniter\Database\Exceptions\DatabaseException; + +/** + * Utils for SQLSRV + */ +class Utils extends BaseUtils +{ + /** + * List databases statement + * + * @var string + */ + protected $listDatabases = 'EXEC sp_helpdb'; // Can also be: EXEC sp_databases + + /** + * OPTIMIZE TABLE statement + * + * @var string + */ + protected $optimizeTable = 'ALTER INDEX all ON %s REORGANIZE'; + + public function __construct(ConnectionInterface &$db) + { + parent::__construct($db); + + $this->optimizeTable = 'ALTER INDEX all ON ' . $this->db->schema . '.%s REORGANIZE'; + } + + /** + * Platform dependent version of the backup function. + * + * @return mixed + */ + public function _backup(?array $prefs = null) + { + throw new DatabaseException('Unsupported feature of the database platform you are using.'); + } +} diff --git a/system/Database/SQLite3/Builder.php b/system/Database/SQLite3/Builder.php new file mode 100644 index 0000000..588d2d0 --- /dev/null +++ b/system/Database/SQLite3/Builder.php @@ -0,0 +1,73 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Database\SQLite3; + +use CodeIgniter\Database\BaseBuilder; + +/** + * Builder for SQLite3 + */ +class Builder extends BaseBuilder +{ + /** + * Default installs of SQLite typically do not + * support limiting delete clauses. + * + * @var bool + */ + protected $canLimitDeletes = false; + + /** + * Default installs of SQLite do no support + * limiting update queries in combo with WHERE. + * + * @var bool + */ + protected $canLimitWhereUpdates = false; + + /** + * ORDER BY random keyword + * + * @var array + */ + protected $randomKeyword = [ + 'RANDOM()', + ]; + + /** + * @var array + */ + protected $supportedIgnoreStatements = [ + 'insert' => 'OR IGNORE', + ]; + + /** + * Replace statement + * + * Generates a platform-specific replace string from the supplied data + */ + protected function _replace(string $table, array $keys, array $values): string + { + return 'INSERT OR ' . parent::_replace($table, $keys, $values); + } + + /** + * Generates a platform-specific truncate string from the supplied data + * + * If the database does not support the TRUNCATE statement, + * then this method maps to 'DELETE FROM table' + */ + protected function _truncate(string $table): string + { + return 'DELETE FROM ' . $table; + } +} diff --git a/system/Database/SQLite3/Connection.php b/system/Database/SQLite3/Connection.php new file mode 100644 index 0000000..39fbca8 --- /dev/null +++ b/system/Database/SQLite3/Connection.php @@ -0,0 +1,396 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Database\SQLite3; + +use CodeIgniter\Database\BaseConnection; +use CodeIgniter\Database\Exceptions\DatabaseException; +use ErrorException; +use Exception; +use SQLite3; +use stdClass; + +/** + * Connection for SQLite3 + */ +class Connection extends BaseConnection +{ + /** + * Database driver + * + * @var string + */ + public $DBDriver = 'SQLite3'; + + /** + * Identifier escape character + * + * @var string + */ + public $escapeChar = '`'; + + /** + * Connect to the database. + * + * @throws DatabaseException + * + * @return mixed + */ + public function connect(bool $persistent = false) + { + if ($persistent && $this->DBDebug) { + throw new DatabaseException('SQLite3 doesn\'t support persistent connections.'); + } + + try { + if ($this->database !== ':memory:' && strpos($this->database, DIRECTORY_SEPARATOR) === false) { + $this->database = WRITEPATH . $this->database; + } + + return (! $this->password) + ? new SQLite3($this->database) + : new SQLite3($this->database, SQLITE3_OPEN_READWRITE | SQLITE3_OPEN_CREATE, $this->password); + } catch (Exception $e) { + throw new DatabaseException('SQLite3 error: ' . $e->getMessage()); + } + } + + /** + * Keep or establish the connection if no queries have been sent for + * a length of time exceeding the server's idle timeout. + */ + public function reconnect() + { + $this->close(); + $this->initialize(); + } + + /** + * Close the database connection. + */ + protected function _close() + { + $this->connID->close(); + } + + /** + * Select a specific database table to use. + */ + public function setDatabase(string $databaseName): bool + { + return false; + } + + /** + * Returns a string containing the version of the database being used. + */ + public function getVersion(): string + { + if (isset($this->dataCache['version'])) { + return $this->dataCache['version']; + } + + $version = SQLite3::version(); + + return $this->dataCache['version'] = $version['versionString']; + } + + /** + * Execute the query + * + * @return mixed \SQLite3Result object or bool + */ + protected function execute(string $sql) + { + try { + return $this->isWriteType($sql) + ? $this->connID->exec($sql) + : $this->connID->query($sql); + } catch (ErrorException $e) { + log_message('error', $e); + if ($this->DBDebug) { + throw $e; + } + } + + return false; + } + + /** + * Returns the total number of rows affected by this query. + */ + public function affectedRows(): int + { + return $this->connID->changes(); + } + + /** + * Platform-dependant string escape + */ + protected function _escapeString(string $str): string + { + return $this->connID->escapeString($str); + } + + /** + * Generates the SQL for listing tables in a platform-dependent manner. + */ + protected function _listTables(bool $prefixLimit = false): string + { + return 'SELECT "NAME" FROM "SQLITE_MASTER" WHERE "TYPE" = \'table\'' + . ' AND "NAME" NOT LIKE \'sqlite!_%\' ESCAPE \'!\'' + . (($prefixLimit !== false && $this->DBPrefix !== '') + ? ' AND "NAME" LIKE \'' . $this->escapeLikeString($this->DBPrefix) . '%\' ' . sprintf($this->likeEscapeStr, $this->likeEscapeChar) + : ''); + } + + /** + * Generates a platform-specific query string so that the column names can be fetched. + */ + protected function _listColumns(string $table = ''): string + { + return 'PRAGMA TABLE_INFO(' . $this->protectIdentifiers($table, true, null, false) . ')'; + } + + /** + * @throws DatabaseException + * + * @return array|false + */ + public function getFieldNames(string $table) + { + // Is there a cached result? + if (isset($this->dataCache['field_names'][$table])) { + return $this->dataCache['field_names'][$table]; + } + + if (empty($this->connID)) { + $this->initialize(); + } + + $sql = $this->_listColumns($table); + + $query = $this->query($sql); + $this->dataCache['field_names'][$table] = []; + + foreach ($query->getResultArray() as $row) { + // Do we know from where to get the column's name? + if (! isset($key)) { + if (isset($row['column_name'])) { + $key = 'column_name'; + } elseif (isset($row['COLUMN_NAME'])) { + $key = 'COLUMN_NAME'; + } elseif (isset($row['name'])) { + $key = 'name'; + } else { + // We have no other choice but to just get the first element's key. + $key = key($row); + } + } + + $this->dataCache['field_names'][$table][] = $row[$key]; + } + + return $this->dataCache['field_names'][$table]; + } + + /** + * Returns an array of objects with field data + * + * @throws DatabaseException + * + * @return stdClass[] + */ + protected function _fieldData(string $table): array + { + if (false === $query = $this->query('PRAGMA TABLE_INFO(' . $this->protectIdentifiers($table, true, null, false) . ')')) { + throw new DatabaseException(lang('Database.failGetFieldData')); + } + + $query = $query->getResultObject(); + + if (empty($query)) { + return []; + } + + $retVal = []; + + for ($i = 0, $c = count($query); $i < $c; $i++) { + $retVal[$i] = new stdClass(); + + $retVal[$i]->name = $query[$i]->name; + $retVal[$i]->type = $query[$i]->type; + $retVal[$i]->max_length = null; + $retVal[$i]->default = $query[$i]->dflt_value; + $retVal[$i]->primary_key = isset($query[$i]->pk) && (bool) $query[$i]->pk; + $retVal[$i]->nullable = isset($query[$i]->notnull) && ! (bool) $query[$i]->notnull; + } + + return $retVal; + } + + /** + * Returns an array of objects with index data + * + * @throws DatabaseException + * + * @return stdClass[] + */ + protected function _indexData(string $table): array + { + // Get indexes + // Don't use PRAGMA index_list, so we can preserve index order + $sql = "SELECT name FROM sqlite_master WHERE type='index' AND tbl_name=" . $this->escape(strtolower($table)); + if (($query = $this->query($sql)) === false) { + throw new DatabaseException(lang('Database.failGetIndexData')); + } + $query = $query->getResultObject(); + + $retVal = []; + + foreach ($query as $row) { + $obj = new stdClass(); + + $obj->name = $row->name; + + // Get fields for index + $obj->fields = []; + + if (false === $fields = $this->query('PRAGMA index_info(' . $this->escape(strtolower($row->name)) . ')')) { + throw new DatabaseException(lang('Database.failGetIndexData')); + } + + $fields = $fields->getResultObject(); + + foreach ($fields as $field) { + $obj->fields[] = $field->name; + } + + $retVal[$obj->name] = $obj; + } + + return $retVal; + } + + /** + * Returns an array of objects with Foreign key data + * + * @return stdClass[] + */ + protected function _foreignKeyData(string $table): array + { + if ($this->supportsForeignKeys() !== true) { + return []; + } + + $tables = $this->listTables(); + + if (empty($tables)) { + return []; + } + + $retVal = []; + + foreach ($tables as $table) { + $query = $this->query("PRAGMA foreign_key_list({$table})")->getResult(); + + foreach ($query as $row) { + $obj = new stdClass(); + $obj->constraint_name = $row->from . ' to ' . $row->table . '.' . $row->to; + $obj->table_name = $table; + $obj->foreign_table_name = $row->table; + $obj->sequence = $row->seq; + + $retVal[] = $obj; + } + } + + return $retVal; + } + + /** + * Returns platform-specific SQL to disable foreign key checks. + * + * @return string + */ + protected function _disableForeignKeyChecks() + { + return 'PRAGMA foreign_keys = OFF'; + } + + /** + * Returns platform-specific SQL to enable foreign key checks. + * + * @return string + */ + protected function _enableForeignKeyChecks() + { + return 'PRAGMA foreign_keys = ON'; + } + + /** + * Returns the last error code and message. + * Must return this format: ['code' => string|int, 'message' => string] + * intval(code) === 0 means "no error". + * + * @return array + */ + public function error(): array + { + return [ + 'code' => $this->connID->lastErrorCode(), + 'message' => $this->connID->lastErrorMsg(), + ]; + } + + /** + * Insert ID + */ + public function insertID(): int + { + return $this->connID->lastInsertRowID(); + } + + /** + * Begin Transaction + */ + protected function _transBegin(): bool + { + return $this->connID->exec('BEGIN TRANSACTION'); + } + + /** + * Commit Transaction + */ + protected function _transCommit(): bool + { + return $this->connID->exec('END TRANSACTION'); + } + + /** + * Rollback Transaction + */ + protected function _transRollback(): bool + { + return $this->connID->exec('ROLLBACK'); + } + + /** + * Checks to see if the current install supports Foreign Keys + * and has them enabled. + */ + public function supportsForeignKeys(): bool + { + $result = $this->simpleQuery('PRAGMA foreign_keys'); + + return (bool) $result; + } +} diff --git a/system/Database/SQLite3/Forge.php b/system/Database/SQLite3/Forge.php new file mode 100644 index 0000000..1f48f20 --- /dev/null +++ b/system/Database/SQLite3/Forge.php @@ -0,0 +1,254 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Database\SQLite3; + +use CodeIgniter\Database\BaseConnection; +use CodeIgniter\Database\Exceptions\DatabaseException; +use CodeIgniter\Database\Forge as BaseForge; + +/** + * Forge for SQLite3 + */ +class Forge extends BaseForge +{ + /** + * DROP INDEX statement + * + * @var string + */ + protected $dropIndexStr = 'DROP INDEX %s'; + + /** + * @var Connection + */ + protected $db; + + /** + * UNSIGNED support + * + * @var array|bool + */ + protected $_unsigned = false; + + /** + * NULL value representation in CREATE/ALTER TABLE statements + * + * @var string + * + * @internal + */ + protected $null = 'NULL'; + + /** + * Constructor. + */ + public function __construct(BaseConnection $db) + { + parent::__construct($db); + + if (version_compare($this->db->getVersion(), '3.3', '<')) { + $this->createTableIfStr = false; + $this->dropTableIfStr = false; + } + } + + /** + * Create database + * + * @param bool $ifNotExists Whether to add IF NOT EXISTS condition + */ + public function createDatabase(string $dbName, bool $ifNotExists = false): bool + { + // In SQLite, a database is created when you connect to the database. + // We'll return TRUE so that an error isn't generated. + return true; + } + + /** + * Drop database + * + * @throws DatabaseException + */ + public function dropDatabase(string $dbName): bool + { + // In SQLite, a database is dropped when we delete a file + if (! is_file($dbName)) { + if ($this->db->DBDebug) { + throw new DatabaseException('Unable to drop the specified database.'); + } + + return false; + } + + // We need to close the pseudo-connection first + $this->db->close(); + if (! @unlink($dbName)) { + if ($this->db->DBDebug) { + throw new DatabaseException('Unable to drop the specified database.'); + } + + return false; + } + + if (! empty($this->db->dataCache['db_names'])) { + $key = array_search(strtolower($dbName), array_map('strtolower', $this->db->dataCache['db_names']), true); + if ($key !== false) { + unset($this->db->dataCache['db_names'][$key]); + } + } + + return true; + } + + /** + * @param mixed $field + * + * @return array|string|null + */ + protected function _alterTable(string $alterType, string $table, $field) + { + switch ($alterType) { + case 'DROP': + $sqlTable = new Table($this->db, $this); + + $sqlTable->fromTable($table) + ->dropColumn($field) + ->run(); + + return ''; + + case 'CHANGE': + (new Table($this->db, $this)) + ->fromTable($table) + ->modifyColumn($field) + ->run(); + + return null; + + default: + return parent::_alterTable($alterType, $table, $field); + } + } + + /** + * Process column + */ + protected function _processColumn(array $field): string + { + if ($field['type'] === 'TEXT' && strpos($field['length'], "('") === 0) { + $field['type'] .= ' CHECK(' . $this->db->escapeIdentifiers($field['name']) + . ' IN ' . $field['length'] . ')'; + } + + return $this->db->escapeIdentifiers($field['name']) + . ' ' . $field['type'] + . $field['auto_increment'] + . $field['null'] + . $field['unique'] + . $field['default']; + } + + /** + * Process indexes + */ + protected function _processIndexes(string $table): array + { + $sqls = []; + + for ($i = 0, $c = count($this->keys); $i < $c; $i++) { + $this->keys[$i] = (array) $this->keys[$i]; + + for ($i2 = 0, $c2 = count($this->keys[$i]); $i2 < $c2; $i2++) { + if (! isset($this->fields[$this->keys[$i][$i2]])) { + unset($this->keys[$i][$i2]); + } + } + if (count($this->keys[$i]) <= 0) { + continue; + } + + if (in_array($i, $this->uniqueKeys, true)) { + $sqls[] = 'CREATE UNIQUE INDEX ' . $this->db->escapeIdentifiers($table . '_' . implode('_', $this->keys[$i])) + . ' ON ' . $this->db->escapeIdentifiers($table) + . ' (' . implode(', ', $this->db->escapeIdentifiers($this->keys[$i])) . ');'; + + continue; + } + + $sqls[] = 'CREATE INDEX ' . $this->db->escapeIdentifiers($table . '_' . implode('_', $this->keys[$i])) + . ' ON ' . $this->db->escapeIdentifiers($table) + . ' (' . implode(', ', $this->db->escapeIdentifiers($this->keys[$i])) . ');'; + } + + return $sqls; + } + + /** + * Field attribute TYPE + * + * Performs a data type mapping between different databases. + */ + protected function _attributeType(array &$attributes) + { + switch (strtoupper($attributes['TYPE'])) { + case 'ENUM': + case 'SET': + $attributes['TYPE'] = 'TEXT'; + break; + + case 'BOOLEAN': + $attributes['TYPE'] = 'INT'; + break; + + default: + break; + } + } + + /** + * Field attribute AUTO_INCREMENT + */ + protected function _attributeAutoIncrement(array &$attributes, array &$field) + { + if (! empty($attributes['AUTO_INCREMENT']) && $attributes['AUTO_INCREMENT'] === true + && stripos($field['type'], 'int') !== false) { + $field['type'] = 'INTEGER PRIMARY KEY'; + $field['default'] = ''; + $field['null'] = ''; + $field['unique'] = ''; + $field['auto_increment'] = ' AUTOINCREMENT'; + + $this->primaryKeys = []; + } + } + + /** + * Foreign Key Drop + * + * @throws DatabaseException + */ + public function dropForeignKey(string $table, string $foreignName): bool + { + // If this version of SQLite doesn't support it, we're done here + if ($this->db->supportsForeignKeys() !== true) { + return true; + } + + // Otherwise we have to copy the table and recreate + // without the foreign key being involved now + $sqlTable = new Table($this->db, $this); + + return $sqlTable->fromTable($this->db->DBPrefix . $table) + ->dropForeignKey($foreignName) + ->run(); + } +} diff --git a/system/Database/SQLite3/PreparedQuery.php b/system/Database/SQLite3/PreparedQuery.php new file mode 100644 index 0000000..7dada92 --- /dev/null +++ b/system/Database/SQLite3/PreparedQuery.php @@ -0,0 +1,91 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Database\SQLite3; + +use BadMethodCallException; +use CodeIgniter\Database\BasePreparedQuery; + +/** + * Prepared query for SQLite3 + */ +class PreparedQuery extends BasePreparedQuery +{ + /** + * The SQLite3Result resource, or false. + * + * @var bool|Result + */ + protected $result; + + /** + * Prepares the query against the database, and saves the connection + * info necessary to execute the query later. + * + * NOTE: This version is based on SQL code. Child classes should + * override this method. + * + * @param array $options Passed to the connection's prepare statement. + * Unused in the MySQLi driver. + * + * @return $this + */ + public function _prepare(string $sql, array $options = []) + { + if (! ($this->statement = $this->db->connID->prepare($sql))) { + $this->errorCode = $this->db->connID->lastErrorCode(); + $this->errorString = $this->db->connID->lastErrorMsg(); + } + + return $this; + } + + /** + * Takes a new set of data and runs it against the currently + * prepared query. Upon success, will return a Results object. + * + * @todo finalize() + */ + public function _execute(array $data): bool + { + if (! isset($this->statement)) { + throw new BadMethodCallException('You must call prepare before trying to execute a prepared statement.'); + } + + foreach ($data as $key => $item) { + // Determine the type string + if (is_int($item)) { + $bindType = SQLITE3_INTEGER; + } elseif (is_float($item)) { + $bindType = SQLITE3_FLOAT; + } else { + $bindType = SQLITE3_TEXT; + } + + // Bind it + $this->statement->bindValue($key + 1, $item, $bindType); + } + + $this->result = $this->statement->execute(); + + return $this->result !== false; + } + + /** + * Returns the result object for the prepared query. + * + * @return mixed + */ + public function _getResult() + { + return $this->result; + } +} diff --git a/system/Database/SQLite3/Result.php b/system/Database/SQLite3/Result.php new file mode 100644 index 0000000..6afc04c --- /dev/null +++ b/system/Database/SQLite3/Result.php @@ -0,0 +1,152 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Database\SQLite3; + +use Closure; +use CodeIgniter\Database\BaseResult; +use CodeIgniter\Database\Exceptions\DatabaseException; +use CodeIgniter\Entity\Entity; +use stdClass; + +/** + * Result for SQLite3 + */ +class Result extends BaseResult +{ + /** + * Gets the number of fields in the result set. + */ + public function getFieldCount(): int + { + return $this->resultID->numColumns(); + } + + /** + * Generates an array of column names in the result set. + */ + public function getFieldNames(): array + { + $fieldNames = []; + + for ($i = 0, $c = $this->getFieldCount(); $i < $c; $i++) { + $fieldNames[] = $this->resultID->columnName($i); + } + + return $fieldNames; + } + + /** + * Generates an array of objects representing field meta-data. + */ + public function getFieldData(): array + { + static $dataTypes = [ + SQLITE3_INTEGER => 'integer', + SQLITE3_FLOAT => 'float', + SQLITE3_TEXT => 'text', + SQLITE3_BLOB => 'blob', + SQLITE3_NULL => 'null', + ]; + + $retVal = []; + $this->resultID->fetchArray(SQLITE3_NUM); + + for ($i = 0, $c = $this->getFieldCount(); $i < $c; $i++) { + $retVal[$i] = new stdClass(); + $retVal[$i]->name = $this->resultID->columnName($i); + $type = $this->resultID->columnType($i); + $retVal[$i]->type = $type; + $retVal[$i]->type_name = $dataTypes[$type] ?? null; + $retVal[$i]->max_length = null; + $retVal[$i]->length = null; + } + $this->resultID->reset(); + + return $retVal; + } + + /** + * Frees the current result. + */ + public function freeResult() + { + if (is_object($this->resultID)) { + $this->resultID->finalize(); + $this->resultID = false; + } + } + + /** + * Moves the internal pointer to the desired offset. This is called + * internally before fetching results to make sure the result set + * starts at zero. + * + * @throws DatabaseException + * + * @return mixed + */ + public function dataSeek(int $n = 0) + { + if ($n !== 0) { + throw new DatabaseException('SQLite3 doesn\'t support seeking to other offset.'); + } + + return $this->resultID->reset(); + } + + /** + * Returns the result set as an array. + * + * Overridden by driver classes. + * + * @return mixed + */ + protected function fetchAssoc() + { + return $this->resultID->fetchArray(SQLITE3_ASSOC); + } + + /** + * Returns the result set as an object. + * + * Overridden by child classes. + * + * @return bool|object + */ + protected function fetchObject(string $className = 'stdClass') + { + // No native support for fetching rows as objects + if (($row = $this->fetchAssoc()) === false) { + return false; + } + + if ($className === 'stdClass') { + return (object) $row; + } + + $classObj = new $className(); + + if (is_subclass_of($className, Entity::class)) { + return $classObj->setAttributes($row); + } + + $classSet = Closure::bind(function ($key, $value) { + $this->{$key} = $value; + }, $classObj, $className); + + foreach (array_keys($row) as $key) { + $classSet($key, $row[$key]); + } + + return $classObj; + } +} diff --git a/system/Database/SQLite3/Table.php b/system/Database/SQLite3/Table.php new file mode 100644 index 0000000..8f04c0f --- /dev/null +++ b/system/Database/SQLite3/Table.php @@ -0,0 +1,363 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Database\SQLite3; + +use CodeIgniter\Database\Exceptions\DataException; + +/** + * Class Table + * + * Provides missing features for altering tables that are common + * in other supported databases, but are missing from SQLite. + * These are needed in order to support migrations during testing + * when another database is used as the primary engine, but + * SQLite in memory databases are used for faster test execution. + */ +class Table +{ + /** + * All of the fields this table represents. + * + * @var array + */ + protected $fields = []; + + /** + * All of the unique/primary keys in the table. + * + * @var array + */ + protected $keys = []; + + /** + * All of the foreign keys in the table. + * + * @var array + */ + protected $foreignKeys = []; + + /** + * The name of the table we're working with. + * + * @var string + */ + protected $tableName; + + /** + * The name of the table, with database prefix + * + * @var string + */ + protected $prefixedTableName; + + /** + * Database connection. + * + * @var Connection + */ + protected $db; + + /** + * Handle to our forge. + * + * @var Forge + */ + protected $forge; + + /** + * Table constructor. + */ + public function __construct(Connection $db, Forge $forge) + { + $this->db = $db; + $this->forge = $forge; + } + + /** + * Reads an existing database table and + * collects all of the information needed to + * recreate this table. + * + * @return Table + */ + public function fromTable(string $table) + { + $this->prefixedTableName = $table; + + $prefix = $this->db->DBPrefix; + + if (! empty($prefix) && strpos($table, $prefix) === 0) { + $table = substr($table, strlen($prefix)); + } + + if (! $this->db->tableExists($this->prefixedTableName)) { + throw DataException::forTableNotFound($this->prefixedTableName); + } + + $this->tableName = $table; + + $this->fields = $this->formatFields($this->db->getFieldData($table)); + + $this->keys = array_merge($this->keys, $this->formatKeys($this->db->getIndexData($table))); + + $this->foreignKeys = $this->db->getForeignKeyData($table); + + return $this; + } + + /** + * Called after `fromTable` and any actions, like `dropColumn`, etc, + * to finalize the action. It creates a temp table, creates the new + * table with modifications, and copies the data over to the new table. + * Resets the connection dataCache to be sure changes are collected. + */ + public function run(): bool + { + $this->db->query('PRAGMA foreign_keys = OFF'); + + $this->db->transStart(); + + $this->forge->renameTable($this->tableName, "temp_{$this->tableName}"); + + $this->forge->reset(); + + $this->createTable(); + + $this->copyData(); + + $this->forge->dropTable("temp_{$this->tableName}"); + + $success = $this->db->transComplete(); + + $this->db->query('PRAGMA foreign_keys = ON'); + + $this->db->resetDataCache(); + + return $success; + } + + /** + * Drops columns from the table. + * + * @param array|string $columns + * + * @return Table + */ + public function dropColumn($columns) + { + if (is_string($columns)) { + $columns = explode(',', $columns); + } + + foreach ($columns as $column) { + $column = trim($column); + if (isset($this->fields[$column])) { + unset($this->fields[$column]); + } + } + + return $this; + } + + /** + * Modifies a field, including changing data type, + * renaming, etc. + * + * @return Table + */ + public function modifyColumn(array $field) + { + $field = $field[0]; + + $oldName = $field['name']; + unset($field['name']); + + $this->fields[$oldName] = $field; + + return $this; + } + + /** + * Drops a foreign key from this table so that + * it won't be recreated in the future. + * + * @return Table + */ + public function dropForeignKey(string $column) + { + if (empty($this->foreignKeys)) { + return $this; + } + + for ($i = 0; $i < count($this->foreignKeys); $i++) { + if ($this->foreignKeys[$i]->table_name !== $this->tableName) { + continue; + } + + // The column name should be the first thing in the constraint name + if (strpos($this->foreignKeys[$i]->constraint_name, $column) !== 0) { + continue; + } + + unset($this->foreignKeys[$i]); + } + + return $this; + } + + /** + * Creates the new table based on our current fields. + * + * @return mixed + */ + protected function createTable() + { + $this->dropIndexes(); + $this->db->resetDataCache(); + + // Handle any modified columns. + $fields = []; + + foreach ($this->fields as $name => $field) { + if (isset($field['new_name'])) { + $fields[$field['new_name']] = $field; + + continue; + } + + $fields[$name] = $field; + } + + $this->forge->addField($fields); + + // Unique/Index keys + if (is_array($this->keys)) { + foreach ($this->keys as $key) { + switch ($key['type']) { + case 'primary': + $this->forge->addPrimaryKey($key['fields']); + break; + + case 'unique': + $this->forge->addUniqueKey($key['fields']); + break; + + case 'index': + $this->forge->addKey($key['fields']); + break; + } + } + } + + return $this->forge->createTable($this->tableName); + } + + /** + * Copies data from our old table to the new one, + * taking care map data correctly based on any columns + * that have been renamed. + */ + protected function copyData() + { + $exFields = []; + $newFields = []; + + foreach ($this->fields as $name => $details) { + $newFields[] = $details['new_name'] ?? $name; + $exFields[] = $name; + } + + $exFields = implode(', ', $exFields); + $newFields = implode(', ', $newFields); + + $this->db->query("INSERT INTO {$this->prefixedTableName}({$newFields}) SELECT {$exFields} FROM {$this->db->DBPrefix}temp_{$this->tableName}"); + } + + /** + * Converts fields retrieved from the database to + * the format needed for creating fields with Forge. + * + * @param array|bool $fields + * + * @return mixed + */ + protected function formatFields($fields) + { + if (! is_array($fields)) { + return $fields; + } + + $return = []; + + foreach ($fields as $field) { + $return[$field->name] = [ + 'type' => $field->type, + 'default' => $field->default, + 'null' => $field->nullable, + ]; + + if ($field->primary_key) { + $this->keys[$field->name] = [ + 'fields' => [$field->name], + 'type' => 'primary', + ]; + } + } + + return $return; + } + + /** + * Converts keys retrieved from the database to + * the format needed to create later. + * + * @param mixed $keys + * + * @return mixed + */ + protected function formatKeys($keys) + { + if (! is_array($keys)) { + return $keys; + } + + $return = []; + + foreach ($keys as $name => $key) { + $return[$name] = [ + 'fields' => $key->fields, + 'type' => 'index', + ]; + } + + return $return; + } + + /** + * Attempts to drop all indexes and constraints + * from the database for this table. + */ + protected function dropIndexes() + { + if (! is_array($this->keys) || $this->keys === []) { + return; + } + + foreach ($this->keys as $name => $key) { + if ($key['type'] === 'primary' || $key['type'] === 'unique') { + continue; + } + + $this->db->query("DROP INDEX IF EXISTS '{$name}'"); + } + } +} diff --git a/system/Database/SQLite3/Utils.php b/system/Database/SQLite3/Utils.php new file mode 100644 index 0000000..f0cc5df --- /dev/null +++ b/system/Database/SQLite3/Utils.php @@ -0,0 +1,38 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Database\SQLite3; + +use CodeIgniter\Database\BaseUtils; +use CodeIgniter\Database\Exceptions\DatabaseException; + +/** + * Utils for SQLite3 + */ +class Utils extends BaseUtils +{ + /** + * OPTIMIZE TABLE statement + * + * @var string + */ + protected $optimizeTable = 'REINDEX %s'; + + /** + * Platform dependent version of the backup function. + * + * @return mixed + */ + public function _backup(?array $prefs = null) + { + throw new DatabaseException('Unsupported feature of the database platform you are using.'); + } +} diff --git a/system/Database/Seeder.php b/system/Database/Seeder.php new file mode 100644 index 0000000..92d2819 --- /dev/null +++ b/system/Database/Seeder.php @@ -0,0 +1,193 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Database; + +use CodeIgniter\CLI\CLI; +use Config\Database; +use Faker\Factory; +use Faker\Generator; +use InvalidArgumentException; + +/** + * Class Seeder + */ +class Seeder +{ + /** + * The name of the database group to use. + * + * @var string + */ + protected $DBGroup; + + /** + * Where we can find the Seed files. + * + * @var string + */ + protected $seedPath; + + /** + * An instance of the main Database configuration + * + * @var Database + */ + protected $config; + + /** + * Database Connection instance + * + * @var BaseConnection + */ + protected $db; + + /** + * Database Forge instance. + * + * @var Forge + */ + protected $forge; + + /** + * If true, will not display CLI messages. + * + * @var bool + */ + protected $silent = false; + + /** + * Faker Generator instance. + * + * @var Generator|null + * + * @deprecated + */ + private static $faker; + + /** + * Seeder constructor. + */ + public function __construct(Database $config, ?BaseConnection $db = null) + { + $this->seedPath = $config->filesPath ?? APPPATH . 'Database/'; + + if (empty($this->seedPath)) { + throw new InvalidArgumentException('Invalid filesPath set in the Config\Database.'); + } + + $this->seedPath = rtrim($this->seedPath, '\\/') . '/Seeds/'; + + if (! is_dir($this->seedPath)) { + throw new InvalidArgumentException('Unable to locate the seeds directory. Please check Config\Database::filesPath'); + } + + $this->config = &$config; + + $db = $db ?? Database::connect($this->DBGroup); + + $this->db = &$db; + $this->forge = Database::forge($this->DBGroup); + } + + /** + * Gets the Faker Generator instance. + * + * @deprecated + */ + public static function faker(): ?Generator + { + if (self::$faker === null && class_exists(Factory::class)) { + self::$faker = Factory::create(); + } + + return self::$faker; + } + + /** + * Loads the specified seeder and runs it. + * + * @throws InvalidArgumentException + */ + public function call(string $class) + { + $class = trim($class); + + if ($class === '') { + throw new InvalidArgumentException('No seeder was specified.'); + } + + if (strpos($class, '\\') === false) { + $path = $this->seedPath . str_replace('.php', '', $class) . '.php'; + + if (! is_file($path)) { + throw new InvalidArgumentException('The specified seeder is not a valid file: ' . $path); + } + + // Assume the class has the correct namespace + // @codeCoverageIgnoreStart + $class = APP_NAMESPACE . '\Database\Seeds\\' . $class; + + if (! class_exists($class, false)) { + require_once $path; + } + // @codeCoverageIgnoreEnd + } + + /** @var Seeder $seeder */ + $seeder = new $class($this->config); + $seeder->setSilent($this->silent)->run(); + + unset($seeder); + + if (is_cli() && ! $this->silent) { + CLI::write("Seeded: {$class}", 'green'); + } + } + + /** + * Sets the location of the directory that seed files can be located in. + * + * @return $this + */ + public function setPath(string $path) + { + $this->seedPath = rtrim($path, '\\/') . '/'; + + return $this; + } + + /** + * Sets the silent treatment. + * + * @return $this + */ + public function setSilent(bool $silent) + { + $this->silent = $silent; + + return $this; + } + + /** + * Run the database seeds. This is where the magic happens. + * + * Child classes must implement this method and take care + * of inserting their data here. + * + * @return mixed + * + * @codeCoverageIgnore + */ + public function run() + { + } +} diff --git a/system/Debug/Exceptions.php b/system/Debug/Exceptions.php new file mode 100644 index 0000000..d319c2f --- /dev/null +++ b/system/Debug/Exceptions.php @@ -0,0 +1,433 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Debug; + +use CodeIgniter\API\ResponseTrait; +use CodeIgniter\Exceptions\PageNotFoundException; +use CodeIgniter\HTTP\IncomingRequest; +use CodeIgniter\HTTP\Response; +use Config\Exceptions as ExceptionsConfig; +use Config\Paths; +use ErrorException; +use Throwable; + +/** + * Exceptions manager + */ +class Exceptions +{ + use ResponseTrait; + + /** + * Nesting level of the output buffering mechanism + * + * @var int + */ + public $ob_level; + + /** + * The path to the directory containing the + * cli and html error view directories. + * + * @var string + */ + protected $viewPath; + + /** + * Config for debug exceptions. + * + * @var ExceptionsConfig + */ + protected $config; + + /** + * The incoming request. + * + * @var IncomingRequest + */ + protected $request; + + /** + * The outgoing response. + * + * @var Response + */ + protected $response; + + public function __construct(ExceptionsConfig $config, IncomingRequest $request, Response $response) + { + $this->ob_level = ob_get_level(); + $this->viewPath = rtrim($config->errorViewPath, '\\/ ') . DIRECTORY_SEPARATOR; + $this->config = $config; + $this->request = $request; + $this->response = $response; + + // workaround for upgraded users + if (! isset($this->config->sensitiveDataInTrace)) { + $this->config->sensitiveDataInTrace = []; + } + } + + /** + * Responsible for registering the error, exception and shutdown + * handling of our application. + * + * @codeCoverageIgnore + */ + public function initialize() + { + set_exception_handler([$this, 'exceptionHandler']); + set_error_handler([$this, 'errorHandler']); + register_shutdown_function([$this, 'shutdownHandler']); + } + + /** + * Catches any uncaught errors and exceptions, including most Fatal errors + * (Yay PHP7!). Will log the error, display it if display_errors is on, + * and fire an event that allows custom actions to be taken at this point. + * + * @codeCoverageIgnore + */ + public function exceptionHandler(Throwable $exception) + { + [$statusCode, $exitCode] = $this->determineCodes($exception); + + if ($this->config->log === true && ! in_array($statusCode, $this->config->ignoreCodes, true)) { + log_message('critical', $exception->getMessage() . "\n{trace}", [ + 'trace' => $exception->getTraceAsString(), + ]); + } + + if (! is_cli()) { + $this->response->setStatusCode($statusCode); + header(sprintf('HTTP/%s %s %s', $this->request->getProtocolVersion(), $this->response->getStatusCode(), $this->response->getReasonPhrase()), true, $statusCode); + + if (strpos($this->request->getHeaderLine('accept'), 'text/html') === false) { + $this->respond(ENVIRONMENT === 'development' ? $this->collectVars($exception, $statusCode) : '', $statusCode)->send(); + + exit($exitCode); + } + } + + $this->render($exception, $statusCode); + + exit($exitCode); + } + + /** + * Even in PHP7, some errors make it through to the errorHandler, so + * convert these to Exceptions and let the exception handler log it and + * display it. + * + * This seems to be primarily when a user triggers it with trigger_error(). + * + * @throws ErrorException + * + * @codeCoverageIgnore + */ + public function errorHandler(int $severity, string $message, ?string $file = null, ?int $line = null) + { + if (! (error_reporting() & $severity)) { + return; + } + + throw new ErrorException($message, 0, $severity, $file, $line); + } + + /** + * Checks to see if any errors have happened during shutdown that + * need to be caught and handle them. + * + * @codeCoverageIgnore + */ + public function shutdownHandler() + { + $error = error_get_last(); + + if ($error === null) { + return; + } + + ['type' => $type, 'message' => $message, 'file' => $file, 'line' => $line] = $error; + + if (in_array($type, [E_ERROR, E_CORE_ERROR, E_COMPILE_ERROR, E_PARSE], true)) { + $this->exceptionHandler(new ErrorException($message, $type, 0, $file, $line)); + } + } + + /** + * Determines the view to display based on the exception thrown, + * whether an HTTP or CLI request, etc. + * + * @return string The path and filename of the view file to use + */ + protected function determineView(Throwable $exception, string $templatePath): string + { + // Production environments should have a custom exception file. + $view = 'production.php'; + $templatePath = rtrim($templatePath, '\\/ ') . DIRECTORY_SEPARATOR; + + if (str_ireplace(['off', 'none', 'no', 'false', 'null'], '', ini_get('display_errors'))) { + $view = 'error_exception.php'; + } + + // 404 Errors + if ($exception instanceof PageNotFoundException) { + return 'error_404.php'; + } + + // Allow for custom views based upon the status code + if (is_file($templatePath . 'error_' . $exception->getCode() . '.php')) { + return 'error_' . $exception->getCode() . '.php'; + } + + return $view; + } + + /** + * Given an exception and status code will display the error to the client. + */ + protected function render(Throwable $exception, int $statusCode) + { + // Determine possible directories of error views + $path = $this->viewPath; + $altPath = rtrim((new Paths())->viewDirectory, '\\/ ') . DIRECTORY_SEPARATOR . 'errors' . DIRECTORY_SEPARATOR; + + $path .= (is_cli() ? 'cli' : 'html') . DIRECTORY_SEPARATOR; + $altPath .= (is_cli() ? 'cli' : 'html') . DIRECTORY_SEPARATOR; + + // Determine the views + $view = $this->determineView($exception, $path); + $altView = $this->determineView($exception, $altPath); + + // Check if the view exists + if (is_file($path . $view)) { + $viewFile = $path . $view; + } elseif (is_file($altPath . $altView)) { + $viewFile = $altPath . $altView; + } + + if (! isset($viewFile)) { + echo 'The error view files were not found. Cannot render exception trace.'; + + exit(1); + } + + if (ob_get_level() > $this->ob_level + 1) { + ob_end_clean(); + } + + echo(function () use ($exception, $statusCode, $viewFile): string { + $vars = $this->collectVars($exception, $statusCode); + extract($vars, EXTR_SKIP); + + ob_start(); + include $viewFile; + + return ob_get_clean(); + })(); + } + + /** + * Gathers the variables that will be made available to the view. + */ + protected function collectVars(Throwable $exception, int $statusCode): array + { + $trace = $exception->getTrace(); + + if ($this->config->sensitiveDataInTrace !== []) { + $this->maskSensitiveData($trace, $this->config->sensitiveDataInTrace); + } + + return [ + 'title' => get_class($exception), + 'type' => get_class($exception), + 'code' => $statusCode, + 'message' => $exception->getMessage() ?? '(null)', + 'file' => $exception->getFile(), + 'line' => $exception->getLine(), + 'trace' => $trace, + ]; + } + + /** + * Mask sensitive data in the trace. + * + * @param array|object $trace + */ + protected function maskSensitiveData(&$trace, array $keysToMask, string $path = '') + { + foreach ($keysToMask as $keyToMask) { + $explode = explode('/', $keyToMask); + $index = end($explode); + + if (strpos(strrev($path . '/' . $index), strrev($keyToMask)) === 0) { + if (is_array($trace) && array_key_exists($index, $trace)) { + $trace[$index] = '******************'; + } elseif (is_object($trace) && property_exists($trace, $index) && isset($trace->{$index})) { + $trace->{$index} = '******************'; + } + } + } + + if (is_object($trace)) { + $trace = get_object_vars($trace); + } + + if (is_array($trace)) { + foreach ($trace as $pathKey => $subarray) { + $this->maskSensitiveData($subarray, $keysToMask, $path . '/' . $pathKey); + } + } + } + + /** + * Determines the HTTP status code and the exit status code for this request. + */ + protected function determineCodes(Throwable $exception): array + { + $statusCode = abs($exception->getCode()); + + if ($statusCode < 100 || $statusCode > 599) { + $exitStatus = $statusCode + EXIT__AUTO_MIN; + + if ($exitStatus > EXIT__AUTO_MAX) { + $exitStatus = EXIT_ERROR; + } + + $statusCode = 500; + } else { + $exitStatus = EXIT_ERROR; + } + + return [$statusCode, $exitStatus]; + } + + //-------------------------------------------------------------------- + // Display Methods + //-------------------------------------------------------------------- + + /** + * This makes nicer looking paths for the error output. + */ + public static function cleanPath(string $file): string + { + switch (true) { + case strpos($file, APPPATH) === 0: + $file = 'APPPATH' . DIRECTORY_SEPARATOR . substr($file, strlen(APPPATH)); + break; + + case strpos($file, SYSTEMPATH) === 0: + $file = 'SYSTEMPATH' . DIRECTORY_SEPARATOR . substr($file, strlen(SYSTEMPATH)); + break; + + case strpos($file, FCPATH) === 0: + $file = 'FCPATH' . DIRECTORY_SEPARATOR . substr($file, strlen(FCPATH)); + break; + + case defined('VENDORPATH') && strpos($file, VENDORPATH) === 0: + $file = 'VENDORPATH' . DIRECTORY_SEPARATOR . substr($file, strlen(VENDORPATH)); + break; + } + + return $file; + } + + /** + * Describes memory usage in real-world units. Intended for use + * with memory_get_usage, etc. + */ + public static function describeMemory(int $bytes): string + { + if ($bytes < 1024) { + return $bytes . 'B'; + } + + if ($bytes < 1048576) { + return round($bytes / 1024, 2) . 'KB'; + } + + return round($bytes / 1048576, 2) . 'MB'; + } + + /** + * Creates a syntax-highlighted version of a PHP file. + * + * @return bool|string + */ + public static function highlightFile(string $file, int $lineNumber, int $lines = 15) + { + if (empty($file) || ! is_readable($file)) { + return false; + } + + // Set our highlight colors: + if (function_exists('ini_set')) { + ini_set('highlight.comment', '#767a7e; font-style: italic'); + ini_set('highlight.default', '#c7c7c7'); + ini_set('highlight.html', '#06B'); + ini_set('highlight.keyword', '#f1ce61;'); + ini_set('highlight.string', '#869d6a'); + } + + try { + $source = file_get_contents($file); + } catch (Throwable $e) { + return false; + } + + $source = str_replace(["\r\n", "\r"], "\n", $source); + $source = explode("\n", highlight_string($source, true)); + $source = str_replace('
', "\n", $source[1]); + $source = explode("\n", str_replace("\r\n", "\n", $source)); + + // Get just the part to show + $start = max($lineNumber - (int) round($lines / 2), 0); + + // Get just the lines we need to display, while keeping line numbers... + $source = array_splice($source, $start, $lines, true); + + // Used to format the line number in the source + $format = '% ' . strlen((string) ($start + $lines)) . 'd'; + + $out = ''; + // Because the highlighting may have an uneven number + // of open and close span tags on one line, we need + // to ensure we can close them all to get the lines + // showing correctly. + $spans = 1; + + foreach ($source as $n => $row) { + $spans += substr_count($row, ']+>#', $row, $tags); + + $out .= sprintf( + "{$format} %s\n%s", + $n + $start + 1, + strip_tags($row), + implode('', $tags[0]) + ); + } else { + $out .= sprintf('' . $format . ' %s', $n + $start + 1, $row) . "\n"; + } + } + + if ($spans > 0) { + $out .= str_repeat('', $spans); + } + + return '
' . $out . '
'; + } +} diff --git a/system/Debug/Iterator.php b/system/Debug/Iterator.php new file mode 100644 index 0000000..6234374 --- /dev/null +++ b/system/Debug/Iterator.php @@ -0,0 +1,130 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Debug; + +use Closure; + +/** + * Iterator for debugging. + */ +class Iterator +{ + /** + * Stores the tests that we are to run. + * + * @var array + */ + protected $tests = []; + + /** + * Stores the results of each of the tests. + * + * @var array + */ + protected $results = []; + + /** + * Adds a test to run. + * + * Tests are simply closures that the user can define any sequence of + * things to happen during the test. + * + * @return $this + */ + public function add(string $name, Closure $closure) + { + $name = strtolower($name); + + $this->tests[$name] = $closure; + + return $this; + } + + /** + * Runs through all of the tests that have been added, recording + * time to execute the desired number of iterations, and the approximate + * memory usage used during those iterations. + * + * @return string|null + */ + public function run(int $iterations = 1000, bool $output = true) + { + foreach ($this->tests as $name => $test) { + // clear memory before start + gc_collect_cycles(); + + $start = microtime(true); + $startMem = $maxMemory = memory_get_usage(true); + + for ($i = 0; $i < $iterations; $i++) { + $result = $test(); + $maxMemory = max($maxMemory, memory_get_usage(true)); + + unset($result); + } + + $this->results[$name] = [ + 'time' => microtime(true) - $start, + 'memory' => $maxMemory - $startMem, + 'n' => $iterations, + ]; + } + + if ($output) { + return $this->getReport(); + } + + return null; + } + + /** + * Get results. + */ + public function getReport(): string + { + if (empty($this->results)) { + return 'No results to display.'; + } + + helper('number'); + + // Template + $tpl = ' + + + + + + + + + {rows} + +
TestTimeMemory
'; + + $rows = ''; + + foreach ($this->results as $name => $result) { + $memory = number_to_size($result['memory'], 4); + + $rows .= " + {$name} + " . number_format($result['time'], 4) . " + {$memory} + "; + } + + $tpl = str_replace('{rows}', $rows, $tpl); + + return $tpl . '
'; + } +} diff --git a/system/Debug/Kint/RichRenderer.php b/system/Debug/Kint/RichRenderer.php new file mode 100644 index 0000000..756cac7 --- /dev/null +++ b/system/Debug/Kint/RichRenderer.php @@ -0,0 +1,75 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Debug\Kint; + +use Kint\Renderer\RichRenderer as KintRichRenderer; + +/** + * Overrides RichRenderer::preRender() for CSP + */ +class RichRenderer extends KintRichRenderer +{ + public function preRender() + { + $output = ''; + + if ($this->pre_render) { + foreach (self::$pre_render_sources as $type => $values) { + $contents = ''; + + foreach ($values as $v) { + $contents .= $v($this); + } + + if (! \strlen($contents)) { + continue; + } + + switch ($type) { + case 'script': + $output .= ''; + break; + + case 'style': + $output .= ''; + break; + + default: + $output .= $contents; + } + } + + // Don't pre-render on every dump + if (! $this->force_pre_render) { + self::$needs_pre_render = false; + } + } + + $output .= '
'; + + return $output; + } +} diff --git a/system/Debug/Timer.php b/system/Debug/Timer.php new file mode 100644 index 0000000..5783c77 --- /dev/null +++ b/system/Debug/Timer.php @@ -0,0 +1,129 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Debug; + +use RuntimeException; + +/** + * Class Timer + * + * Provides a simple way to measure the amount of time + * that elapses between two points. + */ +class Timer +{ + /** + * List of all timers. + * + * @var array + */ + protected $timers = []; + + /** + * Starts a timer running. + * + * Multiple calls can be made to this method so that several + * execution points can be measured. + * + * @param string $name The name of this timer. + * @param float $time Allows user to provide time. + * + * @return Timer + */ + public function start(string $name, ?float $time = null) + { + $this->timers[strtolower($name)] = [ + 'start' => ! empty($time) ? $time : microtime(true), + 'end' => null, + ]; + + return $this; + } + + /** + * Stops a running timer. + * + * If the timer is not stopped before the timers() method is called, + * it will be automatically stopped at that point. + * + * @param string $name The name of this timer. + * + * @return Timer + */ + public function stop(string $name) + { + $name = strtolower($name); + + if (empty($this->timers[$name])) { + throw new RuntimeException('Cannot stop timer: invalid name given.'); + } + + $this->timers[$name]['end'] = microtime(true); + + return $this; + } + + /** + * Returns the duration of a recorded timer. + * + * @param string $name The name of the timer. + * @param int $decimals Number of decimal places. + * + * @return float|null Returns null if timer exists by that name. + * Returns a float representing the number of + * seconds elapsed while that timer was running. + */ + public function getElapsedTime(string $name, int $decimals = 4) + { + $name = strtolower($name); + + if (empty($this->timers[$name])) { + return null; + } + + $timer = $this->timers[$name]; + + if (empty($timer['end'])) { + $timer['end'] = microtime(true); + } + + return (float) number_format($timer['end'] - $timer['start'], $decimals); + } + + /** + * Returns the array of timers, with the duration pre-calculated for you. + * + * @param int $decimals Number of decimal places + */ + public function getTimers(int $decimals = 4): array + { + $timers = $this->timers; + + foreach ($timers as &$timer) { + if (empty($timer['end'])) { + $timer['end'] = microtime(true); + } + + $timer['duration'] = (float) number_format($timer['end'] - $timer['start'], $decimals); + } + + return $timers; + } + + /** + * Checks whether or not a timer with the specified name exists. + */ + public function has(string $name): bool + { + return array_key_exists(strtolower($name), $this->timers); + } +} diff --git a/system/Debug/Toolbar.php b/system/Debug/Toolbar.php new file mode 100644 index 0000000..3502ae8 --- /dev/null +++ b/system/Debug/Toolbar.php @@ -0,0 +1,518 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Debug; + +use CodeIgniter\CodeIgniter; +use CodeIgniter\Debug\Toolbar\Collectors\BaseCollector; +use CodeIgniter\Debug\Toolbar\Collectors\Config; +use CodeIgniter\Debug\Toolbar\Collectors\History; +use CodeIgniter\Format\JSONFormatter; +use CodeIgniter\Format\XMLFormatter; +use CodeIgniter\HTTP\DownloadResponse; +use CodeIgniter\HTTP\IncomingRequest; +use CodeIgniter\HTTP\RequestInterface; +use CodeIgniter\HTTP\Response; +use CodeIgniter\HTTP\ResponseInterface; +use Config\Services; +use Config\Toolbar as ToolbarConfig; +use Kint\Kint; + +/** + * Displays a toolbar with bits of stats to aid a developer in debugging. + * + * Inspiration: http://prophiler.fabfuel.de + */ +class Toolbar +{ + /** + * Toolbar configuration settings. + * + * @var ToolbarConfig + */ + protected $config; + + /** + * Collectors to be used and displayed. + * + * @var BaseCollector[] + */ + protected $collectors = []; + + public function __construct(ToolbarConfig $config) + { + $this->config = $config; + + foreach ($config->collectors as $collector) { + if (! class_exists($collector)) { + log_message('critical', 'Toolbar collector does not exists(' . $collector . ').' . + 'please check $collectors in the Config\Toolbar.php file.'); + + continue; + } + + $this->collectors[] = new $collector(); + } + } + + /** + * Returns all the data required by Debug Bar + * + * @param float $startTime App start time + * @param IncomingRequest $request + * @param Response $response + * + * @return string JSON encoded data + */ + public function run(float $startTime, float $totalTime, RequestInterface $request, ResponseInterface $response): string + { + // Data items used within the view. + $data['url'] = current_url(); + $data['method'] = $request->getMethod(true); + $data['isAJAX'] = $request->isAJAX(); + $data['startTime'] = $startTime; + $data['totalTime'] = $totalTime * 1000; + $data['totalMemory'] = number_format((memory_get_peak_usage()) / 1024 / 1024, 3); + $data['segmentDuration'] = $this->roundTo($data['totalTime'] / 7); + $data['segmentCount'] = (int) ceil($data['totalTime'] / $data['segmentDuration']); + $data['CI_VERSION'] = CodeIgniter::CI_VERSION; + $data['collectors'] = []; + + foreach ($this->collectors as $collector) { + $data['collectors'][] = $collector->getAsArray(); + } + + foreach ($this->collectVarData() as $heading => $items) { + $varData = []; + + if (is_array($items)) { + foreach ($items as $key => $value) { + if (is_string($value)) { + $varData[esc($key)] = esc($value); + } else { + $oldKintMode = Kint::$mode_default; + $oldKintCalledFrom = Kint::$display_called_from; + + Kint::$mode_default = Kint::MODE_RICH; + Kint::$display_called_from = false; + + $kint = @Kint::dump($value); + $kint = substr($kint, strpos($kint, '') + 8); + + Kint::$mode_default = $oldKintMode; + Kint::$display_called_from = $oldKintCalledFrom; + + $varData[esc($key)] = $kint; + } + } + } + + $data['vars']['varData'][esc($heading)] = $varData; + } + + if (! empty($_SESSION)) { + foreach ($_SESSION as $key => $value) { + // Replace the binary data with string to avoid json_encode failure. + if (is_string($value) && preg_match('~[^\x20-\x7E\t\r\n]~', $value)) { + $value = 'binary data'; + } + + $data['vars']['session'][esc($key)] = is_string($value) ? esc($value) : '
' . esc(print_r($value, true)) . '
'; + } + } + + foreach ($request->getGet() as $name => $value) { + $data['vars']['get'][esc($name)] = is_array($value) ? '
' . esc(print_r($value, true)) . '
' : esc($value); + } + + foreach ($request->getPost() as $name => $value) { + $data['vars']['post'][esc($name)] = is_array($value) ? '
' . esc(print_r($value, true)) . '
' : esc($value); + } + + foreach ($request->headers() as $header) { + $data['vars']['headers'][esc($header->getName())] = esc($header->getValueLine()); + } + + foreach ($request->getCookie() as $name => $value) { + $data['vars']['cookies'][esc($name)] = esc($value); + } + + $data['vars']['request'] = ($request->isSecure() ? 'HTTPS' : 'HTTP') . '/' . $request->getProtocolVersion(); + + $data['vars']['response'] = [ + 'statusCode' => $response->getStatusCode(), + 'reason' => esc($response->getReasonPhrase()), + 'contentType' => esc($response->getHeaderLine('content-type')), + ]; + + $data['config'] = Config::display(); + + if ($response->CSP !== null) { + $response->CSP->addImageSrc('data:'); + } + + return json_encode($data); + } + + /** + * Called within the view to display the timeline itself. + */ + protected function renderTimeline(array $collectors, float $startTime, int $segmentCount, int $segmentDuration, array &$styles): string + { + $rows = $this->collectTimelineData($collectors); + $styleCount = 0; + + // Use recursive render function + return $this->renderTimelineRecursive($rows, $startTime, $segmentCount, $segmentDuration, $styles, $styleCount); + } + + /** + * Recursively renders timeline elements and their children. + */ + protected function renderTimelineRecursive(array $rows, float $startTime, int $segmentCount, int $segmentDuration, array &$styles, int &$styleCount, int $level = 0, bool $isChild = false): string + { + $displayTime = $segmentCount * $segmentDuration; + + $output = ''; + + foreach ($rows as $row) { + $hasChildren = isset($row['children']) && ! empty($row['children']); + $isQuery = isset($row['query']) && ! empty($row['query']); + + // Open controller timeline by default + $open = $row['name'] === 'Controller'; + + if ($hasChildren || $isQuery) { + $output .= ''; + } else { + $output .= ''; + } + + $output .= '' . ($hasChildren || $isQuery ? '' : '') . $row['name'] . ''; + $output .= '' . $row['component'] . ''; + $output .= '' . number_format($row['duration'] * 1000, 2) . ' ms'; + $output .= ""; + + $offset = ((((float) $row['start'] - $startTime) * 1000) / $displayTime) * 100; + $length = (((float) $row['duration'] * 1000) / $displayTime) * 100; + + $styles['debug-bar-timeline-' . $styleCount] = "left: {$offset}%; width: {$length}%;"; + + $output .= ""; + $output .= ''; + $output .= ''; + + $styleCount++; + + // Add children if any + if ($hasChildren || $isQuery) { + $output .= ''; + $output .= ''; + $output .= ''; + $output .= ''; + + if ($isQuery) { + // Output query string if query + $output .= ''; + $output .= ''; + $output .= ''; + } else { + // Recursively render children + $output .= $this->renderTimelineRecursive($row['children'], $startTime, $segmentCount, $segmentDuration, $styles, $styleCount, $level + 1, true); + } + + $output .= ''; + $output .= '
' . $row['query'] . '
'; + $output .= ''; + $output .= ''; + } + } + + return $output; + } + + /** + * Returns a sorted array of timeline data arrays from the collectors. + * + * @param array $collectors + */ + protected function collectTimelineData($collectors): array + { + $data = []; + + // Collect it + foreach ($collectors as $collector) { + if (! $collector['hasTimelineData']) { + continue; + } + + $data = array_merge($data, $collector['timelineData']); + } + + // Sort it + $sortArray = [ + array_column($data, 'start'), SORT_NUMERIC, SORT_ASC, + array_column($data, 'duration'), SORT_NUMERIC, SORT_DESC, + &$data, + ]; + + array_multisort(...$sortArray); + + // Add end time to each element + array_walk($data, static function (&$row) { + $row['end'] = $row['start'] + $row['duration']; + }); + + // Group it + $data = $this->structureTimelineData($data); + + return $data; + } + + /** + * Arranges the already sorted timeline data into a parent => child structure. + */ + protected function structureTimelineData(array $elements): array + { + // We define ourselves as the first element of the array + $element = array_shift($elements); + + // If we have children behind us, collect and attach them to us + while (! empty($elements) && $elements[array_key_first($elements)]['end'] <= $element['end']) { + $element['children'][] = array_shift($elements); + } + + // Make sure our children know whether they have children, too + if (isset($element['children'])) { + $element['children'] = $this->structureTimelineData($element['children']); + } + + // If we have no younger siblings, we can return + if (empty($elements)) { + return [$element]; + } + + // Make sure our younger siblings know their relatives, too + return array_merge([$element], $this->structureTimelineData($elements)); + } + + /** + * Returns an array of data from all of the modules + * that should be displayed in the 'Vars' tab. + */ + protected function collectVarData(): array + { + if (! ($this->config->collectVarData ?? true)) { + return []; + } + + $data = []; + + foreach ($this->collectors as $collector) { + if (! $collector->hasVarData()) { + continue; + } + + $data = array_merge($data, $collector->getVarData()); + } + + return $data; + } + + /** + * Rounds a number to the nearest incremental value. + */ + protected function roundTo(float $number, int $increments = 5): float + { + $increments = 1 / $increments; + + return ceil($number * $increments) / $increments; + } + + /** + * Prepare for debugging.. + * + * @param RequestInterface $request + * @param ResponseInterface $response + * + * @global \CodeIgniter\CodeIgniter $app + */ + public function prepare(?RequestInterface $request = null, ?ResponseInterface $response = null) + { + /** + * @var IncomingRequest $request + * @var Response $response + */ + if (CI_DEBUG && ! is_cli()) { + global $app; + + $request = $request ?? Services::request(); + $response = $response ?? Services::response(); + + // Disable the toolbar for downloads + if ($response instanceof DownloadResponse) { + return; + } + + $toolbar = Services::toolbar(config(self::class)); + $stats = $app->getPerformanceStats(); + $data = $toolbar->run( + $stats['startTime'], + $stats['totalTime'], + $request, + $response + ); + + helper('filesystem'); + + // Updated to time() so we can get history + $time = time(); + + if (! is_dir(WRITEPATH . 'debugbar')) { + mkdir(WRITEPATH . 'debugbar', 0777); + } + + write_file(WRITEPATH . 'debugbar/' . 'debugbar_' . $time . '.json', $data, 'w+'); + + $format = $response->getHeaderLine('content-type'); + + // Non-HTML formats should not include the debugbar + // then we send headers saying where to find the debug data + // for this response + if ($request->isAJAX() || strpos($format, 'html') === false) { + $response->setHeader('Debugbar-Time', "{$time}") + ->setHeader('Debugbar-Link', site_url("?debugbar_time={$time}")) + ->getBody(); + + return; + } + + $oldKintMode = Kint::$mode_default; + Kint::$mode_default = Kint::MODE_RICH; + $kintScript = @Kint::dump(''); + Kint::$mode_default = $oldKintMode; + $kintScript = substr($kintScript, 0, strpos($kintScript, '') + 8); + + $script = PHP_EOL + . '' + . '' + . '' + . $kintScript + . PHP_EOL; + + if (strpos($response->getBody(), '') !== false) { + $response->setBody(preg_replace('//', '' . $script, $response->getBody(), 1)); + + return; + } + + $response->appendBody($script); + } + } + + /** + * Inject debug toolbar into the response. + * + * @codeCoverageIgnore + */ + public function respond() + { + if (ENVIRONMENT === 'testing') { + return; + } + + $request = Services::request(); + + // If the request contains '?debugbar then we're + // simply returning the loading script + if ($request->getGet('debugbar') !== null) { + header('Content-Type: application/javascript'); + + ob_start(); + include $this->config->viewsPath . 'toolbarloader.js'; + $output = ob_get_clean(); + $output = str_replace('{url}', rtrim(site_url(), '/'), $output); + echo $output; + + exit; + } + + // Otherwise, if it includes ?debugbar_time, then + // we should return the entire debugbar. + if ($request->getGet('debugbar_time')) { + helper('security'); + + // Negotiate the content-type to format the output + $format = $request->negotiate('media', ['text/html', 'application/json', 'application/xml']); + $format = explode('/', $format)[1]; + + $filename = sanitize_filename('debugbar_' . $request->getGet('debugbar_time')); + $filename = WRITEPATH . 'debugbar/' . $filename . '.json'; + + if (is_file($filename)) { + // Show the toolbar if it exists + echo $this->format(file_get_contents($filename), $format); + + exit; + } + + // Filename not found + http_response_code(404); + + exit; // Exit here is needed to avoid loading the index page + } + } + + /** + * Format output + */ + protected function format(string $data, string $format = 'html'): string + { + $data = json_decode($data, true); + + if ($this->config->maxHistory !== 0) { + $history = new History(); + $history->setFiles( + (int) Services::request()->getGet('debugbar_time'), + $this->config->maxHistory + ); + + $data['collectors'][] = $history->getAsArray(); + } + + $output = ''; + + switch ($format) { + case 'html': + $data['styles'] = []; + extract($data); + $parser = Services::parser($this->config->viewsPath, null, false); + ob_start(); + include $this->config->viewsPath . 'toolbar.tpl.php'; + $output = ob_get_clean(); + break; + + case 'json': + $formatter = new JSONFormatter(); + $output = $formatter->format($data); + break; + + case 'xml': + $formatter = new XMLFormatter(); + $output = $formatter->format($data); + break; + } + + return $output; + } +} diff --git a/system/Debug/Toolbar/Collectors/BaseCollector.php b/system/Debug/Toolbar/Collectors/BaseCollector.php new file mode 100644 index 0000000..5d8d39f --- /dev/null +++ b/system/Debug/Toolbar/Collectors/BaseCollector.php @@ -0,0 +1,234 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Debug\Toolbar\Collectors; + +use CodeIgniter\Debug\Exceptions; + +/** + * Base Toolbar collector + */ +class BaseCollector +{ + /** + * Whether this collector has data that can + * be displayed in the Timeline. + * + * @var bool + */ + protected $hasTimeline = false; + + /** + * Whether this collector needs to display + * content in a tab or not. + * + * @var bool + */ + protected $hasTabContent = false; + + /** + * Whether this collector needs to display + * a label or not. + * + * @var bool + */ + protected $hasLabel = false; + + /** + * Whether this collector has data that + * should be shown in the Vars tab. + * + * @var bool + */ + protected $hasVarData = false; + + /** + * The 'title' of this Collector. + * Used to name things in the toolbar HTML. + * + * @var string + */ + protected $title = ''; + + /** + * Gets the Collector's title. + */ + public function getTitle(bool $safe = false): string + { + if ($safe) { + return str_replace(' ', '-', strtolower($this->title)); + } + + return $this->title; + } + + /** + * Returns any information that should be shown next to the title. + */ + public function getTitleDetails(): string + { + return ''; + } + + /** + * Does this collector need it's own tab? + */ + public function hasTabContent(): bool + { + return (bool) $this->hasTabContent; + } + + /** + * Does this collector have a label? + */ + public function hasLabel(): bool + { + return (bool) $this->hasLabel; + } + + /** + * Does this collector have information for the timeline? + */ + public function hasTimelineData(): bool + { + return (bool) $this->hasTimeline; + } + + /** + * Grabs the data for the timeline, properly formatted, + * or returns an empty array. + */ + public function timelineData(): array + { + if (! $this->hasTimeline) { + return []; + } + + return $this->formatTimelineData(); + } + + /** + * Does this Collector have data that should be shown in the + * 'Vars' tab? + */ + public function hasVarData(): bool + { + return (bool) $this->hasVarData; + } + + /** + * Gets a collection of data that should be shown in the 'Vars' tab. + * The format is an array of sections, each with their own array + * of key/value pairs: + * + * $data = [ + * 'section 1' => [ + * 'foo' => 'bar, + * 'bar' => 'baz' + * ], + * 'section 2' => [ + * 'foo' => 'bar, + * 'bar' => 'baz' + * ], + * ]; + */ + public function getVarData() + { + return null; + } + + /** + * Child classes should implement this to return the timeline data + * formatted for correct usage. + * + * Timeline data should be formatted into arrays that look like: + * + * [ + * 'name' => 'Database::Query', + * 'component' => 'Database', + * 'start' => 10 // milliseconds + * 'duration' => 15 // milliseconds + * ] + */ + protected function formatTimelineData(): array + { + return []; + } + + /** + * Returns the data of this collector to be formatted in the toolbar + * + * @return array|string + */ + public function display() + { + return []; + } + + /** + * Clean Path + * + * This makes nicer looking paths for the error output. + */ + public function cleanPath(string $file): string + { + return Exceptions::cleanPath($file); + } + + /** + * Gets the "badge" value for the button. + */ + public function getBadgeValue() + { + return null; + } + + /** + * Does this collector have any data collected? + * + * If not, then the toolbar button won't get shown. + */ + public function isEmpty(): bool + { + return false; + } + + /** + * Returns the HTML to display the icon. Should either + * be SVG, or a base-64 encoded. + * + * Recommended dimensions are 24px x 24px + */ + public function icon(): string + { + return ''; + } + + /** + * Return settings as an array. + */ + public function getAsArray(): array + { + return [ + 'title' => $this->getTitle(), + 'titleSafe' => $this->getTitle(true), + 'titleDetails' => $this->getTitleDetails(), + 'display' => $this->display(), + 'badgeValue' => $this->getBadgeValue(), + 'isEmpty' => $this->isEmpty(), + 'hasTabContent' => $this->hasTabContent(), + 'hasLabel' => $this->hasLabel(), + 'icon' => $this->icon(), + 'hasTimelineData' => $this->hasTimelineData(), + 'timelineData' => $this->timelineData(), + ]; + } +} diff --git a/system/Debug/Toolbar/Collectors/Config.php b/system/Debug/Toolbar/Collectors/Config.php new file mode 100644 index 0000000..faf7a19 --- /dev/null +++ b/system/Debug/Toolbar/Collectors/Config.php @@ -0,0 +1,41 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Debug\Toolbar\Collectors; + +use CodeIgniter\CodeIgniter; +use Config\App; +use Config\Services; + +/** + * Debug toolbar configuration + */ +class Config +{ + /** + * Return toolbar config values as an array. + */ + public static function display(): array + { + $config = config(App::class); + + return [ + 'ciVersion' => CodeIgniter::CI_VERSION, + 'phpVersion' => PHP_VERSION, + 'phpSAPI' => PHP_SAPI, + 'environment' => ENVIRONMENT, + 'baseURL' => $config->baseURL, + 'timezone' => app_timezone(), + 'locale' => Services::request()->getLocale(), + 'cspEnabled' => $config->CSPEnabled, + ]; + } +} diff --git a/system/Debug/Toolbar/Collectors/Database.php b/system/Debug/Toolbar/Collectors/Database.php new file mode 100644 index 0000000..26cb02d --- /dev/null +++ b/system/Debug/Toolbar/Collectors/Database.php @@ -0,0 +1,253 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Debug\Toolbar\Collectors; + +use CodeIgniter\Database\Query; + +/** + * Collector for the Database tab of the Debug Toolbar. + */ +class Database extends BaseCollector +{ + /** + * Whether this collector has timeline data. + * + * @var bool + */ + protected $hasTimeline = true; + + /** + * Whether this collector should display its own tab. + * + * @var bool + */ + protected $hasTabContent = true; + + /** + * Whether this collector has data for the Vars tab. + * + * @var bool + */ + protected $hasVarData = false; + + /** + * The name used to reference this collector in the toolbar. + * + * @var string + */ + protected $title = 'Database'; + + /** + * Array of database connections. + * + * @var array + */ + protected $connections; + + /** + * The query instances that have been collected + * through the DBQuery Event. + * + * @var array + */ + protected static $queries = []; + + /** + * Constructor + */ + public function __construct() + { + $this->getConnections(); + } + + /** + * The static method used during Events to collect + * data. + * + * @internal param $ array \CodeIgniter\Database\Query + */ + public static function collect(Query $query) + { + $config = config('Toolbar'); + + // Provide default in case it's not set + $max = $config->maxQueries ?: 100; + + if (count(static::$queries) < $max) { + $queryString = $query->getQuery(); + + $backtrace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS); + + if (! is_cli()) { + // when called in the browser, the first two trace arrays + // are from the DB event trigger, which are unneeded + $backtrace = array_slice($backtrace, 2); + } + + static::$queries[] = [ + 'query' => $query, + 'string' => $queryString, + 'duplicate' => in_array($queryString, array_column(static::$queries, 'string', null), true), + 'trace' => $backtrace, + ]; + } + } + + /** + * Returns timeline data formatted for the toolbar. + * + * @return array The formatted data or an empty array. + */ + protected function formatTimelineData(): array + { + $data = []; + + foreach ($this->connections as $alias => $connection) { + // Connection Time + $data[] = [ + 'name' => 'Connecting to Database: "' . $alias . '"', + 'component' => 'Database', + 'start' => $connection->getConnectStart(), + 'duration' => $connection->getConnectDuration(), + ]; + } + + foreach (static::$queries as $query) { + $data[] = [ + 'name' => 'Query', + 'component' => 'Database', + 'start' => $query['query']->getStartTime(true), + 'duration' => $query['query']->getDuration(), + 'query' => $query['query']->debugToolbarDisplay(), + ]; + } + + return $data; + } + + /** + * Returns the data of this collector to be formatted in the toolbar + */ + public function display(): array + { + $data['queries'] = array_map(static function (array $query) { + $isDuplicate = $query['duplicate'] === true; + + $firstNonSystemLine = ''; + + foreach ($query['trace'] as $index => &$line) { + // simplify file and line + if (isset($line['file'])) { + $line['file'] = clean_path($line['file']) . ':' . $line['line']; + unset($line['line']); + } else { + $line['file'] = '[internal function]'; + } + + // find the first trace line that does not originate from `system/` + if ($firstNonSystemLine === '' && strpos($line['file'], 'SYSTEMPATH') === false) { + $firstNonSystemLine = $line['file']; + } + + // simplify function call + if (isset($line['class'])) { + $line['function'] = $line['class'] . $line['type'] . $line['function']; + unset($line['class'], $line['type']); + } + + if (strrpos($line['function'], '{closure}') === false) { + $line['function'] .= '()'; + } + + $line['function'] = str_repeat(chr(0xC2) . chr(0xA0), 8) . $line['function']; + + // add index numbering padded with nonbreaking space + $indexPadded = str_pad(sprintf('%d', $index + 1), 3, ' ', STR_PAD_LEFT); + $indexPadded = preg_replace('/\s/', chr(0xC2) . chr(0xA0), $indexPadded); + + $line['index'] = $indexPadded . str_repeat(chr(0xC2) . chr(0xA0), 4); + } + + return [ + 'hover' => $isDuplicate ? 'This query was called more than once.' : '', + 'class' => $isDuplicate ? 'duplicate' : '', + 'duration' => ((float) $query['query']->getDuration(5) * 1000) . ' ms', + 'sql' => $query['query']->debugToolbarDisplay(), + 'trace' => $query['trace'], + 'trace-file' => $firstNonSystemLine, + 'qid' => md5($query['query'] . microtime()), + ]; + }, static::$queries); + + return $data; + } + + /** + * Gets the "badge" value for the button. + */ + public function getBadgeValue(): int + { + return count(static::$queries); + } + + /** + * Information to be displayed next to the title. + * + * @return string The number of queries (in parentheses) or an empty string. + */ + public function getTitleDetails(): string + { + $this->getConnections(); + + $queryCount = count(static::$queries); + $uniqueCount = count(array_filter(static::$queries, static function ($query) { + return $query['duplicate'] === false; + })); + $connectionCount = count($this->connections); + + return sprintf( + '(%d total Quer%s, %d %s unique across %d Connection%s)', + $queryCount, + $queryCount > 1 ? 'ies' : 'y', + $uniqueCount, + $uniqueCount > 1 ? 'of them' : '', + $connectionCount, + $connectionCount > 1 ? 's' : '' + ); + } + + /** + * Does this collector have any data collected? + */ + public function isEmpty(): bool + { + return empty(static::$queries); + } + + /** + * Display the icon. + * + * Icon from https://icons8.com - 1em package + */ + public function icon(): string + { + return 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAADMSURBVEhLY6A3YExLSwsA4nIycQDIDIhRWEBqamo/UNF/SjDQjF6ocZgAKPkRiFeEhoYyQ4WIBiA9QAuWAPEHqBAmgLqgHcolGQD1V4DMgHIxwbCxYD+QBqcKINseKo6eWrBioPrtQBq/BcgY5ht0cUIYbBg2AJKkRxCNWkDQgtFUNJwtABr+F6igE8olGQD114HMgHIxAVDyAhA/AlpSA8RYUwoeXAPVex5qHCbIyMgwBCkAuQJIY00huDBUz/mUlBQDqHGjgBjAwAAACexpph6oHSQAAAAASUVORK5CYII='; + } + + /** + * Gets the connections from the database config + */ + private function getConnections() + { + $this->connections = \Config\Database::getConnections(); + } +} diff --git a/system/Debug/Toolbar/Collectors/Events.php b/system/Debug/Toolbar/Collectors/Events.php new file mode 100644 index 0000000..a8a7e7a --- /dev/null +++ b/system/Debug/Toolbar/Collectors/Events.php @@ -0,0 +1,141 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Debug\Toolbar\Collectors; + +use CodeIgniter\View\RendererInterface; +use Config\Services; + +/** + * Views collector + */ +class Events extends BaseCollector +{ + /** + * Whether this collector has data that can + * be displayed in the Timeline. + * + * @var bool + */ + protected $hasTimeline = false; + + /** + * Whether this collector needs to display + * content in a tab or not. + * + * @var bool + */ + protected $hasTabContent = true; + + /** + * Whether this collector has data that + * should be shown in the Vars tab. + * + * @var bool + */ + protected $hasVarData = false; + + /** + * The 'title' of this Collector. + * Used to name things in the toolbar HTML. + * + * @var string + */ + protected $title = 'Events'; + + /** + * Instance of the Renderer service + * + * @var RendererInterface + */ + protected $viewer; + + /** + * Constructor. + */ + public function __construct() + { + $this->viewer = Services::renderer(); + } + + /** + * Child classes should implement this to return the timeline data + * formatted for correct usage. + */ + protected function formatTimelineData(): array + { + $data = []; + + $rows = $this->viewer->getPerformanceData(); + + foreach ($rows as $info) { + $data[] = [ + 'name' => 'View: ' . $info['view'], + 'component' => 'Views', + 'start' => $info['start'], + 'duration' => $info['end'] - $info['start'], + ]; + } + + return $data; + } + + /** + * Returns the data of this collector to be formatted in the toolbar + */ + public function display(): array + { + $data = [ + 'events' => [], + ]; + + foreach (\CodeIgniter\Events\Events::getPerformanceLogs() as $row) { + $key = $row['event']; + + if (! array_key_exists($key, $data['events'])) { + $data['events'][$key] = [ + 'event' => $key, + 'duration' => ($row['end'] - $row['start']) * 1000, + 'count' => 1, + ]; + + continue; + } + + $data['events'][$key]['duration'] += ($row['end'] - $row['start']) * 1000; + $data['events'][$key]['count']++; + } + + foreach ($data['events'] as &$row) { + $row['duration'] = number_format($row['duration'], 2); + } + + return $data; + } + + /** + * Gets the "badge" value for the button. + */ + public function getBadgeValue(): int + { + return count(\CodeIgniter\Events\Events::getPerformanceLogs()); + } + + /** + * Display the icon. + * + * Icon from https://icons8.com - 1em package + */ + public function icon(): string + { + return 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAEASURBVEhL7ZXNDcIwDIVTsRBH1uDQDdquUA6IM1xgCA6MwJUN2hk6AQzAz0vl0ETUxC5VT3zSU5w81/mRMGZysixbFEVR0jSKNt8geQU9aRpFmp/keX6AbjZ5oB74vsaN5lSzA4tLSjpBFxsjeSuRy4d2mDdQTWU7YLbXTNN05mKyovj5KL6B7q3hoy3KwdZxBlT+Ipz+jPHrBqOIynZgcZonoukb/0ckiTHqNvDXtXEAaygRbaB9FvUTjRUHsIYS0QaSp+Dw6wT4hiTmYHOcYZsdLQ2CbXa4ftuuYR4x9vYZgdb4vsFYUdmABMYeukK9/SUme3KMFQ77+Yfzh8eYF8+orDuDWU5LAAAAAElFTkSuQmCC'; + } +} diff --git a/system/Debug/Toolbar/Collectors/Files.php b/system/Debug/Toolbar/Collectors/Files.php new file mode 100644 index 0000000..d6aefd2 --- /dev/null +++ b/system/Debug/Toolbar/Collectors/Files.php @@ -0,0 +1,102 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Debug\Toolbar\Collectors; + +/** + * Files collector + */ +class Files extends BaseCollector +{ + /** + * Whether this collector has data that can + * be displayed in the Timeline. + * + * @var bool + */ + protected $hasTimeline = false; + + /** + * Whether this collector needs to display + * content in a tab or not. + * + * @var bool + */ + protected $hasTabContent = true; + + /** + * The 'title' of this Collector. + * Used to name things in the toolbar HTML. + * + * @var string + */ + protected $title = 'Files'; + + /** + * Returns any information that should be shown next to the title. + */ + public function getTitleDetails(): string + { + return '( ' . count(get_included_files()) . ' )'; + } + + /** + * Returns the data of this collector to be formatted in the toolbar + */ + public function display(): array + { + $rawFiles = get_included_files(); + $coreFiles = []; + $userFiles = []; + + foreach ($rawFiles as $file) { + $path = $this->cleanPath($file); + + if (strpos($path, 'SYSTEMPATH') !== false) { + $coreFiles[] = [ + 'name' => basename($file), + 'path' => $path, + ]; + } else { + $userFiles[] = [ + 'name' => basename($file), + 'path' => $path, + ]; + } + } + + sort($userFiles); + sort($coreFiles); + + return [ + 'coreFiles' => $coreFiles, + 'userFiles' => $userFiles, + ]; + } + + /** + * Displays the number of included files as a badge in the tab button. + */ + public function getBadgeValue(): int + { + return count(get_included_files()); + } + + /** + * Display the icon. + * + * Icon from https://icons8.com - 1em package + */ + public function icon(): string + { + return 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGBSURBVEhL7ZQ9S8NQGIVTBQUncfMfCO4uLgoKbuKQOWg+OkXERRE1IAXrIHbVDrqIDuLiJgj+gro7S3dnpfq88b1FMTE3VZx64HBzzvvZWxKnj15QCcPwCD5HUfSWR+JtzgmtsUcQBEva5IIm9SwSu+95CAWbUuy67qBa32ByZEDpIaZYZSZMjjQuPcQUq8yEyYEb8FSerYeQVGbAFzJkX1PyQWLhgCz0BxTCekC1Wp0hsa6yokzhed4oje6Iz6rlJEkyIKfUEFtITVtQdAibn5rMyaYsMS+a5wTv8qeXMhcU16QZbKgl3hbs+L4/pnpdc87MElZgq10p5DxGdq8I7xrvUWUKvG3NbSK7ubngYzdJwSsF7TiOh9VOgfcEz1UayNe3JUPM1RWC5GXYgTfc75B4NBmXJnAtTfpABX0iPvEd9ezALwkplCFXcr9styiNOKc1RRZpaPM9tcqBwlWzGY1qPL9wjqRBgF5BH6j8HWh2S7MHlX8PrmbK+k/8PzjOOzx1D3i1pKTTAAAAAElFTkSuQmCC'; + } +} diff --git a/system/Debug/Toolbar/Collectors/History.php b/system/Debug/Toolbar/Collectors/History.php new file mode 100644 index 0000000..3c0f426 --- /dev/null +++ b/system/Debug/Toolbar/Collectors/History.php @@ -0,0 +1,137 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Debug\Toolbar\Collectors; + +/** + * History collector + */ +class History extends BaseCollector +{ + /** + * Whether this collector has data that can + * be displayed in the Timeline. + * + * @var bool + */ + protected $hasTimeline = false; + + /** + * Whether this collector needs to display + * content in a tab or not. + * + * @var bool + */ + protected $hasTabContent = true; + + /** + * Whether this collector needs to display + * a label or not. + * + * @var bool + */ + protected $hasLabel = true; + + /** + * The 'title' of this Collector. + * Used to name things in the toolbar HTML. + * + * @var string + */ + protected $title = 'History'; + + /** + * @var array History files + */ + protected $files = []; + + /** + * Specify time limit & file count for debug history. + * + * @param int $current Current history time + * @param int $limit Max history files + */ + public function setFiles(int $current, int $limit = 20) + { + $filenames = glob(WRITEPATH . 'debugbar/debugbar_*.json'); + + $files = []; + $counter = 0; + + foreach (array_reverse($filenames) as $filename) { + $counter++; + + // Oldest files will be deleted + if ($limit >= 0 && $counter > $limit) { + unlink($filename); + + continue; + } + + // Get the contents of this specific history request + $contents = file_get_contents($filename); + + $contents = @json_decode($contents); + if (json_last_error() === JSON_ERROR_NONE) { + preg_match_all('/\d+/', $filename, $time); + $time = (int) end($time[0]); + + // Debugbar files shown in History Collector + $files[] = [ + 'time' => $time, + 'datetime' => date('Y-m-d H:i:s', $time), + 'active' => $time === $current, + 'status' => $contents->vars->response->statusCode, + 'method' => $contents->method, + 'url' => $contents->url, + 'isAJAX' => $contents->isAJAX ? 'Yes' : 'No', + 'contentType' => $contents->vars->response->contentType, + ]; + } + } + + $this->files = $files; + } + + /** + * Returns the data of this collector to be formatted in the toolbar + */ + public function display(): array + { + return ['files' => $this->files]; + } + + /** + * Displays the number of included files as a badge in the tab button. + */ + public function getBadgeValue(): int + { + return count($this->files); + } + + /** + * Return true if there are no history files. + */ + public function isEmpty(): bool + { + return empty($this->files); + } + + /** + * Display the icon. + * + * Icon from https://icons8.com - 1em package + */ + public function icon(): string + { + return 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAJySURBVEhL3ZU7aJNhGIVTpV6i4qCIgkIHxcXLErS4FBwUFNwiCKGhuTYJGaIgnRoo4qRu6iCiiIuIXXTTIkIpuqoFwaGgonUQlC5KafU5ycmNP0lTdPLA4fu+8573/a4/f6hXpFKpwUwmc9fDfweKbk+n07fgEv33TLSbtt/hvwNFT1PsG/zdTE0Gp+GFfD6/2fbVIxqNrqPIRbjg4t/hY8aztcngfDabHXbKyiiXy2vcrcPH8oDCry2FKDrA+Ar6L01E/ypyXzXaARjDGGcoeNxSDZXE0dHRA5VRE5LJ5CFy5jzJuOX2wHRHRnjbklZ6isQ3tIctBaAd4vlK3jLtkOVWqABBXd47jGHLmjTmSScttQV5J+SjfcUweFQEbsjAas5aqoCLXutJl7vtQsAzpRowYqkBinyCC8Vicb2lOih8zoldd0F8RD7qTFiqAnGrAy8stUAvi/hbqDM+YzkAFrLPdR5ZqoLXsd+Bh5YCIH7JniVdquUWxOPxDfboHhrI5XJ7HHhiqQXox+APe/Qk64+gGYVCYZs8cMpSFQj9JOoFzVqqo7k4HIvFYpscCoAjOmLffUsNUGRaQUwDlmofUa34ecsdgXdcXo4wbakBgiUFafXJV8A4DJ/2UrxUKm3E95H8RbjLcgOJRGILhnmCP+FBy5XvwN2uIPcy1AJvWgqC4xm2aU4Xb3lF4I+Tpyf8hRe5w3J7YLymSeA8Z3nSclv4WLRyFdfOjzrUFX0klJUEtZtntCNc+F69cz/FiDzEPtjzmcUMOr83kDQEX6pAJxJfpL3OX22n01YN7SZCoQnaSdoZ+Jz+PZihH3wt/xlCoT9M6nEtmRSPCQAAAABJRU5ErkJggg=='; + } +} diff --git a/system/Debug/Toolbar/Collectors/Logs.php b/system/Debug/Toolbar/Collectors/Logs.php new file mode 100644 index 0000000..42d7307 --- /dev/null +++ b/system/Debug/Toolbar/Collectors/Logs.php @@ -0,0 +1,93 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Debug\Toolbar\Collectors; + +use Config\Services; + +/** + * Loags collector + */ +class Logs extends BaseCollector +{ + /** + * Whether this collector has data that can + * be displayed in the Timeline. + * + * @var bool + */ + protected $hasTimeline = false; + + /** + * Whether this collector needs to display + * content in a tab or not. + * + * @var bool + */ + protected $hasTabContent = true; + + /** + * The 'title' of this Collector. + * Used to name things in the toolbar HTML. + * + * @var string + */ + protected $title = 'Logs'; + + /** + * Our collected data. + * + * @var array + */ + protected $data; + + /** + * Returns the data of this collector to be formatted in the toolbar + */ + public function display(): array + { + return [ + 'logs' => $this->collectLogs(), + ]; + } + + /** + * Does this collector actually have any data to display? + */ + public function isEmpty(): bool + { + $this->collectLogs(); + + return empty($this->data); + } + + /** + * Display the icon. + * + * Icon from https://icons8.com - 1em package + */ + public function icon(): string + { + return 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAACYSURBVEhLYxgFJIHU1FSjtLS0i0D8AYj7gEKMEBkqAaAFF4D4ERCvAFrwH4gDoFIMKSkpFkB+OTEYqgUTACXfA/GqjIwMQyD9H2hRHlQKJFcBEiMGQ7VgAqCBvUgK32dmZspCpagGGNPT0/1BLqeF4bQHQJePpiIwhmrBBEADR1MRfgB0+WgqAmOoFkwANHA0FY0CUgEDAwCQ0PUpNB3kqwAAAABJRU5ErkJggg=='; + } + + /** + * Ensures the data has been collected. + */ + protected function collectLogs() + { + if (! empty($this->data)) { + return $this->data; + } + + return $this->data = Services::logger(true)->logCache ?? []; + } +} diff --git a/system/Debug/Toolbar/Collectors/Routes.php b/system/Debug/Toolbar/Collectors/Routes.php new file mode 100644 index 0000000..060d8b9 --- /dev/null +++ b/system/Debug/Toolbar/Collectors/Routes.php @@ -0,0 +1,153 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Debug\Toolbar\Collectors; + +use Config\Services; +use ReflectionException; +use ReflectionFunction; +use ReflectionMethod; + +/** + * Routes collector + */ +class Routes extends BaseCollector +{ + /** + * Whether this collector has data that can + * be displayed in the Timeline. + * + * @var bool + */ + protected $hasTimeline = false; + + /** + * Whether this collector needs to display + * content in a tab or not. + * + * @var bool + */ + protected $hasTabContent = true; + + /** + * The 'title' of this Collector. + * Used to name things in the toolbar HTML. + * + * @var string + */ + protected $title = 'Routes'; + + /** + * Returns the data of this collector to be formatted in the toolbar + * + * @throws ReflectionException + */ + public function display(): array + { + $rawRoutes = Services::routes(true); + $router = Services::router(null, null, true); + + // Matched Route + $route = $router->getMatchedRoute(); + + // Get our parameters + // Closure routes + if (is_callable($router->controllerName())) { + $method = new ReflectionFunction($router->controllerName()); + } else { + try { + $method = new ReflectionMethod($router->controllerName(), $router->methodName()); + } catch (ReflectionException $e) { + // If we're here, the method doesn't exist + // and is likely calculated in _remap. + $method = new ReflectionMethod($router->controllerName(), '_remap'); + } + } + + $rawParams = $method->getParameters(); + + $params = []; + + foreach ($rawParams as $key => $param) { + $params[] = [ + 'name' => $param->getName(), + 'value' => $router->params()[$key] ?? + ('<empty> | default: ' . var_export($param->isDefaultValueAvailable() ? $param->getDefaultValue() : null, true)), + ]; + } + + $matchedRoute = [ + [ + 'directory' => $router->directory(), + 'controller' => $router->controllerName(), + 'method' => $router->methodName(), + 'paramCount' => count($router->params()), + 'truePCount' => count($params), + 'params' => $params, + ], + ]; + + // Defined Routes + $routes = []; + $methods = [ + 'get', + 'head', + 'post', + 'patch', + 'put', + 'delete', + 'options', + 'trace', + 'connect', + 'cli', + ]; + + foreach ($methods as $method) { + $raw = $rawRoutes->getRoutes($method); + + foreach ($raw as $route => $handler) { + // filter for strings, as callbacks aren't displayable + if (is_string($handler)) { + $routes[] = [ + 'method' => strtoupper($method), + 'route' => $route, + 'handler' => $handler, + ]; + } + } + } + + return [ + 'matchedRoute' => $matchedRoute, + 'routes' => $routes, + ]; + } + + /** + * Returns a count of all the routes in the system. + */ + public function getBadgeValue(): int + { + $rawRoutes = Services::routes(true); + + return count($rawRoutes->getRoutes()); + } + + /** + * Display the icon. + * + * Icon from https://icons8.com - 1em package + */ + public function icon(): string + { + return 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAFDSURBVEhL7ZRNSsNQFIUjVXSiOFEcuQIHDpzpxC0IGYeE/BEInbWlCHEDLsSiuANdhKDjgm6ggtSJ+l25ldrmmTwIgtgDh/t37r1J+16cX0dRFMtpmu5pWAkrvYjjOB7AETzStBFW+inxu3KUJMmhludQpoflS1zXban4LYqiO224h6VLTHr8Z+z8EpIHFF9gG78nDVmW7UgTHKjsCyY98QP+pcq+g8Ku2s8G8X3f3/I8b038WZTp+bO38zxfFd+I6YY6sNUvFlSDk9CRhiAI1jX1I9Cfw7GG1UB8LAuwbU0ZwQnbRDeEN5qqBxZMLtE1ti9LtbREnMIuOXnyIf5rGIb7Wq8HmlZgwYBH7ORTcKH5E4mpjeGt9fBZcHE2GCQ3Vt7oTNPNg+FXLHnSsHkw/FR+Gg2bB8Ptzrst/v6C/wrH+QB+duli6MYJdQAAAABJRU5ErkJggg=='; + } +} diff --git a/system/Debug/Toolbar/Collectors/Timers.php b/system/Debug/Toolbar/Collectors/Timers.php new file mode 100644 index 0000000..cfce9e6 --- /dev/null +++ b/system/Debug/Toolbar/Collectors/Timers.php @@ -0,0 +1,71 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Debug\Toolbar\Collectors; + +use Config\Services; + +/** + * Timers collector + */ +class Timers extends BaseCollector +{ + /** + * Whether this collector has data that can + * be displayed in the Timeline. + * + * @var bool + */ + protected $hasTimeline = true; + + /** + * Whether this collector needs to display + * content in a tab or not. + * + * @var bool + */ + protected $hasTabContent = false; + + /** + * The 'title' of this Collector. + * Used to name things in the toolbar HTML. + * + * @var string + */ + protected $title = 'Timers'; + + /** + * Child classes should implement this to return the timeline data + * formatted for correct usage. + */ + protected function formatTimelineData(): array + { + $data = []; + + $benchmark = Services::timer(true); + $rows = $benchmark->getTimers(6); + + foreach ($rows as $name => $info) { + if ($name === 'total_execution') { + continue; + } + + $data[] = [ + 'name' => ucwords(str_replace('_', ' ', $name)), + 'component' => 'Timer', + 'start' => $info['start'], + 'duration' => $info['end'] - $info['start'], + ]; + } + + return $data; + } +} diff --git a/system/Debug/Toolbar/Collectors/Views.php b/system/Debug/Toolbar/Collectors/Views.php new file mode 100644 index 0000000..fae3385 --- /dev/null +++ b/system/Debug/Toolbar/Collectors/Views.php @@ -0,0 +1,147 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Debug\Toolbar\Collectors; + +use CodeIgniter\View\RendererInterface; +use Config\Services; + +/** + * Views collector + */ +class Views extends BaseCollector +{ + /** + * Whether this collector has data that can + * be displayed in the Timeline. + * + * @var bool + */ + protected $hasTimeline = true; + + /** + * Whether this collector needs to display + * content in a tab or not. + * + * @var bool + */ + protected $hasTabContent = false; + + /** + * Whether this collector needs to display + * a label or not. + * + * @var bool + */ + protected $hasLabel = true; + + /** + * Whether this collector has data that + * should be shown in the Vars tab. + * + * @var bool + */ + protected $hasVarData = true; + + /** + * The 'title' of this Collector. + * Used to name things in the toolbar HTML. + * + * @var string + */ + protected $title = 'Views'; + + /** + * Instance of the Renderer service + * + * @var RendererInterface + */ + protected $viewer; + + /** + * Views counter + * + * @var array + */ + protected $views = []; + + /** + * Constructor. + */ + public function __construct() + { + $this->viewer = Services::renderer(); + } + + /** + * Child classes should implement this to return the timeline data + * formatted for correct usage. + */ + protected function formatTimelineData(): array + { + $data = []; + + $rows = $this->viewer->getPerformanceData(); + + foreach ($rows as $info) { + $data[] = [ + 'name' => 'View: ' . $info['view'], + 'component' => 'Views', + 'start' => $info['start'], + 'duration' => $info['end'] - $info['start'], + ]; + } + + return $data; + } + + /** + * Gets a collection of data that should be shown in the 'Vars' tab. + * The format is an array of sections, each with their own array + * of key/value pairs: + * + * $data = [ + * 'section 1' => [ + * 'foo' => 'bar, + * 'bar' => 'baz' + * ], + * 'section 2' => [ + * 'foo' => 'bar, + * 'bar' => 'baz' + * ], + * ]; + */ + public function getVarData(): array + { + return [ + + 'View Data' => $this->viewer->getData(), + ]; + } + + /** + * Returns a count of all views. + */ + public function getBadgeValue(): int + { + return count($this->viewer->getPerformanceData()); + } + + /** + * Display the icon. + * + * Icon from https://icons8.com - 1em package + */ + public function icon(): string + { + return 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAADeSURBVEhL7ZSxDcIwEEWNYA0YgGmgyAaJLTcUaaBzQQEVjMEabBQxAdw53zTHiThEovGTfnE/9rsoRUxhKLOmaa6Uh7X2+UvguLCzVxN1XW9x4EYHzik033Hp3X0LO+DaQG8MDQcuq6qao4qkHuMgQggLvkPLjqh00ZgFDBacMJYFkuwFlH1mshdkZ5JPJERA9JpI6xNCBESvibQ+IURA9JpI6xNCBESvibQ+IURA9DTsuHTOrVFFxixgB/eUFlU8uKJ0eDBFOu/9EvoeKnlJS2/08Tc8NOwQ8sIfMeYFjqKDjdU2sp4AAAAASUVORK5CYII='; + } +} diff --git a/system/Debug/Toolbar/Views/_config.tpl b/system/Debug/Toolbar/Views/_config.tpl new file mode 100644 index 0000000..3934cf6 --- /dev/null +++ b/system/Debug/Toolbar/Views/_config.tpl @@ -0,0 +1,48 @@ +

+ Read the CodeIgniter docs... +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CodeIgniter Version:{ ciVersion }
PHP Version:{ phpVersion }
PHP SAPI:{ phpSAPI }
Environment:{ environment }
Base URL: + { if $baseURL == '' } +
+ The $baseURL should always be set manually to prevent possible URL personification from external parties. +
+ { else } + { baseURL } + { endif } +
Timezone:{ timezone }
Locale:{ locale }
Content Security Policy Enabled:{ if $cspEnabled } Yes { else } No { endif }
diff --git a/system/Debug/Toolbar/Views/_database.tpl b/system/Debug/Toolbar/Views/_database.tpl new file mode 100644 index 0000000..1bd9b8a --- /dev/null +++ b/system/Debug/Toolbar/Views/_database.tpl @@ -0,0 +1,26 @@ + + + + + + + + + {queries} + + + + + + + + + + {/queries} + +
TimeQuery String
{duration}{! sql !}{trace-file}
diff --git a/system/Debug/Toolbar/Views/_events.tpl b/system/Debug/Toolbar/Views/_events.tpl new file mode 100644 index 0000000..88d732f --- /dev/null +++ b/system/Debug/Toolbar/Views/_events.tpl @@ -0,0 +1,18 @@ + + + + + + + + + + {events} + + + + + + {/events} + +
TimeEvent NameTimes Called
{ duration } ms{event}{count}
diff --git a/system/Debug/Toolbar/Views/_files.tpl b/system/Debug/Toolbar/Views/_files.tpl new file mode 100644 index 0000000..9c992ab --- /dev/null +++ b/system/Debug/Toolbar/Views/_files.tpl @@ -0,0 +1,16 @@ + + + {userFiles} + + + + + {/userFiles} + {coreFiles} + + + + + {/coreFiles} + +
{name}{path}
{name}{path}
diff --git a/system/Debug/Toolbar/Views/_history.tpl b/system/Debug/Toolbar/Views/_history.tpl new file mode 100644 index 0000000..9db00ec --- /dev/null +++ b/system/Debug/Toolbar/Views/_history.tpl @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + {files} + + + + + + + + + + {/files} + +
ActionDatetimeStatusMethodURLContent-TypeIs AJAX?
+ + {datetime}{status}{method}{url}{contentType}{isAJAX}
diff --git a/system/Debug/Toolbar/Views/_logs.tpl b/system/Debug/Toolbar/Views/_logs.tpl new file mode 100644 index 0000000..7c80d84 --- /dev/null +++ b/system/Debug/Toolbar/Views/_logs.tpl @@ -0,0 +1,20 @@ +{ if $logs == [] } +

Nothing was logged. If you were expecting logged items, ensure that LoggerConfig file has the correct threshold set.

+{ else } + + + + + + + + + {logs} + + + + + {/logs} + +
SeverityMessage
{level}{msg}
+{ endif } diff --git a/system/Debug/Toolbar/Views/_routes.tpl b/system/Debug/Toolbar/Views/_routes.tpl new file mode 100644 index 0000000..e277046 --- /dev/null +++ b/system/Debug/Toolbar/Views/_routes.tpl @@ -0,0 +1,52 @@ +

Matched Route

+ + + + {matchedRoute} + + + + + + + + + + + + + + + + + {params} + + + + + {/params} + {/matchedRoute} + +
Directory:{directory}
Controller:{controller}
Method:{method}
Params:{paramCount} / {truePCount}
{name}{value}
+ + +

Defined Routes

+ + + + + + + + + + + {routes} + + + + + + {/routes} + +
MethodRouteHandler
{method}{route}{handler}
diff --git a/system/Debug/Toolbar/Views/toolbar.css b/system/Debug/Toolbar/Views/toolbar.css new file mode 100644 index 0000000..ed4230b --- /dev/null +++ b/system/Debug/Toolbar/Views/toolbar.css @@ -0,0 +1,653 @@ +/** + * This file is part of the CodeIgniter 4 framework. + * + * (c) CodeIgniter Foundation + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +#debug-icon { + bottom: 0; + position: fixed; + right: 0; + z-index: 10000; + height: 36px; + width: 36px; + margin: 0px; + padding: 0px; + clear: both; + text-align: center; } + #debug-icon a svg { + margin: 8px; + max-width: 20px; + max-height: 20px; } + #debug-icon.fixed-top { + bottom: auto; + top: 0; } + #debug-icon .debug-bar-ndisplay { + display: none; } + +#debug-bar { + bottom: 0; + left: 0; + position: fixed; + right: 0; + z-index: 10000; + height: 36px; + line-height: 36px; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"; + font-size: 16px; + font-weight: 400; } + #debug-bar h1 { + bottom: 0; + display: inline-block; + font-size: 14px; + font-weight: normal; + margin: 0 16px 0 0; + padding: 0; + position: absolute; + right: 30px; + text-align: left; + top: 0; } + #debug-bar h1 svg { + width: 16px; + margin-right: 5px; } + #debug-bar h2 { + font-size: 16px; + margin: 0; + padding: 5px 0 10px 0; } + #debug-bar h2 span { + font-size: 13px; } + #debug-bar h3 { + font-size: 12px; + font-weight: 200; + margin: 0 0 0 10px; + padding: 0; + text-transform: uppercase; } + #debug-bar p { + font-size: 12px; + margin: 0 0 0 15px; + padding: 0; } + #debug-bar a { + text-decoration: none; } + #debug-bar a:hover { + text-decoration: underline; } + #debug-bar button { + border: 1px solid; + border-radius: 4px; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + cursor: pointer; + line-height: 15px; } + #debug-bar button:hover { + text-decoration: underline; } + #debug-bar table { + border-collapse: collapse; + font-size: 14px; + line-height: normal; + margin: 5px 10px 15px 10px; + width: calc(100% - 10px); } + #debug-bar table strong { + font-weight: 500; } + #debug-bar table th { + display: table-cell; + font-weight: 600; + padding-bottom: 0.7em; + text-align: left; } + #debug-bar table tr { + border: none; } + #debug-bar table td { + border: none; + display: table-cell; + margin: 0; + text-align: left; } + #debug-bar table td:first-child { + max-width: 20%; } + #debug-bar table td:first-child.narrow { + width: 7em; } + #debug-bar td[data-debugbar-route] form { + display: none; } + #debug-bar td[data-debugbar-route]:hover form { + display: block; } + #debug-bar td[data-debugbar-route]:hover > div { + display: none; } + #debug-bar td[data-debugbar-route] input[type=text] { + padding: 2px; } + #debug-bar .toolbar { + display: flex; + overflow: hidden; + overflow-y: auto; + padding: 0 12px 0 12px; + white-space: nowrap; + z-index: 10000; } + #debug-bar.fixed-top { + bottom: auto; + top: 0; } + #debug-bar.fixed-top .tab { + bottom: auto; + top: 36px; } + #debug-bar #toolbar-position a, + #debug-bar #toolbar-theme a { + padding: 0 6px; + display: inline-flex; + vertical-align: top; } + #debug-bar #toolbar-position a:hover, + #debug-bar #toolbar-theme a:hover { + text-decoration: none; } + #debug-bar #debug-bar-link { + bottom: 0; + display: inline-block; + font-size: 16px; + line-height: 36px; + padding: 6px; + position: absolute; + right: 10px; + top: 0; + width: 24px; } + #debug-bar .ci-label { + display: inline-flex; + font-size: 14px; } + #debug-bar .ci-label:hover { + cursor: pointer; } + #debug-bar .ci-label a { + color: inherit; + display: flex; + letter-spacing: normal; + padding: 0 10px; + text-decoration: none; + align-items: center; } + #debug-bar .ci-label img { + margin: 6px 3px 6px 0; + width: 16px !important; } + #debug-bar .ci-label .badge { + border-radius: 12px; + -moz-border-radius: 12px; + -webkit-border-radius: 12px; + display: inline-block; + font-size: 75%; + font-weight: bold; + line-height: 12px; + margin-left: 5px; + padding: 2px 5px; + text-align: center; + vertical-align: baseline; + white-space: nowrap; } + #debug-bar .tab { + bottom: 35px; + display: none; + left: 0; + max-height: 62%; + overflow: hidden; + overflow-y: auto; + padding: 1em 2em; + position: fixed; + right: 0; + z-index: 9999; } + #debug-bar .timeline { + margin-left: 0; + width: 100%; } + #debug-bar .timeline th { + border-left: 1px solid; + font-size: 12px; + font-weight: 200; + padding: 5px 5px 10px 5px; + position: relative; + text-align: left; } + #debug-bar .timeline th:first-child { + border-left: 0; } + #debug-bar .timeline td { + border-left: 1px solid; + padding: 5px; + position: relative; } + #debug-bar .timeline td:first-child { + border-left: 0; + max-width: none; } + #debug-bar .timeline td.child-container { + padding: 0px; } + #debug-bar .timeline td.child-container .timeline { + margin: 0px; } + #debug-bar .timeline td.child-container .timeline td:first-child:not(.child-container) { + padding-left: calc(5px + 10px * var(--level)); } + #debug-bar .timeline .timer { + border-radius: 4px; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + display: inline-block; + padding: 5px; + position: absolute; + top: 30%; } + #debug-bar .timeline .timeline-parent { + cursor: pointer; } + #debug-bar .timeline .timeline-parent td:first-child nav { + background: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzMCAxNTAiPjxwYXRoIGQ9Ik02IDdoMThsLTkgMTV6bTAgMzBoMThsLTkgMTV6bTAgNDVoMThsLTktMTV6bTAgMzBoMThsLTktMTV6bTAgMTJsMTggMThtLTE4IDBsMTgtMTgiIGZpbGw9IiM1NTUiLz48cGF0aCBkPSJNNiAxMjZsMTggMThtLTE4IDBsMTgtMTgiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlPSIjNTU1Ii8+PC9zdmc+") no-repeat scroll 0 0/15px 75px transparent; + background-position: 0 25%; + display: inline-block; + height: 15px; + width: 15px; + margin-right: 3px; + vertical-align: middle; } + #debug-bar .timeline .timeline-parent-open { + background-color: #DFDFDF; } + #debug-bar .timeline .timeline-parent-open td:first-child nav { + background-position: 0 75%; } + #debug-bar .timeline .child-row:hover { + background: transparent; } + #debug-bar .route-params, + #debug-bar .route-params-item { + vertical-align: top; } + #debug-bar .route-params td:first-child, + #debug-bar .route-params-item td:first-child { + font-style: italic; + padding-left: 1em; + text-align: right; } + +.debug-view.show-view { + border: 1px solid; + margin: 4px; } + +.debug-view-path { + font-family: monospace; + font-size: 12px; + letter-spacing: normal; + min-height: 16px; + padding: 2px; + text-align: left; } + +.show-view .debug-view-path { + display: block !important; } + +@media screen and (max-width: 1024px) { + #debug-bar .ci-label img { + margin: unset; } + .hide-sm { + display: none !important; } } + +#debug-icon { + background-color: #FFFFFF; + box-shadow: 0 0 4px #DFDFDF; + -moz-box-shadow: 0 0 4px #DFDFDF; + -webkit-box-shadow: 0 0 4px #DFDFDF; } + #debug-icon a:active, + #debug-icon a:link, + #debug-icon a:visited { + color: #DD8615; } + +#debug-bar { + background-color: #FFFFFF; + color: #434343; } + #debug-bar h1, + #debug-bar h2, + #debug-bar h3, + #debug-bar p, + #debug-bar a, + #debug-bar button, + #debug-bar table, + #debug-bar thead, + #debug-bar tr, + #debug-bar td, + #debug-bar button, + #debug-bar .toolbar { + background-color: transparent; + color: #434343; } + #debug-bar button { + background-color: #FFFFFF; } + #debug-bar table strong { + color: #DD8615; } + #debug-bar table tbody tr:hover { + background-color: #DFDFDF; } + #debug-bar table tbody tr.current { + background-color: #FDC894; } + #debug-bar table tbody tr.current:hover td { + background-color: #DD4814; + color: #FFFFFF; } + #debug-bar .toolbar { + background-color: #FFFFFF; + box-shadow: 0 0 4px #DFDFDF; + -moz-box-shadow: 0 0 4px #DFDFDF; + -webkit-box-shadow: 0 0 4px #DFDFDF; } + #debug-bar .toolbar img { + filter: brightness(0) invert(0.4); } + #debug-bar.fixed-top .toolbar { + box-shadow: 0 0 4px #DFDFDF; + -moz-box-shadow: 0 0 4px #DFDFDF; + -webkit-box-shadow: 0 0 4px #DFDFDF; } + #debug-bar.fixed-top .tab { + box-shadow: 0 1px 4px #DFDFDF; + -moz-box-shadow: 0 1px 4px #DFDFDF; + -webkit-box-shadow: 0 1px 4px #DFDFDF; } + #debug-bar .muted { + color: #434343; } + #debug-bar .muted td { + color: #DFDFDF; } + #debug-bar .muted:hover td { + color: #434343; } + #debug-bar #toolbar-position, + #debug-bar #toolbar-theme { + filter: brightness(0) invert(0.6); } + #debug-bar .ci-label.active { + background-color: #DFDFDF; } + #debug-bar .ci-label:hover { + background-color: #DFDFDF; } + #debug-bar .ci-label .badge { + background-color: #5BC0DE; + color: #FFFFFF; } + #debug-bar .tab { + background-color: #FFFFFF; + box-shadow: 0 -1px 4px #DFDFDF; + -moz-box-shadow: 0 -1px 4px #DFDFDF; + -webkit-box-shadow: 0 -1px 4px #DFDFDF; } + #debug-bar .timeline th, + #debug-bar .timeline td { + border-color: #DFDFDF; } + #debug-bar .timeline .timer { + background-color: #DD8615; } + +.debug-view.show-view { + border-color: #DD8615; } +#debug-bar tr[data-toggle] { + cursor: pointer; } + +.debug-view-path { + background-color: #FDC894; + color: #434343; } + +@media (prefers-color-scheme: dark) { + #debug-icon { + background-color: #252525; + box-shadow: 0 0 4px #DFDFDF; + -moz-box-shadow: 0 0 4px #DFDFDF; + -webkit-box-shadow: 0 0 4px #DFDFDF; } + #debug-icon a:active, + #debug-icon a:link, + #debug-icon a:visited { + color: #DD8615; } + #debug-bar { + background-color: #252525; + color: #DFDFDF; } + #debug-bar h1, + #debug-bar h2, + #debug-bar h3, + #debug-bar p, + #debug-bar a, + #debug-bar button, + #debug-bar table, + #debug-bar thead, + #debug-bar tr, + #debug-bar td, + #debug-bar button, + #debug-bar .toolbar { + background-color: transparent; + color: #DFDFDF; } + #debug-bar button { + background-color: #252525; } + #debug-bar table strong { + color: #DD8615; } + #debug-bar table tbody tr:hover { + background-color: #434343; } + #debug-bar table tbody tr.current { + background-color: #FDC894; } + #debug-bar table tbody tr.current td { + color: #252525; } + #debug-bar table tbody tr.current:hover td { + background-color: #DD4814; + color: #FFFFFF; } + #debug-bar .toolbar { + background-color: #434343; + box-shadow: 0 0 4px #434343; + -moz-box-shadow: 0 0 4px #434343; + -webkit-box-shadow: 0 0 4px #434343; } + #debug-bar .toolbar img { + filter: brightness(0) invert(1); } + #debug-bar.fixed-top .toolbar { + box-shadow: 0 0 4px #434343; + -moz-box-shadow: 0 0 4px #434343; + -webkit-box-shadow: 0 0 4px #434343; } + #debug-bar.fixed-top .tab { + box-shadow: 0 1px 4px #434343; + -moz-box-shadow: 0 1px 4px #434343; + -webkit-box-shadow: 0 1px 4px #434343; } + #debug-bar .muted { + color: #DFDFDF; } + #debug-bar .muted td { + color: #797979; } + #debug-bar .muted:hover td { + color: #DFDFDF; } + #debug-bar #toolbar-position, + #debug-bar #toolbar-theme { + filter: brightness(0) invert(0.6); } + #debug-bar .ci-label.active { + background-color: #252525; } + #debug-bar .ci-label:hover { + background-color: #252525; } + #debug-bar .ci-label .badge { + background-color: #5BC0DE; + color: #DFDFDF; } + #debug-bar .tab { + background-color: #252525; + box-shadow: 0 -1px 4px #434343; + -moz-box-shadow: 0 -1px 4px #434343; + -webkit-box-shadow: 0 -1px 4px #434343; } + #debug-bar .timeline th, + #debug-bar .timeline td { + border-color: #434343; } + #debug-bar .timeline .timer { + background-color: #DD8615; } + .debug-view.show-view { + border-color: #DD8615; } + .debug-view-path { + background-color: #FDC894; + color: #434343; } } + +#toolbarContainer.dark #debug-icon { + background-color: #252525; + box-shadow: 0 0 4px #DFDFDF; + -moz-box-shadow: 0 0 4px #DFDFDF; + -webkit-box-shadow: 0 0 4px #DFDFDF; } + #toolbarContainer.dark #debug-icon a:active, + #toolbarContainer.dark #debug-icon a:link, + #toolbarContainer.dark #debug-icon a:visited { + color: #DD8615; } + +#toolbarContainer.dark #debug-bar { + background-color: #252525; + color: #DFDFDF; } + #toolbarContainer.dark #debug-bar h1, + #toolbarContainer.dark #debug-bar h2, + #toolbarContainer.dark #debug-bar h3, + #toolbarContainer.dark #debug-bar p, + #toolbarContainer.dark #debug-bar a, + #toolbarContainer.dark #debug-bar button, + #toolbarContainer.dark #debug-bar table, + #toolbarContainer.dark #debug-bar thead, + #toolbarContainer.dark #debug-bar tr, + #toolbarContainer.dark #debug-bar td, + #toolbarContainer.dark #debug-bar button, + #toolbarContainer.dark #debug-bar .toolbar { + background-color: transparent; + color: #DFDFDF; } + #toolbarContainer.dark #debug-bar button { + background-color: #252525; } + #toolbarContainer.dark #debug-bar table strong { + color: #DD8615; } + #toolbarContainer.dark #debug-bar table tbody tr:hover { + background-color: #434343; } + #toolbarContainer.dark #debug-bar table tbody tr.current { + background-color: #FDC894; } + #toolbarContainer.dark #ci-database table tbody tr.duplicate { + background-color: #434343;} + #toolbarContainer.dark #debug-bar table tbody tr.current td { + color: #252525; } + #toolbarContainer.dark #debug-bar table tbody tr.current:hover td { + background-color: #DD4814; + color: #FFFFFF; } + #toolbarContainer.dark #debug-bar .toolbar { + background-color: #434343; + box-shadow: 0 0 4px #434343; + -moz-box-shadow: 0 0 4px #434343; + -webkit-box-shadow: 0 0 4px #434343; } + #toolbarContainer.dark #debug-bar .toolbar img { + filter: brightness(0) invert(1); } + #toolbarContainer.dark #debug-bar.fixed-top .toolbar { + box-shadow: 0 0 4px #434343; + -moz-box-shadow: 0 0 4px #434343; + -webkit-box-shadow: 0 0 4px #434343; } + #toolbarContainer.dark #debug-bar.fixed-top .tab { + box-shadow: 0 1px 4px #434343; + -moz-box-shadow: 0 1px 4px #434343; + -webkit-box-shadow: 0 1px 4px #434343; } + #toolbarContainer.dark #debug-bar .muted { + color: #DFDFDF; } + #toolbarContainer.dark #debug-bar .muted td { + color: #797979; } + #toolbarContainer.dark #debug-bar .muted:hover td { + color: #DFDFDF; } + #toolbarContainer.dark #debug-bar #toolbar-position, + #toolbarContainer.dark #debug-bar #toolbar-theme { + filter: brightness(0) invert(0.6); } + #toolbarContainer.dark #debug-bar .ci-label.active { + background-color: #252525; } + #toolbarContainer.dark #debug-bar .ci-label:hover { + background-color: #252525; } + #toolbarContainer.dark #debug-bar .ci-label .badge { + background-color: #5BC0DE; + color: #DFDFDF; } + #toolbarContainer.dark #debug-bar .tab { + background-color: #252525; + box-shadow: 0 -1px 4px #434343; + -moz-box-shadow: 0 -1px 4px #434343; + -webkit-box-shadow: 0 -1px 4px #434343; } + #toolbarContainer.dark #debug-bar .timeline th, + #toolbarContainer.dark #debug-bar .timeline td { + border-color: #434343; } + #toolbarContainer.dark #debug-bar .timeline .timer { + background-color: #DD8615; } + +#toolbarContainer.dark .debug-view.show-view { + border-color: #DD8615; } + +#toolbarContainer.dark .debug-view-path { + background-color: #FDC894; + color: #434343; } + +#toolbarContainer.dark td[data-debugbar-route] input[type=text] { + background: #000; + color: #fff; } + +#toolbarContainer.light #debug-icon { + background-color: #FFFFFF; + box-shadow: 0 0 4px #DFDFDF; + -moz-box-shadow: 0 0 4px #DFDFDF; + -webkit-box-shadow: 0 0 4px #DFDFDF; } + #toolbarContainer.light #debug-icon a:active, + #toolbarContainer.light #debug-icon a:link, + #toolbarContainer.light #debug-icon a:visited { + color: #DD8615; } + +#toolbarContainer.light #debug-bar { + background-color: #FFFFFF; + color: #434343; } + #toolbarContainer.light #debug-bar h1, + #toolbarContainer.light #debug-bar h2, + #toolbarContainer.light #debug-bar h3, + #toolbarContainer.light #debug-bar p, + #toolbarContainer.light #debug-bar a, + #toolbarContainer.light #debug-bar button, + #toolbarContainer.light #debug-bar table, + #toolbarContainer.light #debug-bar thead, + #toolbarContainer.light #debug-bar tr, + #toolbarContainer.light #debug-bar td, + #toolbarContainer.light #debug-bar button, + #toolbarContainer.light #debug-bar .toolbar { + background-color: transparent; + color: #434343; } + #toolbarContainer.light #debug-bar button { + background-color: #FFFFFF; } + #toolbarContainer.light #debug-bar table strong { + color: #DD8615; } + #toolbarContainer.light #debug-bar table tbody tr:hover { + background-color: #DFDFDF; } + #toolbarContainer.light #debug-bar table tbody tr.current { + background-color: #FDC894; } + #toolbarContainer.light #ci-database table tbody tr.duplicate { + background-color: #DFDFDF;} + #toolbarContainer.light #debug-bar table tbody tr.current:hover td { + background-color: #DD4814; + color: #FFFFFF; } + #toolbarContainer.light #debug-bar .toolbar { + background-color: #FFFFFF; + box-shadow: 0 0 4px #DFDFDF; + -moz-box-shadow: 0 0 4px #DFDFDF; + -webkit-box-shadow: 0 0 4px #DFDFDF; } + #toolbarContainer.light #debug-bar .toolbar img { + filter: brightness(0) invert(0.4); } + #toolbarContainer.light #debug-bar.fixed-top .toolbar { + box-shadow: 0 0 4px #DFDFDF; + -moz-box-shadow: 0 0 4px #DFDFDF; + -webkit-box-shadow: 0 0 4px #DFDFDF; } + #toolbarContainer.light #debug-bar.fixed-top .tab { + box-shadow: 0 1px 4px #DFDFDF; + -moz-box-shadow: 0 1px 4px #DFDFDF; + -webkit-box-shadow: 0 1px 4px #DFDFDF; } + #toolbarContainer.light #debug-bar .muted { + color: #797979; } + #toolbarContainer.light #debug-bar .muted td { + color: #797979; } + #toolbarContainer.light #debug-bar .muted:hover td { + color: #434343; } + #toolbarContainer.light #debug-bar #toolbar-position, + #toolbarContainer.light #debug-bar #toolbar-theme { + filter: brightness(0) invert(0.6); } + #toolbarContainer.light #debug-bar .ci-label.active { + background-color: #DFDFDF; } + #toolbarContainer.light #debug-bar .ci-label:hover { + background-color: #DFDFDF; } + #toolbarContainer.light #debug-bar .ci-label .badge { + background-color: #5BC0DE; + color: #FFFFFF; } + #toolbarContainer.light #debug-bar .tab { + background-color: #FFFFFF; + box-shadow: 0 -1px 4px #DFDFDF; + -moz-box-shadow: 0 -1px 4px #DFDFDF; + -webkit-box-shadow: 0 -1px 4px #DFDFDF; } + #toolbarContainer.light #debug-bar .timeline th, + #toolbarContainer.light #debug-bar .timeline td { + border-color: #DFDFDF; } + #toolbarContainer.light #debug-bar .timeline .timer { + background-color: #DD8615; } + +#toolbarContainer.light .debug-view.show-view { + border-color: #DD8615; } + +#toolbarContainer.light .debug-view-path { + background-color: #FDC894; + color: #434343; } + +.debug-bar-width30 { + width: 30%; } + +.debug-bar-width10 { + width: 10%; } + +.debug-bar-width70p { + width: 70px; } + +.debug-bar-width140p { + width: 140px; } + +.debug-bar-width20e { + width: 20em; } + +.debug-bar-width6r { + width: 6rem; } + +.debug-bar-ndisplay { + display: none; } + +.debug-bar-alignRight { + text-align: right; } + +.debug-bar-alignLeft { + text-align: left; } + +.debug-bar-noverflow { + overflow: hidden; } diff --git a/system/Debug/Toolbar/Views/toolbar.js b/system/Debug/Toolbar/Views/toolbar.js new file mode 100644 index 0000000..3bd05d5 --- /dev/null +++ b/system/Debug/Toolbar/Views/toolbar.js @@ -0,0 +1,687 @@ +/* + * Functionality for the CodeIgniter Debug Toolbar. + */ + +var ciDebugBar = { + + toolbarContainer : null, + toolbar : null, + icon : null, + + init : function () { + this.toolbarContainer = document.getElementById('toolbarContainer'); + this.toolbar = document.getElementById('debug-bar'); + this.icon = document.getElementById('debug-icon'); + + ciDebugBar.createListeners(); + ciDebugBar.setToolbarState(); + ciDebugBar.setToolbarPosition(); + ciDebugBar.setToolbarTheme(); + ciDebugBar.toggleViewsHints(); + ciDebugBar.routerLink(); + + document.getElementById('debug-bar-link').addEventListener('click', ciDebugBar.toggleToolbar, true); + document.getElementById('debug-icon-link').addEventListener('click', ciDebugBar.toggleToolbar, true); + + // Allows to highlight the row of the current history request + var btn = this.toolbar.querySelector('button[data-time="' + localStorage.getItem('debugbar-time') + '"]'); + ciDebugBar.addClass(btn.parentNode.parentNode, 'current'); + + historyLoad = this.toolbar.getElementsByClassName('ci-history-load'); + + for (var i = 0; i < historyLoad.length; i++) + { + historyLoad[i].addEventListener('click', function () { + loadDoc(this.getAttribute('data-time')); + }, true); + } + + // Display the active Tab on page load + var tab = ciDebugBar.readCookie('debug-bar-tab'); + if (document.getElementById(tab)) + { + var el = document.getElementById(tab); + el.style.display = 'block'; + ciDebugBar.addClass(el, 'active'); + tab = document.querySelector('[data-tab=' + tab + ']'); + if (tab) + { + ciDebugBar.addClass(tab.parentNode, 'active'); + } + } + }, + + createListeners : function () { + var buttons = [].slice.call(this.toolbar.querySelectorAll('.ci-label a')); + + for (var i = 0; i < buttons.length; i++) + { + buttons[i].addEventListener('click', ciDebugBar.showTab, true); + } + + // Hook up generic toggle via data attributes `data-toggle="foo"` + var links = this.toolbar.querySelectorAll('[data-toggle]'); + for (var i = 0; i < links.length; i++) + { + links[i].addEventListener('click', ciDebugBar.toggleRows, true); + } + }, + + showTab: function () { + // Get the target tab, if any + var tab = document.getElementById(this.getAttribute('data-tab')); + + // If the label have not a tab stops here + if (! tab) + { + return; + } + + // Remove debug-bar-tab cookie + ciDebugBar.createCookie('debug-bar-tab', '', -1); + + // Check our current state. + var state = tab.style.display; + + // Hide all tabs + var tabs = document.querySelectorAll('#debug-bar .tab'); + + for (var i = 0; i < tabs.length; i++) + { + tabs[i].style.display = 'none'; + } + + // Mark all labels as inactive + var labels = document.querySelectorAll('#debug-bar .ci-label'); + + for (var i = 0; i < labels.length; i++) + { + ciDebugBar.removeClass(labels[i], 'active'); + } + + // Show/hide the selected tab + if (state != 'block') + { + tab.style.display = 'block'; + ciDebugBar.addClass(this.parentNode, 'active'); + // Create debug-bar-tab cookie to persistent state + ciDebugBar.createCookie('debug-bar-tab', this.getAttribute('data-tab'), 365); + } + }, + + addClass : function (el, className) { + if (el.classList) + { + el.classList.add(className); + } + else + { + el.className += ' ' + className; + } + }, + + removeClass : function (el, className) { + if (el.classList) + { + el.classList.remove(className); + } + else + { + el.className = el.className.replace(new RegExp('(^|\\b)' + className.split(' ').join('|') + '(\\b|$)', 'gi'), ' '); + } + }, + + /** + * Toggle display of another object based on + * the data-toggle value of this object + * + * @param event + */ + toggleRows : function(event) { + if(event.target) + { + let row = event.target.closest('tr'); + let target = document.getElementById(row.getAttribute('data-toggle')); + target.style.display = target.style.display === 'none' ? 'table-row' : 'none'; + } + }, + + /** + * Toggle display of a data table + * + * @param obj + */ + toggleDataTable : function (obj) { + if (typeof obj == 'string') + { + obj = document.getElementById(obj + '_table'); + } + + if (obj) + { + obj.style.display = obj.style.display === 'none' ? 'block' : 'none'; + } + }, + + /** + * Toggle display of timeline child elements + * + * @param obj + */ + toggleChildRows : function (obj) { + if (typeof obj == 'string') + { + par = document.getElementById(obj + '_parent') + obj = document.getElementById(obj + '_children'); + } + + if (par && obj) + { + obj.style.display = obj.style.display === 'none' ? '' : 'none'; + par.classList.toggle('timeline-parent-open'); + } + }, + + + //-------------------------------------------------------------------- + + /** + * Toggle tool bar from full to icon and icon to full + */ + toggleToolbar : function () { + var open = ciDebugBar.toolbar.style.display != 'none'; + + ciDebugBar.icon.style.display = open == true ? 'inline-block' : 'none'; + ciDebugBar.toolbar.style.display = open == false ? 'inline-block' : 'none'; + + // Remember it for other page loads on this site + ciDebugBar.createCookie('debug-bar-state', '', -1); + ciDebugBar.createCookie('debug-bar-state', open == true ? 'minimized' : 'open' , 365); + }, + + /** + * Sets the initial state of the toolbar (open or minimized) when + * the page is first loaded to allow it to remember the state between refreshes. + */ + setToolbarState: function () { + var open = ciDebugBar.readCookie('debug-bar-state'); + + ciDebugBar.icon.style.display = open != 'open' ? 'inline-block' : 'none'; + ciDebugBar.toolbar.style.display = open == 'open' ? 'inline-block' : 'none'; + }, + + toggleViewsHints: function () { + // Avoid toggle hints on history requests that are not the initial + if (localStorage.getItem('debugbar-time') != localStorage.getItem('debugbar-time-new')) + { + var a = document.querySelector('a[data-tab="ci-views"]'); + a.href = '#'; + return; + } + + var nodeList = []; // [ Element, NewElement( 1 )/OldElement( 0 ) ] + var sortedComments = []; + var comments = []; + + var getComments = function () { + var nodes = []; + var result = []; + var xpathResults = document.evaluate( "//comment()[starts-with(., ' DEBUG-VIEW')]", document, null, XPathResult.ANY_TYPE, null); + var nextNode = xpathResults.iterateNext(); + while ( nextNode ) + { + nodes.push( nextNode ); + nextNode = xpathResults.iterateNext(); + } + + // sort comment by opening and closing tags + for (var i = 0; i < nodes.length; ++i) + { + // get file path + name to use as key + var path = nodes[i].nodeValue.substring( 18, nodes[i].nodeValue.length - 1 ); + + if ( nodes[i].nodeValue[12] === 'S' ) // simple check for start comment + { + // create new entry + result[path] = [ nodes[i], null ]; + } + else if (result[path]) + { + // add to existing entry + result[path][1] = nodes[i]; + } + } + + return result; + }; + + // find node that has TargetNode as parentNode + var getParentNode = function ( node, targetNode ) { + if ( node.parentNode === null ) + { + return null; + } + + if ( node.parentNode !== targetNode ) + { + return getParentNode( node.parentNode, targetNode ); + } + + return node; + }; + + // define invalid & outer ( also invalid ) elements + const INVALID_ELEMENTS = [ 'NOSCRIPT', 'SCRIPT', 'STYLE' ]; + const OUTER_ELEMENTS = [ 'HTML', 'BODY', 'HEAD' ]; + + var getValidElementInner = function ( node, reverse ) { + // handle invalid tags + if ( OUTER_ELEMENTS.indexOf( node.nodeName ) !== -1 ) + { + for (var i = 0; i < document.body.children.length; ++i) + { + var index = reverse ? document.body.children.length - ( i + 1 ) : i; + var element = document.body.children[index]; + + // skip invalid tags + if ( INVALID_ELEMENTS.indexOf( element.nodeName ) !== -1 ) + { + continue; + } + + return [ element, reverse ]; + } + + return null; + } + + // get to next valid element + while ( node !== null && INVALID_ELEMENTS.indexOf( node.nodeName ) !== -1 ) + { + node = reverse ? node.previousElementSibling : node.nextElementSibling; + } + + // return non array if we couldnt find something + if ( node === null ) + { + return null; + } + + return [ node, reverse ]; + }; + + // get next valid element ( to be safe to add divs ) + // @return [ element, skip element ] or null if we couldnt find a valid place + var getValidElement = function ( nodeElement ) { + if (nodeElement) + { + if ( nodeElement.nextElementSibling !== null ) + { + return getValidElementInner( nodeElement.nextElementSibling, false ) + || getValidElementInner( nodeElement.previousElementSibling, true ); + } + if ( nodeElement.previousElementSibling !== null ) + { + return getValidElementInner( nodeElement.previousElementSibling, true ); + } + } + + // something went wrong! -> element is not in DOM + return null; + }; + + function showHints() + { + // Had AJAX? Reset view blocks + sortedComments = getComments(); + + for (var key in sortedComments) + { + var startElement = getValidElement( sortedComments[key][0] ); + var endElement = getValidElement( sortedComments[key][1] ); + + // skip if we couldnt get a valid element + if ( startElement === null || endElement === null ) + { + continue; + } + + // find element which has same parent as startelement + var jointParent = getParentNode( endElement[0], startElement[0].parentNode ); + if ( jointParent === null ) + { + // find element which has same parent as endelement + jointParent = getParentNode( startElement[0], endElement[0].parentNode ); + if ( jointParent === null ) + { + // both tries failed + continue; + } + else + { + startElement[0] = jointParent; + } + } + else + { + endElement[0] = jointParent; + } + + var debugDiv = document.createElement( 'div' ); // holder + var debugPath = document.createElement( 'div' ); // path + var childArray = startElement[0].parentNode.childNodes; // target child array + var parent = startElement[0].parentNode; + var start, end; + + // setup container + debugDiv.classList.add( 'debug-view' ); + debugDiv.classList.add( 'show-view' ); + debugPath.classList.add( 'debug-view-path' ); + debugPath.innerText = key; + debugDiv.appendChild( debugPath ); + + // calc distance between them + // start + for (var i = 0; i < childArray.length; ++i) + { + // check for comment ( start & end ) -> if its before valid start element + if ( childArray[i] === sortedComments[key][1] || + childArray[i] === sortedComments[key][0] || + childArray[i] === startElement[0] ) + { + start = i; + if ( childArray[i] === sortedComments[key][0] ) + { + start++; // increase to skip the start comment + } + break; + } + } + // adjust if we want to skip the start element + if ( startElement[1] ) + { + start++; + } + + // end + for (var i = start; i < childArray.length; ++i) + { + if ( childArray[i] === endElement[0] ) + { + end = i; + // dont break to check for end comment after end valid element + } + else if ( childArray[i] === sortedComments[key][1] ) + { + // if we found the end comment, we can break + end = i; + break; + } + } + + // move elements + var number = end - start; + if ( endElement[1] ) + { + number++; + } + for (var i = 0; i < number; ++i) + { + if ( INVALID_ELEMENTS.indexOf( childArray[start] ) !== -1 ) + { + // skip invalid childs that can cause problems if moved + start++; + continue; + } + debugDiv.appendChild( childArray[start] ); + } + + // add container to DOM + nodeList.push( parent.insertBefore( debugDiv, childArray[start] ) ); + } + + ciDebugBar.createCookie('debug-view', 'show', 365); + ciDebugBar.addClass(btn, 'active'); + } + + function hideHints() + { + for (var i = 0; i < nodeList.length; ++i) + { + var index; + + // find index + for (var j = 0; j < nodeList[i].parentNode.childNodes.length; ++j) + { + if ( nodeList[i].parentNode.childNodes[j] === nodeList[i] ) + { + index = j; + break; + } + } + + // move child back + while ( nodeList[i].childNodes.length !== 1 ) + { + nodeList[i].parentNode.insertBefore( nodeList[i].childNodes[1], nodeList[i].parentNode.childNodes[index].nextSibling ); + index++; + } + + nodeList[i].parentNode.removeChild( nodeList[i] ); + } + nodeList.length = 0; + + ciDebugBar.createCookie('debug-view', '', -1); + ciDebugBar.removeClass(btn, 'active'); + } + + var btn = document.querySelector('[data-tab=ci-views]'); + + // If the Views Collector is inactive stops here + if (! btn) + { + return; + } + + btn.parentNode.onclick = function () { + if (ciDebugBar.readCookie('debug-view')) + { + hideHints(); + } + else + { + showHints(); + } + }; + + // Determine Hints state on page load + if (ciDebugBar.readCookie('debug-view')) + { + showHints(); + } + }, + + setToolbarPosition: function () { + var btnPosition = this.toolbar.querySelector('#toolbar-position'); + + if (ciDebugBar.readCookie('debug-bar-position') === 'top') + { + ciDebugBar.addClass(ciDebugBar.icon, 'fixed-top'); + ciDebugBar.addClass(ciDebugBar.toolbar, 'fixed-top'); + } + + btnPosition.addEventListener('click', function () { + var position = ciDebugBar.readCookie('debug-bar-position'); + + ciDebugBar.createCookie('debug-bar-position', '', -1); + + if (!position || position === 'bottom') + { + ciDebugBar.createCookie('debug-bar-position', 'top', 365); + ciDebugBar.addClass(ciDebugBar.icon, 'fixed-top'); + ciDebugBar.addClass(ciDebugBar.toolbar, 'fixed-top'); + } + else + { + ciDebugBar.createCookie('debug-bar-position', 'bottom', 365); + ciDebugBar.removeClass(ciDebugBar.icon, 'fixed-top'); + ciDebugBar.removeClass(ciDebugBar.toolbar, 'fixed-top'); + } + }, true); + }, + + setToolbarTheme: function () { + var btnTheme = this.toolbar.querySelector('#toolbar-theme'); + var isDarkMode = window.matchMedia("(prefers-color-scheme: dark)").matches; + var isLightMode = window.matchMedia("(prefers-color-scheme: light)").matches; + + // If a cookie is set with a value, we force the color scheme + if (ciDebugBar.readCookie('debug-bar-theme') === 'dark') + { + ciDebugBar.removeClass(ciDebugBar.toolbarContainer, 'light'); + ciDebugBar.addClass(ciDebugBar.toolbarContainer, 'dark'); + } + else if (ciDebugBar.readCookie('debug-bar-theme') === 'light') + { + ciDebugBar.removeClass(ciDebugBar.toolbarContainer, 'dark'); + ciDebugBar.addClass(ciDebugBar.toolbarContainer, 'light'); + } + + btnTheme.addEventListener('click', function () { + var theme = ciDebugBar.readCookie('debug-bar-theme'); + + if (!theme && window.matchMedia("(prefers-color-scheme: dark)").matches) + { + // If there is no cookie, and "prefers-color-scheme" is set to "dark" + // It means that the user wants to switch to light mode + ciDebugBar.createCookie('debug-bar-theme', 'light', 365); + ciDebugBar.removeClass(ciDebugBar.toolbarContainer, 'dark'); + ciDebugBar.addClass(ciDebugBar.toolbarContainer, 'light'); + } + else + { + if (theme === 'dark') + { + ciDebugBar.createCookie('debug-bar-theme', 'light', 365); + ciDebugBar.removeClass(ciDebugBar.toolbarContainer, 'dark'); + ciDebugBar.addClass(ciDebugBar.toolbarContainer, 'light'); + } + else + { + // In any other cases: if there is no cookie, or the cookie is set to + // "light", or the "prefers-color-scheme" is "light"... + ciDebugBar.createCookie('debug-bar-theme', 'dark', 365); + ciDebugBar.removeClass(ciDebugBar.toolbarContainer, 'light'); + ciDebugBar.addClass(ciDebugBar.toolbarContainer, 'dark'); + } + } + }, true); + }, + + /** + * Helper to create a cookie. + * + * @param name + * @param value + * @param days + */ + createCookie : function (name,value,days) { + if (days) + { + var date = new Date(); + + date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000)); + + var expires = "; expires=" + date.toGMTString(); + } + else + { + var expires = ""; + } + + document.cookie = name + "=" + value + expires + "; path=/; samesite=Lax"; + }, + + readCookie : function (name) { + var nameEQ = name + "="; + var ca = document.cookie.split(';'); + + for (var i = 0; i < ca.length; i++) + { + var c = ca[i]; + while (c.charAt(0) == ' ') + { + c = c.substring(1,c.length); + } + if (c.indexOf(nameEQ) == 0) + { + return c.substring(nameEQ.length,c.length); + } + } + return null; + }, + + trimSlash: function (text) { + return text.replace(/^\/|\/$/g, ''); + }, + + routerLink: function () { + var row, _location; + var rowGet = this.toolbar.querySelectorAll('td[data-debugbar-route="GET"]'); + var patt = /\((?:[^)(]+|\((?:[^)(]+|\([^)(]*\))*\))*\)/; + + for (var i = 0; i < rowGet.length; i++) + { + row = rowGet[i]; + if (!/\/\(.+?\)/.test(rowGet[i].innerText)) + { + row.style = 'cursor: pointer;'; + row.setAttribute('title', location.origin + '/' + ciDebugBar.trimSlash(row.innerText)); + row.addEventListener('click', function (ev) { + _location = location.origin + '/' + ciDebugBar.trimSlash(ev.target.innerText); + var redirectWindow = window.open(_location, '_blank'); + redirectWindow.location; + }); + } + else + { + row.innerHTML = '
' + row.innerText + '
' + + '
' + + row.innerText.replace(patt, '') + + '' + + '
'; + } + } + + rowGet = this.toolbar.querySelectorAll('td[data-debugbar-route="GET"] form'); + for (var i = 0; i < rowGet.length; i++) + { + row = rowGet[i]; + + row.addEventListener('submit', function (event) { + event.preventDefault() + var inputArray = [], t = 0; + var input = event.target.querySelectorAll('input[type=text]'); + var tpl = event.target.getAttribute('data-debugbar-route-tpl'); + + for (var n = 0; n < input.length; n++) + { + if (input[n].value.length > 0) + { + inputArray.push(input[n].value); + } + } + + if (inputArray.length > 0) + { + _location = location.origin + '/' + tpl.replace(/\?/g, function () { + return inputArray[t++] + }); + + var redirectWindow = window.open(_location, '_blank'); + redirectWindow.location; + } + }) + } + } +}; diff --git a/system/Debug/Toolbar/Views/toolbar.tpl.php b/system/Debug/Toolbar/Views/toolbar.tpl.php new file mode 100644 index 0000000..65cf2a4 --- /dev/null +++ b/system/Debug/Toolbar/Views/toolbar.tpl.php @@ -0,0 +1,271 @@ + + + + + +
+
+ + 🔅 + + + + ms   MB + + + + + + + + + + + + + + + + + + + + + + + Vars + + + +

+ + + + + + +

+ + + + + +
+ + +
+ + + + + + + + + + + + + renderTimeline($collectors, $startTime, $segmentCount, $segmentDuration, $styles) ?> + +
NAMECOMPONENTDURATION ms
+
+ + + + + +
+

+ + setData($c['display'])->render("_{$c['titleSafe']}.tpl") ?> +
+ + + + + +
+ + + + $items) : ?> + + +

+
+ + + + + + $value) : ?> + + + + + + +
+ + +

No data to display.

+ + + + + + +

Session User Data

+
+ + + + + + $value) : ?> + + + + + + +
+ +

No data to display.

+ + +

Session doesn't seem to be active.

+ + +

Request ( )

+ + + +

$_GET

+
+ + + + $value) : ?> + + + + + + +
+ + + + +

$_POST

+
+ + + + $value) : ?> + + + + + + +
+ + + + +

Headers

+
+ + + + $value) : ?> + + + + + + +
+ + + + +

Cookies

+
+ + + + $value) : ?> + + + + + + + + + +

Response + ( ) +

+ + + +

Headers

+
+ + + + $value) : ?> + + + + + + +
+ +
+ + +
+

System Configuration

+ + setData($config)->render('_config.tpl') ?> +
+
+ diff --git a/system/Debug/Toolbar/Views/toolbarloader.js b/system/Debug/Toolbar/Views/toolbarloader.js new file mode 100644 index 0000000..7e59143 --- /dev/null +++ b/system/Debug/Toolbar/Views/toolbarloader.js @@ -0,0 +1,87 @@ +document.addEventListener('DOMContentLoaded', loadDoc, false); + +function loadDoc(time) { + if (isNaN(time)) { + time = document.getElementById("debugbar_loader").getAttribute("data-time"); + localStorage.setItem('debugbar-time', time); + } + + localStorage.setItem('debugbar-time-new', time); + + let url = '{url}'; + let xhttp = new XMLHttpRequest(); + + xhttp.onreadystatechange = function() { + if (this.readyState === 4 && this.status === 200) { + let toolbar = document.getElementById("toolbarContainer"); + + if (! toolbar) { + toolbar = document.createElement('div'); + toolbar.setAttribute('id', 'toolbarContainer'); + document.body.appendChild(toolbar); + } + + let responseText = this.responseText; + let dynamicStyle = document.getElementById('debugbar_dynamic_style'); + let dynamicScript = document.getElementById('debugbar_dynamic_script'); + + // get the first style block, copy contents to dynamic_style, then remove here + let start = responseText.indexOf('>', responseText.indexOf('', start); + dynamicStyle.innerHTML = responseText.substr(start, end - start); + responseText = responseText.substr(end + 8); + + // get the first script after the first style, copy contents to dynamic_script, then remove here + start = responseText.indexOf('>', responseText.indexOf('', start); + dynamicScript.innerHTML = responseText.substr(start, end - start); + responseText = responseText.substr(end + 9); + + // check for last style block, append contents to dynamic_style, then remove here + start = responseText.indexOf('>', responseText.indexOf('', start); + dynamicStyle.innerHTML += responseText.substr(start, end - start); + responseText = responseText.substr(0, start - 8); + + toolbar.innerHTML = responseText; + + if (typeof ciDebugBar === 'object') { + ciDebugBar.init(); + } + } else if (this.readyState === 4 && this.status === 404) { + console.log('CodeIgniter DebugBar: File "WRITEPATH/debugbar/debugbar_' + time + '" not found.'); + } + }; + + xhttp.open("GET", url + "?debugbar_time=" + time, true); + xhttp.send(); +} + +window.oldXHR = window.ActiveXObject + ? new ActiveXObject('Microsoft.XMLHTTP') + : window.XMLHttpRequest; + +function newXHR() { + const realXHR = new window.oldXHR(); + + realXHR.addEventListener("readystatechange", function() { + // Only success responses and URLs that do not contains "debugbar_time" are tracked + if (realXHR.readyState === 4 && realXHR.status.toString()[0] === '2' && realXHR.responseURL.indexOf('debugbar_time') === -1) { + if (realXHR.getAllResponseHeaders().indexOf("Debugbar-Time") >= 0) { + let debugbarTime = realXHR.getResponseHeader('Debugbar-Time'); + + if (debugbarTime) { + let h2 = document.querySelector('#ci-history > h2'); + + if (h2) { + h2.innerHTML = 'History You have new debug data. '; + document.querySelector('a[data-tab="ci-history"] > span > .badge').className += ' active'; + } + } + } + } + }, false); + return realXHR; +} + +window.XMLHttpRequest = newXHR; diff --git a/system/Email/Email.php b/system/Email/Email.php new file mode 100644 index 0000000..966c08e --- /dev/null +++ b/system/Email/Email.php @@ -0,0 +1,2199 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Email; + +use CodeIgniter\Events\Events; +use Config\Mimes; +use ErrorException; + +/** + * CodeIgniter Email Class + * + * Permits email to be sent using Mail, Sendmail, or SMTP. + */ +class Email +{ + /** + * Properties from the last successful send. + * + * @var array|null + */ + public $archive; + + /** + * Properties to be added to the next archive. + * + * @var array + */ + protected $tmpArchive = []; + + /** + * @var string + */ + public $fromEmail; + + /** + * @var string + */ + public $fromName; + + /** + * Used as the User-Agent and X-Mailer headers' value. + * + * @var string + */ + public $userAgent = 'CodeIgniter'; + + /** + * Path to the Sendmail binary. + * + * @var string + */ + public $mailPath = '/usr/sbin/sendmail'; + + /** + * Which method to use for sending e-mails. + * + * @var string 'mail', 'sendmail' or 'smtp' + */ + public $protocol = 'mail'; + + /** + * STMP Server host + * + * @var string + */ + public $SMTPHost = ''; + + /** + * SMTP Username + * + * @var string + */ + public $SMTPUser = ''; + + /** + * SMTP Password + * + * @var string + */ + public $SMTPPass = ''; + + /** + * SMTP Server port + * + * @var int + */ + public $SMTPPort = 25; + + /** + * SMTP connection timeout in seconds + * + * @var int + */ + public $SMTPTimeout = 5; + + /** + * SMTP persistent connection + * + * @var bool + */ + public $SMTPKeepAlive = false; + + /** + * SMTP Encryption + * + * @var string Empty, 'tls' or 'ssl' + */ + public $SMTPCrypto = ''; + + /** + * Whether to apply word-wrapping to the message body. + * + * @var bool + */ + public $wordWrap = true; + + /** + * Number of characters to wrap at. + * + * @see Email::$wordWrap + * + * @var int + */ + public $wrapChars = 76; + + /** + * Message format. + * + * @var string 'text' or 'html' + */ + public $mailType = 'text'; + + /** + * Character set (default: utf-8) + * + * @var string + */ + public $charset = 'utf-8'; + + /** + * Alternative message (for HTML messages only) + * + * @var string + */ + public $altMessage = ''; + + /** + * Whether to validate e-mail addresses. + * + * @var bool + */ + public $validate = true; + + /** + * X-Priority header value. + * + * @var int 1-5 + */ + public $priority = 3; + + /** + * Newline character sequence. + * Use "\r\n" to comply with RFC 822. + * + * @see http://www.ietf.org/rfc/rfc822.txt + * + * @var string "\r\n" or "\n" + */ + public $newline = "\n"; + + /** + * CRLF character sequence + * + * RFC 2045 specifies that for 'quoted-printable' encoding, + * "\r\n" must be used. However, it appears that some servers + * (even on the receiving end) don't handle it properly and + * switching to "\n", while improper, is the only solution + * that seems to work for all environments. + * + * @see http://www.ietf.org/rfc/rfc822.txt + * + * @var string + */ + public $CRLF = "\n"; + + /** + * Whether to use Delivery Status Notification. + * + * @var bool + */ + public $DSN = false; + + /** + * Whether to send multipart alternatives. + * Yahoo! doesn't seem to like these. + * + * @var bool + */ + public $sendMultipart = true; + + /** + * Whether to send messages to BCC recipients in batches. + * + * @var bool + */ + public $BCCBatchMode = false; + + /** + * BCC Batch max number size. + * + * @see Email::$BCCBatchMode + * + * @var int|string + */ + public $BCCBatchSize = 200; + + /** + * Subject header + * + * @var string + */ + protected $subject = ''; + + /** + * Message body + * + * @var string + */ + protected $body = ''; + + /** + * Final message body to be sent. + * + * @var string + */ + protected $finalBody = ''; + + /** + * Final headers to send + * + * @var string + */ + protected $headerStr = ''; + + /** + * SMTP Connection socket placeholder + * + * @var resource|null + */ + protected $SMTPConnect; + + /** + * Mail encoding + * + * @var string '8bit' or '7bit' + */ + protected $encoding = '8bit'; + + /** + * Whether to perform SMTP authentication + * + * @var bool + */ + protected $SMTPAuth = false; + + /** + * Whether to send a Reply-To header + * + * @var bool + */ + protected $replyToFlag = false; + + /** + * Debug messages + * + * @see Email::printDebugger() + * + * @var array + */ + protected $debugMessage = []; + + /** + * Recipients + * + * @var array|string + */ + protected $recipients = []; + + /** + * CC Recipients + * + * @var array + */ + protected $CCArray = []; + + /** + * BCC Recipients + * + * @var array + */ + protected $BCCArray = []; + + /** + * Message headers + * + * @var array + */ + protected $headers = []; + + /** + * Attachment data + * + * @var array + */ + protected $attachments = []; + + /** + * Valid $protocol values + * + * @see Email::$protocol + * + * @var array + */ + protected $protocols = [ + 'mail', + 'sendmail', + 'smtp', + ]; + + /** + * Character sets valid for 7-bit encoding, + * excluding language suffix. + * + * @var array + */ + protected $baseCharsets = [ + 'us-ascii', + 'iso-2022-', + ]; + + /** + * Bit depths + * + * Valid mail encodings + * + * @see Email::$encoding + * + * @var array + */ + protected $bitDepths = [ + '7bit', + '8bit', + ]; + + /** + * $priority translations + * + * Actual values to send with the X-Priority header + * + * @var array + */ + protected $priorities = [ + 1 => '1 (Highest)', + 2 => '2 (High)', + 3 => '3 (Normal)', + 4 => '4 (Low)', + 5 => '5 (Lowest)', + ]; + + /** + * mbstring.func_overload flag + * + * @var bool + */ + protected static $func_overload; + + /** + * @param array|null $config + */ + public function __construct($config = null) + { + $this->initialize($config); + if (! isset(static::$func_overload)) { + static::$func_overload = (extension_loaded('mbstring') && ini_get('mbstring.func_overload')); + } + } + + /** + * Initialize preferences + * + * @param array|\Config\Email $config + * + * @return Email + */ + public function initialize($config) + { + $this->clear(); + + if ($config instanceof \Config\Email) { + $config = get_object_vars($config); + } + + foreach (array_keys(get_class_vars(static::class)) as $key) { + if (property_exists($this, $key) && isset($config[$key])) { + $method = 'set' . ucfirst($key); + + if (method_exists($this, $method)) { + $this->{$method}($config[$key]); + } else { + $this->{$key} = $config[$key]; + } + } + } + + $this->charset = strtoupper($this->charset); + $this->SMTPAuth = isset($this->SMTPUser[0], $this->SMTPPass[0]); + + return $this; + } + + /** + * @param bool $clearAttachments + * + * @return Email + */ + public function clear($clearAttachments = false) + { + $this->subject = ''; + $this->body = ''; + $this->finalBody = ''; + $this->headerStr = ''; + $this->replyToFlag = false; + $this->recipients = []; + $this->CCArray = []; + $this->BCCArray = []; + $this->headers = []; + $this->debugMessage = []; + + $this->setHeader('Date', $this->setDate()); + + if ($clearAttachments !== false) { + $this->attachments = []; + } + + return $this; + } + + /** + * @param string $from + * @param string $name + * @param string|null $returnPath Return-Path + * + * @return Email + */ + public function setFrom($from, $name = '', $returnPath = null) + { + if (preg_match('/\<(.*)\>/', $from, $match)) { + $from = $match[1]; + } + + if ($this->validate) { + $this->validateEmail($this->stringToArray($from)); + + if ($returnPath) { + $this->validateEmail($this->stringToArray($returnPath)); + } + } + + $this->tmpArchive['fromEmail'] = $from; + $this->tmpArchive['fromName'] = $name; + + if ($name !== '') { + // only use Q encoding if there are characters that would require it + if (! preg_match('/[\200-\377]/', $name)) { + $name = '"' . addcslashes($name, "\0..\37\177'\"\\") . '"'; + } else { + $name = $this->prepQEncoding($name); + } + } + + $this->setHeader('From', $name . ' <' . $from . '>'); + if (! isset($returnPath)) { + $returnPath = $from; + } + $this->setHeader('Return-Path', '<' . $returnPath . '>'); + $this->tmpArchive['returnPath'] = $returnPath; + + return $this; + } + + /** + * @param string $replyto + * @param string $name + * + * @return Email + */ + public function setReplyTo($replyto, $name = '') + { + if (preg_match('/\<(.*)\>/', $replyto, $match)) { + $replyto = $match[1]; + } + + if ($this->validate) { + $this->validateEmail($this->stringToArray($replyto)); + } + + if ($name !== '') { + $this->tmpArchive['replyName'] = $name; + + // only use Q encoding if there are characters that would require it + if (! preg_match('/[\200-\377]/', $name)) { + $name = '"' . addcslashes($name, "\0..\37\177'\"\\") . '"'; + } else { + $name = $this->prepQEncoding($name); + } + } + + $this->setHeader('Reply-To', $name . ' <' . $replyto . '>'); + $this->replyToFlag = true; + $this->tmpArchive['replyTo'] = $replyto; + + return $this; + } + + /** + * @param array|string $to + * + * @return Email + */ + public function setTo($to) + { + $to = $this->stringToArray($to); + $to = $this->cleanEmail($to); + + if ($this->validate) { + $this->validateEmail($to); + } + + if ($this->getProtocol() !== 'mail') { + $this->setHeader('To', implode(', ', $to)); + } + + $this->recipients = $to; + + return $this; + } + + /** + * @param string $cc + * + * @return Email + */ + public function setCC($cc) + { + $cc = $this->cleanEmail($this->stringToArray($cc)); + + if ($this->validate) { + $this->validateEmail($cc); + } + + $this->setHeader('Cc', implode(', ', $cc)); + + if ($this->getProtocol() === 'smtp') { + $this->CCArray = $cc; + } + + $this->tmpArchive['CCArray'] = $cc; + + return $this; + } + + /** + * @param string $bcc + * @param string $limit + * + * @return Email + */ + public function setBCC($bcc, $limit = '') + { + if ($limit !== '' && is_numeric($limit)) { + $this->BCCBatchMode = true; + $this->BCCBatchSize = $limit; + } + + $bcc = $this->cleanEmail($this->stringToArray($bcc)); + + if ($this->validate) { + $this->validateEmail($bcc); + } + + if ($this->getProtocol() === 'smtp' || ($this->BCCBatchMode && count($bcc) > $this->BCCBatchSize)) { + $this->BCCArray = $bcc; + } else { + $this->setHeader('Bcc', implode(', ', $bcc)); + $this->tmpArchive['BCCArray'] = $bcc; + } + + return $this; + } + + /** + * @param string $subject + * + * @return Email + */ + public function setSubject($subject) + { + $this->tmpArchive['subject'] = $subject; + + $subject = $this->prepQEncoding($subject); + $this->setHeader('Subject', $subject); + + return $this; + } + + /** + * @param string $body + * + * @return Email + */ + public function setMessage($body) + { + $this->body = rtrim(str_replace("\r", '', $body)); + + return $this; + } + + /** + * @param string $file Can be local path, URL or buffered content + * @param string $disposition 'attachment' + * @param string|null $newname + * @param string $mime + * + * @return bool|Email + */ + public function attach($file, $disposition = '', $newname = null, $mime = '') + { + if ($mime === '') { + if (strpos($file, '://') === false && ! is_file($file)) { + $this->setErrorMessage(lang('Email.attachmentMissing', [$file])); + + return false; + } + + if (! $fp = @fopen($file, 'rb')) { + $this->setErrorMessage(lang('Email.attachmentUnreadable', [$file])); + + return false; + } + + $fileContent = stream_get_contents($fp); + + $mime = $this->mimeTypes(pathinfo($file, PATHINFO_EXTENSION)); + + fclose($fp); + } else { + $fileContent = &$file; // buffered file + } + + // declare names on their own, to make phpcbf happy + $namesAttached = [$file, $newname]; + + $this->attachments[] = [ + 'name' => $namesAttached, + 'disposition' => empty($disposition) ? 'attachment' : $disposition, + // Can also be 'inline' Not sure if it matters + 'type' => $mime, + 'content' => chunk_split(base64_encode($fileContent)), + 'multipart' => 'mixed', + ]; + + return $this; + } + + /** + * Set and return attachment Content-ID + * Useful for attached inline pictures + * + * @param string $filename + * + * @return bool|string + */ + public function setAttachmentCID($filename) + { + foreach ($this->attachments as $i => $attachment) { + if ($attachment['name'][0] === $filename) { + $this->attachments[$i]['multipart'] = 'related'; + + $this->attachments[$i]['cid'] = uniqid(basename($attachment['name'][0]) . '@', true); + + return $this->attachments[$i]['cid']; + } + } + + return false; + } + + /** + * @param string $header + * @param string $value + * + * @return Email + */ + public function setHeader($header, $value) + { + $this->headers[$header] = str_replace(["\n", "\r"], '', $value); + + return $this; + } + + /** + * @param string $email + * + * @return array + */ + protected function stringToArray($email) + { + if (! is_array($email)) { + return (strpos($email, ',') !== false) ? preg_split('/[\s,]/', $email, -1, PREG_SPLIT_NO_EMPTY) : (array) trim($email); + } + + return $email; + } + + /** + * @param string $str + * + * @return Email + */ + public function setAltMessage($str) + { + $this->altMessage = (string) $str; + + return $this; + } + + /** + * @param string $type + * + * @return Email + */ + public function setMailType($type = 'text') + { + $this->mailType = ($type === 'html') ? 'html' : 'text'; + + return $this; + } + + /** + * @param bool $wordWrap + * + * @return Email + */ + public function setWordWrap($wordWrap = true) + { + $this->wordWrap = (bool) $wordWrap; + + return $this; + } + + /** + * @param string $protocol + * + * @return Email + */ + public function setProtocol($protocol = 'mail') + { + $this->protocol = in_array($protocol, $this->protocols, true) ? strtolower($protocol) : 'mail'; + + return $this; + } + + /** + * @param int $n + * + * @return Email + */ + public function setPriority($n = 3) + { + $this->priority = preg_match('/^[1-5]$/', (string) $n) ? (int) $n : 3; + + return $this; + } + + /** + * @param string $newline + * + * @return Email + */ + public function setNewline($newline = "\n") + { + $this->newline = in_array($newline, ["\n", "\r\n", "\r"], true) ? $newline : "\n"; + + return $this; + } + + /** + * @param string $CRLF + * + * @return Email + */ + public function setCRLF($CRLF = "\n") + { + $this->CRLF = ($CRLF !== "\n" && $CRLF !== "\r\n" && $CRLF !== "\r") ? "\n" : $CRLF; + + return $this; + } + + /** + * @return string + */ + protected function getMessageID() + { + $from = str_replace(['>', '<'], '', $this->headers['Return-Path']); + + return '<' . uniqid('', true) . strstr($from, '@') . '>'; + } + + /** + * @return string + */ + protected function getProtocol() + { + $this->protocol = strtolower($this->protocol); + + if (! in_array($this->protocol, $this->protocols, true)) { + $this->protocol = 'mail'; + } + + return $this->protocol; + } + + /** + * @return string + */ + protected function getEncoding() + { + if (! in_array($this->encoding, $this->bitDepths, true)) { + $this->encoding = '8bit'; + } + + foreach ($this->baseCharsets as $charset) { + if (strpos($this->charset, $charset) === 0) { + $this->encoding = '7bit'; + + break; + } + } + + return $this->encoding; + } + + /** + * @return string + */ + protected function getContentType() + { + if ($this->mailType === 'html') { + return empty($this->attachments) ? 'html' : 'html-attach'; + } + + if ($this->mailType === 'text' && ! empty($this->attachments)) { + return 'plain-attach'; + } + + return 'plain'; + } + + /** + * Set RFC 822 Date + * + * @return string + */ + protected function setDate() + { + $timezone = date('Z'); + $operator = ($timezone[0] === '-') ? '-' : '+'; + $timezone = abs($timezone); + $timezone = floor($timezone / 3600) * 100 + ($timezone % 3600) / 60; + + return sprintf('%s %s%04d', date('D, j M Y H:i:s'), $operator, $timezone); + } + + /** + * @return string + */ + protected function getMimeMessage() + { + return 'This is a multi-part message in MIME format.' . $this->newline . 'Your email application may not support this format.'; + } + + /** + * @param array|string $email + * + * @return bool + */ + public function validateEmail($email) + { + if (! is_array($email)) { + $this->setErrorMessage(lang('Email.mustBeArray')); + + return false; + } + + foreach ($email as $val) { + if (! $this->isValidEmail($val)) { + $this->setErrorMessage(lang('Email.invalidAddress', [$val])); + + return false; + } + } + + return true; + } + + /** + * @param string $email + * + * @return bool + */ + public function isValidEmail($email) + { + if (function_exists('idn_to_ascii') && defined('INTL_IDNA_VARIANT_UTS46') && $atpos = strpos($email, '@')) { + $email = static::substr($email, 0, ++$atpos) + . idn_to_ascii(static::substr($email, $atpos), 0, INTL_IDNA_VARIANT_UTS46); + } + + return (bool) filter_var($email, FILTER_VALIDATE_EMAIL); + } + + /** + * @param array|string $email + * + * @return array|string + */ + public function cleanEmail($email) + { + if (! is_array($email)) { + return preg_match('/\<(.*)\>/', $email, $match) ? $match[1] : $email; + } + + $cleanEmail = []; + + foreach ($email as $addy) { + $cleanEmail[] = preg_match('/\<(.*)\>/', $addy, $match) ? $match[1] : $addy; + } + + return $cleanEmail; + } + + /** + * Build alternative plain text message + * + * Provides the raw message for use in plain-text headers of + * HTML-formatted emails. + * + * If the user hasn't specified his own alternative message + * it creates one by stripping the HTML + * + * @return string + */ + protected function getAltMessage() + { + if (! empty($this->altMessage)) { + return ($this->wordWrap) ? $this->wordWrap($this->altMessage, 76) : $this->altMessage; + } + + $body = preg_match('/\(.*)\<\/body\>/si', $this->body, $match) ? $match[1] : $this->body; + $body = str_replace("\t", '', preg_replace('# ' . $message . "\n"; + + return $this->errorLog($message, $this->messageType); + } + + /** + * Extracted call to `error_log()` in order to be tested. + * + * @codeCoverageIgnore + */ + protected function errorLog(string $message, int $messageType): bool + { + return error_log($message, $messageType); + } +} diff --git a/system/Log/Handlers/FileHandler.php b/system/Log/Handlers/FileHandler.php new file mode 100644 index 0000000..1fc9290 --- /dev/null +++ b/system/Log/Handlers/FileHandler.php @@ -0,0 +1,122 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Log\Handlers; + +use DateTime; +use Exception; + +/** + * Log error messages to file system + */ +class FileHandler extends BaseHandler +{ + /** + * Folder to hold logs + * + * @var string + */ + protected $path; + + /** + * Extension to use for log files + * + * @var string + */ + protected $fileExtension; + + /** + * Permissions for new log files + * + * @var int + */ + protected $filePermissions; + + /** + * Constructor + */ + public function __construct(array $config = []) + { + parent::__construct($config); + + $this->path = empty($config['path']) ? WRITEPATH . 'logs/' : $config['path']; + + $this->fileExtension = empty($config['fileExtension']) ? 'log' : $config['fileExtension']; + $this->fileExtension = ltrim($this->fileExtension, '.'); + + $this->filePermissions = $config['filePermissions'] ?? 0644; + } + + /** + * Handles logging the message. + * If the handler returns false, then execution of handlers + * will stop. Any handlers that have not run, yet, will not + * be run. + * + * @param string $level + * @param string $message + * + * @throws Exception + */ + public function handle($level, $message): bool + { + $filepath = $this->path . 'log-' . date('Y-m-d') . '.' . $this->fileExtension; + + $msg = ''; + + if (! is_file($filepath)) { + $newfile = true; + + // Only add protection to php files + if ($this->fileExtension === 'php') { + $msg .= "\n\n"; + } + } + + if (! $fp = @fopen($filepath, 'ab')) { + return false; + } + + // Instantiating DateTime with microseconds appended to initial date is needed for proper support of this format + if (strpos($this->dateFormat, 'u') !== false) { + $microtimeFull = microtime(true); + $microtimeShort = sprintf('%06d', ($microtimeFull - floor($microtimeFull)) * 1000000); + $date = new DateTime(date('Y-m-d H:i:s.' . $microtimeShort, (int) $microtimeFull)); + $date = $date->format($this->dateFormat); + } else { + $date = date($this->dateFormat); + } + + $msg .= strtoupper($level) . ' - ' . $date . ' --> ' . $message . "\n"; + + flock($fp, LOCK_EX); + + $result = null; + + for ($written = 0, $length = strlen($msg); $written < $length; $written += $result) { + if (($result = fwrite($fp, substr($msg, $written))) === false) { + // if we get this far, we'll never see this during travis-ci + // @codeCoverageIgnoreStart + break; + // @codeCoverageIgnoreEnd + } + } + + flock($fp, LOCK_UN); + fclose($fp); + + if (isset($newfile) && $newfile === true) { + chmod($filepath, $this->filePermissions); + } + + return is_int($result); + } +} diff --git a/system/Log/Handlers/HandlerInterface.php b/system/Log/Handlers/HandlerInterface.php new file mode 100644 index 0000000..7b809a3 --- /dev/null +++ b/system/Log/Handlers/HandlerInterface.php @@ -0,0 +1,42 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Log\Handlers; + +/** + * Expected behavior for a Log handler + */ +interface HandlerInterface +{ + /** + * Handles logging the message. + * If the handler returns false, then execution of handlers + * will stop. Any handlers that have not run, yet, will not + * be run. + * + * @param string $level + * @param string $message + */ + public function handle($level, $message): bool; + + /** + * Checks whether the Handler will handle logging items of this + * log Level. + */ + public function canHandle(string $level): bool; + + /** + * Sets the preferred date format to use when logging. + * + * @return HandlerInterface + */ + public function setDateFormat(string $format); +} diff --git a/system/Log/Logger.php b/system/Log/Logger.php new file mode 100644 index 0000000..cee9711 --- /dev/null +++ b/system/Log/Logger.php @@ -0,0 +1,432 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Log; + +use CodeIgniter\Log\Exceptions\LogException; +use CodeIgniter\Log\Handlers\HandlerInterface; +use Psr\Log\LoggerInterface; +use RuntimeException; +use Throwable; + +/** + * The CodeIgntier Logger + * + * The message MUST be a string or object implementing __toString(). + * + * The message MAY contain placeholders in the form: {foo} where foo + * will be replaced by the context data in key "foo". + * + * The context array can contain arbitrary data, the only assumption that + * can be made by implementors is that if an Exception instance is given + * to produce a stack trace, it MUST be in a key named "exception". + */ +class Logger implements LoggerInterface +{ + /** + * Used by the logThreshold Config setting to define + * which errors to show. + * + * @var array + */ + protected $logLevels = [ + 'emergency' => 1, + 'alert' => 2, + 'critical' => 3, + 'error' => 4, + 'warning' => 5, + 'notice' => 6, + 'info' => 7, + 'debug' => 8, + ]; + + /** + * Array of levels to be logged. + * The rest will be ignored. + * Set in Config/logger.php + * + * @var array + */ + protected $loggableLevels = []; + + /** + * File permissions + * + * @var int + */ + protected $filePermissions = 0644; + + /** + * Format of the timestamp for log files. + * + * @var string + */ + protected $dateFormat = 'Y-m-d H:i:s'; + + /** + * Filename Extension + * + * @var string + */ + protected $fileExt; + + /** + * Caches instances of the handlers. + * + * @var array + */ + protected $handlers = []; + + /** + * Holds the configuration for each handler. + * The key is the handler's class name. The + * value is an associative array of configuration + * items. + * + * @var array + */ + protected $handlerConfig = []; + + /** + * Caches logging calls for debugbar. + * + * @var array + */ + public $logCache; + + /** + * Should we cache our logged items? + * + * @var bool + */ + protected $cacheLogs = false; + + /** + * Constructor. + * + * @param \Config\Logger $config + * + * @throws RuntimeException + */ + public function __construct($config, bool $debug = CI_DEBUG) + { + $this->loggableLevels = is_array($config->threshold) ? $config->threshold : range(1, (int) $config->threshold); + + // Now convert loggable levels to strings. + // We only use numbers to make the threshold setting convenient for users. + if ($this->loggableLevels) { + $temp = []; + + foreach ($this->loggableLevels as $level) { + $temp[] = array_search((int) $level, $this->logLevels, true); + } + + $this->loggableLevels = $temp; + unset($temp); + } + + $this->dateFormat = $config->dateFormat ?? $this->dateFormat; + + if (! is_array($config->handlers) || empty($config->handlers)) { + throw LogException::forNoHandlers('LoggerConfig'); + } + + // Save the handler configuration for later. + // Instances will be created on demand. + $this->handlerConfig = $config->handlers; + + $this->cacheLogs = $debug; + if ($this->cacheLogs) { + $this->logCache = []; + } + } + + /** + * System is unusable. + * + * @param string $message + */ + public function emergency($message, array $context = []): bool + { + return $this->log('emergency', $message, $context); + } + + /** + * Action must be taken immediately. + * + * Example: Entire website down, database unavailable, etc. This should + * trigger the SMS alerts and wake you up. + * + * @param string $message + */ + public function alert($message, array $context = []): bool + { + return $this->log('alert', $message, $context); + } + + /** + * Critical conditions. + * + * Example: Application component unavailable, unexpected exception. + * + * @param string $message + */ + public function critical($message, array $context = []): bool + { + return $this->log('critical', $message, $context); + } + + /** + * Runtime errors that do not require immediate action but should typically + * be logged and monitored. + * + * @param string $message + */ + public function error($message, array $context = []): bool + { + return $this->log('error', $message, $context); + } + + /** + * Exceptional occurrences that are not errors. + * + * Example: Use of deprecated APIs, poor use of an API, undesirable things + * that are not necessarily wrong. + * + * @param string $message + */ + public function warning($message, array $context = []): bool + { + return $this->log('warning', $message, $context); + } + + /** + * Normal but significant events. + * + * @param string $message + */ + public function notice($message, array $context = []): bool + { + return $this->log('notice', $message, $context); + } + + /** + * Interesting events. + * + * Example: User logs in, SQL logs. + * + * @param string $message + */ + public function info($message, array $context = []): bool + { + return $this->log('info', $message, $context); + } + + /** + * Detailed debug information. + * + * @param string $message + */ + public function debug($message, array $context = []): bool + { + return $this->log('debug', $message, $context); + } + + /** + * Logs with an arbitrary level. + * + * @param mixed $level + * @param string $message + */ + public function log($level, $message, array $context = []): bool + { + if (is_numeric($level)) { + $level = array_search((int) $level, $this->logLevels, true); + } + + // Is the level a valid level? + if (! array_key_exists($level, $this->logLevels)) { + throw LogException::forInvalidLogLevel($level); + } + + // Does the app want to log this right now? + if (! in_array($level, $this->loggableLevels, true)) { + return false; + } + + // Parse our placeholders + $message = $this->interpolate($message, $context); + + if (! is_string($message)) { + $message = print_r($message, true); + } + + if ($this->cacheLogs) { + $this->logCache[] = [ + 'level' => $level, + 'msg' => $message, + ]; + } + + foreach ($this->handlerConfig as $className => $config) { + if (! array_key_exists($className, $this->handlers)) { + $this->handlers[$className] = new $className($config); + } + + /** + * @var HandlerInterface $handler + */ + $handler = $this->handlers[$className]; + + if (! $handler->canHandle($level)) { + continue; + } + + // If the handler returns false, then we + // don't execute any other handlers. + if (! $handler->setDateFormat($this->dateFormat)->handle($level, $message)) { + break; + } + } + + return true; + } + + /** + * Replaces any placeholders in the message with variables + * from the context, as well as a few special items like: + * + * {session_vars} + * {post_vars} + * {get_vars} + * {env} + * {env:foo} + * {file} + * {line} + * + * @param mixed $message + * + * @return mixed + */ + protected function interpolate($message, array $context = []) + { + if (! is_string($message)) { + return $message; + } + + // build a replacement array with braces around the context keys + $replace = []; + + foreach ($context as $key => $val) { + // Verify that the 'exception' key is actually an exception + // or error, both of which implement the 'Throwable' interface. + if ($key === 'exception' && $val instanceof Throwable) { + $val = $val->getMessage() . ' ' . $this->cleanFileNames($val->getFile()) . ':' . $val->getLine(); + } + + // todo - sanitize input before writing to file? + $replace['{' . $key . '}'] = $val; + } + + // Add special placeholders + $replace['{post_vars}'] = '$_POST: ' . print_r($_POST, true); + $replace['{get_vars}'] = '$_GET: ' . print_r($_GET, true); + $replace['{env}'] = ENVIRONMENT; + + // Allow us to log the file/line that we are logging from + if (strpos($message, '{file}') !== false) { + [$file, $line] = $this->determineFile(); + + $replace['{file}'] = $file; + $replace['{line}'] = $line; + } + + // Match up environment variables in {env:foo} tags. + if (strpos($message, 'env:') !== false) { + preg_match('/env:[^}]+/', $message, $matches); + + if ($matches) { + foreach ($matches as $str) { + $key = str_replace('env:', '', $str); + $replace["{{$str}}"] = $_ENV[$key] ?? 'n/a'; + } + } + } + + if (isset($_SESSION)) { + $replace['{session_vars}'] = '$_SESSION: ' . print_r($_SESSION, true); + } + + // interpolate replacement values into the message and return + return strtr($message, $replace); + } + + /** + * Determines the file and line that the logging call + * was made from by analyzing the backtrace. + * Find the earliest stack frame that is part of our logging system. + */ + public function determineFile(): array + { + $logFunctions = [ + 'log_message', + 'log', + 'error', + 'debug', + 'info', + 'warning', + 'critical', + 'emergency', + 'alert', + 'notice', + ]; + + // Generate Backtrace info + $trace = \debug_backtrace(0); + + // So we search from the bottom (earliest) of the stack frames + $stackFrames = \array_reverse($trace); + + // Find the first reference to a Logger class method + foreach ($stackFrames as $frame) { + if (\in_array($frame['function'], $logFunctions, true)) { + $file = isset($frame['file']) ? $this->cleanFileNames($frame['file']) : 'unknown'; + $line = $frame['line'] ?? 'unknown'; + + return [ + $file, + $line, + ]; + } + } + + return [ + 'unknown', + 'unknown', + ]; + } + + /** + * Cleans the paths of filenames by replacing APPPATH, SYSTEMPATH, FCPATH + * with the actual var. i.e. + * + * /var/www/site/app/Controllers/Home.php + * becomes: + * APPPATH/Controllers/Home.php + */ + protected function cleanFileNames(string $file): string + { + $file = str_replace(APPPATH, 'APPPATH/', $file); + $file = str_replace(SYSTEMPATH, 'SYSTEMPATH/', $file); + + return str_replace(FCPATH, 'FCPATH/', $file); + } +} diff --git a/system/Model.php b/system/Model.php new file mode 100644 index 0000000..32fa82f --- /dev/null +++ b/system/Model.php @@ -0,0 +1,805 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter; + +use BadMethodCallException; +use Closure; +use CodeIgniter\Database\BaseBuilder; +use CodeIgniter\Database\BaseConnection; +use CodeIgniter\Database\BaseResult; +use CodeIgniter\Database\ConnectionInterface; +use CodeIgniter\Database\Exceptions\DatabaseException; +use CodeIgniter\Database\Exceptions\DataException; +use CodeIgniter\Database\Query; +use CodeIgniter\Exceptions\ModelException; +use CodeIgniter\I18n\Time; +use CodeIgniter\Validation\ValidationInterface; +use Config\Database; +use ReflectionClass; +use ReflectionException; +use ReflectionProperty; + +/** + * The Model class extends BaseModel and provides additional + * convenient features that makes working with a SQL database + * table less painful. + * + * It will: + * - automatically connect to database + * - allow intermingling calls to the builder + * - removes the need to use Result object directly in most cases + * + * @mixin BaseBuilder + * + * @property BaseConnection $db + */ +class Model extends BaseModel +{ + /** + * Name of database table + * + * @var string + */ + protected $table; + + /** + * The table's primary key. + * + * @var string + */ + protected $primaryKey = 'id'; + + /** + * Whether primary key uses auto increment. + * + * @var bool + */ + protected $useAutoIncrement = true; + + /** + * Query Builder object + * + * @var BaseBuilder|null + */ + protected $builder; + + /** + * Holds information passed in via 'set' + * so that we can capture it (not the builder) + * and ensure it gets validated first. + * + * @var array + */ + protected $tempData = []; + + /** + * Escape array that maps usage of escape + * flag for every parameter. + * + * @var array + */ + protected $escape = []; + + public function __construct(?ConnectionInterface &$db = null, ?ValidationInterface $validation = null) + { + /** + * @var BaseConnection $db + */ + $db = $db ?? Database::connect($this->DBGroup); + + $this->db = &$db; + + parent::__construct($validation); + } + + /** + * Specify the table associated with a model + * + * @param string $table Table + * + * @return $this + */ + public function setTable(string $table) + { + $this->table = $table; + + return $this; + } + + /** + * Fetches the row of database from $this->table with a primary key + * matching $id. This methods works only with dbCalls + * This methods works only with dbCalls + * + * @param bool $singleton Single or multiple results + * @param array|int|string|null $id One primary key or an array of primary keys + * + * @return array|object|null The resulting row of data, or null. + */ + protected function doFind(bool $singleton, $id = null) + { + $builder = $this->builder(); + + if ($this->tempUseSoftDeletes) { + $builder->where($this->table . '.' . $this->deletedField, null); + } + + if (is_array($id)) { + $row = $builder->whereIn($this->table . '.' . $this->primaryKey, $id) + ->get() + ->getResult($this->tempReturnType); + } elseif ($singleton) { + $row = $builder->where($this->table . '.' . $this->primaryKey, $id) + ->get() + ->getFirstRow($this->tempReturnType); + } else { + $row = $builder->get()->getResult($this->tempReturnType); + } + + return $row; + } + + /** + * Fetches the column of database from $this->table + * This methods works only with dbCalls + * + * @param string $columnName Column Name + * + * @return array|null The resulting row of data, or null if no data found. + */ + protected function doFindColumn(string $columnName) + { + return $this->select($columnName)->asArray()->find(); + } + + /** + * Works with the current Query Builder instance to return + * all results, while optionally limiting them. + * This methods works only with dbCalls + * + * @param int $limit Limit + * @param int $offset Offset + * + * @return array + */ + protected function doFindAll(int $limit = 0, int $offset = 0) + { + $builder = $this->builder(); + + if ($this->tempUseSoftDeletes) { + $builder->where($this->table . '.' . $this->deletedField, null); + } + + return $builder->limit($limit, $offset) + ->get() + ->getResult($this->tempReturnType); + } + + /** + * Returns the first row of the result set. Will take any previous + * Query Builder calls into account when determining the result set. + * This methods works only with dbCalls + * + * @return array|object|null + */ + protected function doFirst() + { + $builder = $this->builder(); + + if ($this->tempUseSoftDeletes) { + $builder->where($this->table . '.' . $this->deletedField, null); + } elseif ($this->useSoftDeletes && empty($builder->QBGroupBy) && $this->primaryKey) { + $builder->groupBy($this->table . '.' . $this->primaryKey); + } + + // Some databases, like PostgreSQL, need order + // information to consistently return correct results. + if ($builder->QBGroupBy && empty($builder->QBOrderBy) && $this->primaryKey) { + $builder->orderBy($this->table . '.' . $this->primaryKey, 'asc'); + } + + return $builder->limit(1, 0)->get()->getFirstRow($this->tempReturnType); + } + + /** + * Inserts data into the current table. + * This methods works only with dbCalls + * + * @param array $data Data + * + * @return bool|Query + */ + protected function doInsert(array $data) + { + $escape = $this->escape; + $this->escape = []; + + // Require non empty primaryKey when + // not using auto-increment feature + if (! $this->useAutoIncrement && empty($data[$this->primaryKey])) { + throw DataException::forEmptyPrimaryKey('insert'); + } + + $builder = $this->builder(); + + // Must use the set() method to ensure to set the correct escape flag + foreach ($data as $key => $val) { + $builder->set($key, $val, $escape[$key] ?? null); + } + + $result = $builder->insert(); + + // If insertion succeeded then save the insert ID + if ($result) { + $this->insertID = ! $this->useAutoIncrement ? $data[$this->primaryKey] : $this->db->insertID(); + } + + return $result; + } + + /** + * Compiles batch insert strings and runs the queries, validating each row prior. + * This methods works only with dbCalls + * + * @param array|null $set An associative array of insert values + * @param bool|null $escape Whether to escape values + * @param int $batchSize The size of the batch to run + * @param bool $testing True means only number of records is returned, false will execute the query + * + * @return bool|int Number of rows inserted or FALSE on failure + */ + protected function doInsertBatch(?array $set = null, ?bool $escape = null, int $batchSize = 100, bool $testing = false) + { + if (is_array($set)) { + foreach ($set as $row) { + // Require non empty primaryKey when + // not using auto-increment feature + if (! $this->useAutoIncrement && empty($row[$this->primaryKey])) { + throw DataException::forEmptyPrimaryKey('insertBatch'); + } + } + } + + return $this->builder()->testMode($testing)->insertBatch($set, $escape, $batchSize); + } + + /** + * Updates a single record in $this->table. + * This methods works only with dbCalls + * + * @param array|int|string|null $id + * @param array|null $data + */ + protected function doUpdate($id = null, $data = null): bool + { + $escape = $this->escape; + $this->escape = []; + + $builder = $this->builder(); + + if ($id) { + $builder = $builder->whereIn($this->table . '.' . $this->primaryKey, $id); + } + + // Must use the set() method to ensure to set the correct escape flag + foreach ($data as $key => $val) { + $builder->set($key, $val, $escape[$key] ?? null); + } + + return $builder->update(); + } + + /** + * Compiles an update string and runs the query + * This methods works only with dbCalls + * + * @param array|null $set An associative array of update values + * @param string|null $index The where key + * @param int $batchSize The size of the batch to run + * @param bool $returnSQL True means SQL is returned, false will execute the query + * + * @throws DatabaseException + * + * @return mixed Number of rows affected or FALSE on failure + */ + protected function doUpdateBatch(?array $set = null, ?string $index = null, int $batchSize = 100, bool $returnSQL = false) + { + return $this->builder()->testMode($returnSQL)->updateBatch($set, $index, $batchSize); + } + + /** + * Deletes a single record from $this->table where $id matches + * the table's primaryKey + * This methods works only with dbCalls + * + * @param array|int|string|null $id The rows primary key(s) + * @param bool $purge Allows overriding the soft deletes setting. + * + * @throws DatabaseException + * + * @return bool|string + */ + protected function doDelete($id = null, bool $purge = false) + { + $builder = $this->builder(); + + if ($id) { + $builder = $builder->whereIn($this->primaryKey, $id); + } + + if ($this->useSoftDeletes && ! $purge) { + if (empty($builder->getCompiledQBWhere())) { + if (CI_DEBUG) { + throw new DatabaseException( + 'Deletes are not allowed unless they contain a "where" or "like" clause.' + ); + } + + return false; // @codeCoverageIgnore + } + + $set[$this->deletedField] = $this->setDate(); + + if ($this->useTimestamps && $this->updatedField) { + $set[$this->updatedField] = $this->setDate(); + } + + return $builder->update($set); + } + + return $builder->delete(); + } + + /** + * Permanently deletes all rows that have been marked as deleted + * through soft deletes (deleted = 1) + * This methods works only with dbCalls + * + * @return bool|mixed + */ + protected function doPurgeDeleted() + { + return $this->builder() + ->where($this->table . '.' . $this->deletedField . ' IS NOT NULL') + ->delete(); + } + + /** + * Works with the find* methods to return only the rows that + * have been deleted. + * This methods works only with dbCalls + */ + protected function doOnlyDeleted() + { + $this->builder()->where($this->table . '.' . $this->deletedField . ' IS NOT NULL'); + } + + /** + * Compiles a replace into string and runs the query + * This methods works only with dbCalls + * + * @param array|null $data Data + * @param bool $returnSQL Set to true to return Query String + * + * @return mixed + */ + protected function doReplace(?array $data = null, bool $returnSQL = false) + { + return $this->builder()->testMode($returnSQL)->replace($data); + } + + /** + * Grabs the last error(s) that occurred from the Database connection. + * The return array should be in the following format: + * ['source' => 'message'] + * This methods works only with dbCalls + * + * @return array + */ + protected function doErrors() + { + // $error is always ['code' => string|int, 'message' => string] + $error = $this->db->error(); + + if ((int) $error['code'] === 0) { + return []; + } + + return [get_class($this->db) => $error['message']]; + } + + /** + * Returns the id value for the data array or object + * + * @param array|object $data Data + * + * @return array|int|string|null + * + * @deprecated Use getIdValue() instead. Will be removed in version 5.0. + */ + protected function idValue($data) + { + return $this->getIdValue($data); + } + + /** + * Returns the id value for the data array or object + * + * @param array|object $data Data + * + * @return array|int|string|null + */ + public function getIdValue($data) + { + if (is_object($data) && isset($data->{$this->primaryKey})) { + return $data->{$this->primaryKey}; + } + + if (is_array($data) && ! empty($data[$this->primaryKey])) { + return $data[$this->primaryKey]; + } + + return null; + } + + /** + * Loops over records in batches, allowing you to operate on them. + * Works with $this->builder to get the Compiled select to + * determine the rows to operate on. + * This methods works only with dbCalls + * + * @throws DataException + */ + public function chunk(int $size, Closure $userFunc) + { + $total = $this->builder()->countAllResults(false); + $offset = 0; + + while ($offset <= $total) { + $builder = clone $this->builder(); + $rows = $builder->get($size, $offset); + + if (! $rows) { + throw DataException::forEmptyDataset('chunk'); + } + + $rows = $rows->getResult($this->tempReturnType); + + $offset += $size; + + if (empty($rows)) { + continue; + } + + foreach ($rows as $row) { + if ($userFunc($row) === false) { + return; + } + } + } + } + + /** + * Override countAllResults to account for soft deleted accounts. + * + * @return mixed + */ + public function countAllResults(bool $reset = true, bool $test = false) + { + if ($this->tempUseSoftDeletes) { + $this->builder()->where($this->table . '.' . $this->deletedField, null); + } + + // When $reset === false, the $tempUseSoftDeletes will be + // dependant on $useSoftDeletes value because we don't + // want to add the same "where" condition for the second time + $this->tempUseSoftDeletes = $reset + ? $this->useSoftDeletes + : ($this->useSoftDeletes ? false : $this->useSoftDeletes); + + return $this->builder()->testMode($test)->countAllResults($reset); + } + + /** + * Provides a shared instance of the Query Builder. + * + * @throws ModelException + * + * @return BaseBuilder + */ + public function builder(?string $table = null) + { + // Check for an existing Builder + if ($this->builder instanceof BaseBuilder) { + // Make sure the requested table matches the builder + if ($table && $this->builder->getTable() !== $table) { + return $this->db->table($table); + } + + return $this->builder; + } + + // We're going to force a primary key to exist + // so we don't have overly convoluted code, + // and future features are likely to require them. + if (empty($this->primaryKey)) { + throw ModelException::forNoPrimaryKey(static::class); + } + + $table = empty($table) ? $this->table : $table; + + // Ensure we have a good db connection + if (! $this->db instanceof BaseConnection) { + $this->db = Database::connect($this->DBGroup); + } + + $builder = $this->db->table($table); + + // Only consider it "shared" if the table is correct + if ($table === $this->table) { + $this->builder = $builder; + } + + return $builder; + } + + /** + * Captures the builder's set() method so that we can validate the + * data here. This allows it to be used with any of the other + * builder methods and still get validated data, like replace. + * + * @param mixed $key Field name, or an array of field/value pairs + * @param mixed $value Field value, if $key is a single field + * @param bool|null $escape Whether to escape values + * + * @return $this + */ + public function set($key, $value = '', ?bool $escape = null) + { + $data = is_array($key) ? $key : [$key => $value]; + + foreach (array_keys($data) as $k) { + $this->tempData['escape'][$k] = $escape; + } + + $this->tempData['data'] = array_merge($this->tempData['data'] ?? [], $data); + + return $this; + } + + /** + * This method is called on save to determine if entry have to be updated + * If this method return false insert operation will be executed + * + * @param array|object $data Data + */ + protected function shouldUpdate($data): bool + { + if (parent::shouldUpdate($data) === false) { + return false; + } + + if ($this->useAutoIncrement === true) { + return true; + } + + // When useAutoIncrement feature is disabled, check + // in the database if given record already exists + return $this->where($this->primaryKey, $this->getIdValue($data))->countAllResults() === 1; + } + + /** + * Inserts data into the database. If an object is provided, + * it will attempt to convert it to an array. + * + * @param array|object|null $data + * @param bool $returnID Whether insert ID should be returned or not. + * + * @throws ReflectionException + * + * @return BaseResult|false|int|object|string + */ + public function insert($data = null, bool $returnID = true) + { + if (! empty($this->tempData['data'])) { + if (empty($data)) { + $data = $this->tempData['data'] ?? null; + } else { + $data = $this->transformDataToArray($data, 'insert'); + $data = array_merge($this->tempData['data'], $data); + } + } + + $this->escape = $this->tempData['escape'] ?? []; + $this->tempData = []; + + return parent::insert($data, $returnID); + } + + /** + * Updates a single record in the database. If an object is provided, + * it will attempt to convert it into an array. + * + * @param array|int|string|null $id + * @param array|object|null $data + * + * @throws ReflectionException + */ + public function update($id = null, $data = null): bool + { + if (! empty($this->tempData['data'])) { + if (empty($data)) { + $data = $this->tempData['data'] ?? null; + } else { + $data = $this->transformDataToArray($data, 'update'); + $data = array_merge($this->tempData['data'], $data); + } + } + + $this->escape = $this->tempData['escape'] ?? []; + $this->tempData = []; + + return parent::update($id, $data); + } + + /** + * Takes a class an returns an array of it's public and protected + * properties as an array with raw values. + * + * @param object|string $data + * @param bool $recursive If true, inner entities will be casted as array as well + * + * @throws ReflectionException + * + * @return array|null Array + */ + protected function objectToRawArray($data, bool $onlyChanged = true, bool $recursive = false): ?array + { + $properties = parent::objectToRawArray($data, $onlyChanged); + + // Always grab the primary key otherwise updates will fail. + if ( + method_exists($data, 'toRawArray') && (! empty($properties) && ! empty($this->primaryKey) && ! in_array($this->primaryKey, $properties, true) + && ! empty($data->{$this->primaryKey})) + ) { + $properties[$this->primaryKey] = $data->{$this->primaryKey}; + } + + return $properties; + } + + /** + * Provides/instantiates the builder/db connection and model's table/primary key names and return type. + * + * @param string $name Name + * + * @return mixed + */ + public function __get(string $name) + { + if (parent::__isset($name)) { + return parent::__get($name); + } + + if (isset($this->builder()->{$name})) { + return $this->builder()->{$name}; + } + + return null; + } + + /** + * Checks for the existence of properties across this model, builder, and db connection. + * + * @param string $name Name + */ + public function __isset(string $name): bool + { + if (parent::__isset($name)) { + return true; + } + + return isset($this->builder()->{$name}); + } + + /** + * Provides direct access to method in the builder (if available) + * and the database connection. + * + * @return mixed + */ + public function __call(string $name, array $params) + { + $builder = $this->builder(); + $result = null; + + if (method_exists($this->db, $name)) { + $result = $this->db->{$name}(...$params); + } elseif (method_exists($builder, $name)) { + $result = $builder->{$name}(...$params); + } else { + throw new BadMethodCallException('Call to undefined method ' . static::class . '::' . $name); + } + + if ($result instanceof BaseBuilder) { + return $this; + } + + return $result; + } + + /** + * Takes a class an returns an array of it's public and protected + * properties as an array suitable for use in creates and updates. + * + * @param object|string $data + * @param string|null $primaryKey + * + * @throws ReflectionException + * + * @codeCoverageIgnore + * + * @deprecated since 4.1 + */ + public static function classToArray($data, $primaryKey = null, string $dateFormat = 'datetime', bool $onlyChanged = true): array + { + if (method_exists($data, 'toRawArray')) { + $properties = $data->toRawArray($onlyChanged); + + // Always grab the primary key otherwise updates will fail. + if (! empty($properties) && ! empty($primaryKey) && ! in_array($primaryKey, $properties, true) && ! empty($data->{$primaryKey})) { + $properties[$primaryKey] = $data->{$primaryKey}; + } + } else { + $mirror = new ReflectionClass($data); + $props = $mirror->getProperties(ReflectionProperty::IS_PUBLIC | ReflectionProperty::IS_PROTECTED); + + $properties = []; + + // Loop over each property, + // saving the name/value in a new array we can return. + foreach ($props as $prop) { + // Must make protected values accessible. + $prop->setAccessible(true); + $properties[$prop->getName()] = $prop->getValue($data); + } + } + + // Convert any Time instances to appropriate $dateFormat + if ($properties) { + foreach ($properties as $key => $value) { + if ($value instanceof Time) { + switch ($dateFormat) { + case 'datetime': + $converted = $value->format('Y-m-d H:i:s'); + break; + + case 'date': + $converted = $value->format('Y-m-d'); + break; + + case 'int': + $converted = $value->getTimestamp(); + break; + + default: + $converted = (string) $value; + } + + $properties[$key] = $converted; + } + } + } + + return $properties; + } +} diff --git a/system/Modules/Modules.php b/system/Modules/Modules.php new file mode 100644 index 0000000..ade3e69 --- /dev/null +++ b/system/Modules/Modules.php @@ -0,0 +1,53 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Modules; + +/** + * Modules Class + * + * @see https://codeigniter.com/user_guide/general/modules.html + */ +class Modules +{ + /** + * Auto-Discover + * + * @var bool + */ + public $enabled = true; + + /** + * Auto-Discovery Within Composer Packages + * + * @var bool + */ + public $discoverInComposer = true; + + /** + * Auto-Discover Rules Handler + * + * @var array + */ + public $aliases = []; + + /** + * Should the application auto-discover the requested resource. + */ + public function shouldDiscover(string $alias): bool + { + if (! $this->enabled) { + return false; + } + + return in_array(strtolower($alias), $this->aliases, true); + } +} diff --git a/system/Pager/Exceptions/PagerException.php b/system/Pager/Exceptions/PagerException.php new file mode 100644 index 0000000..b1cb607 --- /dev/null +++ b/system/Pager/Exceptions/PagerException.php @@ -0,0 +1,27 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Pager\Exceptions; + +use CodeIgniter\Exceptions\FrameworkException; + +class PagerException extends FrameworkException +{ + public static function forInvalidTemplate(?string $template = null) + { + return new static(lang('Pager.invalidTemplate', [$template])); + } + + public static function forInvalidPaginationGroup(?string $group = null) + { + return new static(lang('Pager.invalidPaginationGroup', [$group])); + } +} diff --git a/system/Pager/Pager.php b/system/Pager/Pager.php new file mode 100644 index 0000000..a653485 --- /dev/null +++ b/system/Pager/Pager.php @@ -0,0 +1,420 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Pager; + +use CodeIgniter\HTTP\Exceptions\HTTPException; +use CodeIgniter\HTTP\URI; +use CodeIgniter\Pager\Exceptions\PagerException; +use CodeIgniter\View\RendererInterface; +use Config\Pager as PagerConfig; + +/** + * Class Pager + * + * The Pager class provides semi-automatic and manual methods for creating + * pagination links and reading the current url's query variable, "page" + * to determine the current page. This class can support multiple + * paginations on a single page. + */ +class Pager implements PagerInterface +{ + /** + * The group data. + * + * @var array + */ + protected $groups = []; + + /** + * URI segment for groups if provided. + * + * @var array + */ + protected $segment = []; + + /** + * Our configuration instance. + * + * @var PagerConfig + */ + protected $config; + + /** + * The view engine to render the links with. + * + * @var RendererInterface + */ + protected $view; + + /** + * List of only permitted queries + * + * @var array + */ + protected $only = []; + + /** + * Constructor. + */ + public function __construct(PagerConfig $config, RendererInterface $view) + { + $this->config = $config; + $this->view = $view; + } + + /** + * Handles creating and displaying the + * + * @param string $template The output template alias to render. + */ + public function links(string $group = 'default', string $template = 'default_full'): string + { + $this->ensureGroup($group); + + return $this->displayLinks($group, $template); + } + + /** + * Creates simple Next/Previous links, instead of full pagination. + */ + public function simpleLinks(string $group = 'default', string $template = 'default_simple'): string + { + $this->ensureGroup($group); + + return $this->displayLinks($group, $template); + } + + /** + * Allows for a simple, manual, form of pagination where all of the data + * is provided by the user. The URL is the current URI. + * + * @param string $template The output template alias to render. + * @param int $segment (whether page number is provided by URI segment) + * @param string|null $group optional group (i.e. if we'd like to define custom path) + */ + public function makeLinks(int $page, ?int $perPage, int $total, string $template = 'default_full', int $segment = 0, ?string $group = 'default'): string + { + $group = $group === '' ? 'default' : $group; + + $this->store($group, $page, $perPage ?? $this->config->perPage, $total, $segment); + + return $this->displayLinks($group, $template); + } + + /** + * Does the actual work of displaying the view file. Used internally + * by links(), simpleLinks(), and makeLinks(). + */ + protected function displayLinks(string $group, string $template): string + { + if (! array_key_exists($template, $this->config->templates)) { + throw PagerException::forInvalidTemplate($template); + } + + $pager = new PagerRenderer($this->getDetails($group)); + + return $this->view->setVar('pager', $pager)->render($this->config->templates[$template]); + } + + /** + * Stores a set of pagination data for later display. Most commonly used + * by the model to automate the process. + * + * @return $this + */ + public function store(string $group, int $page, ?int $perPage, int $total, int $segment = 0) + { + if ($segment) { + $this->setSegment($segment, $group); + } + + $this->ensureGroup($group, $perPage); + + if ($segment > 0 && $this->groups[$group]['currentPage'] > 0) { + $page = $this->groups[$group]['currentPage']; + } + + $perPage = $perPage ?? $this->config->perPage; + $pageCount = (int) ceil($total / $perPage); + + $this->groups[$group]['currentPage'] = $page > $pageCount ? $pageCount : $page; + $this->groups[$group]['perPage'] = $perPage; + $this->groups[$group]['total'] = $total; + $this->groups[$group]['pageCount'] = $pageCount; + + return $this; + } + + /** + * Sets segment for a group. + * + * @return mixed + */ + public function setSegment(int $number, string $group = 'default') + { + $this->segment[$group] = $number; + + return $this; + } + + /** + * Sets the path that an aliased group of links will use. + * + * @return mixed + */ + public function setPath(string $path, string $group = 'default') + { + $this->ensureGroup($group); + + $this->groups[$group]['uri']->setPath($path); + + return $this; + } + + /** + * Returns the total number of items in data store. + */ + public function getTotal(string $group = 'default'): int + { + $this->ensureGroup($group); + + return $this->groups[$group]['total']; + } + + /** + * Returns the total number of pages. + */ + public function getPageCount(string $group = 'default'): int + { + $this->ensureGroup($group); + + return $this->groups[$group]['pageCount']; + } + + /** + * Returns the number of the current page of results. + */ + public function getCurrentPage(string $group = 'default'): int + { + $this->ensureGroup($group); + + return $this->groups[$group]['currentPage'] ?: 1; + } + + /** + * Tells whether this group of results has any more pages of results. + */ + public function hasMore(string $group = 'default'): bool + { + $this->ensureGroup($group); + + return ($this->groups[$group]['currentPage'] * $this->groups[$group]['perPage']) < $this->groups[$group]['total']; + } + + /** + * Returns the last page, if we have a total that we can calculate with. + * + * @return int|null + */ + public function getLastPage(string $group = 'default') + { + $this->ensureGroup($group); + + if (! is_numeric($this->groups[$group]['total']) || ! is_numeric($this->groups[$group]['perPage'])) { + return null; + } + + return (int) ceil($this->groups[$group]['total'] / $this->groups[$group]['perPage']); + } + + /** + * Determines the first page # that should be shown. + */ + public function getFirstPage(string $group = 'default'): int + { + $this->ensureGroup($group); + + // @todo determine based on a 'surroundCount' value + return 1; + } + + /** + * Returns the URI for a specific page for the specified group. + * + * @return string|URI + */ + public function getPageURI(?int $page = null, string $group = 'default', bool $returnObject = false) + { + $this->ensureGroup($group); + + /** + * @var URI $uri + */ + $uri = $this->groups[$group]['uri']; + + $segment = $this->segment[$group] ?? 0; + + if ($segment) { + $uri->setSegment($segment, $page); + } else { + $uri->addQuery($this->groups[$group]['pageSelector'], $page); + } + + if ($this->only) { + $query = array_intersect_key($_GET, array_flip($this->only)); + + if (! $segment) { + $query[$this->groups[$group]['pageSelector']] = $page; + } + + $uri->setQueryArray($query); + } + + return $returnObject === true ? $uri : URI::createURIString($uri->getScheme(), $uri->getAuthority(), $uri->getPath(), $uri->getQuery(), $uri->getFragment()); + } + + /** + * Returns the full URI to the next page of results, or null. + * + * @return string|null + */ + public function getNextPageURI(string $group = 'default', bool $returnObject = false) + { + $this->ensureGroup($group); + + $last = $this->getLastPage($group); + $curr = $this->getCurrentPage($group); + $page = null; + + if (! empty($last) && ! empty($curr) && $last === $curr) { + return null; + } + + if ($last > $curr) { + $page = $curr + 1; + } + + return $this->getPageURI($page, $group, $returnObject); + } + + /** + * Returns the full URL to the previous page of results, or null. + * + * @return string|null + */ + public function getPreviousPageURI(string $group = 'default', bool $returnObject = false) + { + $this->ensureGroup($group); + + $first = $this->getFirstPage($group); + $curr = $this->getCurrentPage($group); + $page = null; + + if (! empty($first) && ! empty($curr) && $first === $curr) { + return null; + } + + if ($first < $curr) { + $page = $curr - 1; + } + + return $this->getPageURI($page, $group, $returnObject); + } + + /** + * Returns the number of results per page that should be shown. + */ + public function getPerPage(string $group = 'default'): int + { + $this->ensureGroup($group); + + return (int) $this->groups[$group]['perPage']; + } + + /** + * Returns an array with details about the results, including + * total, per_page, current_page, last_page, next_url, prev_url, from, to. + * Does not include the actual data. This data is suitable for adding + * a 'data' object to with the result set and converting to JSON. + */ + public function getDetails(string $group = 'default'): array + { + if (! array_key_exists($group, $this->groups)) { + throw PagerException::forInvalidPaginationGroup($group); + } + + $newGroup = $this->groups[$group]; + + $newGroup['next'] = $this->getNextPageURI($group); + $newGroup['previous'] = $this->getPreviousPageURI($group); + $newGroup['segment'] = $this->segment[$group] ?? 0; + + return $newGroup; + } + + /** + * Sets only allowed queries on pagination links. + */ + public function only(array $queries): self + { + $this->only = $queries; + + return $this; + } + + /** + * Ensures that an array exists for the group specified. + * + * @param int $perPage + */ + protected function ensureGroup(string $group, ?int $perPage = null) + { + if (array_key_exists($group, $this->groups)) { + return; + } + + $this->groups[$group] = [ + 'uri' => clone current_url(true), + 'hasMore' => false, + 'total' => null, + 'perPage' => $perPage ?? $this->config->perPage, + 'pageCount' => 1, + 'pageSelector' => $group === 'default' ? 'page' : 'page_' . $group, + ]; + + $this->calculateCurrentPage($group); + + if ($_GET) { + $this->groups[$group]['uri'] = $this->groups[$group]['uri']->setQueryArray($_GET); + } + } + + /** + * Calculating the current page + */ + protected function calculateCurrentPage(string $group) + { + if (array_key_exists($group, $this->segment)) { + try { + $this->groups[$group]['currentPage'] = (int) $this->groups[$group]['uri']->setSilent(false)->getSegment($this->segment[$group]); + } catch (HTTPException $e) { + $this->groups[$group]['currentPage'] = 1; + } + } else { + $pageSelector = $this->groups[$group]['pageSelector']; + + $page = (int) ($_GET[$pageSelector] ?? 1); + + $this->groups[$group]['currentPage'] = $page < 1 ? 1 : $page; + } + } +} diff --git a/system/Pager/PagerInterface.php b/system/Pager/PagerInterface.php new file mode 100644 index 0000000..73c1547 --- /dev/null +++ b/system/Pager/PagerInterface.php @@ -0,0 +1,118 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Pager; + +use CodeIgniter\HTTP\URI; + +/** + * Expected behavior for a Pager + */ +interface PagerInterface +{ + /** + * Handles creating and displaying the + * + * @param string $template The output template alias to render. + */ + public function links(string $group = 'default', string $template = 'default'): string; + + /** + * Creates simple Next/Previous links, instead of full pagination. + */ + public function simpleLinks(string $group = 'default', string $template = 'default'): string; + + /** + * Allows for a simple, manual, form of pagination where all of the data + * is provided by the user. The URL is the current URI. + * + * @param string $template The output template alias to render. + */ + public function makeLinks(int $page, int $perPage, int $total, string $template = 'default'): string; + + /** + * Stores a set of pagination data for later display. Most commonly used + * by the model to automate the process. + * + * @return mixed + */ + public function store(string $group, int $page, int $perPage, int $total); + + /** + * Sets the path that an aliased group of links will use. + * + * @return mixed + */ + public function setPath(string $path, string $group = 'default'); + + /** + * Returns the total number of pages. + */ + public function getPageCount(string $group = 'default'): int; + + /** + * Returns the number of the current page of results. + */ + public function getCurrentPage(string $group = 'default'): int; + + /** + * Returns the URI for a specific page for the specified group. + * + * @return string|URI + */ + public function getPageURI(?int $page = null, string $group = 'default', bool $returnObject = false); + + /** + * Tells whether this group of results has any more pages of results. + */ + public function hasMore(string $group = 'default'): bool; + + /** + * Returns the first page. + * + * @return int + */ + public function getFirstPage(string $group = 'default'); + + /** + * Returns the last page, if we have a total that we can calculate with. + * + * @return int|null + */ + public function getLastPage(string $group = 'default'); + + /** + * Returns the full URI to the next page of results, or null. + * + * @return string|null + */ + public function getNextPageURI(string $group = 'default'); + + /** + * Returns the full URL to the previous page of results, or null. + * + * @return string|null + */ + public function getPreviousPageURI(string $group = 'default'); + + /** + * Returns the number of results per page that should be shown. + */ + public function getPerPage(string $group = 'default'): int; + + /** + * Returns an array with details about the results, including + * total, per_page, current_page, last_page, next_url, prev_url, from, to. + * Does not include the actual data. This data is suitable for adding + * a 'data' object to with the result set and converting to JSON. + */ + public function getDetails(string $group = 'default'): array; +} diff --git a/system/Pager/PagerRenderer.php b/system/Pager/PagerRenderer.php new file mode 100644 index 0000000..8c70314 --- /dev/null +++ b/system/Pager/PagerRenderer.php @@ -0,0 +1,378 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Pager; + +use CodeIgniter\HTTP\URI; + +/** + * Class PagerRenderer + * + * This class is passed to the view that describes the pagination, + * and is used to get the link information and provide utility + * methods needed to work with pagination. + */ +class PagerRenderer +{ + /** + * First page number. + * + * @var int + */ + protected $first; + + /** + * Last page number. + * + * @var int + */ + protected $last; + + /** + * Current page number. + * + * @var int + */ + protected $current; + + /** + * Total number of items. + * + * @var int + */ + protected $total; + + /** + * Total number of pages. + * + * @var int + */ + protected $pageCount; + + /** + * URI base for pagination links + * + * @var URI + */ + protected $uri; + + /** + * Segment number used for pagination. + * + * @var int + */ + protected $segment; + + /** + * Name of $_GET parameter + * + * @var string + */ + protected $pageSelector; + + /** + * Constructor. + */ + public function __construct(array $details) + { + $this->first = 1; + $this->last = $details['pageCount']; + $this->current = $details['currentPage']; + $this->total = $details['total']; + $this->uri = $details['uri']; + $this->pageCount = $details['pageCount']; + $this->segment = $details['segment'] ?? 0; + $this->pageSelector = $details['pageSelector'] ?? 'page'; + } + + /** + * Sets the total number of links that should appear on either + * side of the current page. Adjusts the first and last counts + * to reflect it. + * + * @return PagerRenderer + */ + public function setSurroundCount(?int $count = null) + { + $this->updatePages($count); + + return $this; + } + + /** + * Checks to see if there is a "previous" page before our "first" page. + */ + public function hasPrevious(): bool + { + return $this->first > 1; + } + + /** + * Returns a URL to the "previous" page. The previous page is NOT the + * page before the current page, but is the page just before the + * "first" page. + * + * You MUST call hasPrevious() first, or this value may be invalid. + * + * @return string|null + */ + public function getPrevious() + { + if (! $this->hasPrevious()) { + return null; + } + + $uri = clone $this->uri; + + if ($this->segment === 0) { + $uri->addQuery($this->pageSelector, $this->first - 1); + } else { + $uri->setSegment($this->segment, $this->first - 1); + } + + return URI::createURIString($uri->getScheme(), $uri->getAuthority(), $uri->getPath(), $uri->getQuery(), $uri->getFragment()); + } + + /** + * Checks to see if there is a "next" page after our "last" page. + */ + public function hasNext(): bool + { + return $this->pageCount > $this->last; + } + + /** + * Returns a URL to the "next" page. The next page is NOT, the + * page after the current page, but is the page that follows the + * "last" page. + * + * You MUST call hasNext() first, or this value may be invalid. + * + * @return string|null + */ + public function getNext() + { + if (! $this->hasNext()) { + return null; + } + + $uri = clone $this->uri; + + if ($this->segment === 0) { + $uri->addQuery($this->pageSelector, $this->last + 1); + } else { + $uri->setSegment($this->segment, $this->last + 1); + } + + return URI::createURIString($uri->getScheme(), $uri->getAuthority(), $uri->getPath(), $uri->getQuery(), $uri->getFragment()); + } + + /** + * Returns the URI of the first page. + */ + public function getFirst(): string + { + $uri = clone $this->uri; + + if ($this->segment === 0) { + $uri->addQuery($this->pageSelector, 1); + } else { + $uri->setSegment($this->segment, 1); + } + + return URI::createURIString($uri->getScheme(), $uri->getAuthority(), $uri->getPath(), $uri->getQuery(), $uri->getFragment()); + } + + /** + * Returns the URI of the last page. + */ + public function getLast(): string + { + $uri = clone $this->uri; + + if ($this->segment === 0) { + $uri->addQuery($this->pageSelector, $this->pageCount); + } else { + $uri->setSegment($this->segment, $this->pageCount); + } + + return URI::createURIString($uri->getScheme(), $uri->getAuthority(), $uri->getPath(), $uri->getQuery(), $uri->getFragment()); + } + + /** + * Returns the URI of the current page. + */ + public function getCurrent(): string + { + $uri = clone $this->uri; + + if ($this->segment === 0) { + $uri->addQuery($this->pageSelector, $this->current); + } else { + $uri->setSegment($this->segment, $this->current); + } + + return URI::createURIString($uri->getScheme(), $uri->getAuthority(), $uri->getPath(), $uri->getQuery(), $uri->getFragment()); + } + + /** + * Returns an array of links that should be displayed. Each link + * is represented by another array containing of the URI the link + * should go to, the title (number) of the link, and a boolean + * value representing whether this link is active or not. + */ + public function links(): array + { + $links = []; + + $uri = clone $this->uri; + + for ($i = $this->first; $i <= $this->last; $i++) { + $uri = $this->segment === 0 ? $uri->addQuery($this->pageSelector, $i) : $uri->setSegment($this->segment, $i); + $links[] = [ + 'uri' => URI::createURIString($uri->getScheme(), $uri->getAuthority(), $uri->getPath(), $uri->getQuery(), $uri->getFragment()), + 'title' => $i, + 'active' => ($i === $this->current), + ]; + } + + return $links; + } + + /** + * Updates the first and last pages based on $surroundCount, + * which is the number of links surrounding the active page + * to show. + * + * @param int|null $count The new "surroundCount" + */ + protected function updatePages(?int $count = null) + { + if ($count === null) { + return; + } + + $this->first = $this->current - $count > 0 ? $this->current - $count : 1; + $this->last = $this->current + $count <= $this->pageCount ? $this->current + $count : (int) $this->pageCount; + } + + /** + * Checks to see if there is a "previous" page before our "first" page. + */ + public function hasPreviousPage(): bool + { + return $this->current > 1; + } + + /** + * Returns a URL to the "previous" page. + * + * You MUST call hasPreviousPage() first, or this value may be invalid. + * + * @return string|null + */ + public function getPreviousPage() + { + if (! $this->hasPreviousPage()) { + return null; + } + + $uri = clone $this->uri; + + if ($this->segment === 0) { + $uri->addQuery($this->pageSelector, $this->current - 1); + } else { + $uri->setSegment($this->segment, $this->current - 1); + } + + return URI::createURIString($uri->getScheme(), $uri->getAuthority(), $uri->getPath(), $uri->getQuery(), $uri->getFragment()); + } + + /** + * Checks to see if there is a "next" page after our "last" page. + */ + public function hasNextPage(): bool + { + return $this->current < $this->last; + } + + /** + * Returns a URL to the "next" page. + * + * You MUST call hasNextPage() first, or this value may be invalid. + * + * @return string|null + */ + public function getNextPage() + { + if (! $this->hasNextPage()) { + return null; + } + + $uri = clone $this->uri; + + if ($this->segment === 0) { + $uri->addQuery($this->pageSelector, $this->current + 1); + } else { + $uri->setSegment($this->segment, $this->current + 1); + } + + return URI::createURIString($uri->getScheme(), $uri->getAuthority(), $uri->getPath(), $uri->getQuery(), $uri->getFragment()); + } + + /** + * Returns the page number of the first page. + */ + public function getFirstPageNumber(): int + { + return $this->first; + } + + /** + * Returns the page number of the current page. + */ + public function getCurrentPageNumber(): int + { + return $this->current; + } + + /** + * Returns the page number of the last page. + */ + public function getLastPageNumber(): int + { + return $this->last; + } + + /** + * Returns total number of pages. + */ + public function getPageCount(): int + { + return $this->pageCount; + } + + /** + * Returns the previous page number. + */ + public function getPreviousPageNumber(): ?int + { + return ($this->current === 1) ? null : $this->current - 1; + } + + /** + * Returns the next page number. + */ + public function getNextPageNumber(): ?int + { + return ($this->current === $this->pageCount) ? null : $this->current + 1; + } +} diff --git a/system/Pager/Views/default_full.php b/system/Pager/Views/default_full.php new file mode 100644 index 0000000..0001143 --- /dev/null +++ b/system/Pager/Views/default_full.php @@ -0,0 +1,47 @@ +setSurroundCount(2); +?> + + diff --git a/system/Pager/Views/default_head.php b/system/Pager/Views/default_head.php new file mode 100644 index 0000000..c233e5e --- /dev/null +++ b/system/Pager/Views/default_head.php @@ -0,0 +1,27 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +use CodeIgniter\Pager\PagerRenderer; + +/** + * @var PagerRenderer $pager + */ +$pager->setSurroundCount(0); + +if ($pager->hasPrevious()) { + echo '' . PHP_EOL; +} + +echo '' . PHP_EOL; + +if ($pager->hasNext()) { + echo '' . PHP_EOL; +} diff --git a/system/Pager/Views/default_simple.php b/system/Pager/Views/default_simple.php new file mode 100644 index 0000000..fc00ce8 --- /dev/null +++ b/system/Pager/Views/default_simple.php @@ -0,0 +1,23 @@ +setSurroundCount(0); +?> + diff --git a/system/Publisher/Exceptions/PublisherException.php b/system/Publisher/Exceptions/PublisherException.php new file mode 100644 index 0000000..535d3a7 --- /dev/null +++ b/system/Publisher/Exceptions/PublisherException.php @@ -0,0 +1,49 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Publisher\Exceptions; + +use CodeIgniter\Exceptions\FrameworkException; + +/** + * Publisher Exception Class + * + * Handles exceptions related to actions taken by a Publisher. + */ +class PublisherException extends FrameworkException +{ + /** + * Throws when a file should be overwritten yet cannot. + * + * @param string $from The source file + * @param string $to The destination file + */ + public static function forCollision(string $from, string $to) + { + return new static(lang('Publisher.collision', [filetype($to), $from, $to])); + } + + /** + * Throws when given a destination that is not in the list of allowed directories. + */ + public static function forDestinationNotAllowed(string $destination) + { + return new static(lang('Publisher.destinationNotAllowed', [$destination])); + } + + /** + * Throws when a file fails to match the allowed pattern for its destination. + */ + public static function forFileNotAllowed(string $file, string $directory, string $pattern) + { + return new static(lang('Publisher.fileNotAllowed', [$file, $directory, $pattern])); + } +} diff --git a/system/Publisher/Publisher.php b/system/Publisher/Publisher.php new file mode 100644 index 0000000..dac7aa8 --- /dev/null +++ b/system/Publisher/Publisher.php @@ -0,0 +1,440 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Publisher; + +use CodeIgniter\Autoloader\FileLocator; +use CodeIgniter\Files\FileCollection; +use CodeIgniter\HTTP\URI; +use CodeIgniter\Publisher\Exceptions\PublisherException; +use RuntimeException; +use Throwable; + +/** + * Publishers read in file paths from a variety of sources and copy + * the files out to different destinations. This class acts both as + * a base for individual publication directives as well as the mode + * of discovery for said instances. In this class a "file" is a full + * path to a verified file while a "path" is relative to its source + * or destination and may indicate either a file or directory of + * unconfirmed existence. + * + * Class failures throw the PublisherException, but some underlying + * methods may percolate different exceptions, like FileException, + * FileNotFoundException or InvalidArgumentException. + * + * Write operations will catch all errors in the file-specific + * $errors property to minimize impact of partial batch operations. + */ +class Publisher extends FileCollection +{ + /** + * Array of discovered Publishers. + * + * @var array + */ + private static $discovered = []; + + /** + * Directory to use for methods that need temporary storage. + * Created on-the-fly as needed. + * + * @var string|null + */ + private $scratch; + + /** + * Exceptions for specific files from the last write operation. + * + * @var array + */ + private $errors = []; + + /** + * List of file published curing the last write operation. + * + * @var string[] + */ + private $published = []; + + /** + * List of allowed directories and their allowed files regex. + * Restrictions are intentionally private to prevent overriding. + * + * @var array + */ + private $restrictions; + + /** + * Base path to use for the source. + * + * @var string + */ + protected $source = ROOTPATH; + + /** + * Base path to use for the destination. + * + * @var string + */ + protected $destination = FCPATH; + + //-------------------------------------------------------------------- + // Support Methods + //-------------------------------------------------------------------- + + /** + * Discovers and returns all Publishers in the specified namespace directory. + * + * @return self[] + */ + final public static function discover(string $directory = 'Publishers'): array + { + if (isset(self::$discovered[$directory])) { + return self::$discovered[$directory]; + } + + self::$discovered[$directory] = []; + + /** @var FileLocator $locator */ + $locator = service('locator'); + + if ([] === $files = $locator->listFiles($directory)) { + return []; + } + + // Loop over each file checking to see if it is a Publisher + foreach (array_unique($files) as $file) { + $className = $locator->findQualifiedNameFromPath($file); + + if (is_string($className) && class_exists($className) && is_a($className, self::class, true)) { + self::$discovered[$directory][] = new $className(); + } + } + + sort(self::$discovered[$directory]); + + return self::$discovered[$directory]; + } + + /** + * Removes a directory and all its files and subdirectories. + */ + private static function wipeDirectory(string $directory): void + { + if (is_dir($directory)) { + // Try a few times in case of lingering locks + $attempts = 10; + + while ((bool) $attempts && ! delete_files($directory, true, false, true)) { + // @codeCoverageIgnoreStart + $attempts--; + usleep(100000); // .1s + // @codeCoverageIgnoreEnd + } + + @rmdir($directory); + } + } + + //-------------------------------------------------------------------- + // Class Core + //-------------------------------------------------------------------- + + /** + * Loads the helper and verifies the source and destination directories. + */ + public function __construct(?string $source = null, ?string $destination = null) + { + helper(['filesystem']); + + $this->source = self::resolveDirectory($source ?? $this->source); + $this->destination = self::resolveDirectory($destination ?? $this->destination); + + // Restrictions are intentionally not injected to prevent overriding + $this->restrictions = config('Publisher')->restrictions; + + // Make sure the destination is allowed + foreach (array_keys($this->restrictions) as $directory) { + if (strpos($this->destination, $directory) === 0) { + return; + } + } + + throw PublisherException::forDestinationNotAllowed($this->destination); + } + + /** + * Cleans up any temporary files in the scratch space. + */ + public function __destruct() + { + if (isset($this->scratch)) { + self::wipeDirectory($this->scratch); + + $this->scratch = null; + } + } + + /** + * Reads files from the sources and copies them out to their destinations. + * This method should be reimplemented by child classes intended for + * discovery. + * + * @throws RuntimeException + */ + public function publish(): bool + { + // Safeguard against accidental misuse + if ($this->source === ROOTPATH && $this->destination === FCPATH) { + throw new RuntimeException('Child classes of Publisher should provide their own publish method or a source and destination.'); + } + + return $this->addPath('/')->merge(true); + } + + //-------------------------------------------------------------------- + // Property Accessors + //-------------------------------------------------------------------- + + /** + * Returns the source directory. + */ + final public function getSource(): string + { + return $this->source; + } + + /** + * Returns the destination directory. + */ + final public function getDestination(): string + { + return $this->destination; + } + + /** + * Returns the temporary workspace, creating it if necessary. + */ + final public function getScratch(): string + { + if ($this->scratch === null) { + $this->scratch = rtrim(sys_get_temp_dir(), DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR . bin2hex(random_bytes(6)) . DIRECTORY_SEPARATOR; + mkdir($this->scratch, 0700); + $this->scratch = realpath($this->scratch) ? realpath($this->scratch) . DIRECTORY_SEPARATOR + : $this->scratch; + } + + return $this->scratch; + } + + /** + * Returns errors from the last write operation if any. + * + * @return array + */ + final public function getErrors(): array + { + return $this->errors; + } + + /** + * Returns the files published by the last write operation. + * + * @return string[] + */ + final public function getPublished(): array + { + return $this->published; + } + + //-------------------------------------------------------------------- + // Additional Handlers + //-------------------------------------------------------------------- + + /** + * Verifies and adds paths to the list. + * + * @param string[] $paths + * + * @return $this + */ + final public function addPaths(array $paths, bool $recursive = true) + { + foreach ($paths as $path) { + $this->addPath($path, $recursive); + } + + return $this; + } + + /** + * Adds a single path to the file list. + * + * @return $this + */ + final public function addPath(string $path, bool $recursive = true) + { + $this->add($this->source . $path, $recursive); + + return $this; + } + + /** + * Downloads and stages files from an array of URIs. + * + * @param string[] $uris + * + * @return $this + */ + final public function addUris(array $uris) + { + foreach ($uris as $uri) { + $this->addUri($uri); + } + + return $this; + } + + /** + * Downloads a file from the URI, and adds it to the file list. + * + * @param string $uri Because HTTP\URI is stringable it will still be accepted + * + * @return $this + */ + final public function addUri(string $uri) + { + // Figure out a good filename (using URI strips queries and fragments) + $file = $this->getScratch() . basename((new URI($uri))->getPath()); + + // Get the content and write it to the scratch space + write_file($file, service('curlrequest')->get($uri)->getBody()); + + return $this->addFile($file); + } + + //-------------------------------------------------------------------- + // Write Methods + //-------------------------------------------------------------------- + + /** + * Removes the destination and all its files and folders. + * + * @return $this + */ + final public function wipe() + { + self::wipeDirectory($this->destination); + + return $this; + } + + /** + * Copies all files into the destination, does not create directory structure. + * + * @param bool $replace Whether to overwrite existing files. + * + * @return bool Whether all files were copied successfully + */ + final public function copy(bool $replace = true): bool + { + $this->errors = $this->published = []; + + foreach ($this->get() as $file) { + $to = $this->destination . basename($file); + + try { + $this->safeCopyFile($file, $to, $replace); + $this->published[] = $to; + } catch (Throwable $e) { + $this->errors[$file] = $e; + } + } + + return $this->errors === []; + } + + /** + * Merges all files into the destination. + * Creates a mirrored directory structure only for files from source. + * + * @param bool $replace Whether to overwrite existing files. + * + * @return bool Whether all files were copied successfully + */ + final public function merge(bool $replace = true): bool + { + $this->errors = $this->published = []; + + // Get the files from source for special handling + $sourced = self::filterFiles($this->get(), $this->source); + + // Handle everything else with a flat copy + $this->files = array_diff($this->files, $sourced); + $this->copy($replace); + + // Copy each sourced file to its relative destination + foreach ($sourced as $file) { + // Resolve the destination path + $to = $this->destination . substr($file, strlen($this->source)); + + try { + $this->safeCopyFile($file, $to, $replace); + $this->published[] = $to; + } catch (Throwable $e) { + $this->errors[$file] = $e; + } + } + + return $this->errors === []; + } + + /** + * Copies a file with directory creation and identical file awareness. + * Intentionally allows errors. + * + * @throws PublisherException For collisions and restriction violations + */ + private function safeCopyFile(string $from, string $to, bool $replace): void + { + // Verify this is an allowed file for its destination + foreach ($this->restrictions as $directory => $pattern) { + if (strpos($to, $directory) === 0 && self::matchFiles([$to], $pattern) === []) { + throw PublisherException::forFileNotAllowed($from, $directory, $pattern); + } + } + + // Check for an existing file + if (file_exists($to)) { + // If not replacing or if files are identical then consider successful + if (! $replace || same_file($from, $to)) { + return; + } + + // If it is a directory then do not try to remove it + if (is_dir($to)) { + throw PublisherException::forCollision($from, $to); + } + + // Try to remove anything else + unlink($to); + } + + // Make sure the directory exists + if (! is_dir($directory = pathinfo($to, PATHINFO_DIRNAME))) { + mkdir($directory, 0775, true); + } + + // Allow copy() to throw errors + copy($from, $to); + } +} diff --git a/system/RESTful/BaseResource.php b/system/RESTful/BaseResource.php new file mode 100644 index 0000000..65ad212 --- /dev/null +++ b/system/RESTful/BaseResource.php @@ -0,0 +1,61 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\RESTful; + +use CodeIgniter\Controller; +use CodeIgniter\HTTP\RequestInterface; +use CodeIgniter\HTTP\ResponseInterface; +use Psr\Log\LoggerInterface; + +abstract class BaseResource extends Controller +{ + /** + * @var string|null The model that holding this resource's data + */ + protected $modelName; + + /** + * @var object|null The model that holding this resource's data + */ + protected $model; + + /** + * Constructor. + */ + public function initController(RequestInterface $request, ResponseInterface $response, LoggerInterface $logger) + { + parent::initController($request, $response, $logger); + $this->setModel($this->modelName); + } + + /** + * Set or change the model this controller is bound to. + * Given either the name or the object, determine the other. + * + * @param object|string|null $which + */ + public function setModel($which = null) + { + if ($which) { + $this->model = is_object($which) ? $which : null; + $this->modelName = is_object($which) ? null : $which; + } + + if (empty($this->model) && ! empty($this->modelName) && class_exists($this->modelName)) { + $this->model = model($this->modelName); + } + + if (! empty($this->model) && empty($this->modelName)) { + $this->modelName = get_class($this->model); + } + } +} diff --git a/system/RESTful/ResourceController.php b/system/RESTful/ResourceController.php new file mode 100644 index 0000000..809545c --- /dev/null +++ b/system/RESTful/ResourceController.php @@ -0,0 +1,110 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\RESTful; + +use CodeIgniter\API\ResponseTrait; + +/** + * An extendable controller to provide a RESTful API for a resource. + */ +class ResourceController extends BaseResource +{ + use ResponseTrait; + + /** + * Return an array of resource objects, themselves in array format + * + * @return mixed + */ + public function index() + { + return $this->fail(lang('RESTful.notImplemented', ['index']), 501); + } + + /** + * Return the properties of a resource object + * + * @param mixed $id + * + * @return mixed + */ + public function show($id = null) + { + return $this->fail(lang('RESTful.notImplemented', ['show']), 501); + } + + /** + * Return a new resource object, with default properties + * + * @return mixed + */ + public function new() + { + return $this->fail(lang('RESTful.notImplemented', ['new']), 501); + } + + /** + * Create a new resource object, from "posted" parameters + * + * @return mixed + */ + public function create() + { + return $this->fail(lang('RESTful.notImplemented', ['create']), 501); + } + + /** + * Return the editable properties of a resource object + * + * @param mixed $id + * + * @return mixed + */ + public function edit($id = null) + { + return $this->fail(lang('RESTful.notImplemented', ['edit']), 501); + } + + /** + * Add or update a model resource, from "posted" properties + * + * @param mixed $id + * + * @return mixed + */ + public function update($id = null) + { + return $this->fail(lang('RESTful.notImplemented', ['update']), 501); + } + + /** + * Delete the designated resource object from the model + * + * @param mixed $id + * + * @return mixed + */ + public function delete($id = null) + { + return $this->fail(lang('RESTful.notImplemented', ['delete']), 501); + } + + /** + * Set/change the expected response representation for returned objects + */ + public function setFormat(string $format = 'json') + { + if (in_array($format, ['json', 'xml'], true)) { + $this->format = $format; + } + } +} diff --git a/system/RESTful/ResourcePresenter.php b/system/RESTful/ResourcePresenter.php new file mode 100644 index 0000000..467e268 --- /dev/null +++ b/system/RESTful/ResourcePresenter.php @@ -0,0 +1,110 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\RESTful; + +/** + * An extendable controller to help provide a UI for a resource. + */ +class ResourcePresenter extends BaseResource +{ + /** + * Present a view of resource objects + * + * @return mixed + */ + public function index() + { + return lang('RESTful.notImplemented', ['index']); + } + + /** + * Present a view to present a specific resource object + * + * @param mixed $id + * + * @return mixed + */ + public function show($id = null) + { + return lang('RESTful.notImplemented', ['show']); + } + + /** + * Present a view to present a new single resource object + * + * @return mixed + */ + public function new() + { + return lang('RESTful.notImplemented', ['new']); + } + + /** + * Process the creation/insertion of a new resource object. + * This should be a POST. + * + * @return mixed + */ + public function create() + { + return lang('RESTful.notImplemented', ['create']); + } + + /** + * Present a view to edit the properties of a specific resource object + * + * @param mixed $id + * + * @return mixed + */ + public function edit($id = null) + { + return lang('RESTful.notImplemented', ['edit']); + } + + /** + * Process the updating, full or partial, of a specific resource object. + * This should be a POST. + * + * @param mixed $id + * + * @return mixed + */ + public function update($id = null) + { + return lang('RESTful.notImplemented', ['update']); + } + + /** + * Present a view to confirm the deletion of a specific resource object + * + * @param mixed $id + * + * @return mixed + */ + public function remove($id = null) + { + return lang('RESTful.notImplemented', ['remove']); + } + + /** + * Process the deletion of a specific resource object + * + * @param mixed $id + * + * @return mixed + */ + public function delete($id = null) + { + return lang('RESTful.notImplemented', ['delete']); + } +} diff --git a/system/Router/Exceptions/RedirectException.php b/system/Router/Exceptions/RedirectException.php new file mode 100644 index 0000000..b2456f3 --- /dev/null +++ b/system/Router/Exceptions/RedirectException.php @@ -0,0 +1,27 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Router\Exceptions; + +use Exception; + +/** + * RedirectException + */ +class RedirectException extends Exception +{ + /** + * Status code for redirects + * + * @var int + */ + protected $code = 302; +} diff --git a/system/Router/Exceptions/RouterException.php b/system/Router/Exceptions/RouterException.php new file mode 100644 index 0000000..8c469d9 --- /dev/null +++ b/system/Router/Exceptions/RouterException.php @@ -0,0 +1,61 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Router\Exceptions; + +use CodeIgniter\Exceptions\FrameworkException; + +/** + * RouterException + */ +class RouterException extends FrameworkException +{ + /** + * Thrown when the actual parameter type does not match + * the expected types. + * + * @return RouterException + */ + public static function forInvalidParameterType() + { + return new static(lang('Router.invalidParameterType')); + } + + /** + * Thrown when a default route is not set. + * + * @return RouterException + */ + public static function forMissingDefaultRoute() + { + return new static(lang('Router.missingDefaultRoute')); + } + + /** + * Throw when controller or its method is not found. + * + * @return RouterException + */ + public static function forControllerNotFound(string $controller, string $method) + { + return new static(lang('HTTP.controllerNotFound', [$controller, $method])); + } + + /** + * Throw when route is not valid. + * + * @return RouterException + */ + public static function forInvalidRoute(string $route) + { + return new static(lang('HTTP.invalidRoute', [$route])); + } +} diff --git a/system/Router/RouteCollection.php b/system/Router/RouteCollection.php new file mode 100644 index 0000000..15a2d3d --- /dev/null +++ b/system/Router/RouteCollection.php @@ -0,0 +1,1341 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Router; + +use Closure; +use CodeIgniter\Autoloader\FileLocator; +use CodeIgniter\Router\Exceptions\RouterException; +use Config\Modules; +use Config\Services; +use InvalidArgumentException; + +/** + * @todo Implement nested resource routing (See CakePHP) + */ +class RouteCollection implements RouteCollectionInterface +{ + /** + * The namespace to be added to any Controllers. + * Defaults to the global namespaces (\) + * + * @var string + */ + protected $defaultNamespace = '\\'; + + /** + * The name of the default controller to use + * when no other controller is specified. + * + * Not used here. Pass-thru value for Router class. + * + * @var string + */ + protected $defaultController = 'Home'; + + /** + * The name of the default method to use + * when no other method has been specified. + * + * Not used here. Pass-thru value for Router class. + * + * @var string + */ + protected $defaultMethod = 'index'; + + /** + * The placeholder used when routing 'resources' + * when no other placeholder has been specified. + * + * @var string + */ + protected $defaultPlaceholder = 'any'; + + /** + * Whether to convert dashes to underscores in URI. + * + * Not used here. Pass-thru value for Router class. + * + * @var bool + */ + protected $translateURIDashes = false; + + /** + * Whether to match URI against Controllers + * when it doesn't match defined routes. + * + * Not used here. Pass-thru value for Router class. + * + * @var bool + */ + protected $autoRoute = true; + + /** + * A callable that will be shown + * when the route cannot be matched. + * + * @var Closure|string + */ + protected $override404; + + /** + * Defined placeholders that can be used + * within the + * + * @var array + */ + protected $placeholders = [ + 'any' => '.*', + 'segment' => '[^/]+', + 'alphanum' => '[a-zA-Z0-9]+', + 'num' => '[0-9]+', + 'alpha' => '[a-zA-Z]+', + 'hash' => '[^/]+', + ]; + + /** + * An array of all routes and their mappings. + * + * @var array + */ + protected $routes = [ + '*' => [], + 'options' => [], + 'get' => [], + 'head' => [], + 'post' => [], + 'put' => [], + 'delete' => [], + 'trace' => [], + 'connect' => [], + 'cli' => [], + ]; + + /** + * Array of routes options + * + * @var array + */ + protected $routesOptions = []; + + /** + * The current method that the script is being called by. + * + * @var string + */ + protected $HTTPVerb = '*'; + + /** + * The default list of HTTP methods (and CLI for command line usage) + * that is allowed if no other method is provided. + * + * @var array + */ + protected $defaultHTTPMethods = [ + 'options', + 'get', + 'head', + 'post', + 'put', + 'delete', + 'trace', + 'connect', + 'cli', + ]; + + /** + * The name of the current group, if any. + * + * @var string|null + */ + protected $group; + + /** + * The current subdomain. + * + * @var string|null + */ + protected $currentSubdomain; + + /** + * Stores copy of current options being + * applied during creation. + * + * @var array|null + */ + protected $currentOptions; + + /** + * A little performance booster. + * + * @var bool + */ + protected $didDiscover = false; + + /** + * Handle to the file locator to use. + * + * @var FileLocator + */ + protected $fileLocator; + + /** + * Handle to the modules config. + * + * @var Modules + */ + protected $moduleConfig; + + /** + * Flag for sorting routes by priority. + * + * @var bool + */ + protected $prioritize = false; + + /** + * Route priority detection flag. + * + * @var bool + */ + protected $prioritizeDetected = false; + + /** + * Constructor + */ + public function __construct(FileLocator $locator, Modules $moduleConfig) + { + $this->fileLocator = $locator; + $this->moduleConfig = $moduleConfig; + } + + /** + * Registers a new constraint with the system. Constraints are used + * by the routes as placeholders for regular expressions to make defining + * the routes more human-friendly. + * + * You can pass an associative array as $placeholder, and have + * multiple placeholders added at once. + * + * @param array|string $placeholder + */ + public function addPlaceholder($placeholder, ?string $pattern = null): RouteCollectionInterface + { + if (! is_array($placeholder)) { + $placeholder = [$placeholder => $pattern]; + } + + $this->placeholders = array_merge($this->placeholders, $placeholder); + + return $this; + } + + /** + * Sets the default namespace to use for Controllers when no other + * namespace has been specified. + */ + public function setDefaultNamespace(string $value): RouteCollectionInterface + { + $this->defaultNamespace = esc(strip_tags($value)); + $this->defaultNamespace = rtrim($this->defaultNamespace, '\\') . '\\'; + + return $this; + } + + /** + * Sets the default controller to use when no other controller has been + * specified. + */ + public function setDefaultController(string $value): RouteCollectionInterface + { + $this->defaultController = esc(strip_tags($value)); + + return $this; + } + + /** + * Sets the default method to call on the controller when no other + * method has been set in the route. + */ + public function setDefaultMethod(string $value): RouteCollectionInterface + { + $this->defaultMethod = esc(strip_tags($value)); + + return $this; + } + + /** + * Tells the system whether to convert dashes in URI strings into + * underscores. In some search engines, including Google, dashes + * create more meaning and make it easier for the search engine to + * find words and meaning in the URI for better SEO. But it + * doesn't work well with PHP method names.... + */ + public function setTranslateURIDashes(bool $value): RouteCollectionInterface + { + $this->translateURIDashes = $value; + + return $this; + } + + /** + * If TRUE, the system will attempt to match the URI against + * Controllers by matching each segment against folders/files + * in APPPATH/Controllers, when a match wasn't found against + * defined routes. + * + * If FALSE, will stop searching and do NO automatic routing. + */ + public function setAutoRoute(bool $value): RouteCollectionInterface + { + $this->autoRoute = $value; + + return $this; + } + + /** + * Sets the class/method that should be called if routing doesn't + * find a match. It can be either a closure or the controller/method + * name exactly like a route is defined: Users::index + * + * This setting is passed to the Router class and handled there. + * + * @param callable|null $callable + */ + public function set404Override($callable = null): RouteCollectionInterface + { + $this->override404 = $callable; + + return $this; + } + + /** + * Returns the 404 Override setting, which can be null, a closure + * or the controller/string. + * + * @return Closure|string|null + */ + public function get404Override() + { + return $this->override404; + } + + /** + * Will attempt to discover any additional routes, either through + * the local PSR4 namespaces, or through selected Composer packages. + */ + protected function discoverRoutes() + { + if ($this->didDiscover) { + return; + } + + // We need this var in local scope + // so route files can access it. + $routes = $this; + + if ($this->moduleConfig->shouldDiscover('routes')) { + $files = $this->fileLocator->search('Config/Routes.php'); + + foreach ($files as $file) { + // Don't include our main file again... + if ($file === APPPATH . 'Config/Routes.php') { + continue; + } + + include $file; + } + } + + $this->didDiscover = true; + } + + /** + * Sets the default constraint to be used in the system. Typically + * for use with the 'resource' method. + */ + public function setDefaultConstraint(string $placeholder): RouteCollectionInterface + { + if (array_key_exists($placeholder, $this->placeholders)) { + $this->defaultPlaceholder = $placeholder; + } + + return $this; + } + + /** + * Returns the name of the default controller. With Namespace. + */ + public function getDefaultController(): string + { + return $this->defaultController; + } + + /** + * Returns the name of the default method to use within the controller. + */ + public function getDefaultMethod(): string + { + return $this->defaultMethod; + } + + /** + * Returns the default namespace as set in the Routes config file. + */ + public function getDefaultNamespace(): string + { + return $this->defaultNamespace; + } + + /** + * Returns the current value of the translateURIDashes setting. + */ + public function shouldTranslateURIDashes(): bool + { + return $this->translateURIDashes; + } + + /** + * Returns the flag that tells whether to autoRoute URI against Controllers. + */ + public function shouldAutoRoute(): bool + { + return $this->autoRoute; + } + + /** + * Returns the raw array of available routes. + */ + public function getRoutes(?string $verb = null): array + { + if (empty($verb)) { + $verb = $this->getHTTPVerb(); + } + + // Since this is the entry point for the Router, + // take a moment to do any route discovery + // we might need to do. + $this->discoverRoutes(); + + $routes = []; + $collection = []; + + if (isset($this->routes[$verb])) { + // Keep current verb's routes at the beginning so they're matched + // before any of the generic, "add" routes. + if (isset($this->routes['*'])) { + $extraRules = array_diff_key($this->routes['*'], $this->routes[$verb]); + $collection = array_merge($this->routes[$verb], $extraRules); + } + + foreach ($collection as $r) { + $key = key($r['route']); + $routes[$key] = $r['route'][$key]; + } + } + + // sorting routes by priority + if ($this->prioritizeDetected && $this->prioritize && $routes !== []) { + $order = []; + + foreach ($routes as $key => $value) { + $key = $key === '/' ? $key : ltrim($key, '/ '); + $priority = $this->getRoutesOptions($key, $verb)['priority'] ?? 0; + $order[$priority][$key] = $value; + } + + ksort($order); + $routes = array_merge(...$order); + } + + return $routes; + } + + /** + * Returns one or all routes options + */ + public function getRoutesOptions(?string $from = null, ?string $verb = null): array + { + $options = $this->loadRoutesOptions($verb); + + return $from ? $options[$from] ?? [] : $options; + } + + /** + * Returns the current HTTP Verb being used. + */ + public function getHTTPVerb(): string + { + return $this->HTTPVerb; + } + + /** + * Sets the current HTTP verb. + * Used primarily for testing. + * + * @return $this + */ + public function setHTTPVerb(string $verb) + { + $this->HTTPVerb = $verb; + + return $this; + } + + /** + * A shortcut method to add a number of routes at a single time. + * It does not allow any options to be set on the route, or to + * define the method used. + */ + public function map(array $routes = [], ?array $options = null): RouteCollectionInterface + { + foreach ($routes as $from => $to) { + $this->add($from, $to, $options); + } + + return $this; + } + + /** + * Adds a single route to the collection. + * + * Example: + * $routes->add('news', 'Posts::index'); + * + * @param array|Closure|string $to + */ + public function add(string $from, $to, ?array $options = null): RouteCollectionInterface + { + $this->create('*', $from, $to, $options); + + return $this; + } + + /** + * Adds a temporary redirect from one route to another. Used for + * redirecting traffic from old, non-existing routes to the new + * moved routes. + * + * @param string $from The pattern to match against + * @param string $to Either a route name or a URI to redirect to + * @param int $status The HTTP status code that should be returned with this redirect + * + * @return RouteCollection + */ + public function addRedirect(string $from, string $to, int $status = 302) + { + // Use the named route's pattern if this is a named route. + if (array_key_exists($to, $this->routes['*'])) { + $to = $this->routes['*'][$to]['route']; + } elseif (array_key_exists($to, $this->routes['get'])) { + $to = $this->routes['get'][$to]['route']; + } + + $this->create('*', $from, $to, ['redirect' => $status]); + + return $this; + } + + /** + * Determines if the route is a redirecting route. + */ + public function isRedirect(string $from): bool + { + foreach ($this->routes['*'] as $name => $route) { + // Named route? + if ($name === $from || key($route['route']) === $from) { + return isset($route['redirect']) && is_numeric($route['redirect']); + } + } + + return false; + } + + /** + * Grabs the HTTP status code from a redirecting Route. + */ + public function getRedirectCode(string $from): int + { + foreach ($this->routes['*'] as $name => $route) { + // Named route? + if ($name === $from || key($route['route']) === $from) { + return $route['redirect'] ?? 0; + } + } + + return 0; + } + + /** + * Group a series of routes under a single URL segment. This is handy + * for grouping items into an admin area, like: + * + * Example: + * // Creates route: admin/users + * $route->group('admin', function() { + * $route->resource('users'); + * }); + * + * @param string $name The name to group/prefix the routes with. + * @param array|callable ...$params + */ + public function group(string $name, ...$params) + { + $oldGroup = $this->group; + $oldOptions = $this->currentOptions; + + // To register a route, we'll set a flag so that our router + // so it will see the group name. + // If the group name is empty, we go on using the previously built group name. + $this->group = $name ? ltrim($oldGroup . '/' . $name, '/') : $oldGroup; + + $callback = array_pop($params); + + if ($params && is_array($params[0])) { + $this->currentOptions = array_shift($params); + } + + if (is_callable($callback)) { + $callback($this); + } + + $this->group = $oldGroup; + $this->currentOptions = $oldOptions; + } + + /* + * -------------------------------------------------------------------- + * HTTP Verb-based routing + * -------------------------------------------------------------------- + * Routing works here because, as the routes Config file is read in, + * the various HTTP verb-based routes will only be added to the in-memory + * routes if it is a call that should respond to that verb. + * + * The options array is typically used to pass in an 'as' or var, but may + * be expanded in the future. See the docblock for 'add' method above for + * current list of globally available options. + */ + + /** + * Creates a collections of HTTP-verb based routes for a controller. + * + * Possible Options: + * 'controller' - Customize the name of the controller used in the 'to' route + * 'placeholder' - The regex used by the Router. Defaults to '(:any)' + * 'websafe' - - '1' if only GET and POST HTTP verbs are supported + * + * Example: + * + * $route->resource('photos'); + * + * // Generates the following routes: + * HTTP Verb | Path | Action | Used for... + * ----------+-------------+---------------+----------------- + * GET /photos index an array of photo objects + * GET /photos/new new an empty photo object, with default properties + * GET /photos/{id}/edit edit a specific photo object, editable properties + * GET /photos/{id} show a specific photo object, all properties + * POST /photos create a new photo object, to add to the resource + * DELETE /photos/{id} delete deletes the specified photo object + * PUT/PATCH /photos/{id} update replacement properties for existing photo + * + * If 'websafe' option is present, the following paths are also available: + * + * POST /photos/{id}/delete delete + * POST /photos/{id} update + * + * @param string $name The name of the resource/controller to route to. + * @param array|null $options An list of possible ways to customize the routing. + */ + public function resource(string $name, ?array $options = null): RouteCollectionInterface + { + // In order to allow customization of the route the + // resources are sent to, we need to have a new name + // to store the values in. + $newName = implode('\\', array_map('ucfirst', explode('/', $name))); + + // If a new controller is specified, then we replace the + // $name value with the name of the new controller. + if (isset($options['controller'])) { + $newName = ucfirst(esc(strip_tags($options['controller']))); + } + + // In order to allow customization of allowed id values + // we need someplace to store them. + $id = $options['placeholder'] ?? $this->placeholders[$this->defaultPlaceholder] ?? '(:segment)'; + + // Make sure we capture back-references + $id = '(' . trim($id, '()') . ')'; + + $methods = isset($options['only']) ? (is_string($options['only']) ? explode(',', $options['only']) : $options['only']) : ['index', 'show', 'create', 'update', 'delete', 'new', 'edit']; + + if (isset($options['except'])) { + $options['except'] = is_array($options['except']) ? $options['except'] : explode(',', $options['except']); + + foreach ($methods as $i => $method) { + if (in_array($method, $options['except'], true)) { + unset($methods[$i]); + } + } + } + + if (in_array('index', $methods, true)) { + $this->get($name, $newName . '::index', $options); + } + if (in_array('new', $methods, true)) { + $this->get($name . '/new', $newName . '::new', $options); + } + if (in_array('edit', $methods, true)) { + $this->get($name . '/' . $id . '/edit', $newName . '::edit/$1', $options); + } + if (in_array('show', $methods, true)) { + $this->get($name . '/' . $id, $newName . '::show/$1', $options); + } + if (in_array('create', $methods, true)) { + $this->post($name, $newName . '::create', $options); + } + if (in_array('update', $methods, true)) { + $this->put($name . '/' . $id, $newName . '::update/$1', $options); + $this->patch($name . '/' . $id, $newName . '::update/$1', $options); + } + if (in_array('delete', $methods, true)) { + $this->delete($name . '/' . $id, $newName . '::delete/$1', $options); + } + + // Web Safe? delete needs checking before update because of method name + if (isset($options['websafe'])) { + if (in_array('delete', $methods, true)) { + $this->post($name . '/' . $id . '/delete', $newName . '::delete/$1', $options); + } + if (in_array('update', $methods, true)) { + $this->post($name . '/' . $id, $newName . '::update/$1', $options); + } + } + + return $this; + } + + /** + * Creates a collections of HTTP-verb based routes for a presenter controller. + * + * Possible Options: + * 'controller' - Customize the name of the controller used in the 'to' route + * 'placeholder' - The regex used by the Router. Defaults to '(:any)' + * + * Example: + * + * $route->presenter('photos'); + * + * // Generates the following routes: + * HTTP Verb | Path | Action | Used for... + * ----------+-------------+---------------+----------------- + * GET /photos index showing all array of photo objects + * GET /photos/show/{id} show showing a specific photo object, all properties + * GET /photos/new new showing a form for an empty photo object, with default properties + * POST /photos/create create processing the form for a new photo + * GET /photos/edit/{id} edit show an editing form for a specific photo object, editable properties + * POST /photos/update/{id} update process the editing form data + * GET /photos/remove/{id} remove show a form to confirm deletion of a specific photo object + * POST /photos/delete/{id} delete deleting the specified photo object + * + * @param string $name The name of the controller to route to. + * @param array|null $options An list of possible ways to customize the routing. + */ + public function presenter(string $name, ?array $options = null): RouteCollectionInterface + { + // In order to allow customization of the route the + // resources are sent to, we need to have a new name + // to store the values in. + $newName = implode('\\', array_map('ucfirst', explode('/', $name))); + + // If a new controller is specified, then we replace the + // $name value with the name of the new controller. + if (isset($options['controller'])) { + $newName = ucfirst(esc(strip_tags($options['controller']))); + } + + // In order to allow customization of allowed id values + // we need someplace to store them. + $id = $options['placeholder'] ?? $this->placeholders[$this->defaultPlaceholder] ?? '(:segment)'; + + // Make sure we capture back-references + $id = '(' . trim($id, '()') . ')'; + + $methods = isset($options['only']) ? (is_string($options['only']) ? explode(',', $options['only']) : $options['only']) : ['index', 'show', 'new', 'create', 'edit', 'update', 'remove', 'delete']; + + if (isset($options['except'])) { + $options['except'] = is_array($options['except']) ? $options['except'] : explode(',', $options['except']); + + foreach ($methods as $i => $method) { + if (in_array($method, $options['except'], true)) { + unset($methods[$i]); + } + } + } + + if (in_array('index', $methods, true)) { + $this->get($name, $newName . '::index', $options); + } + if (in_array('show', $methods, true)) { + $this->get($name . '/show/' . $id, $newName . '::show/$1', $options); + } + if (in_array('new', $methods, true)) { + $this->get($name . '/new', $newName . '::new', $options); + } + if (in_array('create', $methods, true)) { + $this->post($name . '/create', $newName . '::create', $options); + } + if (in_array('edit', $methods, true)) { + $this->get($name . '/edit/' . $id, $newName . '::edit/$1', $options); + } + if (in_array('update', $methods, true)) { + $this->post($name . '/update/' . $id, $newName . '::update/$1', $options); + } + if (in_array('remove', $methods, true)) { + $this->get($name . '/remove/' . $id, $newName . '::remove/$1', $options); + } + if (in_array('delete', $methods, true)) { + $this->post($name . '/delete/' . $id, $newName . '::delete/$1', $options); + } + if (in_array('show', $methods, true)) { + $this->get($name . '/' . $id, $newName . '::show/$1', $options); + } + if (in_array('create', $methods, true)) { + $this->post($name, $newName . '::create', $options); + } + + return $this; + } + + /** + * Specifies a single route to match for multiple HTTP Verbs. + * + * Example: + * $route->match( ['get', 'post'], 'users/(:num)', 'users/$1); + * + * @param array|Closure|string $to + */ + public function match(array $verbs = [], string $from = '', $to = '', ?array $options = null): RouteCollectionInterface + { + if (empty($from) || empty($to)) { + throw new InvalidArgumentException('You must supply the parameters: from, to.'); + } + + foreach ($verbs as $verb) { + $verb = strtolower($verb); + + $this->{$verb}($from, $to, $options); + } + + return $this; + } + + /** + * Specifies a route that is only available to GET requests. + * + * @param array|Closure|string $to + */ + public function get(string $from, $to, ?array $options = null): RouteCollectionInterface + { + $this->create('get', $from, $to, $options); + + return $this; + } + + /** + * Specifies a route that is only available to POST requests. + * + * @param array|Closure|string $to + */ + public function post(string $from, $to, ?array $options = null): RouteCollectionInterface + { + $this->create('post', $from, $to, $options); + + return $this; + } + + /** + * Specifies a route that is only available to PUT requests. + * + * @param array|Closure|string $to + */ + public function put(string $from, $to, ?array $options = null): RouteCollectionInterface + { + $this->create('put', $from, $to, $options); + + return $this; + } + + /** + * Specifies a route that is only available to DELETE requests. + * + * @param array|Closure|string $to + */ + public function delete(string $from, $to, ?array $options = null): RouteCollectionInterface + { + $this->create('delete', $from, $to, $options); + + return $this; + } + + /** + * Specifies a route that is only available to HEAD requests. + * + * @param array|Closure|string $to + */ + public function head(string $from, $to, ?array $options = null): RouteCollectionInterface + { + $this->create('head', $from, $to, $options); + + return $this; + } + + /** + * Specifies a route that is only available to PATCH requests. + * + * @param array|Closure|string $to + */ + public function patch(string $from, $to, ?array $options = null): RouteCollectionInterface + { + $this->create('patch', $from, $to, $options); + + return $this; + } + + /** + * Specifies a route that is only available to OPTIONS requests. + * + * @param array|Closure|string $to + */ + public function options(string $from, $to, ?array $options = null): RouteCollectionInterface + { + $this->create('options', $from, $to, $options); + + return $this; + } + + /** + * Specifies a route that is only available to command-line requests. + * + * @param array|Closure|string $to + */ + public function cli(string $from, $to, ?array $options = null): RouteCollectionInterface + { + $this->create('cli', $from, $to, $options); + + return $this; + } + + /** + * Limits the routes to a specified ENVIRONMENT or they won't run. + */ + public function environment(string $env, Closure $callback): RouteCollectionInterface + { + if ($env === ENVIRONMENT) { + $callback($this); + } + + return $this; + } + + /** + * Attempts to look up a route based on its destination. + * + * If a route exists: + * + * 'path/(:any)/(:any)' => 'Controller::method/$1/$2' + * + * This method allows you to know the Controller and method + * and get the route that leads to it. + * + * // Equals 'path/$param1/$param2' + * reverseRoute('Controller::method', $param1, $param2); + * + * @param mixed ...$params + * + * @return false|string + */ + public function reverseRoute(string $search, ...$params) + { + // Named routes get higher priority. + foreach ($this->routes as $collection) { + if (array_key_exists($search, $collection)) { + $route = $this->fillRouteParams(key($collection[$search]['route']), $params); + + return $this->localizeRoute($route); + } + } + + // If it's not a named route, then loop over + // all routes to find a match. + foreach ($this->routes as $collection) { + foreach ($collection as $route) { + $from = key($route['route']); + $to = $route['route'][$from]; + + // ignore closures + if (! is_string($to)) { + continue; + } + + // Lose any namespace slash at beginning of strings + // to ensure more consistent match. + $to = ltrim($to, '\\'); + $search = ltrim($search, '\\'); + + // If there's any chance of a match, then it will + // be with $search at the beginning of the $to string. + if (strpos($to, $search) !== 0) { + continue; + } + + // Ensure that the number of $params given here + // matches the number of back-references in the route + if (substr_count($to, '$') !== count($params)) { + continue; + } + + $route = $this->fillRouteParams($from, $params); + + return $this->localizeRoute($route); + } + } + + // If we're still here, then we did not find a match. + return false; + } + + /** + * Replaces the {locale} tag with the current application locale + */ + protected function localizeRoute(string $route): string + { + return strtr($route, ['{locale}' => Services::request()->getLocale()]); + } + + /** + * Checks a route (using the "from") to see if it's filtered or not. + */ + public function isFiltered(string $search, ?string $verb = null): bool + { + $options = $this->loadRoutesOptions($verb); + + return isset($options[$search]['filter']); + } + + /** + * Returns the filter that should be applied for a single route, along + * with any parameters it might have. Parameters are found by splitting + * the parameter name on a colon to separate the filter name from the parameter list, + * and the splitting the result on commas. So: + * + * 'role:admin,manager' + * + * has a filter of "role", with parameters of ['admin', 'manager']. + * + * @deprecated Use getFiltersForRoute() + */ + public function getFilterForRoute(string $search, ?string $verb = null): string + { + $options = $this->loadRoutesOptions($verb); + + return $options[$search]['filter'] ?? ''; + } + + /** + * Returns the filters that should be applied for a single route, along + * with any parameters it might have. Parameters are found by splitting + * the parameter name on a colon to separate the filter name from the parameter list, + * and the splitting the result on commas. So: + * + * 'role:admin,manager' + * + * has a filter of "role", with parameters of ['admin', 'manager']. + */ + public function getFiltersForRoute(string $search, ?string $verb = null): array + { + $options = $this->loadRoutesOptions($verb); + + if (is_string($options[$search]['filter'])) { + return [$options[$search]['filter']]; + } + + return $options[$search]['filter'] ?? []; + } + + /** + * Given a + * + * @throws RouterException + */ + protected function fillRouteParams(string $from, ?array $params = null): string + { + // Find all of our back-references in the original route + preg_match_all('/\(([^)]+)\)/', $from, $matches); + + if (empty($matches[0])) { + return '/' . ltrim($from, '/'); + } + + // Build our resulting string, inserting the $params in + // the appropriate places. + foreach ($matches[0] as $index => $pattern) { + if (! preg_match('#^' . $pattern . '$#u', $params[$index])) { + throw RouterException::forInvalidParameterType(); + } + + // Ensure that the param we're inserting matches + // the expected param type. + $pos = strpos($from, $pattern); + $from = substr_replace($from, $params[$index], $pos, strlen($pattern)); + } + + return '/' . ltrim($from, '/'); + } + + /** + * Does the heavy lifting of creating an actual route. You must specify + * the request method(s) that this route will work for. They can be separated + * by a pipe character "|" if there is more than one. + * + * @param array|Closure|string $to + */ + protected function create(string $verb, string $from, $to, ?array $options = null) + { + $overwrite = false; + $prefix = $this->group === null ? '' : $this->group . '/'; + + $from = esc(strip_tags($prefix . $from)); + + // While we want to add a route within a group of '/', + // it doesn't work with matching, so remove them... + if ($from !== '/') { + $from = trim($from, '/'); + } + + $options = array_merge($this->currentOptions ?? [], $options ?? []); + + // Route priority detect + if (isset($options['priority'])) { + $options['priority'] = abs((int) $options['priority']); + + if ($options['priority'] > 0) { + $this->prioritizeDetected = true; + } + } + + // Hostname limiting? + if (! empty($options['hostname'])) { + // @todo determine if there's a way to whitelist hosts? + if (isset($_SERVER['HTTP_HOST']) && strtolower($_SERVER['HTTP_HOST']) !== strtolower($options['hostname'])) { + return; + } + + $overwrite = true; + } + + // Limiting to subdomains? + elseif (! empty($options['subdomain'])) { + // If we don't match the current subdomain, then + // we don't need to add the route. + if (! $this->checkSubdomains($options['subdomain'])) { + return; + } + + $overwrite = true; + } + + // Are we offsetting the binds? + // If so, take care of them here in one + // fell swoop. + if (isset($options['offset']) && is_string($to)) { + // Get a constant string to work with. + $to = preg_replace('/(\$\d+)/', '$X', $to); + + for ($i = (int) $options['offset'] + 1; $i < (int) $options['offset'] + 7; $i++) { + $to = preg_replace_callback( + '/\$X/', + static function ($m) use ($i) { + return '$' . $i; + }, + $to, + 1 + ); + } + } + + // Replace our regex pattern placeholders with the actual thing + // so that the Router doesn't need to know about any of this. + foreach ($this->placeholders as $tag => $pattern) { + $from = str_ireplace(':' . $tag, $pattern, $from); + } + + // If is redirect, No processing + if (! isset($options['redirect']) && is_string($to)) { + // If no namespace found, add the default namespace + if (strpos($to, '\\') === false || strpos($to, '\\') > 0) { + $namespace = $options['namespace'] ?? $this->defaultNamespace; + $to = trim($namespace, '\\') . '\\' . $to; + } + // Always ensure that we escape our namespace so we're not pointing to + // \CodeIgniter\Routes\Controller::method. + $to = '\\' . ltrim($to, '\\'); + } + + $name = $options['as'] ?? $from; + + // Don't overwrite any existing 'froms' so that auto-discovered routes + // do not overwrite any app/Config/Routes settings. The app + // routes should always be the "source of truth". + // this works only because discovered routes are added just prior + // to attempting to route the request. + if (isset($this->routes[$verb][$name]) && ! $overwrite) { + return; + } + + $this->routes[$verb][$name] = [ + 'route' => [$from => $to], + ]; + + $this->routesOptions[$verb][$from] = $options; + + // Is this a redirect? + if (isset($options['redirect']) && is_numeric($options['redirect'])) { + $this->routes['*'][$name]['redirect'] = $options['redirect']; + } + } + + /** + * Compares the subdomain(s) passed in against the current subdomain + * on this page request. + * + * @param mixed $subdomains + */ + private function checkSubdomains($subdomains): bool + { + // CLI calls can't be on subdomain. + if (! isset($_SERVER['HTTP_HOST'])) { + return false; + } + + if ($this->currentSubdomain === null) { + $this->currentSubdomain = $this->determineCurrentSubdomain(); + } + + if (! is_array($subdomains)) { + $subdomains = [$subdomains]; + } + + // Routes can be limited to any sub-domain. In that case, though, + // it does require a sub-domain to be present. + if (! empty($this->currentSubdomain) && in_array('*', $subdomains, true)) { + return true; + } + + return in_array($this->currentSubdomain, $subdomains, true); + } + + /** + * Examines the HTTP_HOST to get a best match for the subdomain. It + * won't be perfect, but should work for our needs. + * + * It's especially not perfect since it's possible to register a domain + * with a period (.) as part of the domain name. + * + * @return mixed + */ + private function determineCurrentSubdomain() + { + // We have to ensure that a scheme exists + // on the URL else parse_url will mis-interpret + // 'host' as the 'path'. + $url = $_SERVER['HTTP_HOST']; + if (strpos($url, 'http') !== 0) { + $url = 'http://' . $url; + } + + $parsedUrl = parse_url($url); + + $host = explode('.', $parsedUrl['host']); + + if ($host[0] === 'www') { + unset($host[0]); + } + + // Get rid of any domains, which will be the last + unset($host[count($host)]); + + // Account for .co.uk, .co.nz, etc. domains + if (end($host) === 'co') { + $host = array_slice($host, 0, -1); + } + + // If we only have 1 part left, then we don't have a sub-domain. + if (count($host) === 1) { + // Set it to false so we don't make it back here again. + return false; + } + + return array_shift($host); + } + + /** + * Reset the routes, so that a test case can provide the + * explicit ones needed for it. + */ + public function resetRoutes() + { + $this->routes = ['*' => []]; + + foreach ($this->defaultHTTPMethods as $verb) { + $this->routes[$verb] = []; + } + + $this->prioritizeDetected = false; + } + + /** + * Load routes options based on verb + */ + protected function loadRoutesOptions(?string $verb = null): array + { + $verb = $verb ?: $this->getHTTPVerb(); + + $options = $this->routesOptions[$verb] ?? []; + + if (isset($this->routesOptions['*'])) { + foreach ($this->routesOptions['*'] as $key => $val) { + if (isset($options[$key])) { + $extraOptions = array_diff_key($val, $options[$key]); + $options[$key] = array_merge($options[$key], $extraOptions); + } else { + $options[$key] = $val; + } + } + } + + return $options; + } + + /** + * Enable or Disable sorting routes by priority + * + * @param bool $enabled The value status + * + * @return $this + */ + public function setPrioritize(bool $enabled = true) + { + $this->prioritize = $enabled; + + return $this; + } +} diff --git a/system/Router/RouteCollectionInterface.php b/system/Router/RouteCollectionInterface.php new file mode 100644 index 0000000..a55b5d8 --- /dev/null +++ b/system/Router/RouteCollectionInterface.php @@ -0,0 +1,187 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Router; + +use Closure; + +/** + * Interface RouteCollectionInterface + * + * A Route Collection's sole job is to hold a series of routes. The required + * number of methods is kept very small on purpose, but implementors may + * add a number of additional methods to customize how the routes are defined. + * + * The RouteCollection provides the Router with the routes so that it can determine + * which controller should be ran. + */ +interface RouteCollectionInterface +{ + /** + * Adds a single route to the collection. + * + * @param array|Closure|string $to + * @param array $options + * + * @return mixed + */ + public function add(string $from, $to, ?array $options = null); + + /** + * Registers a new constraint with the system. Constraints are used + * by the routes as placeholders for regular expressions to make defining + * the routes more human-friendly. + * + * You can pass an associative array as $placeholder, and have + * multiple placeholders added at once. + * + * @param array|string $placeholder + * @param string $pattern + * + * @return mixed + */ + public function addPlaceholder($placeholder, ?string $pattern = null); + + /** + * Sets the default namespace to use for Controllers when no other + * namespace has been specified. + * + * @return mixed + */ + public function setDefaultNamespace(string $value); + + /** + * Sets the default controller to use when no other controller has been + * specified. + * + * @return mixed + */ + public function setDefaultController(string $value); + + /** + * Sets the default method to call on the controller when no other + * method has been set in the route. + * + * @return mixed + */ + public function setDefaultMethod(string $value); + + /** + * Tells the system whether to convert dashes in URI strings into + * underscores. In some search engines, including Google, dashes + * create more meaning and make it easier for the search engine to + * find words and meaning in the URI for better SEO. But it + * doesn't work well with PHP method names.... + * + * @return mixed + */ + public function setTranslateURIDashes(bool $value); + + /** + * If TRUE, the system will attempt to match the URI against + * Controllers by matching each segment against folders/files + * in APPPATH/Controllers, when a match wasn't found against + * defined routes. + * + * If FALSE, will stop searching and do NO automatic routing. + */ + public function setAutoRoute(bool $value): self; + + /** + * Sets the class/method that should be called if routing doesn't + * find a match. It can be either a closure or the controller/method + * name exactly like a route is defined: Users::index + * + * This setting is passed to the Router class and handled there. + * + * @param callable|null $callable + */ + public function set404Override($callable = null): self; + + /** + * Returns the 404 Override setting, which can be null, a closure + * or the controller/string. + * + * @return Closure|string|null + */ + public function get404Override(); + + /** + * Returns the name of the default controller. With Namespace. + * + * @return string + */ + public function getDefaultController(); + + /** + * Returns the name of the default method to use within the controller. + * + * @return string + */ + public function getDefaultMethod(); + + /** + * Returns the current value of the translateURIDashes setting. + * + * @return mixed + */ + public function shouldTranslateURIDashes(); + + /** + * Returns the flag that tells whether to autoRoute URI against Controllers. + * + * @return bool + */ + public function shouldAutoRoute(); + + /** + * Returns the raw array of available routes. + * + * @return mixed + */ + public function getRoutes(); + + /** + * Returns the current HTTP Verb being used. + * + * @return string + */ + public function getHTTPVerb(); + + /** + * Attempts to look up a route based on it's destination. + * + * If a route exists: + * + * 'path/(:any)/(:any)' => 'Controller::method/$1/$2' + * + * This method allows you to know the Controller and method + * and get the route that leads to it. + * + * // Equals 'path/$param1/$param2' + * reverseRoute('Controller::method', $param1, $param2); + * + * @param array ...$params + * + * @return false|string + */ + public function reverseRoute(string $search, ...$params); + + /** + * Determines if the route is a redirecting route. + */ + public function isRedirect(string $from): bool; + + /** + * Grabs the HTTP status code from a redirecting Route. + */ + public function getRedirectCode(string $from): int; +} diff --git a/system/Router/Router.php b/system/Router/Router.php new file mode 100644 index 0000000..5c4b3f0 --- /dev/null +++ b/system/Router/Router.php @@ -0,0 +1,686 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Router; + +use CodeIgniter\Exceptions\PageNotFoundException; +use CodeIgniter\HTTP\Request; +use CodeIgniter\Router\Exceptions\RedirectException; +use CodeIgniter\Router\Exceptions\RouterException; + +/** + * Request router. + */ +class Router implements RouterInterface +{ + /** + * A RouteCollection instance. + * + * @var RouteCollectionInterface + */ + protected $collection; + + /** + * Sub-directory that contains the requested controller class. + * Primarily used by 'autoRoute'. + * + * @var string|null + */ + protected $directory; + + /** + * The name of the controller class. + * + * @var string + */ + protected $controller; + + /** + * The name of the method to use. + * + * @var string + */ + protected $method; + + /** + * An array of binds that were collected + * so they can be sent to closure routes. + * + * @var array + */ + protected $params = []; + + /** + * The name of the front controller. + * + * @var string + */ + protected $indexPage = 'index.php'; + + /** + * Whether dashes in URI's should be converted + * to underscores when determining method names. + * + * @var bool + */ + protected $translateURIDashes = false; + + /** + * The route that was matched for this request. + * + * @var array|null + */ + protected $matchedRoute; + + /** + * The options set for the matched route. + * + * @var array|null + */ + protected $matchedRouteOptions; + + /** + * The locale that was detected in a route. + * + * @var string + */ + protected $detectedLocale; + + /** + * The filter info from Route Collection + * if the matched route should be filtered. + * + * @var string|null + * + * @deprecated Use $filtersInfo + */ + protected $filterInfo; + + /** + * The filter info from Route Collection + * if the matched route should be filtered. + * + * @var string[] + */ + protected $filtersInfo = []; + + /** + * Stores a reference to the RouteCollection object. + * + * @param Request $request + */ + public function __construct(RouteCollectionInterface $routes, ?Request $request = null) + { + $this->collection = $routes; + + $this->controller = $this->collection->getDefaultController(); + $this->method = $this->collection->getDefaultMethod(); + + $this->collection->setHTTPVerb($request->getMethod() ?? strtolower($_SERVER['REQUEST_METHOD'])); + } + + /** + * @throws PageNotFoundException + * @throws RedirectException + * + * @return mixed|string + */ + public function handle(?string $uri = null) + { + $this->translateURIDashes = $this->collection->shouldTranslateURIDashes(); + + // If we cannot find a URI to match against, then + // everything runs off of it's default settings. + if ($uri === null || $uri === '') { + return strpos($this->controller, '\\') === false + ? $this->collection->getDefaultNamespace() . $this->controller + : $this->controller; + } + + // Decode URL-encoded string + $uri = urldecode($uri); + + // Restart filterInfo + $this->filterInfo = null; + + if ($this->checkRoutes($uri)) { + if ($this->collection->isFiltered($this->matchedRoute[0])) { + $multipleFiltersEnabled = config('Feature')->multipleFilters ?? false; + if ($multipleFiltersEnabled) { + $this->filtersInfo = $this->collection->getFiltersForRoute($this->matchedRoute[0]); + } else { + // for backward compatibility + $this->filterInfo = $this->collection->getFilterForRoute($this->matchedRoute[0]); + } + } + + return $this->controller; + } + + // Still here? Then we can try to match the URI against + // Controllers/directories, but the application may not + // want this, like in the case of API's. + if (! $this->collection->shouldAutoRoute()) { + throw new PageNotFoundException("Can't find a route for '{$uri}'."); + } + + $this->autoRoute($uri); + + return $this->controllerName(); + } + + /** + * Returns the filter info for the matched route, if any. + * + * @return string + * + * @deprecated Use getFilters() + */ + public function getFilter() + { + return $this->filterInfo; + } + + /** + * Returns the filter info for the matched route, if any. + * + * @return string[] + */ + public function getFilters(): array + { + return $this->filtersInfo; + } + + /** + * Returns the name of the matched controller. + * + * @return mixed + */ + public function controllerName() + { + return $this->translateURIDashes + ? str_replace('-', '_', $this->controller) + : $this->controller; + } + + /** + * Returns the name of the method to run in the + * chosen container. + */ + public function methodName(): string + { + return $this->translateURIDashes + ? str_replace('-', '_', $this->method) + : $this->method; + } + + /** + * Returns the 404 Override settings from the Collection. + * If the override is a string, will split to controller/index array. + */ + public function get404Override() + { + $route = $this->collection->get404Override(); + + if (is_string($route)) { + $routeArray = explode('::', $route); + + return [ + $routeArray[0], // Controller + $routeArray[1] ?? 'index', // Method + ]; + } + + if (is_callable($route)) { + return $route; + } + + return null; + } + + /** + * Returns the binds that have been matched and collected + * during the parsing process as an array, ready to send to + * instance->method(...$params). + */ + public function params(): array + { + return $this->params; + } + + /** + * Returns the name of the sub-directory the controller is in, + * if any. Relative to APPPATH.'Controllers'. + * + * Only used when auto-routing is turned on. + */ + public function directory(): string + { + return ! empty($this->directory) ? $this->directory : ''; + } + + /** + * Returns the routing information that was matched for this + * request, if a route was defined. + * + * @return array|null + */ + public function getMatchedRoute() + { + return $this->matchedRoute; + } + + /** + * Returns all options set for the matched route + * + * @return array|null + */ + public function getMatchedRouteOptions() + { + return $this->matchedRouteOptions; + } + + /** + * Sets the value that should be used to match the index.php file. Defaults + * to index.php but this allows you to modify it in case your are using + * something like mod_rewrite to remove the page. This allows you to set + * it a blank. + * + * @param string $page + */ + public function setIndexPage($page): self + { + $this->indexPage = $page; + + return $this; + } + + /** + * Tells the system whether we should translate URI dashes or not + * in the URI from a dash to an underscore. + */ + public function setTranslateURIDashes(bool $val = false): self + { + $this->translateURIDashes = $val; + + return $this; + } + + /** + * Returns true/false based on whether the current route contained + * a {locale} placeholder. + * + * @return bool + */ + public function hasLocale() + { + return (bool) $this->detectedLocale; + } + + /** + * Returns the detected locale, if any, or null. + * + * @return string + */ + public function getLocale() + { + return $this->detectedLocale; + } + + /** + * Compares the uri string against the routes that the + * RouteCollection class defined for us, attempting to find a match. + * This method will modify $this->controller, etal as needed. + * + * @param string $uri The URI path to compare against the routes + * + * @throws RedirectException + * + * @return bool Whether the route was matched or not. + */ + protected function checkRoutes(string $uri): bool + { + $routes = $this->collection->getRoutes($this->collection->getHTTPVerb()); + + // Don't waste any time + if (empty($routes)) { + return false; + } + + $uri = $uri === '/' + ? $uri + : trim($uri, '/ '); + + // Loop through the route array looking for wildcards + foreach ($routes as $key => $val) { + // Reset localeSegment + $localeSegment = null; + + $key = $key === '/' + ? $key + : ltrim($key, '/ '); + + $matchedKey = $key; + + // Are we dealing with a locale? + if (strpos($key, '{locale}') !== false) { + $localeSegment = array_search('{locale}', preg_split('/[\/]*((^[a-zA-Z0-9])|\(([^()]*)\))*[\/]+/m', $key), true); + + // Replace it with a regex so it + // will actually match. + $key = str_replace('/', '\/', $key); + $key = str_replace('{locale}', '[^\/]+', $key); + } + + // Does the RegEx match? + if (preg_match('#^' . $key . '$#u', $uri, $matches)) { + // Is this route supposed to redirect to another? + if ($this->collection->isRedirect($key)) { + throw new RedirectException(is_array($val) ? key($val) : $val, $this->collection->getRedirectCode($key)); + } + // Store our locale so CodeIgniter object can + // assign it to the Request. + if (isset($localeSegment)) { + // The following may be inefficient, but doesn't upset NetBeans :-/ + $temp = (explode('/', $uri)); + $this->detectedLocale = $temp[$localeSegment]; + } + + // Are we using Closures? If so, then we need + // to collect the params into an array + // so it can be passed to the controller method later. + if (! is_string($val) && is_callable($val)) { + $this->controller = $val; + + // Remove the original string from the matches array + array_shift($matches); + + $this->params = $matches; + + $this->matchedRoute = [ + $matchedKey, + $val, + ]; + + $this->matchedRouteOptions = $this->collection->getRoutesOptions($matchedKey); + + return true; + } + // Are we using the default method for back-references? + + // Support resource route when function with subdirectory + // ex: $routes->resource('Admin/Admins'); + if (strpos($val, '$') !== false && strpos($key, '(') !== false && strpos($key, '/') !== false) { + $replacekey = str_replace('/(.*)', '', $key); + $val = preg_replace('#^' . $key . '$#u', $val, $uri); + $val = str_replace($replacekey, str_replace('/', '\\', $replacekey), $val); + } elseif (strpos($val, '$') !== false && strpos($key, '(') !== false) { + $val = preg_replace('#^' . $key . '$#u', $val, $uri); + } elseif (strpos($val, '/') !== false) { + [ + $controller, + $method, + ] = explode('::', $val); + + // Only replace slashes in the controller, not in the method. + $controller = str_replace('/', '\\', $controller); + + $val = $controller . '::' . $method; + } + + $this->setRequest(explode('/', $val)); + + $this->matchedRoute = [ + $matchedKey, + $val, + ]; + + $this->matchedRouteOptions = $this->collection->getRoutesOptions($matchedKey); + + return true; + } + } + + return false; + } + + /** + * Attempts to match a URI path against Controllers and directories + * found in APPPATH/Controllers, to find a matching route. + */ + public function autoRoute(string $uri) + { + $segments = explode('/', $uri); + + $segments = $this->scanControllers($segments); + + // If we don't have any segments left - try the default controller; + // WARNING: Directories get shifted out of the segments array. + if (empty($segments)) { + $this->setDefaultController(); + } + // If not empty, then the first segment should be the controller + else { + $this->controller = ucfirst(array_shift($segments)); + } + + $controllerName = $this->controllerName(); + if (! $this->isValidSegment($controllerName)) { + throw new PageNotFoundException($this->controller . ' is not a valid controller name'); + } + + // Use the method name if it exists. + // If it doesn't, no biggie - the default method name + // has already been set. + if (! empty($segments)) { + $this->method = array_shift($segments) ?: $this->method; + } + + if (! empty($segments)) { + $this->params = $segments; + } + + $defaultNamespace = $this->collection->getDefaultNamespace(); + if ($this->collection->getHTTPVerb() !== 'cli') { + $controller = '\\' . $defaultNamespace; + + $controller .= $this->directory ? str_replace('/', '\\', $this->directory) : ''; + $controller .= $controllerName; + + $controller = strtolower($controller); + $methodName = strtolower($this->methodName()); + + foreach ($this->collection->getRoutes('cli') as $route) { + if (is_string($route)) { + $route = strtolower($route); + if (strpos($route, $controller . '::' . $methodName) === 0) { + throw new PageNotFoundException(); + } + + if ($route === $controller) { + throw new PageNotFoundException(); + } + } + } + } + + // Load the file so that it's available for CodeIgniter. + $file = APPPATH . 'Controllers/' . $this->directory . $controllerName . '.php'; + if (is_file($file)) { + include_once $file; + } + + // Ensure the controller stores the fully-qualified class name + // We have to check for a length over 1, since by default it will be '\' + if (strpos($this->controller, '\\') === false && strlen($defaultNamespace) > 1) { + $this->controller = '\\' . ltrim(str_replace('/', '\\', $defaultNamespace . $this->directory . $controllerName), '\\'); + } + } + + /** + * Scans the controller directory, attempting to locate a controller matching the supplied uri $segments + * + * @param array $segments URI segments + * + * @return array returns an array of remaining uri segments that don't map onto a directory + * + * @deprecated this function name does not properly describe its behavior so it has been deprecated + * + * @codeCoverageIgnore + */ + protected function validateRequest(array $segments): array + { + return $this->scanControllers($segments); + } + + /** + * Scans the controller directory, attempting to locate a controller matching the supplied uri $segments + * + * @param array $segments URI segments + * + * @return array returns an array of remaining uri segments that don't map onto a directory + */ + protected function scanControllers(array $segments): array + { + $segments = array_filter($segments, static function ($segment) { + return $segment !== ''; + }); + // numerically reindex the array, removing gaps + $segments = array_values($segments); + + // if a prior directory value has been set, just return segments and get out of here + if (isset($this->directory)) { + return $segments; + } + + // Loop through our segments and return as soon as a controller + // is found or when such a directory doesn't exist + $c = count($segments); + + while ($c-- > 0) { + $segmentConvert = ucfirst($this->translateURIDashes === true ? str_replace('-', '_', $segments[0]) : $segments[0]); + // as soon as we encounter any segment that is not PSR-4 compliant, stop searching + if (! $this->isValidSegment($segmentConvert)) { + return $segments; + } + + $test = APPPATH . 'Controllers/' . $this->directory . $segmentConvert; + + // as long as each segment is *not* a controller file but does match a directory, add it to $this->directory + if (! is_file($test . '.php') && is_dir($test)) { + $this->setDirectory($segmentConvert, true, false); + array_shift($segments); + + continue; + } + + return $segments; + } + + // This means that all segments were actually directories + return $segments; + } + + /** + * Sets the sub-directory that the controller is in. + * + * @param bool $validate if true, checks to make sure $dir consists of only PSR4 compliant segments + */ + public function setDirectory(?string $dir = null, bool $append = false, bool $validate = true) + { + if (empty($dir)) { + $this->directory = null; + + return; + } + + if ($validate) { + $segments = explode('/', trim($dir, '/')); + + foreach ($segments as $segment) { + if (! $this->isValidSegment($segment)) { + return; + } + } + } + + if ($append !== true || empty($this->directory)) { + $this->directory = trim($dir, '/') . '/'; + } else { + $this->directory .= trim($dir, '/') . '/'; + } + } + + /** + * Returns true if the supplied $segment string represents a valid PSR-4 compliant namespace/directory segment + * + * regex comes from https://www.php.net/manual/en/language.variables.basics.php + */ + private function isValidSegment(string $segment): bool + { + return (bool) preg_match('/^[a-zA-Z_\x80-\xff][a-zA-Z0-9_\x80-\xff]*$/', $segment); + } + + /** + * Set request route + * + * Takes an array of URI segments as input and sets the class/method + * to be called. + * + * @param array $segments URI segments + */ + protected function setRequest(array $segments = []) + { + // If we don't have any segments - try the default controller; + if (empty($segments)) { + $this->setDefaultController(); + + return; + } + + [$controller, $method] = array_pad(explode('::', $segments[0]), 2, null); + + $this->controller = $controller; + + // $this->method already contains the default method name, + // so don't overwrite it with emptiness. + if (! empty($method)) { + $this->method = $method; + } + + array_shift($segments); + + $this->params = $segments; + } + + /** + * Sets the default controller based on the info set in the RouteCollection. + */ + protected function setDefaultController() + { + if (empty($this->controller)) { + throw RouterException::forMissingDefaultRoute(); + } + + // Is the method being specified? + if (sscanf($this->controller, '%[^/]/%s', $class, $this->method) !== 2) { + $this->method = 'index'; + } + + if (! is_file(APPPATH . 'Controllers/' . $this->directory . ucfirst($class) . '.php')) { + return; + } + + $this->controller = ucfirst($class); + + log_message('info', 'Used the default controller.'); + } +} diff --git a/system/Router/RouterInterface.php b/system/Router/RouterInterface.php new file mode 100644 index 0000000..e252b56 --- /dev/null +++ b/system/Router/RouterInterface.php @@ -0,0 +1,73 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Router; + +use CodeIgniter\HTTP\Request; + +/** + * Expected behavior of a Router. + */ +interface RouterInterface +{ + /** + * Stores a reference to the RouteCollection object. + * + * @param Request $request + */ + public function __construct(RouteCollectionInterface $routes, ?Request $request = null); + + /** + * Scans the URI and attempts to match the current URI to the + * one of the defined routes in the RouteCollection. + * + * @param string $uri + * + * @return mixed + */ + public function handle(?string $uri = null); + + /** + * Returns the name of the matched controller. + * + * @return mixed + */ + public function controllerName(); + + /** + * Returns the name of the method to run in the + * chosen container. + * + * @return mixed + */ + public function methodName(); + + /** + * Returns the binds that have been matched and collected + * during the parsing process as an array, ready to send to + * instance->method(...$params). + * + * @return mixed + */ + public function params(); + + /** + * Sets the value that should be used to match the index.php file. Defaults + * to index.php but this allows you to modify it in case your are using + * something like mod_rewrite to remove the page. This allows you to set + * it a blank. + * + * @param string $page + * + * @return mixed + */ + public function setIndexPage($page); +} diff --git a/system/Security/Exceptions/SecurityException.php b/system/Security/Exceptions/SecurityException.php new file mode 100644 index 0000000..ed118d9 --- /dev/null +++ b/system/Security/Exceptions/SecurityException.php @@ -0,0 +1,48 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Security\Exceptions; + +use CodeIgniter\Exceptions\FrameworkException; + +class SecurityException extends FrameworkException +{ + public static function forDisallowedAction() + { + return new static(lang('Security.disallowedAction'), 403); + } + + public static function forInvalidUTF8Chars(string $source, string $string) + { + return new static( + 'Invalid UTF-8 characters in ' . $source . ': ' . $string, + 400 + ); + } + + public static function forInvalidControlChars(string $source, string $string) + { + return new static( + 'Invalid Control characters in ' . $source . ': ' . $string, + 400 + ); + } + + /** + * @deprecated Use `CookieException::forInvalidSameSite()` instead. + * + * @codeCoverageIgnore + */ + public static function forInvalidSameSite(string $samesite) + { + return new static(lang('Security.invalidSameSite', [$samesite])); + } +} diff --git a/system/Security/Security.php b/system/Security/Security.php new file mode 100644 index 0000000..008e94a --- /dev/null +++ b/system/Security/Security.php @@ -0,0 +1,574 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Security; + +use CodeIgniter\Cookie\Cookie; +use CodeIgniter\HTTP\RequestInterface; +use CodeIgniter\HTTP\Response; +use CodeIgniter\Security\Exceptions\SecurityException; +use CodeIgniter\Session\Session; +use Config\App; +use Config\Cookie as CookieConfig; +use Config\Security as SecurityConfig; +use Config\Services; +use LogicException; + +/** + * Class Security + * + * Provides methods that help protect your site against + * Cross-Site Request Forgery attacks. + */ +class Security implements SecurityInterface +{ + public const CSRF_PROTECTION_COOKIE = 'cookie'; + public const CSRF_PROTECTION_SESSION = 'session'; + protected const CSRF_HASH_BYTES = 16; + + /** + * CSRF Protection Method + * + * Protection Method for Cross Site Request Forgery protection. + * + * @var string 'cookie' or 'session' + */ + protected $csrfProtection = self::CSRF_PROTECTION_COOKIE; + + /** + * CSRF Token Randomization + * + * @var bool + */ + protected $tokenRandomize = false; + + /** + * CSRF Hash + * + * Random hash for Cross Site Request Forgery protection. + * + * @var string|null + */ + protected $hash; + + /** + * CSRF Token Name + * + * Token name for Cross Site Request Forgery protection. + * + * @var string + */ + protected $tokenName = 'csrf_token_name'; + + /** + * CSRF Header Name + * + * Header name for Cross Site Request Forgery protection. + * + * @var string + */ + protected $headerName = 'X-CSRF-TOKEN'; + + /** + * The CSRF Cookie instance. + * + * @var Cookie + */ + protected $cookie; + + /** + * CSRF Cookie Name + * + * Cookie name for Cross Site Request Forgery protection. + * + * @var string + */ + protected $cookieName = 'csrf_cookie_name'; + + /** + * CSRF Expires + * + * Expiration time for Cross Site Request Forgery protection cookie. + * + * Defaults to two hours (in seconds). + * + * @var int + */ + protected $expires = 7200; + + /** + * CSRF Regenerate + * + * Regenerate CSRF Token on every request. + * + * @var bool + */ + protected $regenerate = true; + + /** + * CSRF Redirect + * + * Redirect to previous page with error on failure. + * + * @var bool + */ + protected $redirect = true; + + /** + * CSRF SameSite + * + * Setting for CSRF SameSite cookie token. + * + * Allowed values are: None - Lax - Strict - ''. + * + * Defaults to `Lax` as recommended in this link: + * + * @see https://portswigger.net/web-security/csrf/samesite-cookies + * + * @var string + * + * @deprecated + */ + protected $samesite = Cookie::SAMESITE_LAX; + + /** + * @var RequestInterface + */ + private $request; + + /** + * CSRF Cookie Name without Prefix + * + * @var string + */ + private $rawCookieName; + + /** + * Session instance. + * + * @var Session + */ + private $session; + + /** + * Constructor. + * + * Stores our configuration and fires off the init() method to setup + * initial state. + */ + public function __construct(App $config) + { + /** @var SecurityConfig|null $security */ + $security = config('Security'); + + // Store CSRF-related configurations + if ($security instanceof SecurityConfig) { + $this->csrfProtection = $security->csrfProtection ?? $this->csrfProtection; + $this->tokenName = $security->tokenName ?? $this->tokenName; + $this->headerName = $security->headerName ?? $this->headerName; + $this->regenerate = $security->regenerate ?? $this->regenerate; + $this->rawCookieName = $security->cookieName ?? $this->rawCookieName; + $this->expires = $security->expires ?? $this->expires; + $this->tokenRandomize = $security->tokenRandomize ?? $this->tokenRandomize; + } else { + // `Config/Security.php` is absence + $this->tokenName = $config->CSRFTokenName ?? $this->tokenName; + $this->headerName = $config->CSRFHeaderName ?? $this->headerName; + $this->regenerate = $config->CSRFRegenerate ?? $this->regenerate; + $this->rawCookieName = $config->CSRFCookieName ?? $this->rawCookieName; + $this->expires = $config->CSRFExpire ?? $this->expires; + } + + if ($this->isCSRFCookie()) { + $this->configureCookie($config); + } else { + // Session based CSRF protection + $this->configureSession(); + } + + $this->request = Services::request(); + + $this->generateHash(); + } + + private function isCSRFCookie(): bool + { + return $this->csrfProtection === self::CSRF_PROTECTION_COOKIE; + } + + private function configureSession(): void + { + $this->session = Services::session(); + } + + private function configureCookie(App $config): void + { + /** @var CookieConfig|null $cookie */ + $cookie = config('Cookie'); + + if ($cookie instanceof CookieConfig) { + $cookiePrefix = $cookie->prefix; + $this->cookieName = $cookiePrefix . $this->rawCookieName; + Cookie::setDefaults($cookie); + } else { + // `Config/Cookie.php` is absence + $cookiePrefix = $config->cookiePrefix; + $this->cookieName = $cookiePrefix . $this->rawCookieName; + } + } + + /** + * CSRF Verify + * + * @throws SecurityException + * + * @return $this|false + * + * @deprecated Use `CodeIgniter\Security\Security::verify()` instead of using this method. + * + * @codeCoverageIgnore + */ + public function CSRFVerify(RequestInterface $request) + { + return $this->verify($request); + } + + /** + * Returns the CSRF Hash. + * + * @deprecated Use `CodeIgniter\Security\Security::getHash()` instead of using this method. + * + * @codeCoverageIgnore + */ + public function getCSRFHash(): ?string + { + return $this->getHash(); + } + + /** + * Returns the CSRF Token Name. + * + * @deprecated Use `CodeIgniter\Security\Security::getTokenName()` instead of using this method. + * + * @codeCoverageIgnore + */ + public function getCSRFTokenName(): string + { + return $this->getTokenName(); + } + + /** + * CSRF Verify + * + * @throws SecurityException + * + * @return $this + */ + public function verify(RequestInterface $request) + { + // Protects POST, PUT, DELETE, PATCH + $method = strtoupper($request->getMethod()); + $methodsToProtect = ['POST', 'PUT', 'DELETE', 'PATCH']; + if (! in_array($method, $methodsToProtect, true)) { + return $this; + } + + $token = $this->tokenRandomize ? $this->derandomize($this->getPostedToken($request)) + : $this->getPostedToken($request); + + // Do the tokens match? + if (! isset($token, $this->hash) || ! hash_equals($this->hash, $token)) { + throw SecurityException::forDisallowedAction(); + } + + $json = json_decode($request->getBody() ?? ''); + + if (isset($_POST[$this->tokenName])) { + // We kill this since we're done and we don't want to pollute the POST array. + unset($_POST[$this->tokenName]); + $request->setGlobal('post', $_POST); + } elseif (isset($json->{$this->tokenName})) { + // We kill this since we're done and we don't want to pollute the JSON data. + unset($json->{$this->tokenName}); + $request->setBody(json_encode($json)); + } + + if ($this->regenerate) { + $this->hash = null; + if ($this->isCSRFCookie()) { + unset($_COOKIE[$this->cookieName]); + } else { + // Session based CSRF protection + $this->session->remove($this->tokenName); + } + } + + $this->generateHash(); + + log_message('info', 'CSRF token verified.'); + + return $this; + } + + private function getPostedToken(RequestInterface $request): ?string + { + // Does the token exist in POST, HEADER or optionally php:://input - json data. + if ($request->hasHeader($this->headerName) && ! empty($request->header($this->headerName)->getValue())) { + $tokenName = $request->header($this->headerName)->getValue(); + } else { + $body = (string) $request->getBody(); + $json = json_decode($body); + + if ($body !== '' && ! empty($json) && json_last_error() === JSON_ERROR_NONE) { + $tokenName = $json->{$this->tokenName} ?? null; + } else { + $tokenName = null; + } + } + + return $request->getPost($this->tokenName) ?? $tokenName; + } + + /** + * Returns the CSRF Hash. + */ + public function getHash(): ?string + { + return $this->tokenRandomize ? $this->randomize($this->hash) : $this->hash; + } + + /** + * Randomize hash to avoid BREACH attacks. + */ + protected function randomize(string $hash): string + { + $keyBinary = random_bytes(static::CSRF_HASH_BYTES); + $hashBinary = hex2bin($hash); + + if ($hashBinary === false) { + throw new LogicException('$hash is invalid: ' . $hash); + } + + return bin2hex(($hashBinary ^ $keyBinary) . $keyBinary); + } + + /** + * Derandomize the token. + */ + protected function derandomize(string $token): string + { + $key = substr($token, -static::CSRF_HASH_BYTES * 2); + $value = substr($token, 0, static::CSRF_HASH_BYTES * 2); + + return bin2hex(hex2bin($value) ^ hex2bin($key)); + } + + /** + * Returns the CSRF Token Name. + */ + public function getTokenName(): string + { + return $this->tokenName; + } + + /** + * Returns the CSRF Header Name. + */ + public function getHeaderName(): string + { + return $this->headerName; + } + + /** + * Returns the CSRF Cookie Name. + */ + public function getCookieName(): string + { + return $this->cookieName; + } + + /** + * Check if CSRF cookie is expired. + * + * @deprecated + * + * @codeCoverageIgnore + */ + public function isExpired(): bool + { + return $this->cookie->isExpired(); + } + + /** + * Check if request should be redirect on failure. + */ + public function shouldRedirect(): bool + { + return $this->redirect; + } + + /** + * Sanitize Filename + * + * Tries to sanitize filenames in order to prevent directory traversal attempts + * and other security threats, which is particularly useful for files that + * were supplied via user input. + * + * If it is acceptable for the user input to include relative paths, + * e.g. file/in/some/approved/folder.txt, you can set the second optional + * parameter, $relative_path to TRUE. + * + * @param string $str Input file name + * @param bool $relativePath Whether to preserve paths + */ + public function sanitizeFilename(string $str, bool $relativePath = false): string + { + // List of sanitize filename strings + $bad = [ + '../', + '', + '<', + '>', + "'", + '"', + '&', + '$', + '#', + '{', + '}', + '[', + ']', + '=', + ';', + '?', + '%20', + '%22', + '%3c', + '%253c', + '%3e', + '%0e', + '%28', + '%29', + '%2528', + '%26', + '%24', + '%3f', + '%3b', + '%3d', + ]; + + if (! $relativePath) { + $bad[] = './'; + $bad[] = '/'; + } + + $str = remove_invisible_characters($str, false); + + do { + $old = $str; + $str = str_replace($bad, '', $str); + } while ($old !== $str); + + return stripslashes($str); + } + + /** + * Generates the CSRF Hash. + */ + protected function generateHash(): string + { + if ($this->hash === null) { + // If the cookie exists we will use its value. + // We don't necessarily want to regenerate it with + // each page load since a page could contain embedded + // sub-pages causing this feature to fail + if ($this->isCSRFCookie()) { + if ($this->isHashInCookie()) { + return $this->hash = $_COOKIE[$this->cookieName]; + } + } elseif ($this->session->has($this->tokenName)) { + // Session based CSRF protection + return $this->hash = $this->session->get($this->tokenName); + } + + $this->hash = bin2hex(random_bytes(static::CSRF_HASH_BYTES)); + + if ($this->isCSRFCookie()) { + $this->saveHashInCookie(); + } else { + // Session based CSRF protection + $this->saveHashInSession(); + } + } + + return $this->hash; + } + + private function isHashInCookie(): bool + { + return isset($_COOKIE[$this->cookieName]) + && is_string($_COOKIE[$this->cookieName]) + && preg_match('#^[0-9a-f]{32}$#iS', $_COOKIE[$this->cookieName]) === 1; + } + + private function saveHashInCookie(): void + { + $this->cookie = new Cookie( + $this->rawCookieName, + $this->hash, + [ + 'expires' => $this->expires === 0 ? 0 : time() + $this->expires, + ] + ); + + /** @var Response $response */ + $response = Services::response(); + $response->setCookie($this->cookie); + } + + /** + * CSRF Send Cookie + * + * @return false|Security + * + * @deprecated Set cookies to Response object instead. + */ + protected function sendCookie(RequestInterface $request) + { + if ($this->cookie->isSecure() && ! $request->isSecure()) { + return false; + } + + $this->doSendCookie(); + log_message('info', 'CSRF cookie sent.'); + + return $this; + } + + /** + * Actual dispatching of cookies. + * Extracted for this to be unit tested. + * + * @codeCoverageIgnore + * + * @deprecated Set cookies to Response object instead. + */ + protected function doSendCookie(): void + { + cookies([$this->cookie], false)->dispatch(); + } + + private function saveHashInSession(): void + { + $this->session->set($this->tokenName, $this->hash); + } +} diff --git a/system/Security/SecurityInterface.php b/system/Security/SecurityInterface.php new file mode 100644 index 0000000..8dfefbc --- /dev/null +++ b/system/Security/SecurityInterface.php @@ -0,0 +1,78 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Security; + +use CodeIgniter\HTTP\RequestInterface; +use CodeIgniter\Security\Exceptions\SecurityException; + +/** + * Expected behavior of a Security. + */ +interface SecurityInterface +{ + /** + * CSRF Verify + * + * @throws SecurityException + * + * @return $this|false + */ + public function verify(RequestInterface $request); + + /** + * Returns the CSRF Hash. + */ + public function getHash(): ?string; + + /** + * Returns the CSRF Token Name. + */ + public function getTokenName(): string; + + /** + * Returns the CSRF Header Name. + */ + public function getHeaderName(): string; + + /** + * Returns the CSRF Cookie Name. + */ + public function getCookieName(): string; + + /** + * Check if CSRF cookie is expired. + * + * @deprecated + */ + public function isExpired(): bool; + + /** + * Check if request should be redirect on failure. + */ + public function shouldRedirect(): bool; + + /** + * Sanitize Filename + * + * Tries to sanitize filenames in order to prevent directory traversal attempts + * and other security threats, which is particularly useful for files that + * were supplied via user input. + * + * If it is acceptable for the user input to include relative paths, + * e.g. file/in/some/approved/folder.txt, you can set the second optional + * parameter, $relative_path to TRUE. + * + * @param string $str Input file name + * @param bool $relativePath Whether to preserve paths + */ + public function sanitizeFilename(string $str, bool $relativePath = false): string; +} diff --git a/system/Session/Exceptions/SessionException.php b/system/Session/Exceptions/SessionException.php new file mode 100644 index 0000000..af619c2 --- /dev/null +++ b/system/Session/Exceptions/SessionException.php @@ -0,0 +1,52 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Session\Exceptions; + +use CodeIgniter\Exceptions\FrameworkException; + +class SessionException extends FrameworkException +{ + public static function forMissingDatabaseTable() + { + return new static(lang('Session.missingDatabaseTable')); + } + + public static function forInvalidSavePath(?string $path = null) + { + return new static(lang('Session.invalidSavePath', [$path])); + } + + public static function forWriteProtectedSavePath(?string $path = null) + { + return new static(lang('Session.writeProtectedSavePath', [$path])); + } + + public static function forEmptySavepath() + { + return new static(lang('Session.emptySavePath')); + } + + public static function forInvalidSavePathFormat(string $path) + { + return new static(lang('Session.invalidSavePathFormat', [$path])); + } + + /** + * @deprecated + * + * @codeCoverageIgnore + */ + public static function forInvalidSameSiteSetting(string $samesite) + { + return new static(lang('Session.invalidSameSiteSetting', [$samesite])); + } +} diff --git a/system/Session/Handlers/ArrayHandler.php b/system/Session/Handlers/ArrayHandler.php new file mode 100644 index 0000000..31951a7 --- /dev/null +++ b/system/Session/Handlers/ArrayHandler.php @@ -0,0 +1,91 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Session\Handlers; + +use ReturnTypeWillChange; + +/** + * Session handler using static array for storage. + * Intended only for use during testing. + */ +class ArrayHandler extends BaseHandler +{ + protected static $cache = []; + + /** + * Re-initialize existing session, or creates a new one. + * + * @param string $path The path where to store/retrieve the session + * @param string $name The session name + */ + public function open($path, $name): bool + { + return true; + } + + /** + * Reads the session data from the session storage, and returns the results. + * + * @param string $id The session ID + * + * @return false|string Returns an encoded string of the read data. + * If nothing was read, it must return false. + */ + #[ReturnTypeWillChange] + public function read($id) + { + return ''; + } + + /** + * Writes the session data to the session storage. + * + * @param string $id The session ID + * @param string $data The encoded session data + */ + public function write($id, $data): bool + { + return true; + } + + /** + * Closes the current session. + */ + public function close(): bool + { + return true; + } + + /** + * Destroys a session + * + * @param string $id The session ID being destroyed + */ + public function destroy($id): bool + { + return true; + } + + /** + * Cleans up expired sessions. + * + * @param int $max_lifetime Sessions that have not updated + * for the last max_lifetime seconds will be removed. + * + * @return false|int Returns the number of deleted sessions on success, or false on failure. + */ + #[ReturnTypeWillChange] + public function gc($max_lifetime) + { + return 1; + } +} diff --git a/system/Session/Handlers/BaseHandler.php b/system/Session/Handlers/BaseHandler.php new file mode 100644 index 0000000..f6fa57b --- /dev/null +++ b/system/Session/Handlers/BaseHandler.php @@ -0,0 +1,166 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Session\Handlers; + +use Config\App as AppConfig; +use Psr\Log\LoggerAwareTrait; +use SessionHandlerInterface; + +/** + * Base class for session handling + */ +abstract class BaseHandler implements SessionHandlerInterface +{ + use LoggerAwareTrait; + + /** + * The Data fingerprint. + * + * @var string + */ + protected $fingerprint; + + /** + * Lock placeholder. + * + * @var mixed + */ + protected $lock = false; + + /** + * Cookie prefix + * + * @var string + */ + protected $cookiePrefix = ''; + + /** + * Cookie domain + * + * @var string + */ + protected $cookieDomain = ''; + + /** + * Cookie path + * + * @var string + */ + protected $cookiePath = '/'; + + /** + * Cookie secure? + * + * @var bool + */ + protected $cookieSecure = false; + + /** + * Cookie name to use + * + * @var string + */ + protected $cookieName; + + /** + * Match IP addresses for cookies? + * + * @var bool + */ + protected $matchIP = false; + + /** + * Current session ID + * + * @var string + */ + protected $sessionID; + + /** + * The 'save path' for the session + * varies between + * + * @var array|string + */ + protected $savePath; + + /** + * User's IP address. + * + * @var string + */ + protected $ipAddress; + + public function __construct(AppConfig $config, string $ipAddress) + { + $this->cookiePrefix = $config->cookiePrefix; + $this->cookieDomain = $config->cookieDomain; + $this->cookiePath = $config->cookiePath; + $this->cookieSecure = $config->cookieSecure; + $this->cookieName = $config->sessionCookieName; + $this->matchIP = $config->sessionMatchIP; + $this->savePath = $config->sessionSavePath; + $this->ipAddress = $ipAddress; + } + + /** + * Internal method to force removal of a cookie by the client + * when session_destroy() is called. + */ + protected function destroyCookie(): bool + { + return setcookie( + $this->cookieName, + '', + ['expires' => 1, 'path' => $this->cookiePath, 'domain' => $this->cookieDomain, 'secure' => $this->cookieSecure, 'httponly' => true] + ); + } + + /** + * A dummy method allowing drivers with no locking functionality + * (databases other than PostgreSQL and MySQL) to act as if they + * do acquire a lock. + */ + protected function lockSession(string $sessionID): bool + { + $this->lock = true; + + return true; + } + + /** + * Releases the lock, if any. + */ + protected function releaseLock(): bool + { + $this->lock = false; + + return true; + } + + /** + * Drivers other than the 'files' one don't (need to) use the + * session.save_path INI setting, but that leads to confusing + * error messages emitted by PHP when open() or write() fail, + * as the message contains session.save_path ... + * + * To work around the problem, the drivers will call this method + * so that the INI is set just in time for the error message to + * be properly generated. + */ + protected function fail(): bool + { + ini_set('session.save_path', $this->savePath); + + return false; + } +} diff --git a/system/Session/Handlers/DatabaseHandler.php b/system/Session/Handlers/DatabaseHandler.php new file mode 100644 index 0000000..dfaa472 --- /dev/null +++ b/system/Session/Handlers/DatabaseHandler.php @@ -0,0 +1,324 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Session\Handlers; + +use CodeIgniter\Database\BaseConnection; +use CodeIgniter\Session\Exceptions\SessionException; +use Config\App as AppConfig; +use Config\Database; +use ReturnTypeWillChange; + +/** + * Session handler using current Database for storage + */ +class DatabaseHandler extends BaseHandler +{ + /** + * The database group to use for storage. + * + * @var string + */ + protected $DBGroup; + + /** + * The name of the table to store session info. + * + * @var string + */ + protected $table; + + /** + * The DB Connection instance. + * + * @var BaseConnection + */ + protected $db; + + /** + * The database type, for locking purposes. + * + * @var string + */ + protected $platform; + + /** + * Row exists flag + * + * @var bool + */ + protected $rowExists = false; + + /** + * @throws SessionException + */ + public function __construct(AppConfig $config, string $ipAddress) + { + parent::__construct($config, $ipAddress); + $this->table = $config->sessionSavePath; + + if (empty($this->table)) { + throw SessionException::forMissingDatabaseTable(); + } + + $this->DBGroup = $config->sessionDBGroup ?? config(Database::class)->defaultGroup; + + $this->db = Database::connect($this->DBGroup); + + $driver = strtolower(get_class($this->db)); + + if (strpos($driver, 'mysql') !== false) { + $this->platform = 'mysql'; + } elseif (strpos($driver, 'postgre') !== false) { + $this->platform = 'postgre'; + } + } + + /** + * Re-initialize existing session, or creates a new one. + * + * @param string $path The path where to store/retrieve the session + * @param string $name The session name + */ + public function open($path, $name): bool + { + if (empty($this->db->connID)) { + $this->db->initialize(); + } + + return true; + } + + /** + * Reads the session data from the session storage, and returns the results. + * + * @param string $id The session ID + * + * @return false|string Returns an encoded string of the read data. + * If nothing was read, it must return false. + */ + #[ReturnTypeWillChange] + public function read($id) + { + if ($this->lockSession($id) === false) { + $this->fingerprint = md5(''); + + return ''; + } + + if (! isset($this->sessionID)) { + $this->sessionID = $id; + } + + $builder = $this->db->table($this->table) + ->select($this->platform === 'postgre' ? "encode(data, 'base64') AS data" : 'data') + ->where('id', $id); + + if ($this->matchIP) { + $builder = $builder->where('ip_address', $this->ipAddress); + } + + $result = $builder->get()->getRow(); + + if ($result === null) { + // PHP7 will reuse the same SessionHandler object after + // ID regeneration, so we need to explicitly set this to + // FALSE instead of relying on the default ... + $this->rowExists = false; + $this->fingerprint = md5(''); + + return ''; + } + + if (is_bool($result)) { + $result = ''; + } else { + $result = ($this->platform === 'postgre') ? base64_decode(rtrim($result->data), true) : $result->data; + } + + $this->fingerprint = md5($result); + $this->rowExists = true; + + return $result; + } + + /** + * Writes the session data to the session storage. + * + * @param string $id The session ID + * @param string $data The encoded session data + */ + public function write($id, $data): bool + { + if ($this->lock === false) { + return $this->fail(); + } + + if ($this->sessionID !== $id) { + $this->rowExists = false; + $this->sessionID = $id; + } + + if ($this->rowExists === false) { + $insertData = [ + 'id' => $id, + 'ip_address' => $this->ipAddress, + 'data' => $this->platform === 'postgre' ? '\x' . bin2hex($data) : $data, + ]; + + if (! $this->db->table($this->table)->set('timestamp', 'now()', false)->insert($insertData)) { + return $this->fail(); + } + + $this->fingerprint = md5($data); + $this->rowExists = true; + + return true; + } + + $builder = $this->db->table($this->table)->where('id', $id); + + if ($this->matchIP) { + $builder = $builder->where('ip_address', $this->ipAddress); + } + + $updateData = []; + + if ($this->fingerprint !== md5($data)) { + $updateData['data'] = ($this->platform === 'postgre') ? '\x' . bin2hex($data) : $data; + } + + if (! $builder->set('timestamp', 'now()', false)->update($updateData)) { + return $this->fail(); + } + + $this->fingerprint = md5($data); + + return true; + } + + /** + * Closes the current session. + */ + public function close(): bool + { + return ($this->lock && ! $this->releaseLock()) ? $this->fail() : true; + } + + /** + * Destroys a session + * + * @param string $id The session ID being destroyed + */ + public function destroy($id): bool + { + if ($this->lock) { + $builder = $this->db->table($this->table)->where('id', $id); + + if ($this->matchIP) { + $builder = $builder->where('ip_address', $this->ipAddress); + } + + if (! $builder->delete()) { + return $this->fail(); + } + } + + if ($this->close()) { + $this->destroyCookie(); + + return true; + } + + return $this->fail(); + } + + /** + * Cleans up expired sessions. + * + * @param int $max_lifetime Sessions that have not updated + * for the last max_lifetime seconds will be removed. + * + * @return false|int Returns the number of deleted sessions on success, or false on failure. + */ + #[ReturnTypeWillChange] + public function gc($max_lifetime) + { + $separator = $this->platform === 'postgre' ? '\'' : ' '; + $interval = implode($separator, ['', "{$max_lifetime} second", '']); + + return $this->db->table($this->table)->where('timestamp <', "now() - INTERVAL {$interval}", false)->delete() ? 1 : $this->fail(); + } + + /** + * Lock the session. + */ + protected function lockSession(string $sessionID): bool + { + if ($this->platform === 'mysql') { + $arg = md5($sessionID . ($this->matchIP ? '_' . $this->ipAddress : '')); + if ($this->db->query("SELECT GET_LOCK('{$arg}', 300) AS ci_session_lock")->getRow()->ci_session_lock) { + $this->lock = $arg; + + return true; + } + + return $this->fail(); + } + + if ($this->platform === 'postgre') { + $arg = "hashtext('{$sessionID}')" . ($this->matchIP ? ", hashtext('{$this->ipAddress}')" : ''); + if ($this->db->simpleQuery("SELECT pg_advisory_lock({$arg})")) { + $this->lock = $arg; + + return true; + } + + return $this->fail(); + } + + // Unsupported DB? Let the parent handle the simplified version. + return parent::lockSession($sessionID); + } + + /** + * Releases the lock, if any. + */ + protected function releaseLock(): bool + { + if (! $this->lock) { + return true; + } + + if ($this->platform === 'mysql') { + if ($this->db->query("SELECT RELEASE_LOCK('{$this->lock}') AS ci_session_lock")->getRow()->ci_session_lock) { + $this->lock = false; + + return true; + } + + return $this->fail(); + } + + if ($this->platform === 'postgre') { + if ($this->db->simpleQuery("SELECT pg_advisory_unlock({$this->lock})")) { + $this->lock = false; + + return true; + } + + return $this->fail(); + } + + // Unsupported DB? Let the parent handle the simple version. + return parent::releaseLock(); + } +} diff --git a/system/Session/Handlers/FileHandler.php b/system/Session/Handlers/FileHandler.php new file mode 100644 index 0000000..9a6d2de --- /dev/null +++ b/system/Session/Handlers/FileHandler.php @@ -0,0 +1,339 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Session\Handlers; + +use CodeIgniter\Session\Exceptions\SessionException; +use Config\App as AppConfig; +use ReturnTypeWillChange; + +/** + * Session handler using file system for storage + */ +class FileHandler extends BaseHandler +{ + /** + * Where to save the session files to. + * + * @var string + */ + protected $savePath; + + /** + * The file handle + * + * @var resource|null + */ + protected $fileHandle; + + /** + * File Name + * + * @var string + */ + protected $filePath; + + /** + * Whether this is a new file. + * + * @var bool + */ + protected $fileNew; + + /** + * Whether IP addresses should be matched. + * + * @var bool + */ + protected $matchIP = false; + + /** + * Regex of session ID + * + * @var string + */ + protected $sessionIDRegex = ''; + + public function __construct(AppConfig $config, string $ipAddress) + { + parent::__construct($config, $ipAddress); + + if (! empty($config->sessionSavePath)) { + $this->savePath = rtrim($config->sessionSavePath, '/\\'); + ini_set('session.save_path', $config->sessionSavePath); + } else { + $sessionPath = rtrim(ini_get('session.save_path'), '/\\'); + + if (! $sessionPath) { + $sessionPath = WRITEPATH . 'session'; + } + + $this->savePath = $sessionPath; + } + + $this->matchIP = $config->sessionMatchIP; + + $this->configureSessionIDRegex(); + } + + /** + * Re-initialize existing session, or creates a new one. + * + * @param string $path The path where to store/retrieve the session + * @param string $name The session name + * + * @throws SessionException + */ + public function open($path, $name): bool + { + if (! is_dir($path) && ! mkdir($path, 0700, true)) { + throw SessionException::forInvalidSavePath($this->savePath); + } + + if (! is_writable($path)) { + throw SessionException::forWriteProtectedSavePath($this->savePath); + } + + $this->savePath = $path; + + // we'll use the session name as prefix to avoid collisions + $this->filePath = $this->savePath . '/' . $name . ($this->matchIP ? md5($this->ipAddress) : ''); + + return true; + } + + /** + * Reads the session data from the session storage, and returns the results. + * + * @param string $id The session ID + * + * @return false|string Returns an encoded string of the read data. + * If nothing was read, it must return false. + */ + #[ReturnTypeWillChange] + public function read($id) + { + // This might seem weird, but PHP 5.6 introduced session_reset(), + // which re-reads session data + if ($this->fileHandle === null) { + $this->fileNew = ! is_file($this->filePath . $id); + + if (($this->fileHandle = fopen($this->filePath . $id, 'c+b')) === false) { + $this->logger->error("Session: Unable to open file '" . $this->filePath . $id . "'."); + + return false; + } + + if (flock($this->fileHandle, LOCK_EX) === false) { + $this->logger->error("Session: Unable to obtain lock for file '" . $this->filePath . $id . "'."); + fclose($this->fileHandle); + $this->fileHandle = null; + + return false; + } + + if (! isset($this->sessionID)) { + $this->sessionID = $id; + } + + if ($this->fileNew) { + chmod($this->filePath . $id, 0600); + $this->fingerprint = md5(''); + + return ''; + } + } else { + rewind($this->fileHandle); + } + + $data = ''; + $buffer = 0; + clearstatcache(); // Address https://github.com/codeigniter4/CodeIgniter4/issues/2056 + + for ($read = 0, $length = filesize($this->filePath . $id); $read < $length; $read += strlen($buffer)) { + if (($buffer = fread($this->fileHandle, $length - $read)) === false) { + break; + } + + $data .= $buffer; + } + + $this->fingerprint = md5($data); + + return $data; + } + + /** + * Writes the session data to the session storage. + * + * @param string $id The session ID + * @param string $data The encoded session data + */ + public function write($id, $data): bool + { + // If the two IDs don't match, we have a session_regenerate_id() call + if ($id !== $this->sessionID) { + $this->sessionID = $id; + } + + if (! is_resource($this->fileHandle)) { + return false; + } + + if ($this->fingerprint === md5($data)) { + return ($this->fileNew) ? true : touch($this->filePath . $id); + } + + if (! $this->fileNew) { + ftruncate($this->fileHandle, 0); + rewind($this->fileHandle); + } + + if (($length = strlen($data)) > 0) { + $result = null; + + for ($written = 0; $written < $length; $written += $result) { + if (($result = fwrite($this->fileHandle, substr($data, $written))) === false) { + break; + } + } + + if (! is_int($result)) { + $this->fingerprint = md5(substr($data, 0, $written)); + $this->logger->error('Session: Unable to write data.'); + + return false; + } + } + + $this->fingerprint = md5($data); + + return true; + } + + /** + * Closes the current session. + */ + public function close(): bool + { + if (is_resource($this->fileHandle)) { + flock($this->fileHandle, LOCK_UN); + fclose($this->fileHandle); + + $this->fileHandle = null; + $this->fileNew = false; + } + + return true; + } + + /** + * Destroys a session + * + * @param string $id The session ID being destroyed + */ + public function destroy($id): bool + { + if ($this->close()) { + return is_file($this->filePath . $id) + ? (unlink($this->filePath . $id) && $this->destroyCookie()) + : true; + } + + if ($this->filePath !== null) { + clearstatcache(); + + return is_file($this->filePath . $id) + ? (unlink($this->filePath . $id) && $this->destroyCookie()) + : true; + } + + return false; + } + + /** + * Cleans up expired sessions. + * + * @param int $max_lifetime Sessions that have not updated + * for the last max_lifetime seconds will be removed. + * + * @return false|int Returns the number of deleted sessions on success, or false on failure. + */ + #[ReturnTypeWillChange] + public function gc($max_lifetime) + { + if (! is_dir($this->savePath) || ($directory = opendir($this->savePath)) === false) { + $this->logger->debug("Session: Garbage collector couldn't list files under directory '" . $this->savePath . "'."); + + return false; + } + + $ts = time() - $max_lifetime; + + $pattern = $this->matchIP === true ? '[0-9a-f]{32}' : ''; + + $pattern = sprintf( + '#\A%s' . $pattern . $this->sessionIDRegex . '\z#', + preg_quote($this->cookieName, '#') + ); + + $collected = 0; + + while (($file = readdir($directory)) !== false) { + // If the filename doesn't match this pattern, it's either not a session file or is not ours + if (! preg_match($pattern, $file) + || ! is_file($this->savePath . DIRECTORY_SEPARATOR . $file) + || ($mtime = filemtime($this->savePath . DIRECTORY_SEPARATOR . $file)) === false + || $mtime > $ts + ) { + continue; + } + + unlink($this->savePath . DIRECTORY_SEPARATOR . $file); + $collected++; + } + + closedir($directory); + + return $collected; + } + + /** + * Configure Session ID regular expression + */ + protected function configureSessionIDRegex() + { + $bitsPerCharacter = (int) ini_get('session.sid_bits_per_character'); + $SIDLength = (int) ini_get('session.sid_length'); + + if (($bits = $SIDLength * $bitsPerCharacter) < 160) { + // Add as many more characters as necessary to reach at least 160 bits + $SIDLength += (int) ceil((160 % $bits) / $bitsPerCharacter); + ini_set('session.sid_length', (string) $SIDLength); + } + + switch ($bitsPerCharacter) { + case 4: + $this->sessionIDRegex = '[0-9a-f]'; + break; + + case 5: + $this->sessionIDRegex = '[0-9a-v]'; + break; + + case 6: + $this->sessionIDRegex = '[0-9a-zA-Z,-]'; + break; + } + + $this->sessionIDRegex .= '{' . $SIDLength . '}'; + } +} diff --git a/system/Session/Handlers/MemcachedHandler.php b/system/Session/Handlers/MemcachedHandler.php new file mode 100644 index 0000000..5e963bf --- /dev/null +++ b/system/Session/Handlers/MemcachedHandler.php @@ -0,0 +1,303 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Session\Handlers; + +use CodeIgniter\Session\Exceptions\SessionException; +use Config\App as AppConfig; +use Memcached; +use ReturnTypeWillChange; + +/** + * Session handler using Memcache for persistence + */ +class MemcachedHandler extends BaseHandler +{ + /** + * Memcached instance + * + * @var Memcached|null + */ + protected $memcached; + + /** + * Key prefix + * + * @var string + */ + protected $keyPrefix = 'ci_session:'; + + /** + * Lock key + * + * @var string|null + */ + protected $lockKey; + + /** + * Number of seconds until the session ends. + * + * @var int + */ + protected $sessionExpiration = 7200; + + /** + * @throws SessionException + */ + public function __construct(AppConfig $config, string $ipAddress) + { + parent::__construct($config, $ipAddress); + + if (empty($this->savePath)) { + throw SessionException::forEmptySavepath(); + } + + if ($this->matchIP === true) { + $this->keyPrefix .= $this->ipAddress . ':'; + } + + if (! empty($this->keyPrefix)) { + ini_set('memcached.sess_prefix', $this->keyPrefix); + } + + $this->sessionExpiration = $config->sessionExpiration; + } + + /** + * Re-initialize existing session, or creates a new one. + * + * @param string $path The path where to store/retrieve the session + * @param string $name The session name + */ + public function open($path, $name): bool + { + $this->memcached = new Memcached(); + $this->memcached->setOption(Memcached::OPT_BINARY_PROTOCOL, true); // required for touch() usage + + $serverList = []; + + foreach ($this->memcached->getServerList() as $server) { + $serverList[] = $server['host'] . ':' . $server['port']; + } + + if (! preg_match_all('#,?([^,:]+)\:(\d{1,5})(?:\:(\d+))?#', $this->savePath, $matches, PREG_SET_ORDER)) { + $this->memcached = null; + $this->logger->error('Session: Invalid Memcached save path format: ' . $this->savePath); + + return false; + } + + foreach ($matches as $match) { + // If Memcached already has this server (or if the port is invalid), skip it + if (in_array($match[1] . ':' . $match[2], $serverList, true)) { + $this->logger->debug('Session: Memcached server pool already has ' . $match[1] . ':' . $match[2]); + + continue; + } + + if (! $this->memcached->addServer($match[1], $match[2], $match[3] ?? 0)) { + $this->logger->error('Could not add ' . $match[1] . ':' . $match[2] . ' to Memcached server pool.'); + } else { + $serverList[] = $match[1] . ':' . $match[2]; + } + } + + if (empty($serverList)) { + $this->logger->error('Session: Memcached server pool is empty.'); + + return false; + } + + return true; + } + + /** + * Reads the session data from the session storage, and returns the results. + * + * @param string $id The session ID + * + * @return false|string Returns an encoded string of the read data. + * If nothing was read, it must return false. + */ + #[ReturnTypeWillChange] + public function read($id) + { + if (isset($this->memcached) && $this->lockSession($id)) { + if (! isset($this->sessionID)) { + $this->sessionID = $id; + } + + $data = (string) $this->memcached->get($this->keyPrefix . $id); + + $this->fingerprint = md5($data); + + return $data; + } + + return ''; + } + + /** + * Writes the session data to the session storage. + * + * @param string $id The session ID + * @param string $data The encoded session data + */ + public function write($id, $data): bool + { + if (! isset($this->memcached)) { + return false; + } + + if ($this->sessionID !== $id) { + if (! $this->releaseLock() || ! $this->lockSession($id)) { + return false; + } + + $this->fingerprint = md5(''); + $this->sessionID = $id; + } + + if (isset($this->lockKey)) { + $this->memcached->replace($this->lockKey, time(), 300); + + if ($this->fingerprint !== ($fingerprint = md5($data))) { + if ($this->memcached->set($this->keyPrefix . $id, $data, $this->sessionExpiration)) { + $this->fingerprint = $fingerprint; + + return true; + } + + return false; + } + + return $this->memcached->touch($this->keyPrefix . $id, $this->sessionExpiration); + } + + return false; + } + + /** + * Closes the current session. + */ + public function close(): bool + { + if (isset($this->memcached)) { + if (isset($this->lockKey)) { + $this->memcached->delete($this->lockKey); + } + + if (! $this->memcached->quit()) { + return false; + } + + $this->memcached = null; + + return true; + } + + return false; + } + + /** + * Destroys a session + * + * @param string $id The session ID being destroyed + */ + public function destroy($id): bool + { + if (isset($this->memcached, $this->lockKey)) { + $this->memcached->delete($this->keyPrefix . $id); + + return $this->destroyCookie(); + } + + return false; + } + + /** + * Cleans up expired sessions. + * + * @param int $max_lifetime Sessions that have not updated + * for the last max_lifetime seconds will be removed. + * + * @return false|int Returns the number of deleted sessions on success, or false on failure. + */ + #[ReturnTypeWillChange] + public function gc($max_lifetime) + { + return 1; + } + + /** + * Acquires an emulated lock. + * + * @param string $sessionID Session ID + */ + protected function lockSession(string $sessionID): bool + { + if (isset($this->lockKey)) { + return $this->memcached->replace($this->lockKey, time(), 300); + } + + $lockKey = $this->keyPrefix . $sessionID . ':lock'; + $attempt = 0; + + do { + if ($this->memcached->get($lockKey)) { + sleep(1); + + continue; + } + + if (! $this->memcached->set($lockKey, time(), 300)) { + $this->logger->error('Session: Error while trying to obtain lock for ' . $this->keyPrefix . $sessionID); + + return false; + } + + $this->lockKey = $lockKey; + break; + } while (++$attempt < 30); + + if ($attempt === 30) { + $this->logger->error('Session: Unable to obtain lock for ' . $this->keyPrefix . $sessionID . ' after 30 attempts, aborting.'); + + return false; + } + + $this->lock = true; + + return true; + } + + /** + * Releases a previously acquired lock + */ + protected function releaseLock(): bool + { + if (isset($this->memcached, $this->lockKey) && $this->lock) { + if ( + ! $this->memcached->delete($this->lockKey) + && $this->memcached->getResultCode() !== Memcached::RES_NOTFOUND + ) { + $this->logger->error('Session: Error while trying to free lock for ' . $this->lockKey); + + return false; + } + + $this->lockKey = null; + $this->lock = false; + } + + return true; + } +} diff --git a/system/Session/Handlers/RedisHandler.php b/system/Session/Handlers/RedisHandler.php new file mode 100644 index 0000000..93a601e --- /dev/null +++ b/system/Session/Handlers/RedisHandler.php @@ -0,0 +1,329 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Session\Handlers; + +use CodeIgniter\Session\Exceptions\SessionException; +use Config\App as AppConfig; +use Redis; +use RedisException; +use ReturnTypeWillChange; + +/** + * Session handler using Redis for persistence + */ +class RedisHandler extends BaseHandler +{ + /** + * phpRedis instance + * + * @var Redis|null + */ + protected $redis; + + /** + * Key prefix + * + * @var string + */ + protected $keyPrefix = 'ci_session:'; + + /** + * Lock key + * + * @var string|null + */ + protected $lockKey; + + /** + * Key exists flag + * + * @var bool + */ + protected $keyExists = false; + + /** + * Number of seconds until the session ends. + * + * @var int + */ + protected $sessionExpiration = 7200; + + /** + * @throws SessionException + */ + public function __construct(AppConfig $config, string $ipAddress) + { + parent::__construct($config, $ipAddress); + + if (empty($this->savePath)) { + throw SessionException::forEmptySavepath(); + } + + if (preg_match('#(?:tcp://)?([^:?]+)(?:\:(\d+))?(\?.+)?#', $this->savePath, $matches)) { + if (! isset($matches[3])) { + $matches[3] = ''; // Just to avoid undefined index notices below + } + + $this->savePath = [ + 'host' => $matches[1], + 'port' => empty($matches[2]) ? null : $matches[2], + 'password' => preg_match('#auth=([^\s&]+)#', $matches[3], $match) ? $match[1] : null, + 'database' => preg_match('#database=(\d+)#', $matches[3], $match) ? (int) $match[1] : null, + 'timeout' => preg_match('#timeout=(\d+\.\d+)#', $matches[3], $match) ? (float) $match[1] : null, + ]; + + preg_match('#prefix=([^\s&]+)#', $matches[3], $match) && $this->keyPrefix = $match[1]; + } else { + throw SessionException::forInvalidSavePathFormat($this->savePath); + } + + if ($this->matchIP === true) { + $this->keyPrefix .= $this->ipAddress . ':'; + } + + $this->sessionExpiration = empty($config->sessionExpiration) + ? (int) ini_get('session.gc_maxlifetime') + : (int) $config->sessionExpiration; + } + + /** + * Re-initialize existing session, or creates a new one. + * + * @param string $path The path where to store/retrieve the session + * @param string $name The session name + */ + public function open($path, $name): bool + { + if (empty($this->savePath)) { + return false; + } + + $redis = new Redis(); + + if (! $redis->connect($this->savePath['host'], $this->savePath['port'], $this->savePath['timeout'])) { + $this->logger->error('Session: Unable to connect to Redis with the configured settings.'); + } elseif (isset($this->savePath['password']) && ! $redis->auth($this->savePath['password'])) { + $this->logger->error('Session: Unable to authenticate to Redis instance.'); + } elseif (isset($this->savePath['database']) && ! $redis->select($this->savePath['database'])) { + $this->logger->error('Session: Unable to select Redis database with index ' . $this->savePath['database']); + } else { + $this->redis = $redis; + + return true; + } + + return false; + } + + /** + * Reads the session data from the session storage, and returns the results. + * + * @param string $id The session ID + * + * @return false|string Returns an encoded string of the read data. + * If nothing was read, it must return false. + */ + #[ReturnTypeWillChange] + public function read($id) + { + if (isset($this->redis) && $this->lockSession($id)) { + if (! isset($this->sessionID)) { + $this->sessionID = $id; + } + + $data = $this->redis->get($this->keyPrefix . $id); + + if (is_string($data)) { + $this->keyExists = true; + } else { + $data = ''; + } + + $this->fingerprint = md5($data); + + return $data; + } + + return ''; + } + + /** + * Writes the session data to the session storage. + * + * @param string $id The session ID + * @param string $data The encoded session data + */ + public function write($id, $data): bool + { + if (! isset($this->redis)) { + return false; + } + + if ($this->sessionID !== $id) { + if (! $this->releaseLock() || ! $this->lockSession($id)) { + return false; + } + + $this->keyExists = false; + $this->sessionID = $id; + } + + if (isset($this->lockKey)) { + $this->redis->expire($this->lockKey, 300); + + if ($this->fingerprint !== ($fingerprint = md5($data)) || $this->keyExists === false) { + if ($this->redis->set($this->keyPrefix . $id, $data, $this->sessionExpiration)) { + $this->fingerprint = $fingerprint; + $this->keyExists = true; + + return true; + } + + return false; + } + + return $this->redis->expire($this->keyPrefix . $id, $this->sessionExpiration); + } + + return false; + } + + /** + * Closes the current session. + */ + public function close(): bool + { + if (isset($this->redis)) { + try { + $pingReply = $this->redis->ping(); + + if (($pingReply === true) || ($pingReply === '+PONG')) { + if (isset($this->lockKey)) { + $this->redis->del($this->lockKey); + } + + if (! $this->redis->close()) { + return false; + } + } + } catch (RedisException $e) { + $this->logger->error('Session: Got RedisException on close(): ' . $e->getMessage()); + } + + $this->redis = null; + + return true; + } + + return true; + } + + /** + * Destroys a session + * + * @param string $id The session ID being destroyed + */ + public function destroy($id): bool + { + if (isset($this->redis, $this->lockKey)) { + if (($result = $this->redis->del($this->keyPrefix . $id)) !== 1) { + $this->logger->debug('Session: Redis::del() expected to return 1, got ' . var_export($result, true) . ' instead.'); + } + + return $this->destroyCookie(); + } + + return false; + } + + /** + * Cleans up expired sessions. + * + * @param int $max_lifetime Sessions that have not updated + * for the last max_lifetime seconds will be removed. + * + * @return false|int Returns the number of deleted sessions on success, or false on failure. + */ + #[ReturnTypeWillChange] + public function gc($max_lifetime) + { + return 1; + } + + /** + * Acquires an emulated lock. + * + * @param string $sessionID Session ID + */ + protected function lockSession(string $sessionID): bool + { + // PHP 7 reuses the SessionHandler object on regeneration, + // so we need to check here if the lock key is for the + // correct session ID. + if ($this->lockKey === $this->keyPrefix . $sessionID . ':lock') { + return $this->redis->expire($this->lockKey, 300); + } + + $lockKey = $this->keyPrefix . $sessionID . ':lock'; + $attempt = 0; + + do { + if (($ttl = $this->redis->ttl($lockKey)) > 0) { + sleep(1); + + continue; + } + + if (! $this->redis->setex($lockKey, 300, (string) time())) { + $this->logger->error('Session: Error while trying to obtain lock for ' . $this->keyPrefix . $sessionID); + + return false; + } + + $this->lockKey = $lockKey; + break; + } while (++$attempt < 30); + + if ($attempt === 30) { + log_message('error', 'Session: Unable to obtain lock for ' . $this->keyPrefix . $sessionID . ' after 30 attempts, aborting.'); + + return false; + } + + if ($ttl === -1) { + log_message('debug', 'Session: Lock for ' . $this->keyPrefix . $sessionID . ' had no TTL, overriding.'); + } + + $this->lock = true; + + return true; + } + + /** + * Releases a previously acquired lock + */ + protected function releaseLock(): bool + { + if (isset($this->redis, $this->lockKey) && $this->lock) { + if (! $this->redis->del($this->lockKey)) { + $this->logger->error('Session: Error while trying to free lock for ' . $this->lockKey); + + return false; + } + + $this->lockKey = null; + $this->lock = false; + } + + return true; + } +} diff --git a/system/Session/Session.php b/system/Session/Session.php new file mode 100644 index 0000000..ebfb6a9 --- /dev/null +++ b/system/Session/Session.php @@ -0,0 +1,909 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Session; + +use CodeIgniter\Cookie\Cookie; +use Config\App; +use Config\Cookie as CookieConfig; +use Psr\Log\LoggerAwareTrait; +use Psr\Log\LoggerInterface; +use SessionHandlerInterface; + +/** + * Implementation of CodeIgniter session container. + * + * Session configuration is done through session variables and cookie related + * variables in app/config/App.php + */ +class Session implements SessionInterface +{ + use LoggerAwareTrait; + + /** + * Instance of the driver to use. + * + * @var SessionHandlerInterface + */ + protected $driver; + + /** + * The storage driver to use: files, database, redis, memcached + * + * @var string + */ + protected $sessionDriverName; + + /** + * The session cookie name, must contain only [0-9a-z_-] characters. + * + * @var string + */ + protected $sessionCookieName = 'ci_session'; + + /** + * The number of SECONDS you want the session to last. + * Setting it to 0 (zero) means expire when the browser is closed. + * + * @var int + */ + protected $sessionExpiration = 7200; + + /** + * The location to save sessions to, driver dependent.. + * + * For the 'files' driver, it's a path to a writable directory. + * WARNING: Only absolute paths are supported! + * + * For the 'database' driver, it's a table name. + * + * @todo address memcache & redis needs + * + * IMPORTANT: You are REQUIRED to set a valid save path! + * + * @var string + */ + protected $sessionSavePath; + + /** + * Whether to match the user's IP address when reading the session data. + * + * WARNING: If you're using the database driver, don't forget to update + * your session table's PRIMARY KEY when changing this setting. + * + * @var bool + */ + protected $sessionMatchIP = false; + + /** + * How many seconds between CI regenerating the session ID. + * + * @var int + */ + protected $sessionTimeToUpdate = 300; + + /** + * Whether to destroy session data associated with the old session ID + * when auto-regenerating the session ID. When set to FALSE, the data + * will be later deleted by the garbage collector. + * + * @var bool + */ + protected $sessionRegenerateDestroy = false; + + /** + * The session cookie instance. + * + * @var Cookie + */ + protected $cookie; + + /** + * The domain name to use for cookies. + * Set to .your-domain.com for site-wide cookies. + * + * @var string + * + * @deprecated + */ + protected $cookieDomain = ''; + + /** + * Path used for storing cookies. + * Typically will be a forward slash. + * + * @var string + * + * @deprecated + */ + protected $cookiePath = '/'; + + /** + * Cookie will only be set if a secure HTTPS connection exists. + * + * @var bool + * + * @deprecated + */ + protected $cookieSecure = false; + + /** + * Cookie SameSite setting as described in RFC6265 + * Must be 'None', 'Lax' or 'Strict'. + * + * @var string + * + * @deprecated + */ + protected $cookieSameSite = Cookie::SAMESITE_LAX; + + /** + * sid regex expression + * + * @var string + */ + protected $sidRegexp; + + /** + * Logger instance to record error messages and warnings. + * + * @var LoggerInterface + */ + protected $logger; + + /** + * Constructor. + * + * Extract configuration settings and save them here. + */ + public function __construct(SessionHandlerInterface $driver, App $config) + { + $this->driver = $driver; + + $this->sessionDriverName = $config->sessionDriver; + $this->sessionCookieName = $config->sessionCookieName ?? $this->sessionCookieName; + $this->sessionExpiration = $config->sessionExpiration ?? $this->sessionExpiration; + $this->sessionSavePath = $config->sessionSavePath; + $this->sessionMatchIP = $config->sessionMatchIP ?? $this->sessionMatchIP; + $this->sessionTimeToUpdate = $config->sessionTimeToUpdate ?? $this->sessionTimeToUpdate; + $this->sessionRegenerateDestroy = $config->sessionRegenerateDestroy ?? $this->sessionRegenerateDestroy; + + // DEPRECATED COOKIE MANAGEMENT + $this->cookiePath = $config->cookiePath ?? $this->cookiePath; + $this->cookieDomain = $config->cookieDomain ?? $this->cookieDomain; + $this->cookieSecure = $config->cookieSecure ?? $this->cookieSecure; + $this->cookieSameSite = $config->cookieSameSite ?? $this->cookieSameSite; + + /** @var CookieConfig $cookie */ + $cookie = config('Cookie'); + + $this->cookie = new Cookie($this->sessionCookieName, '', [ + 'expires' => $this->sessionExpiration === 0 ? 0 : time() + $this->sessionExpiration, + 'path' => $cookie->path ?? $config->cookiePath, + 'domain' => $cookie->domain ?? $config->cookieDomain, + 'secure' => $cookie->secure ?? $config->cookieSecure, + 'httponly' => true, // for security + 'samesite' => $cookie->samesite ?? $config->cookieSameSite ?? Cookie::SAMESITE_LAX, + 'raw' => $cookie->raw ?? false, + ]); + + helper('array'); + } + + /** + * Initialize the session container and starts up the session. + * + * @return mixed + */ + public function start() + { + if (is_cli() && ENVIRONMENT !== 'testing') { + // @codeCoverageIgnoreStart + $this->logger->debug('Session: Initialization under CLI aborted.'); + + return; + // @codeCoverageIgnoreEnd + } + + if ((bool) ini_get('session.auto_start')) { + $this->logger->error('Session: session.auto_start is enabled in php.ini. Aborting.'); + + return; + } + + if (session_status() === PHP_SESSION_ACTIVE) { + $this->logger->warning('Session: Sessions is enabled, and one exists.Please don\'t $session->start();'); + + return; + } + + $this->configure(); + $this->setSaveHandler(); + + // Sanitize the cookie, because apparently PHP doesn't do that for userspace handlers + if (isset($_COOKIE[$this->sessionCookieName]) + && (! is_string($_COOKIE[$this->sessionCookieName]) || ! preg_match('#\A' . $this->sidRegexp . '\z#', $_COOKIE[$this->sessionCookieName])) + ) { + unset($_COOKIE[$this->sessionCookieName]); + } + + $this->startSession(); + + // Is session ID auto-regeneration configured? (ignoring ajax requests) + if ((empty($_SERVER['HTTP_X_REQUESTED_WITH']) || strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) !== 'xmlhttprequest') + && ($regenerateTime = $this->sessionTimeToUpdate) > 0 + ) { + if (! isset($_SESSION['__ci_last_regenerate'])) { + $_SESSION['__ci_last_regenerate'] = time(); + } elseif ($_SESSION['__ci_last_regenerate'] < (time() - $regenerateTime)) { + $this->regenerate((bool) $this->sessionRegenerateDestroy); + } + } + // Another work-around ... PHP doesn't seem to send the session cookie + // unless it is being currently created or regenerated + elseif (isset($_COOKIE[$this->sessionCookieName]) && $_COOKIE[$this->sessionCookieName] === session_id()) { + $this->setCookie(); + } + + $this->initVars(); + $this->logger->info("Session: Class initialized using '" . $this->sessionDriverName . "' driver."); + + return $this; + } + + /** + * Does a full stop of the session: + * + * - destroys the session + * - unsets the session id + * - destroys the session cookie + */ + public function stop() + { + setcookie( + $this->sessionCookieName, + session_id(), + ['expires' => 1, 'path' => $this->cookie->getPath(), 'domain' => $this->cookie->getDomain(), 'secure' => $this->cookie->isSecure(), 'httponly' => true] + ); + + session_regenerate_id(true); + } + + /** + * Configuration. + * + * Handle input binds and configuration defaults. + */ + protected function configure() + { + if (empty($this->sessionCookieName)) { + $this->sessionCookieName = ini_get('session.name'); + } else { + ini_set('session.name', $this->sessionCookieName); + } + + $sameSite = $this->cookie->getSameSite() ?: ucfirst(Cookie::SAMESITE_LAX); + + $params = [ + 'lifetime' => $this->sessionExpiration, + 'path' => $this->cookie->getPath(), + 'domain' => $this->cookie->getDomain(), + 'secure' => $this->cookie->isSecure(), + 'httponly' => true, // HTTP only; Yes, this is intentional and not configurable for security reasons. + 'samesite' => $sameSite, + ]; + + ini_set('session.cookie_samesite', $sameSite); + session_set_cookie_params($params); + + if (! isset($this->sessionExpiration)) { + $this->sessionExpiration = (int) ini_get('session.gc_maxlifetime'); + } elseif ($this->sessionExpiration > 0) { + ini_set('session.gc_maxlifetime', (string) $this->sessionExpiration); + } + + if (! empty($this->sessionSavePath)) { + ini_set('session.save_path', $this->sessionSavePath); + } + + // Security is king + ini_set('session.use_trans_sid', '0'); + ini_set('session.use_strict_mode', '1'); + ini_set('session.use_cookies', '1'); + ini_set('session.use_only_cookies', '1'); + + $this->configureSidLength(); + } + + /** + * Configure session ID length + * + * To make life easier, we used to force SHA-1 and 4 bits per + * character on everyone. And of course, someone was unhappy. + * + * Then PHP 7.1 broke backwards-compatibility because ext/session + * is such a mess that nobody wants to touch it with a pole stick, + * and the one guy who does, nobody has the energy to argue with. + * + * So we were forced to make changes, and OF COURSE something was + * going to break and now we have this pile of shit. -- Narf + */ + protected function configureSidLength() + { + $bitsPerCharacter = (int) (ini_get('session.sid_bits_per_character') !== false + ? ini_get('session.sid_bits_per_character') + : 4); + + $sidLength = (int) (ini_get('session.sid_length') !== false + ? ini_get('session.sid_length') + : 40); + + if (($sidLength * $bitsPerCharacter) < 160) { + $bits = ($sidLength * $bitsPerCharacter); + // Add as many more characters as necessary to reach at least 160 bits + $sidLength += (int) ceil((160 % $bits) / $bitsPerCharacter); + ini_set('session.sid_length', (string) $sidLength); + } + + // Yes, 4,5,6 are the only known possible values as of 2016-10-27 + switch ($bitsPerCharacter) { + case 4: + $this->sidRegexp = '[0-9a-f]'; + break; + + case 5: + $this->sidRegexp = '[0-9a-v]'; + break; + + case 6: + $this->sidRegexp = '[0-9a-zA-Z,-]'; + break; + } + + $this->sidRegexp .= '{' . $sidLength . '}'; + } + + /** + * Handle temporary variables + * + * Clears old "flash" data, marks the new one for deletion and handles + * "temp" data deletion. + */ + protected function initVars() + { + if (empty($_SESSION['__ci_vars'])) { + return; + } + + $currentTime = time(); + + foreach ($_SESSION['__ci_vars'] as $key => &$value) { + if ($value === 'new') { + $_SESSION['__ci_vars'][$key] = 'old'; + } + // DO NOT move this above the 'new' check! + elseif ($value === 'old' || $value < $currentTime) { + unset($_SESSION[$key], $_SESSION['__ci_vars'][$key]); + } + } + + if (empty($_SESSION['__ci_vars'])) { + unset($_SESSION['__ci_vars']); + } + } + + /** + * Regenerates the session ID. + * + * @param bool $destroy Should old session data be destroyed? + */ + public function regenerate(bool $destroy = false) + { + $_SESSION['__ci_last_regenerate'] = time(); + session_regenerate_id($destroy); + } + + /** + * Destroys the current session. + */ + public function destroy() + { + if (ENVIRONMENT === 'testing') { + return; + } + + session_destroy(); + } + + /** + * Sets user data into the session. + * + * If $data is a string, then it is interpreted as a session property + * key, and $value is expected to be non-null. + * + * If $data is an array, it is expected to be an array of key/value pairs + * to be set as session properties. + * + * @param array|string $data Property name or associative array of properties + * @param mixed $value Property value if single key provided + */ + public function set($data, $value = null) + { + if (is_array($data)) { + foreach ($data as $key => &$value) { + if (is_int($key)) { + $_SESSION[$value] = null; + } else { + $_SESSION[$key] = $value; + } + } + + return; + } + + $_SESSION[$data] = $value; + } + + /** + * Get user data that has been set in the session. + * + * If the property exists as "normal", returns it. + * Otherwise, returns an array of any temp or flash data values with the + * property key. + * + * Replaces the legacy method $session->userdata(); + * + * @param string|null $key Identifier of the session property to retrieve + * + * @return mixed The property value(s) + */ + public function get(?string $key = null) + { + if (! empty($key) && (null !== ($value = $_SESSION[$key] ?? null) || null !== ($value = dot_array_search($key, $_SESSION ?? [])))) { + return $value; + } + + if (empty($_SESSION)) { + return $key === null ? [] : null; + } + + if (! empty($key)) { + return null; + } + + $userdata = []; + $_exclude = array_merge(['__ci_vars'], $this->getFlashKeys(), $this->getTempKeys()); + + $keys = array_keys($_SESSION); + + foreach ($keys as $key) { + if (! in_array($key, $_exclude, true)) { + $userdata[$key] = $_SESSION[$key]; + } + } + + return $userdata; + } + + /** + * Returns whether an index exists in the session array. + * + * @param string $key Identifier of the session property we are interested in. + */ + public function has(string $key): bool + { + return isset($_SESSION[$key]); + } + + /** + * Push new value onto session value that is array. + * + * @param string $key Identifier of the session property we are interested in. + * @param array $data value to be pushed to existing session key. + */ + public function push(string $key, array $data) + { + if ($this->has($key) && is_array($value = $this->get($key))) { + $this->set($key, array_merge($value, $data)); + } + } + + /** + * Remove one or more session properties. + * + * If $key is an array, it is interpreted as an array of string property + * identifiers to remove. Otherwise, it is interpreted as the identifier + * of a specific session property to remove. + * + * @param array|string $key Identifier of the session property or properties to remove. + */ + public function remove($key) + { + if (is_array($key)) { + foreach ($key as $k) { + unset($_SESSION[$k]); + } + + return; + } + + unset($_SESSION[$key]); + } + + /** + * Magic method to set variables in the session by simply calling + * $session->foo = bar; + * + * @param string $key Identifier of the session property to set. + * @param array|string $value + */ + public function __set(string $key, $value) + { + $_SESSION[$key] = $value; + } + + /** + * Magic method to get session variables by simply calling + * $foo = $session->foo; + * + * @param string $key Identifier of the session property to remove. + * + * @return string|null + */ + public function __get(string $key) + { + // Note: Keep this order the same, just in case somebody wants to + // use 'session_id' as a session data key, for whatever reason + if (isset($_SESSION[$key])) { + return $_SESSION[$key]; + } + + if ($key === 'session_id') { + return session_id(); + } + + return null; + } + + /** + * Magic method to check for session variables. + * Different from has() in that it will validate 'session_id' as well. + * Mostly used by internal PHP functions, users should stick to has() + * + * @param string $key Identifier of the session property to remove. + */ + public function __isset(string $key): bool + { + return isset($_SESSION[$key]) || ($key === 'session_id'); + } + + /** + * Sets data into the session that will only last for a single request. + * Perfect for use with single-use status update messages. + * + * If $data is an array, it is interpreted as an associative array of + * key/value pairs for flashdata properties. + * Otherwise, it is interpreted as the identifier of a specific + * flashdata property, with $value containing the property value. + * + * @param array|string $data Property identifier or associative array of properties + * @param array|string $value Property value if $data is a scalar + */ + public function setFlashdata($data, $value = null) + { + $this->set($data, $value); + $this->markAsFlashdata(is_array($data) ? array_keys($data) : $data); + } + + /** + * Retrieve one or more items of flash data from the session. + * + * If the item key is null, return all flashdata. + * + * @param string $key Property identifier + * + * @return array|null The requested property value, or an associative array of them + */ + public function getFlashdata(?string $key = null) + { + if (isset($key)) { + return (isset($_SESSION['__ci_vars'], $_SESSION['__ci_vars'][$key], $_SESSION[$key]) + && ! is_int($_SESSION['__ci_vars'][$key])) ? $_SESSION[$key] : null; + } + + $flashdata = []; + + if (! empty($_SESSION['__ci_vars'])) { + foreach ($_SESSION['__ci_vars'] as $key => &$value) { + if (! is_int($value)) { + $flashdata[$key] = $_SESSION[$key]; + } + } + } + + return $flashdata; + } + + /** + * Keeps a single piece of flash data alive for one more request. + * + * @param array|string $key Property identifier or array of them + */ + public function keepFlashdata($key) + { + $this->markAsFlashdata($key); + } + + /** + * Mark a session property or properties as flashdata. + * + * @param array|string $key Property identifier or array of them + * + * @return bool False if any of the properties are not already set + */ + public function markAsFlashdata($key): bool + { + if (is_array($key)) { + foreach ($key as $sessionKey) { + if (! isset($_SESSION[$sessionKey])) { + return false; + } + } + + $new = array_fill_keys($key, 'new'); + + $_SESSION['__ci_vars'] = isset($_SESSION['__ci_vars']) ? array_merge($_SESSION['__ci_vars'], $new) : $new; + + return true; + } + + if (! isset($_SESSION[$key])) { + return false; + } + + $_SESSION['__ci_vars'][$key] = 'new'; + + return true; + } + + /** + * Unmark data in the session as flashdata. + * + * @param mixed $key Property identifier or array of them + */ + public function unmarkFlashdata($key) + { + if (empty($_SESSION['__ci_vars'])) { + return; + } + + if (! is_array($key)) { + $key = [$key]; + } + + foreach ($key as $k) { + if (isset($_SESSION['__ci_vars'][$k]) && ! is_int($_SESSION['__ci_vars'][$k])) { + unset($_SESSION['__ci_vars'][$k]); + } + } + + if (empty($_SESSION['__ci_vars'])) { + unset($_SESSION['__ci_vars']); + } + } + + /** + * Retrieve all of the keys for session data marked as flashdata. + * + * @return array The property names of all flashdata + */ + public function getFlashKeys(): array + { + if (! isset($_SESSION['__ci_vars'])) { + return []; + } + + $keys = []; + + foreach (array_keys($_SESSION['__ci_vars']) as $key) { + if (! is_int($_SESSION['__ci_vars'][$key])) { + $keys[] = $key; + } + } + + return $keys; + } + + /** + * Sets new data into the session, and marks it as temporary data + * with a set lifespan. + * + * @param array|string $data Session data key or associative array of items + * @param null $value Value to store + * @param int $ttl Time-to-live in seconds + */ + public function setTempdata($data, $value = null, int $ttl = 300) + { + $this->set($data, $value); + $this->markAsTempdata($data, $ttl); + } + + /** + * Returns either a single piece of tempdata, or all temp data currently + * in the session. + * + * @param string $key Session data key + * + * @return mixed Session data value or null if not found. + */ + public function getTempdata(?string $key = null) + { + if (isset($key)) { + return (isset($_SESSION['__ci_vars'], $_SESSION['__ci_vars'][$key], $_SESSION[$key]) + && is_int($_SESSION['__ci_vars'][$key])) ? $_SESSION[$key] : null; + } + + $tempdata = []; + + if (! empty($_SESSION['__ci_vars'])) { + foreach ($_SESSION['__ci_vars'] as $key => &$value) { + if (is_int($value)) { + $tempdata[$key] = $_SESSION[$key]; + } + } + } + + return $tempdata; + } + + /** + * Removes a single piece of temporary data from the session. + * + * @param string $key Session data key + */ + public function removeTempdata(string $key) + { + $this->unmarkTempdata($key); + unset($_SESSION[$key]); + } + + /** + * Mark one of more pieces of data as being temporary, meaning that + * it has a set lifespan within the session. + * + * @param array|string $key Property identifier or array of them + * @param int $ttl Time to live, in seconds + * + * @return bool False if any of the properties were not set + */ + public function markAsTempdata($key, int $ttl = 300): bool + { + $ttl += time(); + + if (is_array($key)) { + $temp = []; + + foreach ($key as $k => $v) { + // Do we have a key => ttl pair, or just a key? + if (is_int($k)) { + $k = $v; + $v = $ttl; + } elseif (is_string($v)) { + $v = time() + $ttl; + } else { + $v += time(); + } + + if (! array_key_exists($k, $_SESSION)) { + return false; + } + + $temp[$k] = $v; + } + + $_SESSION['__ci_vars'] = isset($_SESSION['__ci_vars']) ? array_merge($_SESSION['__ci_vars'], $temp) : $temp; + + return true; + } + + if (! isset($_SESSION[$key])) { + return false; + } + + $_SESSION['__ci_vars'][$key] = $ttl; + + return true; + } + + /** + * Unmarks temporary data in the session, effectively removing its + * lifespan and allowing it to live as long as the session does. + * + * @param array|string $key Property identifier or array of them + */ + public function unmarkTempdata($key) + { + if (empty($_SESSION['__ci_vars'])) { + return; + } + + if (! is_array($key)) { + $key = [$key]; + } + + foreach ($key as $k) { + if (isset($_SESSION['__ci_vars'][$k]) && is_int($_SESSION['__ci_vars'][$k])) { + unset($_SESSION['__ci_vars'][$k]); + } + } + + if (empty($_SESSION['__ci_vars'])) { + unset($_SESSION['__ci_vars']); + } + } + + /** + * Retrieve the keys of all session data that have been marked as temporary data. + */ + public function getTempKeys(): array + { + if (! isset($_SESSION['__ci_vars'])) { + return []; + } + + $keys = []; + + foreach (array_keys($_SESSION['__ci_vars']) as $key) { + if (is_int($_SESSION['__ci_vars'][$key])) { + $keys[] = $key; + } + } + + return $keys; + } + + /** + * Sets the driver as the session handler in PHP. + * Extracted for easier testing. + */ + protected function setSaveHandler() + { + session_set_save_handler($this->driver, true); + } + + /** + * Starts the session. + * Extracted for testing reasons. + */ + protected function startSession() + { + if (ENVIRONMENT === 'testing') { + $_SESSION = []; + + return; + } + + session_start(); // @codeCoverageIgnore + } + + /** + * Takes care of setting the cookie on the client side. + * + * @codeCoverageIgnore + */ + protected function setCookie() + { + $expiration = $this->sessionExpiration === 0 ? 0 : time() + $this->sessionExpiration; + $this->cookie = $this->cookie->withValue(session_id())->withExpires($expiration); + + cookies([$this->cookie], false)->dispatch(); + } +} diff --git a/system/Session/SessionInterface.php b/system/Session/SessionInterface.php new file mode 100644 index 0000000..f485f64 --- /dev/null +++ b/system/Session/SessionInterface.php @@ -0,0 +1,184 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Session; + +/** + * Expected behavior of a session container used with CodeIgniter. + */ +interface SessionInterface +{ + /** + * Regenerates the session ID. + * + * @param bool $destroy Should old session data be destroyed? + */ + public function regenerate(bool $destroy = false); + + /** + * Destroys the current session. + */ + public function destroy(); + + /** + * Sets user data into the session. + * + * If $data is a string, then it is interpreted as a session property + * key, and $value is expected to be non-null. + * + * If $data is an array, it is expected to be an array of key/value pairs + * to be set as session properties. + * + * @param array|string $data Property name or associative array of properties + * @param mixed $value Property value if single key provided + */ + public function set($data, $value = null); + + /** + * Get user data that has been set in the session. + * + * If the property exists as "normal", returns it. + * Otherwise, returns an array of any temp or flash data values with the + * property key. + * + * Replaces the legacy method $session->userdata(); + * + * @param string $key Identifier of the session property to retrieve + * + * @return mixed The property value(s) + */ + public function get(?string $key = null); + + /** + * Returns whether an index exists in the session array. + * + * @param string $key Identifier of the session property we are interested in. + */ + public function has(string $key): bool; + + /** + * Remove one or more session properties. + * + * If $key is an array, it is interpreted as an array of string property + * identifiers to remove. Otherwise, it is interpreted as the identifier + * of a specific session property to remove. + * + * @param array|string $key Identifier of the session property or properties to remove. + */ + public function remove($key); + + /** + * Sets data into the session that will only last for a single request. + * Perfect for use with single-use status update messages. + * + * If $data is an array, it is interpreted as an associative array of + * key/value pairs for flashdata properties. + * Otherwise, it is interpreted as the identifier of a specific + * flashdata property, with $value containing the property value. + * + * @param array|string $data Property identifier or associative array of properties + * @param array|string $value Property value if $data is a scalar + */ + public function setFlashdata($data, $value = null); + + /** + * Retrieve one or more items of flash data from the session. + * + * If the item key is null, return all flashdata. + * + * @param string $key Property identifier + * + * @return array|null The requested property value, or an associative + * array of them + */ + public function getFlashdata(?string $key = null); + + /** + * Keeps a single piece of flash data alive for one more request. + * + * @param array|string $key Property identifier or array of them + */ + public function keepFlashdata($key); + + /** + * Mark a session property or properties as flashdata. + * + * @param array|string $key Property identifier or array of them + * + * @return false if any of the properties are not already set + */ + public function markAsFlashdata($key); + + /** + * Unmark data in the session as flashdata. + * + * @param array|string $key Property identifier or array of them + */ + public function unmarkFlashdata($key); + + /** + * Retrieve all of the keys for session data marked as flashdata. + * + * @return array The property names of all flashdata + */ + public function getFlashKeys(): array; + + /** + * Sets new data into the session, and marks it as temporary data + * with a set lifespan. + * + * @param array|string $data Session data key or associative array of items + * @param mixed $value Value to store + * @param int $ttl Time-to-live in seconds + */ + public function setTempdata($data, $value = null, int $ttl = 300); + + /** + * Returns either a single piece of tempdata, or all temp data currently + * in the session. + * + * @param string $key Session data key + * + * @return mixed Session data value or null if not found. + */ + public function getTempdata(?string $key = null); + + /** + * Removes a single piece of temporary data from the session. + * + * @param string $key Session data key + */ + public function removeTempdata(string $key); + + /** + * Mark one of more pieces of data as being temporary, meaning that + * it has a set lifespan within the session. + * + * @param array|string $key Property identifier or array of them + * @param int $ttl Time to live, in seconds + * + * @return bool False if any of the properties were not set + */ + public function markAsTempdata($key, int $ttl = 300); + + /** + * Unmarks temporary data in the session, effectively removing its + * lifespan and allowing it to live as long as the session does. + * + * @param array|string $key Property identifier or array of them + */ + public function unmarkTempdata($key); + + /** + * Retrieve the keys of all session data that have been marked as temporary data. + */ + public function getTempKeys(): array; +} diff --git a/system/Test/CIDatabaseTestCase.php b/system/Test/CIDatabaseTestCase.php new file mode 100644 index 0000000..8e25c37 --- /dev/null +++ b/system/Test/CIDatabaseTestCase.php @@ -0,0 +1,24 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Test; + +/** + * CIDatabaseTestCase + * + * Use DatabaseTestTrait instead. + * + * @deprecated 4.1.2 + */ +abstract class CIDatabaseTestCase extends CIUnitTestCase +{ + use DatabaseTestTrait; +} diff --git a/system/Test/CIUnitTestCase.php b/system/Test/CIUnitTestCase.php new file mode 100644 index 0000000..e2c6eab --- /dev/null +++ b/system/Test/CIUnitTestCase.php @@ -0,0 +1,541 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Test; + +use CodeIgniter\CodeIgniter; +use CodeIgniter\Config\Factories; +use CodeIgniter\Database\BaseConnection; +use CodeIgniter\Database\MigrationRunner; +use CodeIgniter\Database\Seeder; +use CodeIgniter\Events\Events; +use CodeIgniter\Router\RouteCollection; +use CodeIgniter\Session\Handlers\ArrayHandler; +use CodeIgniter\Test\Mock\MockCache; +use CodeIgniter\Test\Mock\MockCodeIgniter; +use CodeIgniter\Test\Mock\MockEmail; +use CodeIgniter\Test\Mock\MockSession; +use Config\App; +use Config\Autoload; +use Config\Modules; +use Config\Services; +use Exception; +use PHPUnit\Framework\TestCase; + +/** + * Framework test case for PHPUnit. + */ +abstract class CIUnitTestCase extends TestCase +{ + use ReflectionHelper; + + /** + * @var CodeIgniter + */ + protected $app; + + /** + * Methods to run during setUp. + * + * @var array of methods + */ + protected $setUpMethods = [ + 'resetFactories', + 'mockCache', + 'mockEmail', + 'mockSession', + ]; + + /** + * Methods to run during tearDown. + * + * @var array of methods + */ + protected $tearDownMethods = []; + + /** + * Store of identified traits. + * + * @var string[]|null + */ + private $traits; + + //-------------------------------------------------------------------- + // Database Properties + //-------------------------------------------------------------------- + + /** + * Should run db migration? + * + * @var bool + */ + protected $migrate = true; + + /** + * Should run db migration only once? + * + * @var bool + */ + protected $migrateOnce = false; + + /** + * Should run seeding only once? + * + * @var bool + */ + protected $seedOnce = false; + + /** + * Should the db be refreshed before test? + * + * @var bool + */ + protected $refresh = true; + + /** + * The seed file(s) used for all tests within this test case. + * Should be fully-namespaced or relative to $basePath + * + * @var array|string + */ + protected $seed = ''; + + /** + * The path to the seeds directory. + * Allows overriding the default application directories. + * + * @var string + */ + protected $basePath = SUPPORTPATH . 'Database'; + + /** + * The namespace(s) to help us find the migration classes. + * Empty is equivalent to running `spark migrate -all`. + * Note that running "all" runs migrations in date order, + * but specifying namespaces runs them in namespace order (then date) + * + * @var array|string|null + */ + protected $namespace = 'Tests\Support'; + + /** + * The name of the database group to connect to. + * If not present, will use the defaultGroup. + * + * @var string + */ + protected $DBGroup = 'tests'; + + /** + * Our database connection. + * + * @var BaseConnection + */ + protected $db; + + /** + * Migration Runner instance. + * + * @var MigrationRunner|mixed + */ + protected $migrations; + + /** + * Seeder instance + * + * @var Seeder + */ + protected $seeder; + + /** + * Stores information needed to remove any + * rows inserted via $this->hasInDatabase(); + * + * @var array + */ + protected $insertCache = []; + + //-------------------------------------------------------------------- + // Feature Properties + //-------------------------------------------------------------------- + + /** + * If present, will override application + * routes when using call(). + * + * @var RouteCollection|null + */ + protected $routes; + + /** + * Values to be set in the SESSION global + * before running the test. + * + * @var array + */ + protected $session = []; + + /** + * Enabled auto clean op buffer after request call + * + * @var bool + */ + protected $clean = true; + + /** + * Custom request's headers + * + * @var array + */ + protected $headers = []; + + /** + * Allows for formatting the request body to what + * the controller is going to expect + * + * @var string + */ + protected $bodyFormat = ''; + + /** + * Allows for directly setting the body to what + * it needs to be. + * + * @var mixed + */ + protected $requestBody = ''; + + //-------------------------------------------------------------------- + // Staging + //-------------------------------------------------------------------- + + /** + * Load the helpers. + */ + public static function setUpBeforeClass(): void + { + parent::setUpBeforeClass(); + + helper(['url', 'test']); + } + + protected function setUp(): void + { + parent::setUp(); + + if (! $this->app) { + $this->app = $this->createApplication(); + } + + foreach ($this->setUpMethods as $method) { + $this->{$method}(); + } + + // Check for the database trait + if (method_exists($this, 'setUpDatabase')) { + $this->setUpDatabase(); + } + + // Check for other trait methods + $this->callTraitMethods('setUp'); + } + + protected function tearDown(): void + { + parent::tearDown(); + + foreach ($this->tearDownMethods as $method) { + $this->{$method}(); + } + + // Check for the database trait + if (method_exists($this, 'tearDownDatabase')) { + $this->tearDownDatabase(); + } + + // Check for other trait methods + $this->callTraitMethods('tearDown'); + } + + /** + * Checks for traits with corresponding + * methods for setUp or tearDown. + * + * @param string $stage 'setUp' or 'tearDown' + */ + private function callTraitMethods(string $stage): void + { + if ($this->traits === null) { + $this->traits = class_uses_recursive($this); + } + + foreach ($this->traits as $trait) { + $method = $stage . class_basename($trait); + + if (method_exists($this, $method)) { + $this->{$method}(); + } + } + } + + //-------------------------------------------------------------------- + // Mocking + //-------------------------------------------------------------------- + + /** + * Resets shared instanced for all Factories components + */ + protected function resetFactories() + { + Factories::reset(); + } + + /** + * Resets shared instanced for all Services + */ + protected function resetServices() + { + Services::reset(); + } + + /** + * Injects the mock Cache driver to prevent filesystem collisions + */ + protected function mockCache() + { + Services::injectMock('cache', new MockCache()); + } + + /** + * Injects the mock email driver so no emails really send + */ + protected function mockEmail() + { + Services::injectMock('email', new MockEmail(config('Email'))); + } + + /** + * Injects the mock session driver into Services + */ + protected function mockSession() + { + $_SESSION = []; + + $config = config('App'); + $session = new MockSession(new ArrayHandler($config, '0.0.0.0'), $config); + + Services::injectMock('session', $session); + } + + //-------------------------------------------------------------------- + // Assertions + //-------------------------------------------------------------------- + + /** + * Custom function to hook into CodeIgniter's Logging mechanism + * to check if certain messages were logged during code execution. + * + * @param string|null $expectedMessage + * + * @throws Exception + * + * @return bool + */ + public function assertLogged(string $level, $expectedMessage = null) + { + $result = TestLogger::didLog($level, $expectedMessage); + + $this->assertTrue($result, sprintf( + 'Failed asserting that expected message "%s" with level "%s" was logged.', + $expectedMessage ?? '', + $level + )); + + return $result; + } + + /** + * Hooks into CodeIgniter's Events system to check if a specific + * event was triggered or not. + * + * @throws Exception + */ + public function assertEventTriggered(string $eventName): bool + { + $found = false; + $eventName = strtolower($eventName); + + foreach (Events::getPerformanceLogs() as $log) { + if ($log['event'] !== $eventName) { + continue; + } + + $found = true; + break; + } + + $this->assertTrue($found); + + return $found; + } + + /** + * Hooks into xdebug's headers capture, looking for a specific header + * emitted + * + * @param string $header The leading portion of the header we are looking for + * + * @throws Exception + */ + public function assertHeaderEmitted(string $header, bool $ignoreCase = false): void + { + $found = false; + + if (! function_exists('xdebug_get_headers')) { + $this->markTestSkipped('XDebug not found.'); + } + + foreach (xdebug_get_headers() as $emitted) { + $found = $ignoreCase ? + (stripos($emitted, $header) === 0) : + (strpos($emitted, $header) === 0); + if ($found) { + break; + } + } + + $this->assertTrue($found, "Didn't find header for {$header}"); + } + + /** + * Hooks into xdebug's headers capture, looking for a specific header + * emitted + * + * @param string $header The leading portion of the header we don't want to find + * + * @throws Exception + */ + public function assertHeaderNotEmitted(string $header, bool $ignoreCase = false): void + { + $found = false; + + if (! function_exists('xdebug_get_headers')) { + $this->markTestSkipped('XDebug not found.'); + } + + foreach (xdebug_get_headers() as $emitted) { + $found = $ignoreCase ? + (stripos($emitted, $header) === 0) : + (strpos($emitted, $header) === 0); + if ($found) { + break; + } + } + + $success = ! $found; + $this->assertTrue($success, "Found header for {$header}"); + } + + /** + * Custom function to test that two values are "close enough". + * This is intended for extended execution time testing, + * where the result is close but not exactly equal to the + * expected time, for reasons beyond our control. + * + * @param mixed $actual + * + * @throws Exception + */ + public function assertCloseEnough(int $expected, $actual, string $message = '', int $tolerance = 1) + { + $difference = abs($expected - (int) floor($actual)); + + $this->assertLessThanOrEqual($tolerance, $difference, $message); + } + + /** + * Custom function to test that two values are "close enough". + * This is intended for extended execution time testing, + * where the result is close but not exactly equal to the + * expected time, for reasons beyond our control. + * + * @param mixed $expected + * @param mixed $actual + * + * @throws Exception + * + * @return bool|void + */ + public function assertCloseEnoughString($expected, $actual, string $message = '', int $tolerance = 1) + { + $expected = (string) $expected; + $actual = (string) $actual; + if (strlen($expected) !== strlen($actual)) { + return false; + } + + try { + $expected = (int) substr($expected, -2); + $actual = (int) substr($actual, -2); + $difference = abs($expected - $actual); + + $this->assertLessThanOrEqual($tolerance, $difference, $message); + } catch (Exception $e) { + return false; + } + } + + //-------------------------------------------------------------------- + // Utility + //-------------------------------------------------------------------- + + /** + * Loads up an instance of CodeIgniter + * and gets the environment setup. + * + * @return CodeIgniter + */ + protected function createApplication() + { + // Initialize the autoloader. + Services::autoloader()->initialize(new Autoload(), new Modules()); + + $app = new MockCodeIgniter(new App()); + $app->initialize(); + + return $app; + } + + /** + * Return first matching emitted header. + * + * @param string $header Identifier of the header of interest + * + * @return string|null The value of the header found, null if not found + */ + protected function getHeaderEmitted(string $header, bool $ignoreCase = false): ?string + { + if (! function_exists('xdebug_get_headers')) { + $this->markTestSkipped('XDebug not found.'); + } + + foreach (xdebug_get_headers() as $emitted) { + $found = $ignoreCase ? + (stripos($emitted, $header) === 0) : + (strpos($emitted, $header) === 0); + if ($found) { + return $emitted; + } + } + + return null; + } +} diff --git a/system/Test/Constraints/SeeInDatabase.php b/system/Test/Constraints/SeeInDatabase.php new file mode 100644 index 0000000..dbed1e4 --- /dev/null +++ b/system/Test/Constraints/SeeInDatabase.php @@ -0,0 +1,118 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Test\Constraints; + +use CodeIgniter\Database\ConnectionInterface; +use PHPUnit\Framework\Constraint\Constraint; + +class SeeInDatabase extends Constraint +{ + /** + * The number of results that will show in the database + * in case of failure. + * + * @var int + */ + protected $show = 3; + + /** + * @var ConnectionInterface + */ + protected $db; + + /** + * Data used to compare results against. + * + * @var array + */ + protected $data; + + /** + * SeeInDatabase constructor. + */ + public function __construct(ConnectionInterface $db, array $data) + { + $this->db = $db; + $this->data = $data; + } + + /** + * Check if data is found in the table + * + * @param mixed $table + */ + protected function matches($table): bool + { + return $this->db->table($table)->where($this->data)->countAllResults() > 0; + } + + /** + * Get the description of the failure + * + * @param mixed $table + */ + protected function failureDescription($table): string + { + return sprintf( + "a row in the table [%s] matches the attributes \n%s\n\n%s", + $table, + $this->toString(JSON_PRETTY_PRINT), + $this->getAdditionalInfo($table) + ); + } + + /** + * Gets additional records similar to $data. + */ + protected function getAdditionalInfo(string $table): string + { + $builder = $this->db->table($table); + + $similar = $builder->where( + array_key_first($this->data), + $this->data[array_key_first($this->data)] + )->limit($this->show)->get()->getResultArray(); + + if ($similar !== []) { + $description = 'Found similar results: ' . json_encode($similar, JSON_PRETTY_PRINT); + } else { + // Does the table have any results at all? + $results = $this->db->table($table) + ->limit($this->show) + ->get() + ->getResultArray(); + + if ($results !== []) { + return 'The table is empty.'; + } + + $description = 'Found: ' . json_encode($results, JSON_PRETTY_PRINT); + } + + $total = $this->db->table($table)->countAll(); + if ($total > $this->show) { + $description .= sprintf(' and %s others', $total - $this->show); + } + + return $description; + } + + /** + * Gets a string representation of the constraint + * + * @param int $options + */ + public function toString($options = 0): string + { + return json_encode($this->data, $options); + } +} diff --git a/system/Test/ControllerResponse.php b/system/Test/ControllerResponse.php new file mode 100644 index 0000000..2a90e4d --- /dev/null +++ b/system/Test/ControllerResponse.php @@ -0,0 +1,99 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Test; + +use CodeIgniter\HTTP\ResponseInterface; +use Config\Services; + +/** + * Testable response from a controller + * + * @deprecated Use TestResponse directly + * + * @codeCoverageIgnore + */ +class ControllerResponse extends TestResponse +{ + /** + * The message payload. + * + * @var string + * + * @deprecated Use $response->getBody() instead + */ + protected $body; + + /** + * DOM for the body. + * + * @var DOMParser + * + * @deprecated Use $domParser instead + */ + protected $dom; + + /** + * Maintains the deprecated $dom property. + */ + public function __construct() + { + parent::__construct(Services::response()); + + $this->dom = &$this->domParser; + } + + /** + * Sets the response. + * + * @return $this + * + * @deprecated Will revert to parent::setResponse() in a future release (no $body updates) + */ + public function setResponse(ResponseInterface $response) + { + parent::setResponse($response); + + $this->body = $response->getBody() ?? ''; + + return $this; + } + + /** + * Sets the body and updates the DOM. + * + * @return $this + * + * @deprecated Use response()->setBody() instead + */ + public function setBody(string $body) + { + $this->body = $body; + + if ($body !== '') { + $this->domParser->withString($body); + } + + return $this; + } + + /** + * Retrieve the body. + * + * @return string + * + * @deprecated Use response()->getBody() instead + */ + public function getBody() + { + return $this->body; + } +} diff --git a/system/Test/ControllerTestTrait.php b/system/Test/ControllerTestTrait.php new file mode 100644 index 0000000..c5e255b --- /dev/null +++ b/system/Test/ControllerTestTrait.php @@ -0,0 +1,297 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Test; + +use CodeIgniter\Controller; +use CodeIgniter\HTTP\Exceptions\HTTPException; +use CodeIgniter\HTTP\IncomingRequest; +use CodeIgniter\HTTP\Response; +use CodeIgniter\HTTP\URI; +use Config\App; +use Config\Services; +use InvalidArgumentException; +use Psr\Log\LoggerInterface; +use Throwable; + +/** + * Controller Test Trait + * + * Provides features that make testing controllers simple and fluent. + * + * Example: + * + * $this->withRequest($request) + * ->withResponse($response) + * ->withURI($uri) + * ->withBody($body) + * ->controller('App\Controllers\Home') + * ->execute('methodName'); + */ +trait ControllerTestTrait +{ + /** + * Controller configuration. + * + * @var App + */ + protected $appConfig; + + /** + * Request. + * + * @var IncomingRequest + */ + protected $request; + + /** + * Response. + * + * @var Response + */ + protected $response; + + /** + * Message logger. + * + * @var LoggerInterface + */ + protected $logger; + + /** + * Initialized controller. + * + * @var Controller + */ + protected $controller; + + /** + * URI of this request. + * + * @var string + */ + protected $uri = 'http://example.com'; + + /** + * Request body. + * + * @var string|null + */ + protected $body; + + /** + * Initializes required components. + */ + protected function setUpControllerTestTrait(): void + { + // The URL helper is always loaded by the system so ensure it is available. + helper('url'); + + if (empty($this->appConfig)) { + $this->appConfig = config('App'); + } + + if (! $this->uri instanceof URI) { + $this->uri = Services::uri($this->appConfig->baseURL ?? 'http://example.com/', false); + } + + if (empty($this->request)) { + // Do some acrobatics so we can use the Request service with our own URI + $tempUri = Services::uri(); + Services::injectMock('uri', $this->uri); + + $this->withRequest(Services::request($this->appConfig, false)->setBody($this->body)); + + // Restore the URI service + Services::injectMock('uri', $tempUri); + } + + if (empty($this->response)) { + $this->response = Services::response($this->appConfig, false); + } + + if (empty($this->logger)) { + $this->logger = Services::logger(); + } + } + + /** + * Loads the specified controller, and generates any needed dependencies. + * + * @return mixed + */ + public function controller(string $name) + { + if (! class_exists($name)) { + throw new InvalidArgumentException('Invalid Controller: ' . $name); + } + + $this->controller = new $name(); + $this->controller->initController($this->request, $this->response, $this->logger); + + return $this; + } + + /** + * Runs the specified method on the controller and returns the results. + * + * @param array $params + * + * @throws InvalidArgumentException + * + * @return TestResponse + */ + public function execute(string $method, ...$params) + { + if (! method_exists($this->controller, $method) || ! is_callable([$this->controller, $method])) { + throw new InvalidArgumentException('Method does not exist or is not callable in controller: ' . $method); + } + + $response = null; + + try { + ob_start(); + $response = $this->controller->{$method}(...$params); + } catch (Throwable $e) { + $code = $e->getCode(); + + // If code is not a valid HTTP status then assume there is an error + if ($code < 100 || $code >= 600) { + throw $e; + } + } finally { + $output = ob_get_clean(); + } + + // If the controller returned a view then add it to the output + if (is_string($response)) { + $output = is_string($output) ? $output . $response : $response; + } + + // If the controller did not return a response then start one + if (! $response instanceof Response) { + $response = $this->response; + } + + // Check for output to set or prepend + // @see \CodeIgniter\CodeIgniter::gatherOutput() + if (is_string($output)) { + if (is_string($response->getBody())) { + $response->setBody($output . $response->getBody()); + } else { + $response->setBody($output); + } + } + + // Check for an overriding code from exceptions + if (isset($code)) { + $response->setStatusCode($code); + } + // Otherwise ensure there is a status code + else { + // getStatusCode() throws for empty codes + try { + $response->getStatusCode(); + } catch (HTTPException $e) { + // If no code has been set then assume success + $response->setStatusCode(200); + } + } + + // Create the result and add the Request for reference + return (new TestResponse($response))->setRequest($this->request); + } + + /** + * Set controller's config, with method chaining. + * + * @param mixed $appConfig + * + * @return mixed + */ + public function withConfig($appConfig) + { + $this->appConfig = $appConfig; + + return $this; + } + + /** + * Set controller's request, with method chaining. + * + * @param mixed $request + * + * @return mixed + */ + public function withRequest($request) + { + $this->request = $request; + + // Make sure it's available for other classes + Services::injectMock('request', $request); + + return $this; + } + + /** + * Set controller's response, with method chaining. + * + * @param mixed $response + * + * @return mixed + */ + public function withResponse($response) + { + $this->response = $response; + + return $this; + } + + /** + * Set controller's logger, with method chaining. + * + * @param mixed $logger + * + * @return mixed + */ + public function withLogger($logger) + { + $this->logger = $logger; + + return $this; + } + + /** + * Set the controller's URI, with method chaining. + * + * @return mixed + */ + public function withUri(string $uri) + { + $this->uri = new URI($uri); + + return $this; + } + + /** + * Set the method's body, with method chaining. + * + * @param string|null $body + * + * @return mixed + */ + public function withBody($body) + { + $this->body = $body; + + return $this; + } +} diff --git a/system/Test/ControllerTester.php b/system/Test/ControllerTester.php new file mode 100644 index 0000000..a8bccc3 --- /dev/null +++ b/system/Test/ControllerTester.php @@ -0,0 +1,293 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Test; + +use CodeIgniter\Controller; +use CodeIgniter\HTTP\IncomingRequest; +use CodeIgniter\HTTP\Response; +use CodeIgniter\HTTP\URI; +use Config\App; +use Config\Services; +use InvalidArgumentException; +use Psr\Log\LoggerInterface; +use Throwable; + +/** + * ControllerTester Trait + * + * Provides features that make testing controllers simple and fluent. + * + * Example: + * + * $this->withRequest($request) + * ->withResponse($response) + * ->withURI($uri) + * ->withBody($body) + * ->controller('App\Controllers\Home') + * ->execute('methodName'); + * + * @deprecated Use ControllerTestTrait instead + * + * @codeCoverageIgnore + */ +trait ControllerTester +{ + /** + * Controller configuration. + * + * @var App + */ + protected $appConfig; + + /** + * Request. + * + * @var IncomingRequest + */ + protected $request; + + /** + * Response. + * + * @var Response + */ + protected $response; + + /** + * Message logger. + * + * @var LoggerInterface + */ + protected $logger; + + /** + * Initialized controller. + * + * @var Controller + */ + protected $controller; + + /** + * URI of this request. + * + * @var string + */ + protected $uri = 'http://example.com'; + + /** + * Request or response body. + * + * @var string|null + */ + protected $body; + + /** + * Initializes required components. + */ + protected function setUpControllerTester(): void + { + if (empty($this->appConfig)) { + $this->appConfig = config('App'); + } + + if (! $this->uri instanceof URI) { + $this->uri = Services::uri($this->appConfig->baseURL ?? 'http://example.com/', false); + } + + if (empty($this->request)) { + // Do some acrobatics so we can use the Request service with our own URI + $tempUri = Services::uri(); + Services::injectMock('uri', $this->uri); + + $this->withRequest(Services::request($this->appConfig, false)->setBody($this->body)); + + // Restore the URI service + Services::injectMock('uri', $tempUri); + } + + if (empty($this->response)) { + $this->response = Services::response($this->appConfig, false); + } + + if (empty($this->logger)) { + $this->logger = Services::logger(); + } + } + + /** + * Loads the specified controller, and generates any needed dependencies. + * + * @return mixed + */ + public function controller(string $name) + { + if (! class_exists($name)) { + throw new InvalidArgumentException('Invalid Controller: ' . $name); + } + + $this->controller = new $name(); + $this->controller->initController($this->request, $this->response, $this->logger); + + return $this; + } + + /** + * Runs the specified method on the controller and returns the results. + * + * @param array $params + * + * @throws InvalidArgumentException + * + * @return ControllerResponse + */ + public function execute(string $method, ...$params) + { + if (! method_exists($this->controller, $method) || ! is_callable([$this->controller, $method])) { + throw new InvalidArgumentException('Method does not exist or is not callable in controller: ' . $method); + } + + // The URL helper is always loaded by the system + // so ensure it's available. + helper('url'); + + $result = (new ControllerResponse()) + ->setRequest($this->request) + ->setResponse($this->response); + + $response = null; + + try { + ob_start(); + + $response = $this->controller->{$method}(...$params); + } catch (Throwable $e) { + $code = $e->getCode(); + + // If code is not a valid HTTP status then assume there is an error + if ($code < 100 || $code >= 600) { + throw $e; + } + + $result->response()->setStatusCode($code); + } finally { + $output = ob_get_clean(); + + // If the controller returned a response, use it + if (isset($response) && $response instanceof Response) { + $result->setResponse($response); + } + + // check if controller returned a view rather than echoing it + if (is_string($response)) { + $output = $response; + $result->response()->setBody($output); + $result->setBody($output); + } elseif (! empty($response) && ! empty($response->getBody())) { + $result->setBody($response->getBody()); + } else { + $result->setBody(''); + } + } + + // If not response code has been sent, assume a success + if (empty($result->response()->getStatusCode())) { + $result->response()->setStatusCode(200); + } + + return $result; + } + + /** + * Set controller's config, with method chaining. + * + * @param mixed $appConfig + * + * @return mixed + */ + public function withConfig($appConfig) + { + $this->appConfig = $appConfig; + + return $this; + } + + /** + * Set controller's request, with method chaining. + * + * @param mixed $request + * + * @return mixed + */ + public function withRequest($request) + { + $this->request = $request; + + // Make sure it's available for other classes + Services::injectMock('request', $request); + + return $this; + } + + /** + * Set controller's response, with method chaining. + * + * @param mixed $response + * + * @return mixed + */ + public function withResponse($response) + { + $this->response = $response; + + return $this; + } + + /** + * Set controller's logger, with method chaining. + * + * @param mixed $logger + * + * @return mixed + */ + public function withLogger($logger) + { + $this->logger = $logger; + + return $this; + } + + /** + * Set the controller's URI, with method chaining. + * + * @return mixed + */ + public function withUri(string $uri) + { + $this->uri = new URI($uri); + + return $this; + } + + /** + * Set the method's body, with method chaining. + * + * @param string|null $body + * + * @return mixed + */ + public function withBody($body) + { + $this->body = $body; + + return $this; + } +} diff --git a/system/Test/DOMParser.php b/system/Test/DOMParser.php new file mode 100644 index 0000000..531adf7 --- /dev/null +++ b/system/Test/DOMParser.php @@ -0,0 +1,283 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Test; + +use BadMethodCallException; +use DOMDocument; +use DOMNodeList; +use DOMXPath; +use InvalidArgumentException; + +/** + * Load a response into a DOMDocument for testing assertions based on that + */ +class DOMParser +{ + /** + * DOM for the body, + * + * @var DOMDocument + */ + protected $dom; + + /** + * Constructor. + * + * @throws BadMethodCallException + */ + public function __construct() + { + if (! extension_loaded('DOM')) { + // always there in travis-ci + // @codeCoverageIgnoreStart + throw new BadMethodCallException('DOM extension is required, but not currently loaded.'); + // @codeCoverageIgnoreEnd + } + + $this->dom = new DOMDocument('1.0', 'utf-8'); + } + + /** + * Returns the body of the current document. + */ + public function getBody(): string + { + return $this->dom->saveHTML(); + } + + /** + * Sets a string as the body that we want to work with. + * + * @return $this + */ + public function withString(string $content) + { + // converts all special characters to utf-8 + $content = mb_convert_encoding($content, 'HTML-ENTITIES', 'UTF-8'); + + // turning off some errors + libxml_use_internal_errors(true); + + if (! $this->dom->loadHTML($content)) { + // unclear how we would get here, given that we are trapping libxml errors + // @codeCoverageIgnoreStart + libxml_clear_errors(); + + throw new BadMethodCallException('Invalid HTML'); + // @codeCoverageIgnoreEnd + } + + // ignore the whitespace. + $this->dom->preserveWhiteSpace = false; + + return $this; + } + + /** + * Loads the contents of a file as a string + * so that we can work with it. + * + * @return DOMParser + */ + public function withFile(string $path) + { + if (! is_file($path)) { + throw new InvalidArgumentException(basename($path) . ' is not a valid file.'); + } + + $content = file_get_contents($path); + + return $this->withString($content); + } + + /** + * Checks to see if the text is found within the result. + * + * @param string $search + * @param string $element + */ + public function see(?string $search = null, ?string $element = null): bool + { + // If Element is null, we're just scanning for text + if ($element === null) { + $content = $this->dom->saveHTML($this->dom->documentElement); + + return mb_strpos($content, $search) !== false; + } + + $result = $this->doXPath($search, $element); + + return (bool) $result->length; + } + + /** + * Checks to see if the text is NOT found within the result. + * + * @param string $search + */ + public function dontSee(?string $search = null, ?string $element = null): bool + { + return ! $this->see($search, $element); + } + + /** + * Checks to see if an element with the matching CSS specifier + * is found within the current DOM. + */ + public function seeElement(string $element): bool + { + return $this->see(null, $element); + } + + /** + * Checks to see if the element is available within the result. + */ + public function dontSeeElement(string $element): bool + { + return $this->dontSee(null, $element); + } + + /** + * Determines if a link with the specified text is found + * within the results. + */ + public function seeLink(string $text, ?string $details = null): bool + { + return $this->see($text, 'a' . $details); + } + + /** + * Checks for an input named $field with a value of $value. + */ + public function seeInField(string $field, string $value): bool + { + $result = $this->doXPath(null, 'input', ["[@value=\"{$value}\"][@name=\"{$field}\"]"]); + + return (bool) $result->length; + } + + /** + * Checks for checkboxes that are currently checked. + */ + public function seeCheckboxIsChecked(string $element): bool + { + $result = $this->doXPath(null, 'input' . $element, [ + '[@type="checkbox"]', + '[@checked="checked"]', + ]); + + return (bool) $result->length; + } + + /** + * Search the DOM using an XPath expression. + * + * @return DOMNodeList + */ + protected function doXPath(?string $search, string $element, array $paths = []) + { + // Otherwise, grab any elements that match + // the selector + $selector = $this->parseSelector($element); + + $path = ''; + + // By ID + if (! empty($selector['id'])) { + $path = empty($selector['tag']) + ? "id(\"{$selector['id']}\")" + : "//{$selector['tag']}[@id=\"{$selector['id']}\"]"; + } + // By Class + elseif (! empty($selector['class'])) { + $path = empty($selector['tag']) + ? "//*[@class=\"{$selector['class']}\"]" + : "//{$selector['tag']}[@class=\"{$selector['class']}\"]"; + } + // By tag only + elseif (! empty($selector['tag'])) { + $path = "//{$selector['tag']}"; + } + + if (! empty($selector['attr'])) { + foreach ($selector['attr'] as $key => $value) { + $path .= "[@{$key}=\"{$value}\"]"; + } + } + + // $paths might contain a number of different + // ready to go xpath portions to tack on. + if (! empty($paths) && is_array($paths)) { + foreach ($paths as $extra) { + $path .= $extra; + } + } + + if ($search !== null) { + $path .= "[contains(., \"{$search}\")]"; + } + + $xpath = new DOMXPath($this->dom); + + return $xpath->query($path); + } + + /** + * Look for the a selector in the passed text. + * + * @return array + */ + public function parseSelector(string $selector) + { + $id = null; + $class = null; + $attr = null; + + // ID? + if (strpos($selector, '#') !== false) { + [$tag, $id] = explode('#', $selector); + } + // Attribute + elseif (strpos($selector, '[') !== false && strpos($selector, ']') !== false) { + $open = strpos($selector, '['); + $close = strpos($selector, ']'); + + $tag = substr($selector, 0, $open); + $text = substr($selector, $open + 1, $close - 2); + + // We only support a single attribute currently + $text = explode(',', $text); + $text = trim(array_shift($text)); + + [$name, $value] = explode('=', $text); + + $name = trim($name); + $value = trim($value); + $attr = [$name => trim($value, '] ')]; + } + // Class? + elseif (strpos($selector, '.') !== false) { + [$tag, $class] = explode('.', $selector); + } + // Otherwise, assume the entire string is our tag + else { + $tag = $selector; + } + + return [ + 'tag' => $tag, + 'id' => $id, + 'class' => $class, + 'attr' => $attr, + ]; + } +} diff --git a/system/Test/DatabaseTestTrait.php b/system/Test/DatabaseTestTrait.php new file mode 100644 index 0000000..d15a5fb --- /dev/null +++ b/system/Test/DatabaseTestTrait.php @@ -0,0 +1,326 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Test; + +use CodeIgniter\Database\BaseBuilder; +use CodeIgniter\Database\Exceptions\DatabaseException; +use CodeIgniter\Test\Constraints\SeeInDatabase; +use Config\Database; +use Config\Migrations; +use Config\Services; + +/** + * DatabaseTestTrait + * + * Provides functionality for refreshing/seeding + * the database during testing. + * + * @mixin CIUnitTestCase + */ +trait DatabaseTestTrait +{ + /** + * Is db migration done once or more than once? + * + * @var bool + */ + private static $doneMigration = false; + + /** + * Is seeding done once or more than once? + * + * @var bool + */ + private static $doneSeed = false; + + //-------------------------------------------------------------------- + // Staging + //-------------------------------------------------------------------- + + /** + * Runs the trait set up methods. + */ + protected function setUpDatabase() + { + $this->loadDependencies(); + $this->setUpMigrate(); + $this->setUpSeed(); + } + + /** + * Runs the trait set up methods. + */ + protected function tearDownDatabase() + { + $this->clearInsertCache(); + } + + /** + * Load any database test dependencies. + */ + public function loadDependencies() + { + if ($this->db === null) { + $this->db = Database::connect($this->DBGroup); + $this->db->initialize(); + } + + if ($this->migrations === null) { + // Ensure that we can run migrations + $config = new Migrations(); + $config->enabled = true; + + $this->migrations = Services::migrations($config, $this->db); + $this->migrations->setSilent(false); + } + + if ($this->seeder === null) { + $this->seeder = Database::seeder($this->DBGroup); + $this->seeder->setSilent(true); + } + } + + //-------------------------------------------------------------------- + // Migrations + //-------------------------------------------------------------------- + + /** + * Migrate on setUp + */ + protected function setUpMigrate() + { + if ($this->migrateOnce === false || self::$doneMigration === false) { + if ($this->refresh === true) { + $this->regressDatabase(); + + // Reset counts on faked items + Fabricator::resetCounts(); + } + + $this->migrateDatabase(); + } + } + + /** + * Regress migrations as defined by the class + */ + protected function regressDatabase() + { + if ($this->migrate === false) { + return; + } + + // If no namespace was specified then rollback all + if (empty($this->namespace)) { + $this->migrations->setNamespace(null); + $this->migrations->regress(0, 'tests'); + } + + // Regress each specified namespace + else { + $namespaces = is_array($this->namespace) ? $this->namespace : [$this->namespace]; + + foreach ($namespaces as $namespace) { + $this->migrations->setNamespace($namespace); + $this->migrations->regress(0, 'tests'); + } + } + } + + /** + * Run migrations as defined by the class + */ + protected function migrateDatabase() + { + if ($this->migrate === false) { + return; + } + + // If no namespace was specified then migrate all + if (empty($this->namespace)) { + $this->migrations->setNamespace(null); + $this->migrations->latest('tests'); + self::$doneMigration = true; + } + // Run migrations for each specified namespace + else { + $namespaces = is_array($this->namespace) ? $this->namespace : [$this->namespace]; + + foreach ($namespaces as $namespace) { + $this->migrations->setNamespace($namespace); + $this->migrations->latest('tests'); + self::$doneMigration = true; + } + } + } + + //-------------------------------------------------------------------- + // Seeds + //-------------------------------------------------------------------- + + /** + * Seed on setUp + */ + protected function setUpSeed() + { + if ($this->seedOnce === false || self::$doneSeed === false) { + $this->runSeeds(); + } + } + + /** + * Run seeds as defined by the class + */ + protected function runSeeds() + { + if (! empty($this->seed)) { + if (! empty($this->basePath)) { + $this->seeder->setPath(rtrim($this->basePath, '/') . '/Seeds'); + } + + $seeds = is_array($this->seed) ? $this->seed : [$this->seed]; + + foreach ($seeds as $seed) { + $this->seed($seed); + } + } + + self::$doneSeed = true; + } + + /** + * Seeds that database with a specific seeder. + */ + public function seed(string $name) + { + $this->seeder->call($name); + } + + //-------------------------------------------------------------------- + // Utility + //-------------------------------------------------------------------- + + /** + * Reset $doneMigration and $doneSeed + * + * @afterClass + */ + public static function resetMigrationSeedCount() + { + self::$doneMigration = false; + self::$doneSeed = false; + } + + /** + * Removes any rows inserted via $this->hasInDatabase() + */ + protected function clearInsertCache() + { + foreach ($this->insertCache as $row) { + $this->db->table($row[0]) + ->where($row[1]) + ->delete(); + } + } + + /** + * Loads the Builder class appropriate for the current database. + * + * @return BaseBuilder + */ + public function loadBuilder(string $tableName) + { + $builderClass = str_replace('Connection', 'Builder', get_class($this->db)); + + return new $builderClass($tableName, $this->db); + } + + /** + * Fetches a single column from a database row with criteria + * matching $where. + * + * @throws DatabaseException + * + * @return bool + */ + public function grabFromDatabase(string $table, string $column, array $where) + { + $query = $this->db->table($table) + ->select($column) + ->where($where) + ->get(); + + $query = $query->getRow(); + + return $query->{$column} ?? false; + } + + //-------------------------------------------------------------------- + // Assertions + //-------------------------------------------------------------------- + + /** + * Asserts that records that match the conditions in $where DO + * exist in the database. + * + * @throws DatabaseException + */ + public function seeInDatabase(string $table, array $where) + { + $constraint = new SeeInDatabase($this->db, $where); + static::assertThat($table, $constraint); + } + + /** + * Asserts that records that match the conditions in $where do + * not exist in the database. + */ + public function dontSeeInDatabase(string $table, array $where) + { + $count = $this->db->table($table) + ->where($where) + ->countAllResults(); + + $this->assertTrue($count === 0, 'Row was found in database'); + } + + /** + * Inserts a row into to the database. This row will be removed + * after the test has run. + * + * @return bool + */ + public function hasInDatabase(string $table, array $data) + { + $this->insertCache[] = [ + $table, + $data, + ]; + + return $this->db->table($table)->insert($data); + } + + /** + * Asserts that the number of rows in the database that match $where + * is equal to $expected. + * + * @throws DatabaseException + */ + public function seeNumRecords(int $expected, string $table, array $where) + { + $count = $this->db->table($table) + ->where($where) + ->countAllResults(); + + $this->assertEquals($expected, $count, 'Wrong number of matching rows in database.'); + } +} diff --git a/system/Test/Fabricator.php b/system/Test/Fabricator.php new file mode 100644 index 0000000..d436976 --- /dev/null +++ b/system/Test/Fabricator.php @@ -0,0 +1,542 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Test; + +use CodeIgniter\Exceptions\FrameworkException; +use CodeIgniter\Model; +use Faker\Factory; +use Faker\Generator; +use InvalidArgumentException; +use RuntimeException; + +/** + * Fabricator + * + * Bridge class for using Faker to create example data based on + * model specifications. + */ +class Fabricator +{ + /** + * Array of counts for fabricated items + * + * @var array + */ + protected static $tableCounts = []; + + /** + * Locale-specific Faker instance + * + * @var Generator + */ + protected $faker; + + /** + * Model instance (can be non-framework if it follows framework design) + * + * @var Model|object + */ + protected $model; + + /** + * Locale used to initialize Faker + * + * @var string + */ + protected $locale; + + /** + * Map of properties and their formatter to use + * + * @var array|null + */ + protected $formatters; + + /** + * Date fields present in the model + * + * @var array + */ + protected $dateFields = []; + + /** + * Array of data to add or override faked versions + * + * @var array + */ + protected $overrides = []; + + /** + * Array of single-use data to override faked versions + * + * @var array|null + */ + protected $tempOverrides; + + /** + * Default formatter to use when nothing is detected + * + * @var string + */ + public $defaultFormatter = 'word'; + + /** + * Store the model instance and initialize Faker to the locale. + * + * @param object|string $model Instance or classname of the model to use + * @param array|null $formatters Array of property => formatter + * @param string|null $locale Locale for Faker provider + * + * @throws InvalidArgumentException + */ + public function __construct($model, ?array $formatters = null, ?string $locale = null) + { + if (is_string($model)) { + // Create a new model instance + $model = model($model, false); + } + + if (! is_object($model)) { + throw new InvalidArgumentException(lang('Fabricator.invalidModel')); + } + + $this->model = $model; + + // If no locale was specified then use the App default + if ($locale === null) { + $locale = config('App')->defaultLocale; + } + + // There is no easy way to retrieve the locale from Faker so we will store it + $this->locale = $locale; + + // Create the locale-specific Generator + $this->faker = Factory::create($this->locale); + + // Determine eligible date fields + foreach (['createdField', 'updatedField', 'deletedField'] as $field) { + if (! empty($this->model->{$field})) { + $this->dateFields[] = $this->model->{$field}; + } + } + + // Set the formatters + $this->setFormatters($formatters); + } + + /** + * Reset internal counts + */ + public static function resetCounts() + { + self::$tableCounts = []; + } + + /** + * Get the count for a specific table + * + * @param string $table Name of the target table + */ + public static function getCount(string $table): int + { + return empty(self::$tableCounts[$table]) ? 0 : self::$tableCounts[$table]; + } + + /** + * Set the count for a specific table + * + * @param string $table Name of the target table + * @param int $count Count value + * + * @return int The new count value + */ + public static function setCount(string $table, int $count): int + { + self::$tableCounts[$table] = $count; + + return $count; + } + + /** + * Increment the count for a table + * + * @param string $table Name of the target table + * + * @return int The new count value + */ + public static function upCount(string $table): int + { + return self::setCount($table, self::getCount($table) + 1); + } + + /** + * Decrement the count for a table + * + * @param string $table Name of the target table + * + * @return int The new count value + */ + public static function downCount(string $table): int + { + return self::setCount($table, self::getCount($table) - 1); + } + + /** + * Returns the model instance + * + * @return object Framework or compatible model + */ + public function getModel() + { + return $this->model; + } + + /** + * Returns the locale + */ + public function getLocale(): string + { + return $this->locale; + } + + /** + * Returns the Faker generator + */ + public function getFaker(): Generator + { + return $this->faker; + } + + /** + * Return and reset tempOverrides + */ + public function getOverrides(): array + { + $overrides = $this->tempOverrides ?? $this->overrides; + + $this->tempOverrides = $this->overrides; + + return $overrides; + } + + /** + * Set the overrides, once or persistent + * + * @param array $overrides Array of [field => value] + * @param bool $persist Whether these overrides should persist through the next operation + */ + public function setOverrides(array $overrides = [], $persist = true): self + { + if ($persist) { + $this->overrides = $overrides; + } + + $this->tempOverrides = $overrides; + + return $this; + } + + /** + * Returns the current formatters + */ + public function getFormatters(): ?array + { + return $this->formatters; + } + + /** + * Set the formatters to use. Will attempt to autodetect if none are available. + * + * @param array|null $formatters Array of [field => formatter], or null to detect + */ + public function setFormatters(?array $formatters = null): self + { + if ($formatters !== null) { + $this->formatters = $formatters; + } elseif (method_exists($this->model, 'fake')) { + $this->formatters = null; + } else { + $this->detectFormatters(); + } + + return $this; + } + + /** + * Try to identify the appropriate Faker formatter for each field. + */ + protected function detectFormatters(): self + { + $this->formatters = []; + + if (! empty($this->model->allowedFields)) { + foreach ($this->model->allowedFields as $field) { + $this->formatters[$field] = $this->guessFormatter($field); + } + } + + return $this; + } + + /** + * Guess at the correct formatter to match a field name. + * + * @param string $field Name of the field + * + * @return string Name of the formatter + */ + protected function guessFormatter($field): string + { + // First check for a Faker formatter of the same name - covers things like "email" + try { + $this->faker->getFormatter($field); + + return $field; + } catch (InvalidArgumentException $e) { + // No match, keep going + } + + // Next look for known model fields + if (in_array($field, $this->dateFields, true)) { + switch ($this->model->dateFormat) { + case 'datetime': + case 'date': + return 'date'; + + case 'int': + return 'unixTime'; + } + } elseif ($field === $this->model->primaryKey) { + return 'numberBetween'; + } + + // Check some common partials + foreach (['email', 'name', 'title', 'text', 'date', 'url'] as $term) { + if (stripos($field, $term) !== false) { + return $term; + } + } + + if (stripos($field, 'phone') !== false) { + return 'phoneNumber'; + } + + // Nothing left, use the default + return $this->defaultFormatter; + } + + /** + * Generate new entities with faked data + * + * @param int|null $count Optional number to create a collection + * + * @return array|object An array or object (based on returnType), or an array of returnTypes + */ + public function make(?int $count = null) + { + // If a singleton was requested then go straight to it + if ($count === null) { + return $this->model->returnType === 'array' + ? $this->makeArray() + : $this->makeObject(); + } + + $return = []; + + for ($i = 0; $i < $count; $i++) { + $return[] = $this->model->returnType === 'array' + ? $this->makeArray() + : $this->makeObject(); + } + + return $return; + } + + /** + * Generate an array of faked data + * + * @throws RuntimeException + * + * @return array An array of faked data + */ + public function makeArray() + { + if ($this->formatters !== null) { + $result = []; + + foreach ($this->formatters as $field => $formatter) { + $result[$field] = $this->faker->{$formatter}; + } + } + // If no formatters were defined then look for a model fake() method + elseif (method_exists($this->model, 'fake')) { + $result = $this->model->fake($this->faker); + + $result = is_object($result) && method_exists($result, 'toArray') + // This should cover entities + ? $result->toArray() + // Try to cast it + : (array) $result; + } + // Nothing left to do but give up + else { + throw new RuntimeException(lang('Fabricator.missingFormatters')); + } + + // Replace overridden fields + return array_merge($result, $this->getOverrides()); + } + + /** + * Generate an object of faked data + * + * @param string|null $className Class name of the object to create; null to use model default + * + * @throws RuntimeException + * + * @return object An instance of the class with faked data + */ + public function makeObject(?string $className = null): object + { + if ($className === null) { + if ($this->model->returnType === 'object' || $this->model->returnType === 'array') { + $className = 'stdClass'; + } else { + $className = $this->model->returnType; + } + } + + // If using the model's fake() method then check it for the correct return type + if ($this->formatters === null && method_exists($this->model, 'fake')) { + $result = $this->model->fake($this->faker); + + if ($result instanceof $className) { + // Set overrides manually + foreach ($this->getOverrides() as $key => $value) { + $result->{$key} = $value; + } + + return $result; + } + } + + // Get the array values and apply them to the object + $array = $this->makeArray(); + $object = new $className(); + + // Check for the entity method + if (method_exists($object, 'fill')) { + $object->fill($array); + } else { + foreach ($array as $key => $value) { + $object->{$key} = $value; + } + } + + return $object; + } + + /** + * Generate new entities from the database + * + * @param int|null $count Optional number to create a collection + * @param bool $mock Whether to execute or mock the insertion + * + * @throws FrameworkException + * + * @return array|object An array or object (based on returnType), or an array of returnTypes + */ + public function create(?int $count = null, bool $mock = false) + { + // Intercept mock requests + if ($mock) { + return $this->createMock($count); + } + + $ids = []; + + // Iterate over new entities and insert each one, storing insert IDs + foreach ($this->make($count ?? 1) as $result) { + if ($id = $this->model->insert($result, true)) { + $ids[] = $id; + self::upCount($this->model->table); + + continue; + } + + throw FrameworkException::forFabricatorCreateFailed($this->model->table, implode(' ', $this->model->errors() ?? [])); + } + + // If the model defines a "withDeleted" method for handling soft deletes then use it + if (method_exists($this->model, 'withDeleted')) { + $this->model->withDeleted(); + } + + return $this->model->find($count === null ? reset($ids) : $ids); + } + + /** + * Generate new database entities without actually inserting them + * + * @param int|null $count Optional number to create a collection + * + * @return array|object An array or object (based on returnType), or an array of returnTypes + */ + protected function createMock(?int $count = null) + { + switch ($this->model->dateFormat) { + case 'datetime': + $datetime = date('Y-m-d H:i:s'); + break; + + case 'date': + $datetime = date('Y-m-d'); + break; + + default: + $datetime = time(); + } + + // Determine which fields we will need + $fields = []; + + if (! empty($this->model->useTimestamps)) { + $fields[$this->model->createdField] = $datetime; + $fields[$this->model->updatedField] = $datetime; + } + + if (! empty($this->model->useSoftDeletes)) { + $fields[$this->model->deletedField] = null; + } + + // Iterate over new entities and add the necessary fields + $return = []; + + foreach ($this->make($count ?? 1) as $i => $result) { + // Set the ID + $fields[$this->model->primaryKey] = $i; + + // Merge fields + if (is_array($result)) { + $result = array_merge($result, $fields); + } else { + foreach ($fields as $key => $value) { + $result->{$key} = $value; + } + } + + $return[] = $result; + } + + return $count === null ? reset($return) : $return; + } +} diff --git a/system/Test/FeatureResponse.php b/system/Test/FeatureResponse.php new file mode 100644 index 0000000..971f41c --- /dev/null +++ b/system/Test/FeatureResponse.php @@ -0,0 +1,25 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Test; + +/** + * Assertions for a response + * + * @deprecated Use TestResponse directly + */ +class FeatureResponse extends TestResponse +{ + /** + * @deprecated Will be protected in a future release, use response() instead + */ + public $response; +} diff --git a/system/Test/FeatureTestCase.php b/system/Test/FeatureTestCase.php new file mode 100644 index 0000000..d1a75ed --- /dev/null +++ b/system/Test/FeatureTestCase.php @@ -0,0 +1,401 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Test; + +use CodeIgniter\Events\Events; +use CodeIgniter\HTTP\IncomingRequest; +use CodeIgniter\HTTP\Request; +use CodeIgniter\HTTP\URI; +use CodeIgniter\HTTP\UserAgent; +use CodeIgniter\Router\Exceptions\RedirectException; +use CodeIgniter\Router\RouteCollection; +use Config\App; +use Config\Services; +use Exception; +use ReflectionException; + +/** + * Class FeatureTestCase + * + * Provides a base class with the trait for doing full HTTP testing + * against your application. + * + * @no-final + * + * @deprecated Use FeatureTestTrait instead + * + * @codeCoverageIgnore + * + * @internal + */ +class FeatureTestCase extends CIUnitTestCase +{ + use DatabaseTestTrait; + + /** + * Sets a RouteCollection that will override + * the application's route collection. + * + * Example routes: + * [ + * ['get', 'home', 'Home::index'] + * ] + * + * @param array $routes + * + * @return $this + */ + protected function withRoutes(?array $routes = null) + { + $collection = Services::routes(); + + if ($routes) { + $collection->resetRoutes(); + + foreach ($routes as $route) { + $collection->{$route[0]}($route[1], $route[2]); + } + } + + $this->routes = $collection; + + return $this; + } + + /** + * Sets any values that should exist during this session. + * + * @param array|null $values Array of values, or null to use the current $_SESSION + * + * @return $this + */ + public function withSession(?array $values = null) + { + $this->session = $values ?? $_SESSION; + + return $this; + } + + /** + * Set request's headers + * + * Example of use + * withHeaders([ + * 'Authorization' => 'Token' + * ]) + * + * @param array $headers Array of headers + * + * @return $this + */ + public function withHeaders(array $headers = []) + { + $this->headers = $headers; + + return $this; + } + + /** + * Set the format the request's body should have. + * + * @param string $format The desired format. Currently supported formats: xml, json + * + * @return $this + */ + public function withBodyFormat(string $format) + { + $this->bodyFormat = $format; + + return $this; + } + + /** + * Set the raw body for the request + * + * @param mixed $body + * + * @return $this + */ + public function withBody($body) + { + $this->requestBody = $body; + + return $this; + } + + /** + * Don't run any events while running this test. + * + * @return $this + */ + public function skipEvents() + { + Events::simulate(true); + + return $this; + } + + /** + * Calls a single URI, executes it, and returns a FeatureResponse + * instance that can be used to run many assertions against. + * + * @throws Exception + * @throws RedirectException + * + * @return FeatureResponse + */ + public function call(string $method, string $path, ?array $params = null) + { + $buffer = \ob_get_level(); + + // Clean up any open output buffers + // not relevant to unit testing + // @codeCoverageIgnoreStart + if (\ob_get_level() > 0 && (! isset($this->clean) || $this->clean === true)) { + \ob_end_clean(); + } + // @codeCoverageIgnoreEnd + + // Simulate having a blank session + $_SESSION = []; + $_SERVER['REQUEST_METHOD'] = $method; + + $request = $this->setupRequest($method, $path); + $request = $this->setupHeaders($request); + $request = $this->populateGlobals($method, $request, $params); + $request = $this->setRequestBody($request); + + // Initialize the RouteCollection + if (! $routes = $this->routes) { + require APPPATH . 'Config/Routes.php'; + + /** + * @var RouteCollection $routes + */ + $routes->getRoutes('*'); + } + + $routes->setHTTPVerb($method); + + // Make sure any other classes that might call the request + // instance get the right one. + Services::injectMock('request', $request); + + // Make sure filters are reset between tests + Services::injectMock('filters', Services::filters(null, false)); + + $response = $this->app + ->setRequest($request) + ->run($routes, true); + + $output = \ob_get_contents(); + if (empty($response->getBody()) && ! empty($output)) { + $response->setBody($output); + } + + // Reset directory if it has been set + Services::router()->setDirectory(null); + + // Ensure the output buffer is identical so no tests are risky + // @codeCoverageIgnoreStart + while (\ob_get_level() > $buffer) { + \ob_end_clean(); + } + + while (\ob_get_level() < $buffer) { + \ob_start(); + } + // @codeCoverageIgnoreEnd + + return new FeatureResponse($response); + } + + /** + * Performs a GET request. + * + * @throws Exception + * @throws RedirectException + * + * @return FeatureResponse + */ + public function get(string $path, ?array $params = null) + { + return $this->call('get', $path, $params); + } + + /** + * Performs a POST request. + * + * @throws Exception + * @throws RedirectException + * + * @return FeatureResponse + */ + public function post(string $path, ?array $params = null) + { + return $this->call('post', $path, $params); + } + + /** + * Performs a PUT request + * + * @throws Exception + * @throws RedirectException + * + * @return FeatureResponse + */ + public function put(string $path, ?array $params = null) + { + return $this->call('put', $path, $params); + } + + /** + * Performss a PATCH request + * + * @throws Exception + * @throws RedirectException + * + * @return FeatureResponse + */ + public function patch(string $path, ?array $params = null) + { + return $this->call('patch', $path, $params); + } + + /** + * Performs a DELETE request. + * + * @throws Exception + * @throws RedirectException + * + * @return FeatureResponse + */ + public function delete(string $path, ?array $params = null) + { + return $this->call('delete', $path, $params); + } + + /** + * Performs an OPTIONS request. + * + * @throws Exception + * @throws RedirectException + * + * @return FeatureResponse + */ + public function options(string $path, ?array $params = null) + { + return $this->call('options', $path, $params); + } + + /** + * Setup a Request object to use so that CodeIgniter + * won't try to auto-populate some of the items. + */ + protected function setupRequest(string $method, ?string $path = null): IncomingRequest + { + $config = config(App::class); + $uri = new URI(rtrim($config->baseURL, '/') . '/' . trim($path, '/ ')); + + $request = new IncomingRequest($config, clone $uri, null, new UserAgent()); + $request->uri = $uri; + + $request->setMethod($method); + $request->setProtocolVersion('1.1'); + + if ($config->forceGlobalSecureRequests) { + $_SERVER['HTTPS'] = 'test'; + } + + return $request; + } + + /** + * Setup the custom request's headers + * + * @return IncomingRequest + */ + protected function setupHeaders(IncomingRequest $request) + { + foreach ($this->headers as $name => $value) { + $request->setHeader($name, $value); + } + + return $request; + } + + /** + * Populates the data of our Request with "global" data + * relevant to the request, like $_POST data. + * + * Always populate the GET vars based on the URI. + * + * @throws ReflectionException + * + * @return Request + */ + protected function populateGlobals(string $method, Request $request, ?array $params = null) + { + // $params should set the query vars if present, + // otherwise set it from the URL. + $get = ! empty($params) && $method === 'get' + ? $params + : $this->getPrivateProperty($request->uri, 'query'); + + $request->setGlobal('get', $get); + if ($method !== 'get') { + $request->setGlobal($method, $params); + } + + $request->setGlobal('request', $params); + + $_SESSION = $this->session ?? []; + + return $request; + } + + /** + * Set the request's body formatted according to the value in $this->bodyFormat. + * This allows the body to be formatted in a way that the controller is going to + * expect as in the case of testing a JSON or XML API. + * + * @param array|null $params The parameters to be formatted and put in the body. If this is empty, it will get the + * what has been loaded into the request global of the request class. + */ + protected function setRequestBody(Request $request, ?array $params = null): Request + { + if (isset($this->requestBody) && $this->requestBody !== '') { + $request->setBody($this->requestBody); + + return $request; + } + + if (isset($this->bodyFormat) && $this->bodyFormat !== '') { + if (empty($params)) { + $params = $request->fetchGlobal('request'); + } + $formatMime = ''; + if ($this->bodyFormat === 'json') { + $formatMime = 'application/json'; + } elseif ($this->bodyFormat === 'xml') { + $formatMime = 'application/xml'; + } + if (! empty($formatMime) && ! empty($params)) { + $formatted = Services::format()->getFormatter($formatMime)->format($params); + $request->setBody($formatted); + $request->setHeader('Content-Type', $formatMime); + } + } + + return $request; + } +} diff --git a/system/Test/FeatureTestTrait.php b/system/Test/FeatureTestTrait.php new file mode 100644 index 0000000..afb9337 --- /dev/null +++ b/system/Test/FeatureTestTrait.php @@ -0,0 +1,396 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Test; + +use CodeIgniter\Events\Events; +use CodeIgniter\HTTP\IncomingRequest; +use CodeIgniter\HTTP\Request; +use CodeIgniter\HTTP\URI; +use CodeIgniter\HTTP\UserAgent; +use CodeIgniter\Router\Exceptions\RedirectException; +use CodeIgniter\Router\RouteCollection; +use Config\App; +use Config\Services; +use Exception; +use ReflectionException; + +/** + * Trait FeatureTestTrait + * + * Provides additional utilities for doing full HTTP testing + * against your application in trait format. + */ +trait FeatureTestTrait +{ + /** + * Sets a RouteCollection that will override + * the application's route collection. + * + * Example routes: + * [ + * ['get', 'home', 'Home::index'] + * ] + * + * @param array $routes + * + * @return $this + */ + protected function withRoutes(?array $routes = null) + { + $collection = Services::routes(); + + if ($routes) { + $collection->resetRoutes(); + + foreach ($routes as $route) { + $collection->{$route[0]}($route[1], $route[2]); + } + } + + $this->routes = $collection; + + return $this; + } + + /** + * Sets any values that should exist during this session. + * + * @param array|null $values Array of values, or null to use the current $_SESSION + * + * @return $this + */ + public function withSession(?array $values = null) + { + $this->session = $values ?? $_SESSION; + + return $this; + } + + /** + * Set request's headers + * + * Example of use + * withHeaders([ + * 'Authorization' => 'Token' + * ]) + * + * @param array $headers Array of headers + * + * @return $this + */ + public function withHeaders(array $headers = []) + { + $this->headers = $headers; + + return $this; + } + + /** + * Set the format the request's body should have. + * + * @param string $format The desired format. Currently supported formats: xml, json + * + * @return $this + */ + public function withBodyFormat(string $format) + { + $this->bodyFormat = $format; + + return $this; + } + + /** + * Set the raw body for the request + * + * @param mixed $body + * + * @return $this + */ + public function withBody($body) + { + $this->requestBody = $body; + + return $this; + } + + /** + * Don't run any events while running this test. + * + * @return $this + */ + public function skipEvents() + { + Events::simulate(true); + + return $this; + } + + /** + * Calls a single URI, executes it, and returns a TestResponse + * instance that can be used to run many assertions against. + * + * @throws RedirectException + * @throws Exception + * + * @return TestResponse + */ + public function call(string $method, string $path, ?array $params = null) + { + $buffer = \ob_get_level(); + + // Clean up any open output buffers + // not relevant to unit testing + // @codeCoverageIgnoreStart + if (\ob_get_level() > 0 && (! isset($this->clean) || $this->clean === true)) { + \ob_end_clean(); + } + // @codeCoverageIgnoreEnd + + // Simulate having a blank session + $_SESSION = []; + $_SERVER['REQUEST_METHOD'] = $method; + + $request = $this->setupRequest($method, $path); + $request = $this->setupHeaders($request); + $request = $this->populateGlobals($method, $request, $params); + $request = $this->setRequestBody($request); + + // Initialize the RouteCollection + if (! $routes = $this->routes) { + require APPPATH . 'Config/Routes.php'; + + /** + * @var RouteCollection $routes + */ + $routes->getRoutes('*'); + } + + $routes->setHTTPVerb($method); + + // Make sure any other classes that might call the request + // instance get the right one. + Services::injectMock('request', $request); + + // Make sure filters are reset between tests + Services::injectMock('filters', Services::filters(null, false)); + + $response = $this->app + ->setRequest($request) + ->run($routes, true); + + $output = \ob_get_contents(); + if (empty($response->getBody()) && ! empty($output)) { + $response->setBody($output); + } + + // Reset directory if it has been set + Services::router()->setDirectory(null); + + // Ensure the output buffer is identical so no tests are risky + // @codeCoverageIgnoreStart + while (\ob_get_level() > $buffer) { + \ob_end_clean(); + } + + while (\ob_get_level() < $buffer) { + \ob_start(); + } + // @codeCoverageIgnoreEnd + + return new TestResponse($response); + } + + /** + * Performs a GET request. + * + * @throws RedirectException + * @throws Exception + * + * @return TestResponse + */ + public function get(string $path, ?array $params = null) + { + return $this->call('get', $path, $params); + } + + /** + * Performs a POST request. + * + * @throws RedirectException + * @throws Exception + * + * @return TestResponse + */ + public function post(string $path, ?array $params = null) + { + return $this->call('post', $path, $params); + } + + /** + * Performs a PUT request + * + * @throws RedirectException + * @throws Exception + * + * @return TestResponse + */ + public function put(string $path, ?array $params = null) + { + return $this->call('put', $path, $params); + } + + /** + * Performss a PATCH request + * + * @throws RedirectException + * @throws Exception + * + * @return TestResponse + */ + public function patch(string $path, ?array $params = null) + { + return $this->call('patch', $path, $params); + } + + /** + * Performs a DELETE request. + * + * @throws RedirectException + * @throws Exception + * + * @return TestResponse + */ + public function delete(string $path, ?array $params = null) + { + return $this->call('delete', $path, $params); + } + + /** + * Performs an OPTIONS request. + * + * @throws RedirectException + * @throws Exception + * + * @return TestResponse + */ + public function options(string $path, ?array $params = null) + { + return $this->call('options', $path, $params); + } + + /** + * Setup a Request object to use so that CodeIgniter + * won't try to auto-populate some of the items. + */ + protected function setupRequest(string $method, ?string $path = null): IncomingRequest + { + $path = URI::removeDotSegments($path); + $config = config(App::class); + $request = new IncomingRequest($config, new URI(), null, new UserAgent()); + + // $path may have a query in it + $parts = explode('?', $path); + $_SERVER['QUERY_STRING'] = $parts[1] ?? ''; + + $request->setPath($parts[0]); + $request->setMethod($method); + $request->setProtocolVersion('1.1'); + + if ($config->forceGlobalSecureRequests) { + $_SERVER['HTTPS'] = 'test'; + } + + return $request; + } + + /** + * Setup the custom request's headers + * + * @return IncomingRequest + */ + protected function setupHeaders(IncomingRequest $request) + { + if (! empty($this->headers)) { + foreach ($this->headers as $name => $value) { + $request->setHeader($name, $value); + } + } + + return $request; + } + + /** + * Populates the data of our Request with "global" data + * relevant to the request, like $_POST data. + * + * Always populate the GET vars based on the URI. + * + * @throws ReflectionException + * + * @return Request + */ + protected function populateGlobals(string $method, Request $request, ?array $params = null) + { + // $params should set the query vars if present, + // otherwise set it from the URL. + $get = ! empty($params) && $method === 'get' + ? $params + : $this->getPrivateProperty($request->uri, 'query'); + + $request->setGlobal('get', $get); + if ($method !== 'get') { + $request->setGlobal($method, $params); + } + + $request->setGlobal('request', $params); + + $_SESSION = $this->session ?? []; + + return $request; + } + + /** + * Set the request's body formatted according to the value in $this->bodyFormat. + * This allows the body to be formatted in a way that the controller is going to + * expect as in the case of testing a JSON or XML API. + * + * @param array|null $params The parameters to be formatted and put in the body. If this is empty, it will get the + * what has been loaded into the request global of the request class. + */ + protected function setRequestBody(Request $request, ?array $params = null): Request + { + if (isset($this->requestBody) && $this->requestBody !== '') { + $request->setBody($this->requestBody); + + return $request; + } + + if (isset($this->bodyFormat) && $this->bodyFormat !== '') { + if (empty($params)) { + $params = $request->fetchGlobal('request'); + } + $formatMime = ''; + if ($this->bodyFormat === 'json') { + $formatMime = 'application/json'; + } elseif ($this->bodyFormat === 'xml') { + $formatMime = 'application/xml'; + } + if (! empty($formatMime) && ! empty($params)) { + $formatted = Services::format()->getFormatter($formatMime)->format($params); + $request->setBody($formatted); + $request->setHeader('Content-Type', $formatMime); + } + } + + return $request; + } +} diff --git a/system/Test/FilterTestTrait.php b/system/Test/FilterTestTrait.php new file mode 100644 index 0000000..680515e --- /dev/null +++ b/system/Test/FilterTestTrait.php @@ -0,0 +1,270 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Test; + +use Closure; +use CodeIgniter\Filters\Exceptions\FilterException; +use CodeIgniter\Filters\FilterInterface; +use CodeIgniter\Filters\Filters; +use CodeIgniter\HTTP\RequestInterface; +use CodeIgniter\HTTP\ResponseInterface; +use CodeIgniter\Router\RouteCollection; +use Config\Filters as FiltersConfig; +use Config\Services; +use InvalidArgumentException; +use RuntimeException; + +/** + * Filter Test Trait + * + * Provides functionality for testing + * filters and their route associations. + * + * @mixin CIUnitTestCase + */ +trait FilterTestTrait +{ + /** + * Have the one-time classes been instantiated? + * + * @var bool + */ + private $doneFilterSetUp = false; + + /** + * The active IncomingRequest or CLIRequest + * + * @var RequestInterface + */ + protected $request; + + /** + * The active Response instance + * + * @var ResponseInterface + */ + protected $response; + + /** + * The Filters configuration to use. + * Extracted for access to aliases + * during Filters::discoverFilters(). + * + * @var FiltersConfig|null + */ + protected $filtersConfig; + + /** + * The prepared Filters library. + * + * @var Filters|null + */ + protected $filters; + + /** + * The default App and discovered + * routes to check for filters. + * + * @var RouteCollection|null + */ + protected $collection; + + //-------------------------------------------------------------------- + // Staging + //-------------------------------------------------------------------- + + /** + * Initializes dependencies once. + */ + protected function setUpFilterTestTrait(): void + { + if ($this->doneFilterSetUp === true) { + return; + } + + // Create our own Request and Response so we can + // use the same ones for Filters and FilterInterface + // yet isolate them from outside influence + $this->request = $this->request ?? clone Services::request(); + $this->response = $this->response ?? clone Services::response(); + + // Create our config and Filters instance to reuse for performance + $this->filtersConfig = $this->filtersConfig ?? config('Filters'); + $this->filters = $this->filters ?? new Filters($this->filtersConfig, $this->request, $this->response); + + if ($this->collection === null) { + // Load the RouteCollection from Config to gather App route info + // (creates $routes using the Service as a starting point) + require APPPATH . 'Config/Routes.php'; + + $routes->getRoutes('*'); // Triggers discovery + $this->collection = $routes; + } + + $this->doneFilterSetUp = true; + } + + //-------------------------------------------------------------------- + // Utility + //-------------------------------------------------------------------- + + /** + * Returns a callable method for a filter position + * using the local HTTP instances. + * + * @param FilterInterface|string $filter The filter instance, class, or alias + * @param string $position "before" or "after" + */ + protected function getFilterCaller($filter, string $position): Closure + { + if (! in_array($position, ['before', 'after'], true)) { + throw new InvalidArgumentException('Invalid filter position passed: ' . $position); + } + + if (is_string($filter)) { + // Check for an alias (no namespace) + if (strpos($filter, '\\') === false) { + if (! isset($this->filtersConfig->aliases[$filter])) { + throw new RuntimeException("No filter found with alias '{$filter}'"); + } + + $filter = $this->filtersConfig->aliases[$filter]; + } + + // Get an instance + $filter = new $filter(); + } + + if (! $filter instanceof FilterInterface) { + throw FilterException::forIncorrectInterface(get_class($filter)); + } + + $request = clone $this->request; + + if ($position === 'before') { + return static function (?array $params = null) use ($filter, $request) { + return $filter->before($request, $params); + }; + } + + $response = clone $this->response; + + return static function (?array $params = null) use ($filter, $request, $response) { + return $filter->after($request, $response, $params); + }; + } + + /** + * Gets an array of filter aliases enabled + * for the given route at position. + * + * @param string $route The route to test + * @param string $position "before" or "after" + * + * @return string[] The filter aliases + */ + protected function getFiltersForRoute(string $route, string $position): array + { + if (! in_array($position, ['before', 'after'], true)) { + throw new InvalidArgumentException('Invalid filter position passed:' . $position); + } + + $this->filters->reset(); + + if ($routeFilter = $this->collection->getFilterForRoute($route)) { + $this->filters->enableFilter($routeFilter, $position); + } + + $aliases = $this->filters->initialize($route)->getFilters(); + + $this->filters->reset(); + + return $aliases[$position]; + } + + //-------------------------------------------------------------------- + // Assertions + //-------------------------------------------------------------------- + + /** + * Asserts that the given route at position uses + * the filter (by its alias). + * + * @param string $route The route to test + * @param string $position "before" or "after" + * @param string $alias Alias for the anticipated filter + */ + protected function assertFilter(string $route, string $position, string $alias): void + { + $filters = $this->getFiltersForRoute($route, $position); + + $this->assertContains( + $alias, + $filters, + "Filter '{$alias}' does not apply to '{$route}'.", + ); + } + + /** + * Asserts that the given route at position does not + * use the filter (by its alias). + * + * @param string $route The route to test + * @param string $position "before" or "after" + * @param string $alias Alias for the anticipated filter + */ + protected function assertNotFilter(string $route, string $position, string $alias) + { + $filters = $this->getFiltersForRoute($route, $position); + + $this->assertNotContains( + $alias, + $filters, + "Filter '{$alias}' applies to '{$route}' when it should not.", + ); + } + + /** + * Asserts that the given route at position has + * at least one filter set. + * + * @param string $route The route to test + * @param string $position "before" or "after" + */ + protected function assertHasFilters(string $route, string $position) + { + $filters = $this->getFiltersForRoute($route, $position); + + $this->assertNotEmpty( + $filters, + "No filters found for '{$route}' when at least one was expected.", + ); + } + + /** + * Asserts that the given route at position has + * no filters set. + * + * @param string $route The route to test + * @param string $position "before" or "after" + */ + protected function assertNotHasFilters(string $route, string $position) + { + $filters = $this->getFiltersForRoute($route, $position); + + $this->assertSame( + [], + $filters, + "Found filters for '{$route}' when none were expected: " . implode(', ', $filters) . '.', + ); + } +} diff --git a/system/Test/Filters/CITestStreamFilter.php b/system/Test/Filters/CITestStreamFilter.php new file mode 100644 index 0000000..46e895a --- /dev/null +++ b/system/Test/Filters/CITestStreamFilter.php @@ -0,0 +1,50 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Test\Filters; + +use php_user_filter; + +/** + * Used to capture output during unit testing, so that it can + * be used in assertions. + */ +class CITestStreamFilter extends php_user_filter +{ + /** + * Buffer to capture stream content. + * + * @var string + */ + public static $buffer = ''; + + /** + * This method is called whenever data is read from or written to the + * attached stream (such as with fread() or fwrite()). + * + * @param resource $in + * @param resource $out + * @param int $consumed + * @param bool $closing + */ + public function filter($in, $out, &$consumed, $closing): int + { + while ($bucket = stream_bucket_make_writeable($in)) { + static::$buffer .= $bucket->data; + + $consumed += $bucket->datalen; + } + + return PSFS_PASS_ON; + } +} + +stream_filter_register('CITestStreamFilter', CITestStreamFilter::class); // @codeCoverageIgnore diff --git a/system/Test/Interfaces/FabricatorModel.php b/system/Test/Interfaces/FabricatorModel.php new file mode 100644 index 0000000..08cf5a1 --- /dev/null +++ b/system/Test/Interfaces/FabricatorModel.php @@ -0,0 +1,84 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Test\Interfaces; + +use Faker\Generator; +use ReflectionException; + +/** + * FabricatorModel + * + * An interface defining the required methods and properties + * needed for a model to qualify for use with the Fabricator class. + * While interfaces cannot enforce properties, the following + * are required for use with Fabricator: + * + * @property string $returnType + * @property string $primaryKey + * @property string $dateFormat + */ +interface FabricatorModel +{ + /** + * Fetches the row of database from $this->table with a primary key + * matching $id. + * + * @param array|mixed|null $id One primary key or an array of primary keys + * + * @return array|object|null The resulting row of data, or null. + */ + public function find($id = null); + + /** + * Inserts data into the current table. If an object is provided, + * it will attempt to convert it to an array. + * + * @param array|object $data + * @param bool $returnID Whether insert ID should be returned or not. + * + * @throws ReflectionException + * + * @return bool|int|string + */ + public function insert($data = null, bool $returnID = true); + + /** + * The following properties and methods are optional, but if present should + * adhere to their definitions. + * + * @property array $allowedFields + * @property string $useSoftDeletes + * @property string $useTimestamps + * @property string $createdField + * @property string $updatedField + * @property string $deletedField + */ + + /* + * Sets $useSoftDeletes value so that we can temporarily override + * the softdeletes settings. Can be used for all find* methods. + * + * @param boolean $val + * + * @return Model + */ + // public function withDeleted($val = true); + + /** + * Faked data for Fabricator. + * + * @param Generator $faker + * + * @return array|object + */ + // public function fake(Generator &$faker); +} diff --git a/system/Test/Mock/MockAppConfig.php b/system/Test/Mock/MockAppConfig.php new file mode 100644 index 0000000..15aff95 --- /dev/null +++ b/system/Test/Mock/MockAppConfig.php @@ -0,0 +1,42 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Test\Mock; + +use Config\App; + +class MockAppConfig extends App +{ + public $baseURL = 'http://example.com/'; + public $uriProtocol = 'REQUEST_URI'; + public $cookiePrefix = ''; + public $cookieDomain = ''; + public $cookiePath = '/'; + public $cookieSecure = false; + public $cookieHTTPOnly = false; + public $cookieSameSite = 'Lax'; + public $proxyIPs = ''; + public $CSRFTokenName = 'csrf_test_name'; + public $CSRFHeaderName = 'X-CSRF-TOKEN'; + public $CSRFCookieName = 'csrf_cookie_name'; + public $CSRFExpire = 7200; + public $CSRFRegenerate = true; + public $CSRFExcludeURIs = ['http://example.com']; + public $CSRFRedirect = false; + public $CSRFSameSite = 'Lax'; + public $CSPEnabled = false; + public $defaultLocale = 'en'; + public $negotiateLocale = false; + public $supportedLocales = [ + 'en', + 'es', + ]; +} diff --git a/system/Test/Mock/MockAutoload.php b/system/Test/Mock/MockAutoload.php new file mode 100644 index 0000000..291974c --- /dev/null +++ b/system/Test/Mock/MockAutoload.php @@ -0,0 +1,26 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Test\Mock; + +use Config\Autoload; + +class MockAutoload extends Autoload +{ + public $psr4 = []; + public $classmap = []; + + public function __construct() + { + // Don't call the parent since we don't want the default mappings. + // parent::__construct(); + } +} diff --git a/system/Test/Mock/MockBuilder.php b/system/Test/Mock/MockBuilder.php new file mode 100644 index 0000000..6300243 --- /dev/null +++ b/system/Test/Mock/MockBuilder.php @@ -0,0 +1,18 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Test\Mock; + +use CodeIgniter\Database\BaseBuilder; + +class MockBuilder extends BaseBuilder +{ +} diff --git a/system/Test/Mock/MockCLIConfig.php b/system/Test/Mock/MockCLIConfig.php new file mode 100644 index 0000000..6eb0dd7 --- /dev/null +++ b/system/Test/Mock/MockCLIConfig.php @@ -0,0 +1,40 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Test\Mock; + +use Config\App; + +class MockCLIConfig extends App +{ + public $baseURL = 'http://example.com/'; + public $uriProtocol = 'REQUEST_URI'; + public $cookiePrefix = ''; + public $cookieDomain = ''; + public $cookiePath = '/'; + public $cookieSecure = false; + public $cookieHTTPOnly = false; + public $cookieSameSite = 'Lax'; + public $proxyIPs = ''; + public $CSRFTokenName = 'csrf_test_name'; + public $CSRFCookieName = 'csrf_cookie_name'; + public $CSRFExpire = 7200; + public $CSRFRegenerate = true; + public $CSRFExcludeURIs = ['http://example.com']; + public $CSRFSameSite = 'Lax'; + public $CSPEnabled = false; + public $defaultLocale = 'en'; + public $negotiateLocale = false; + public $supportedLocales = [ + 'en', + 'es', + ]; +} diff --git a/system/Test/Mock/MockCURLRequest.php b/system/Test/Mock/MockCURLRequest.php new file mode 100644 index 0000000..635db36 --- /dev/null +++ b/system/Test/Mock/MockCURLRequest.php @@ -0,0 +1,54 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Test\Mock; + +use CodeIgniter\HTTP\CURLRequest; + +/** + * Class MockCURLRequest + * + * Simply allows us to not actually call cURL during the + * test runs. Instead, we can set the desired output + * and get back the set options. + */ +class MockCURLRequest extends CURLRequest +{ + public $curl_options; + protected $output = ''; + + public function setOutput($output) + { + $this->output = $output; + + return $this; + } + + protected function sendRequest(array $curlOptions = []): string + { + // Save so we can access later. + $this->curl_options = $curlOptions; + + return $this->output; + } + + // for testing purposes only + public function getBaseURI() + { + return $this->baseURI; + } + + // for testing purposes only + public function getDelay() + { + return $this->delay; + } +} diff --git a/system/Test/Mock/MockCache.php b/system/Test/Mock/MockCache.php new file mode 100644 index 0000000..ebdaccc --- /dev/null +++ b/system/Test/Mock/MockCache.php @@ -0,0 +1,297 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Test\Mock; + +use Closure; +use CodeIgniter\Cache\CacheInterface; +use CodeIgniter\Cache\Handlers\BaseHandler; +use PHPUnit\Framework\Assert; + +class MockCache extends BaseHandler implements CacheInterface +{ + /** + * Mock cache storage. + * + * @var array + */ + protected $cache = []; + + /** + * Expiration times. + * + * @var ?int[] + */ + protected $expirations = []; + + /** + * If true, will not cache any data. + * + * @var bool + */ + protected $bypass = false; + + /** + * Takes care of any handler-specific setup that must be done. + */ + public function initialize() + { + } + + /** + * Attempts to fetch an item from the cache store. + * + * @param string $key Cache item name + * + * @return mixed + */ + public function get(string $key) + { + $key = static::validateKey($key, $this->prefix); + + return array_key_exists($key, $this->cache) ? $this->cache[$key] : null; + } + + /** + * Get an item from the cache, or execute the given Closure and store the result. + * + * @return mixed + */ + public function remember(string $key, int $ttl, Closure $callback) + { + $value = $this->get($key); + + if ($value !== null) { + return $value; + } + + $this->save($key, $value = $callback(), $ttl); + + return $value; + } + + /** + * Saves an item to the cache store. + * + * The $raw parameter is only utilized by Mamcache in order to + * allow usage of increment() and decrement(). + * + * @param string $key Cache item name + * @param mixed $value the data to save + * @param int $ttl Time To Live, in seconds (default 60) + * @param bool $raw Whether to store the raw value. + * + * @return bool + */ + public function save(string $key, $value, int $ttl = 60, bool $raw = false) + { + if ($this->bypass) { + return false; + } + + $key = static::validateKey($key, $this->prefix); + + $this->cache[$key] = $value; + $this->expirations[$key] = $ttl > 0 ? time() + $ttl : null; + + return true; + } + + /** + * Deletes a specific item from the cache store. + * + * @return bool + */ + public function delete(string $key) + { + $key = static::validateKey($key, $this->prefix); + + if (! isset($this->cache[$key])) { + return false; + } + + unset($this->cache[$key], $this->expirations[$key]); + + return true; + } + + /** + * Deletes items from the cache store matching a given pattern. + * + * @return int + */ + public function deleteMatching(string $pattern) + { + $count = 0; + + foreach (array_keys($this->cache) as $key) { + if (fnmatch($pattern, $key)) { + $count++; + unset($this->cache[$key], $this->expirations[$key]); + } + } + + return $count; + } + + /** + * Performs atomic incrementation of a raw stored value. + * + * @return bool + */ + public function increment(string $key, int $offset = 1) + { + $key = static::validateKey($key, $this->prefix); + $data = $this->cache[$key] ?: null; + + if (empty($data)) { + $data = 0; + } elseif (! is_int($data)) { + return false; + } + + return $this->save($key, $data + $offset); + } + + /** + * Performs atomic decrementation of a raw stored value. + * + * @return bool + */ + public function decrement(string $key, int $offset = 1) + { + $key = static::validateKey($key, $this->prefix); + + $data = $this->cache[$key] ?: null; + + if (empty($data)) { + $data = 0; + } elseif (! is_int($data)) { + return false; + } + + return $this->save($key, $data - $offset); + } + + /** + * Will delete all items in the entire cache. + * + * @return bool + */ + public function clean() + { + $this->cache = []; + $this->expirations = []; + + return true; + } + + /** + * Returns information on the entire cache. + * + * The information returned and the structure of the data + * varies depending on the handler. + * + * @return string[] Keys currently present in the store + */ + public function getCacheInfo() + { + return array_keys($this->cache); + } + + /** + * Returns detailed information about the specific item in the cache. + * + * @return array|null Returns null if the item does not exist, otherwise array + * with at least the 'expire' key for absolute epoch expiry (or null). + */ + public function getMetaData(string $key) + { + // Misses return null + if (! array_key_exists($key, $this->expirations)) { + return null; + } + + // Count expired items as a miss + if (is_int($this->expirations[$key]) && $this->expirations[$key] > time()) { + return null; + } + + return ['expire' => $this->expirations[$key]]; + } + + /** + * Determine if the driver is supported on this system. + */ + public function isSupported(): bool + { + return true; + } + + //-------------------------------------------------------------------- + // Test Helpers + //-------------------------------------------------------------------- + + /** + * Instructs the class to ignore all + * requests to cache an item, and always "miss" + * when checked for existing data. + * + * @return $this + */ + public function bypass(bool $bypass = true) + { + $this->clean(); + $this->bypass = $bypass; + + return $this; + } + + //-------------------------------------------------------------------- + // Additional Assertions + //-------------------------------------------------------------------- + + /** + * Asserts that the cache has an item named $key. + * The value is not checked since storing false or null + * values is valid. + */ + public function assertHas(string $key) + { + Assert::assertNotNull($this->get($key), "The cache does not have an item named: `{$key}`"); + } + + /** + * Asserts that the cache has an item named $key with a value matching $value. + * + * @param mixed $value + */ + public function assertHasValue(string $key, $value = null) + { + $item = $this->get($key); + + // Let assertHas handle throwing the error for consistency + // if the key is not found + if (empty($item)) { + $this->assertHas($key); + } + + Assert::assertSame($value, $this->get($key), "The cached item `{$key}` does not equal match expectation. Found: " . print_r($value, true)); + } + + /** + * Asserts that the cache does NOT have an item named $key. + */ + public function assertMissing(string $key) + { + Assert::assertArrayNotHasKey($key, $this->cache, "The cached item named `{$key}` exists."); + } +} diff --git a/system/Test/Mock/MockCodeIgniter.php b/system/Test/Mock/MockCodeIgniter.php new file mode 100644 index 0000000..bf2f54a --- /dev/null +++ b/system/Test/Mock/MockCodeIgniter.php @@ -0,0 +1,22 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Test\Mock; + +use CodeIgniter\CodeIgniter; + +class MockCodeIgniter extends CodeIgniter +{ + protected function callExit($code) + { + // Do not call exit() in testing. + } +} diff --git a/system/Test/Mock/MockCommon.php b/system/Test/Mock/MockCommon.php new file mode 100644 index 0000000..d8ba461 --- /dev/null +++ b/system/Test/Mock/MockCommon.php @@ -0,0 +1,32 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +if (! function_exists('is_cli')) { + /** + * Is CLI? + * + * Test to see if a request was made from the command line. + * You can set the return value for testing. + * + * @param bool $newReturn return value to set + */ + function is_cli(?bool $newReturn = null): bool + { + // PHPUnit always runs via CLI. + static $returnValue = true; + + if ($newReturn !== null) { + $returnValue = $newReturn; + } + + return $returnValue; + } +} diff --git a/system/Test/Mock/MockConnection.php b/system/Test/Mock/MockConnection.php new file mode 100644 index 0000000..c9d03e7 --- /dev/null +++ b/system/Test/Mock/MockConnection.php @@ -0,0 +1,233 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Test\Mock; + +use CodeIgniter\CodeIgniter; +use CodeIgniter\Database\BaseConnection; +use CodeIgniter\Database\BaseResult; +use CodeIgniter\Database\Query; + +class MockConnection extends BaseConnection +{ + protected $returnValues = []; + public $database; + public $lastQuery; + + public function shouldReturn(string $method, $return) + { + $this->returnValues[$method] = $return; + + return $this; + } + + /** + * Orchestrates a query against the database. Queries must use + * Database\Statement objects to store the query and build it. + * This method works with the cache. + * + * Should automatically handle different connections for read/write + * queries if needed. + * + * @param mixed ...$binds + * + * @return BaseResult|bool|Query + * + * @todo BC set $queryClass default as null in 4.1 + */ + public function query(string $sql, $binds = null, bool $setEscapeFlags = true, string $queryClass = '') + { + $queryClass = str_replace('Connection', 'Query', static::class); + + $query = new $queryClass($this); + + $query->setQuery($sql, $binds, $setEscapeFlags); + + if (! empty($this->swapPre) && ! empty($this->DBPrefix)) { + $query->swapPrefix($this->DBPrefix, $this->swapPre); + } + + $startTime = microtime(true); + + $this->lastQuery = $query; + + // Run the query + if (false === ($this->resultID = $this->simpleQuery($query->getQuery()))) { + $query->setDuration($startTime, $startTime); + + // @todo deal with errors + + return false; + } + + $query->setDuration($startTime); + + // resultID is not false, so it must be successful + if ($query->isWriteType()) { + return true; + } + + // query is not write-type, so it must be read-type query; return QueryResult + $resultClass = str_replace('Connection', 'Result', static::class); + + return new $resultClass($this->connID, $this->resultID); + } + + /** + * Connect to the database. + * + * @return mixed + */ + public function connect(bool $persistent = false) + { + $return = $this->returnValues['connect'] ?? true; + + if (is_array($return)) { + // By removing the top item here, we can + // get a different value for, say, testing failover connections. + $return = array_shift($this->returnValues['connect']); + } + + return $return; + } + + /** + * Keep or establish the connection if no queries have been sent for + * a length of time exceeding the server's idle timeout. + */ + public function reconnect(): bool + { + return true; + } + + /** + * Select a specific database table to use. + * + * @return mixed + */ + public function setDatabase(string $databaseName) + { + $this->database = $databaseName; + + return $this; + } + + /** + * Returns a string containing the version of the database being used. + */ + public function getVersion(): string + { + return CodeIgniter::CI_VERSION; + } + + /** + * Executes the query against the database. + * + * @return mixed + */ + protected function execute(string $sql) + { + return $this->returnValues['execute']; + } + + /** + * Returns the total number of rows affected by this query. + */ + public function affectedRows(): int + { + return 1; + } + + /** + * Returns the last error code and message. + * + * Must return an array with keys 'code' and 'message': + * + * return ['code' => null, 'message' => null); + */ + public function error(): array + { + return [ + 'code' => 0, + 'message' => '', + ]; + } + + /** + * Insert ID + */ + public function insertID(): int + { + return $this->connID->insert_id; + } + + /** + * Generates the SQL for listing tables in a platform-dependent manner. + */ + protected function _listTables(bool $constrainByPrefix = false): string + { + return ''; + } + + /** + * Generates a platform-specific query string so that the column names can be fetched. + */ + protected function _listColumns(string $table = ''): string + { + return ''; + } + + protected function _fieldData(string $table): array + { + return []; + } + + protected function _indexData(string $table): array + { + return []; + } + + protected function _foreignKeyData(string $table): array + { + return []; + } + + /** + * Close the connection. + */ + protected function _close() + { + } + + /** + * Begin Transaction + */ + protected function _transBegin(): bool + { + return true; + } + + /** + * Commit Transaction + */ + protected function _transCommit(): bool + { + return true; + } + + /** + * Rollback Transaction + */ + protected function _transRollback(): bool + { + return true; + } +} diff --git a/system/Test/Mock/MockEmail.php b/system/Test/Mock/MockEmail.php new file mode 100644 index 0000000..3683ee8 --- /dev/null +++ b/system/Test/Mock/MockEmail.php @@ -0,0 +1,40 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Test\Mock; + +use CodeIgniter\Email\Email; +use CodeIgniter\Events\Events; + +class MockEmail extends Email +{ + /** + * Value to return from mocked send(). + * + * @var bool + */ + public $returnValue = true; + + public function send($autoClear = true) + { + if ($this->returnValue) { + $this->setArchiveValues(); + + if ($autoClear) { + $this->clear(); + } + + Events::trigger('email', $this->archive); + } + + return $this->returnValue; + } +} diff --git a/system/Test/Mock/MockEvents.php b/system/Test/Mock/MockEvents.php new file mode 100644 index 0000000..e4f556a --- /dev/null +++ b/system/Test/Mock/MockEvents.php @@ -0,0 +1,40 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Test\Mock; + +use CodeIgniter\Events\Events; + +/** + * Events + */ +class MockEvents extends Events +{ + public function getListeners() + { + return self::$listeners; + } + + public function getEventsFile() + { + return self::$files; + } + + public function getSimulate() + { + return self::$simulate; + } + + public function unInitialize() + { + static::$initialized = false; + } +} diff --git a/system/Test/Mock/MockFileLogger.php b/system/Test/Mock/MockFileLogger.php new file mode 100644 index 0000000..7422221 --- /dev/null +++ b/system/Test/Mock/MockFileLogger.php @@ -0,0 +1,34 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Test\Mock; + +use CodeIgniter\Log\Handlers\FileHandler; + +/** + * Class MockFileLogger + * + * Extends FileHandler, exposing some inner workings + */ +class MockFileLogger extends FileHandler +{ + /** + * Where would the log be written? + */ + public $destination; + + public function __construct(array $config) + { + parent::__construct($config); + $this->handles = $config['handles'] ?? []; + $this->destination = $this->path . 'log-' . date('Y-m-d') . '.' . $this->fileExtension; + } +} diff --git a/system/Test/Mock/MockIncomingRequest.php b/system/Test/Mock/MockIncomingRequest.php new file mode 100644 index 0000000..05c9587 --- /dev/null +++ b/system/Test/Mock/MockIncomingRequest.php @@ -0,0 +1,22 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Test\Mock; + +use CodeIgniter\HTTP\IncomingRequest; + +class MockIncomingRequest extends IncomingRequest +{ + protected function detectURI($protocol, $baseURL) + { + // Do nothing... + } +} diff --git a/system/Test/Mock/MockLanguage.php b/system/Test/Mock/MockLanguage.php new file mode 100644 index 0000000..267114e --- /dev/null +++ b/system/Test/Mock/MockLanguage.php @@ -0,0 +1,56 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Test\Mock; + +use CodeIgniter\Language\Language; + +class MockLanguage extends Language +{ + /** + * Stores the data that should be + * returned by the 'requireFile()' method. + * + * @var mixed + */ + protected $data; + + /** + * Sets the data that should be returned by the + * 'requireFile()' method to allow easy overrides + * during testing. + * + * @return $this + */ + public function setData(string $file, array $data, ?string $locale = null) + { + $this->language[$locale ?? $this->locale][$file] = $data; + + return $this; + } + + /** + * Provides an override that allows us to set custom + * data to be returned easily during testing. + */ + protected function requireFile(string $path): array + { + return $this->data ?? []; + } + + /** + * Arbitrarily turnoff internationalization support for testing + */ + public function disableIntlSupport() + { + $this->intlSupport = false; + } +} diff --git a/system/Test/Mock/MockLogger.php b/system/Test/Mock/MockLogger.php new file mode 100644 index 0000000..97c3e89 --- /dev/null +++ b/system/Test/Mock/MockLogger.php @@ -0,0 +1,101 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Test\Mock; + +class MockLogger +{ + /* + |-------------------------------------------------------------------------- + | Error Logging Threshold + |-------------------------------------------------------------------------- + | + | You can enable error logging by setting a threshold over zero. The + | threshold determines what gets logged. Any values below or equal to the + | threshold will be logged. Threshold options are: + | + | 0 = Disables logging, Error logging TURNED OFF + | 1 = Emergency Messages - System is unusable + | 2 = Alert Messages - Action Must Be Taken Immediately + | 3 = Critical Messages - Application component unavailable, unexpected exception. + | 4 = Runtime Errors - Don't need immediate action, but should be monitored. + | 5 = Warnings - Exceptional occurrences that are not errors. + | 6 = Notices - Normal but significant events. + | 7 = Info - Interesting events, like user logging in, etc. + | 8 = Debug - Detailed debug information. + | 9 = All Messages + | + | You can also pass an array with threshold levels to show individual error types + | + | array(1, 2, 3, 8) = Emergency, Alert, Critical, and Debug messages + | + | For a live site you'll usually enable Critical or higher (3) to be logged otherwise + | your log files will fill up very fast. + | + */ + + public $threshold = 9; + + /* + |-------------------------------------------------------------------------- + | Date Format for Logs + |-------------------------------------------------------------------------- + | + | Each item that is logged has an associated date. You can use PHP date + | codes to set your own date formatting + | + */ + public $dateFormat = 'Y-m-d'; + + /* + |-------------------------------------------------------------------------- + | Log Handlers + |-------------------------------------------------------------------------- + | + | The logging system supports multiple actions to be taken when something + | is logged. This is done by allowing for multiple Handlers, special classes + | designed to write the log to their chosen destinations, whether that is + | a file on the getServer, a cloud-based service, or even taking actions such + | as emailing the dev team. + | + | Each handler is defined by the class name used for that handler, and it + | MUST implement the CodeIgniter\Log\Handlers\HandlerInterface interface. + | + | The value of each key is an array of configuration items that are sent + | to the constructor of each handler. The only required configuration item + | is the 'handles' element, which must be an array of integer log levels. + | This is most easily handled by using the constants defined in the + | Psr\Log\LogLevel class. + | + | Handlers are executed in the order defined in this array, starting with + | the handler on top and continuing down. + | + */ + public $handlers = [ + // File Handler + 'Tests\Support\Log\Handlers\TestHandler' => [ + // The log levels that this handler will handle. + 'handles' => [ + 'critical', + 'alert', + 'emergency', + 'debug', + 'error', + 'info', + 'notice', + 'warning', + ], + + // Logging Directory Path + 'path' => '', + ], + ]; +} diff --git a/system/Test/Mock/MockQuery.php b/system/Test/Mock/MockQuery.php new file mode 100644 index 0000000..c67c476 --- /dev/null +++ b/system/Test/Mock/MockQuery.php @@ -0,0 +1,18 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Test\Mock; + +use CodeIgniter\Database\Query; + +class MockQuery extends Query +{ +} diff --git a/system/Test/Mock/MockResourceController.php b/system/Test/Mock/MockResourceController.php new file mode 100644 index 0000000..2d5871f --- /dev/null +++ b/system/Test/Mock/MockResourceController.php @@ -0,0 +1,32 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Test\Mock; + +use CodeIgniter\RESTful\ResourceController; + +class MockResourceController extends ResourceController +{ + public function getModel() + { + return $this->model; + } + + public function getModelName() + { + return $this->modelName; + } + + public function getFormat() + { + return $this->format; + } +} diff --git a/system/Test/Mock/MockResourcePresenter.php b/system/Test/Mock/MockResourcePresenter.php new file mode 100644 index 0000000..26f0132 --- /dev/null +++ b/system/Test/Mock/MockResourcePresenter.php @@ -0,0 +1,35 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Test\Mock; + +use CodeIgniter\API\ResponseTrait; +use CodeIgniter\RESTful\ResourcePresenter; + +class MockResourcePresenter extends ResourcePresenter +{ + use ResponseTrait; + + public function getModel() + { + return $this->model; + } + + public function getModelName() + { + return $this->modelName; + } + + public function getFormat() + { + return $this->format; + } +} diff --git a/system/Test/Mock/MockResponse.php b/system/Test/Mock/MockResponse.php new file mode 100644 index 0000000..5331292 --- /dev/null +++ b/system/Test/Mock/MockResponse.php @@ -0,0 +1,39 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Test\Mock; + +use CodeIgniter\HTTP\Response; + +/** + * Class MockResponse + */ +class MockResponse extends Response +{ + /** + * If true, will not write output. Useful during testing. + * + * @var bool + */ + protected $pretend = true; + + // for testing + public function getPretend() + { + return $this->pretend; + } + + // artificial error for testing + public function misbehave() + { + $this->statusCode = 0; + } +} diff --git a/system/Test/Mock/MockResult.php b/system/Test/Mock/MockResult.php new file mode 100644 index 0000000..0aaa340 --- /dev/null +++ b/system/Test/Mock/MockResult.php @@ -0,0 +1,96 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Test\Mock; + +use CodeIgniter\Database\BaseResult; + +class MockResult extends BaseResult +{ + /** + * Gets the number of fields in the result set. + */ + public function getFieldCount(): int + { + return 0; + } + + /** + * Generates an array of column names in the result set. + */ + public function getFieldNames(): array + { + return []; + } + + /** + * Generates an array of objects representing field meta-data. + */ + public function getFieldData(): array + { + return []; + } + + /** + * Frees the current result. + * + * @return mixed + */ + public function freeResult() + { + } + + /** + * Moves the internal pointer to the desired offset. This is called + * internally before fetching results to make sure the result set + * starts at zero. + * + * @param int $n + * + * @return mixed + */ + public function dataSeek($n = 0) + { + } + + /** + * Returns the result set as an array. + * + * Overridden by driver classes. + * + * @return mixed + */ + protected function fetchAssoc() + { + } + + /** + * Returns the result set as an object. + * + * Overridden by child classes. + * + * @param string $className + * + * @return object + */ + protected function fetchObject($className = 'stdClass') + { + return new $className(); + } + + /** + * Gets the number of fields in the result set. + */ + public function getNumRows(): int + { + return 0; + } +} diff --git a/system/Test/Mock/MockSecurity.php b/system/Test/Mock/MockSecurity.php new file mode 100644 index 0000000..a078154 --- /dev/null +++ b/system/Test/Mock/MockSecurity.php @@ -0,0 +1,30 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Test\Mock; + +use CodeIgniter\Security\Security; + +class MockSecurity extends Security +{ + protected function doSendCookie(): void + { + $_COOKIE['csrf_cookie_name'] = $this->hash; + } + + protected function randomize(string $hash): string + { + $keyBinary = hex2bin('005513c290126d34d41bf41c5265e0f1'); + $hashBinary = hex2bin($hash); + + return bin2hex(($hashBinary ^ $keyBinary) . $keyBinary); + } +} diff --git a/system/Test/Mock/MockSecurityConfig.php b/system/Test/Mock/MockSecurityConfig.php new file mode 100644 index 0000000..67e9e28 --- /dev/null +++ b/system/Test/Mock/MockSecurityConfig.php @@ -0,0 +1,31 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Test\Mock; + +use Config\Security as Security; + +/** + * @deprecated + * + * @codeCoverageIgnore + */ +class MockSecurityConfig extends Security +{ + public $tokenName = 'csrf_test_name'; + public $headerName = 'X-CSRF-TOKEN'; + public $cookieName = 'csrf_cookie_name'; + public $expires = 7200; + public $regenerate = true; + public $redirect = false; + public $samesite = 'Lax'; + public $excludeURIs = ['http://example.com']; +} diff --git a/system/Test/Mock/MockServices.php b/system/Test/Mock/MockServices.php new file mode 100644 index 0000000..f187004 --- /dev/null +++ b/system/Test/Mock/MockServices.php @@ -0,0 +1,34 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Test\Mock; + +use CodeIgniter\Autoloader\FileLocator; +use CodeIgniter\Config\BaseService; + +class MockServices extends BaseService +{ + public $psr4 = [ + 'Tests/Support' => TESTPATH . '_support/', + ]; + public $classmap = []; + + public function __construct() + { + // Don't call the parent since we don't want the default mappings. + // parent::__construct(); + } + + public static function locator(bool $getShared = true) + { + return new FileLocator(static::autoloader()); + } +} diff --git a/system/Test/Mock/MockSession.php b/system/Test/Mock/MockSession.php new file mode 100644 index 0000000..f686f17 --- /dev/null +++ b/system/Test/Mock/MockSession.php @@ -0,0 +1,70 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Test\Mock; + +use CodeIgniter\Cookie\Cookie; +use CodeIgniter\Session\Session; + +/** + * Class MockSession + * + * Provides a safe way to test the Session class itself, + * that doesn't interact with the session or cookies at all. + */ +class MockSession extends Session +{ + /** + * Holds our "cookie" data. + * + * @var Cookie[] + */ + public $cookies = []; + + public $didRegenerate = false; + + /** + * Sets the driver as the session handler in PHP. + * Extracted for easier testing. + */ + protected function setSaveHandler() + { + // session_set_save_handler($this->driver, true); + } + + /** + * Starts the session. + * Extracted for testing reasons. + */ + protected function startSession() + { + // session_start(); + $this->setCookie(); + } + + /** + * Takes care of setting the cookie on the client side. + * Extracted for testing reasons. + */ + protected function setCookie() + { + $expiration = $this->sessionExpiration === 0 ? 0 : time() + $this->sessionExpiration; + $this->cookie = $this->cookie->withValue(session_id())->withExpires($expiration); + + $this->cookies[] = $this->cookie; + } + + public function regenerate(bool $destroy = false) + { + $this->didRegenerate = true; + $_SESSION['__ci_last_regenerate'] = time(); + } +} diff --git a/system/Test/Mock/MockTable.php b/system/Test/Mock/MockTable.php new file mode 100644 index 0000000..697e72b --- /dev/null +++ b/system/Test/Mock/MockTable.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Test\Mock; + +use BadMethodCallException; +use CodeIgniter\View\Table; + +class MockTable extends Table +{ + // Override inaccessible protected method + public function __call($method, $params) + { + if (is_callable([$this, '_' . $method])) { + return call_user_func_array([$this, '_' . $method], $params); + } + + throw new BadMethodCallException('Method ' . $method . ' was not found'); + } +} diff --git a/system/Test/ReflectionHelper.php b/system/Test/ReflectionHelper.php new file mode 100644 index 0000000..4eb474a --- /dev/null +++ b/system/Test/ReflectionHelper.php @@ -0,0 +1,98 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Test; + +use Closure; +use ReflectionClass; +use ReflectionException; +use ReflectionMethod; +use ReflectionObject; +use ReflectionProperty; + +/** + * Testing helper. + */ +trait ReflectionHelper +{ + /** + * Find a private method invoker. + * + * @param object|string $obj object or class name + * @param string $method method name + * + * @throws ReflectionException + * + * @return Closure + */ + public static function getPrivateMethodInvoker($obj, $method) + { + $refMethod = new ReflectionMethod($obj, $method); + $refMethod->setAccessible(true); + $obj = (gettype($obj) === 'object') ? $obj : null; + + return static function (...$args) use ($obj, $refMethod) { + return $refMethod->invokeArgs($obj, $args); + }; + } + + /** + * Find an accessible property. + * + * @param object|string $obj + * @param string $property + * + * @throws ReflectionException + * + * @return ReflectionProperty + */ + private static function getAccessibleRefProperty($obj, $property) + { + $refClass = is_object($obj) ? new ReflectionObject($obj) : new ReflectionClass($obj); + + $refProperty = $refClass->getProperty($property); + $refProperty->setAccessible(true); + + return $refProperty; + } + + /** + * Set a private property. + * + * @param object|string $obj object or class name + * @param string $property property name + * @param mixed $value value + * + * @throws ReflectionException + */ + public static function setPrivateProperty($obj, $property, $value) + { + $refProperty = self::getAccessibleRefProperty($obj, $property); + $refProperty->setValue($obj, $value); + } + + /** + * Retrieve a private property. + * + * @param object|string $obj object or class name + * @param string $property property name + * + * @throws ReflectionException + * + * @return mixed value + */ + public static function getPrivateProperty($obj, $property) + { + $refProperty = self::getAccessibleRefProperty($obj, $property); + + return is_string($obj) ? $refProperty->getValue() : $refProperty->getValue($obj); + } +} diff --git a/system/Test/TestLogger.php b/system/Test/TestLogger.php new file mode 100644 index 0000000..22d9f81 --- /dev/null +++ b/system/Test/TestLogger.php @@ -0,0 +1,78 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Test; + +use CodeIgniter\Log\Logger; + +class TestLogger extends Logger +{ + protected static $op_logs = []; + + /** + * The log method is overridden so that we can store log history during + * the tests to allow us to check ->assertLogged() methods. + * + * @param string $level + * @param string $message + */ + public function log($level, $message, array $context = []): bool + { + // While this requires duplicate work, we want to ensure + // we have the final message to test against. + $logMessage = $this->interpolate($message, $context); + + // Determine the file and line by finding the first + // backtrace that is not part of our logging system. + $trace = debug_backtrace(); + $file = null; + + foreach ($trace as $row) { + if (! in_array($row['function'], ['log', 'log_message'], true)) { + $file = basename($row['file'] ?? ''); + break; + } + } + + self::$op_logs[] = [ + 'level' => $level, + 'message' => $logMessage, + 'file' => $file, + ]; + + // Let the parent do it's thing. + return parent::log($level, $message, $context); + } + + /** + * Used by CIUnitTestCase class to provide ->assertLogged() methods. + * + * @param string $message + * + * @return bool + */ + public static function didLog(string $level, $message) + { + foreach (self::$op_logs as $log) { + if (strtolower($log['level']) === strtolower($level) && $message === $log['message']) { + return true; + } + } + + return false; + } + + // Expose cleanFileNames() + public function cleanup($file) + { + return $this->cleanFileNames($file); + } +} diff --git a/system/Test/TestResponse.php b/system/Test/TestResponse.php new file mode 100644 index 0000000..d91f000 --- /dev/null +++ b/system/Test/TestResponse.php @@ -0,0 +1,496 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +namespace CodeIgniter\Test; + +use CodeIgniter\HTTP\RedirectResponse; +use CodeIgniter\HTTP\RequestInterface; +use CodeIgniter\HTTP\ResponseInterface; +use Config\Services; +use Exception; +use PHPUnit\Framework\Constraint\IsEqual; +use PHPUnit\Framework\TestCase; + +/** + * Test Response Class + * + * Consolidated response processing + * for test results. + * + * @no-final + * + * @internal + */ +class TestResponse extends TestCase +{ + /** + * The request. + * + * @var RequestInterface|null + */ + protected $request; + + /** + * The response. + * + * @var ResponseInterface + */ + protected $response; + + /** + * DOM for the body. + * + * @var DOMParser + */ + protected $domParser; + + /** + * Stores or the Response and parses the body in the DOM. + */ + public function __construct(ResponseInterface $response) + { + $this->setResponse($response); + } + + //-------------------------------------------------------------------- + // Getters / Setters + //-------------------------------------------------------------------- + + /** + * Sets the request. + * + * @return $this + */ + public function setRequest(RequestInterface $request) + { + $this->request = $request; + + return $this; + } + + /** + * Sets the Response and updates the DOM. + * + * @return $this + */ + public function setResponse(ResponseInterface $response) + { + $this->response = $response; + $this->domParser = new DOMParser(); + + $body = $response->getBody(); + if (is_string($body) && $body !== '') { + $this->domParser->withString($body); + } + + return $this; + } + + /** + * Request accessor. + * + * @return RequestInterface|null + */ + public function request() + { + return $this->request; + } + + /** + * Response accessor. + * + * @return ResponseInterface + */ + public function response() + { + return $this->response; + } + + //-------------------------------------------------------------------- + // Status Checks + //-------------------------------------------------------------------- + + /** + * Boils down the possible responses into a boolean valid/not-valid + * response type. + */ + public function isOK(): bool + { + $status = $this->response->getStatusCode(); + + // Only 200 and 300 range status codes + // are considered valid. + if ($status >= 400 || $status < 200) { + return false; + } + // Empty bodies are not considered valid, unless in redirects + return ! ($status < 300 && empty($this->response->getBody())); + } + + /** + * Asserts that the status is a specific value. + * + * @throws Exception + */ + public function assertStatus(int $code) + { + $this->assertSame($code, $this->response->getStatusCode()); + } + + /** + * Asserts that the Response is considered OK. + * + * @throws Exception + */ + public function assertOK() + { + $this->assertTrue($this->isOK(), "{$this->response->getStatusCode()} is not a successful status code, or the Response has an empty body."); + } + + /** + * Asserts that the Response is considered OK. + * + * @throws Exception + */ + public function assertNotOK() + { + $this->assertFalse($this->isOK(), "{$this->response->getStatusCode()} is an unexpected successful status code, or the Response has body content."); + } + + //-------------------------------------------------------------------- + // Redirection + //-------------------------------------------------------------------- + + /** + * Returns whether or not the Response was a redirect or RedirectResponse + */ + public function isRedirect(): bool + { + return $this->response instanceof RedirectResponse + || $this->response->hasHeader('Location') + || $this->response->hasHeader('Refresh'); + } + + /** + * Assert that the given response was a redirect. + * + * @throws Exception + */ + public function assertRedirect() + { + $this->assertTrue($this->isRedirect(), 'Response is not a redirect or RedirectResponse.'); + } + + /** + * Assert that a given response was a redirect + * and it was redirect to a specific URI. + * + * @throws Exception + */ + public function assertRedirectTo(string $uri) + { + $this->assertRedirect(); + + $uri = trim(strtolower($uri)); + $redirectUri = strtolower($this->getRedirectUrl()); + + $matches = $uri === $redirectUri + || strtolower(site_url($uri)) === $redirectUri + || $uri === site_url($redirectUri); + + $this->assertTrue($matches, "Redirect URL `{$uri}` does not match `{$redirectUri}`"); + } + + /** + * Assert that the given response was not a redirect. + * + * @throws Exception + */ + public function assertNotRedirect() + { + $this->assertFalse($this->isRedirect(), 'Response is an unexpected redirect or RedirectResponse.'); + } + + /** + * Returns the URL set for redirection. + */ + public function getRedirectUrl(): ?string + { + if (! $this->isRedirect()) { + return null; + } + + if ($this->response->hasHeader('Location')) { + return $this->response->getHeaderLine('Location'); + } + + if ($this->response->hasHeader('Refresh')) { + return str_replace('0;url=', '', $this->response->getHeaderLine('Refresh')); + } + + return null; + } + + //-------------------------------------------------------------------- + // Session + //-------------------------------------------------------------------- + + /** + * Asserts that an SESSION key has been set and, optionally, test it's value. + * + * @param mixed $value + * + * @throws Exception + */ + public function assertSessionHas(string $key, $value = null) + { + $this->assertArrayHasKey($key, $_SESSION, "'{$key}' is not in the current \$_SESSION"); + + if ($value === null) { + return; + } + + if (is_scalar($value)) { + $this->assertSame($value, $_SESSION[$key], "The value of '{$key}' ({$value}) does not match expected value."); + } else { + $this->assertSame($value, $_SESSION[$key], "The value of '{$key}' does not match expected value."); + } + } + + /** + * Asserts the session is missing $key. + * + * @throws Exception + */ + public function assertSessionMissing(string $key) + { + $this->assertArrayNotHasKey($key, $_SESSION, "'{$key}' should not be present in \$_SESSION."); + } + + //-------------------------------------------------------------------- + // Headers + //-------------------------------------------------------------------- + + /** + * Asserts that the Response contains a specific header. + * + * @param string|null $value + * + * @throws Exception + */ + public function assertHeader(string $key, $value = null) + { + $this->assertTrue($this->response->hasHeader($key), "'{$key}' is not a valid Response header."); + + if ($value !== null) { + $this->assertSame($value, $this->response->getHeaderLine($key), "The value of '{$key}' header ({$this->response->getHeaderLine($key)}) does not match expected value."); + } + } + + /** + * Asserts the Response headers does not contain the specified header. + * + * @throws Exception + */ + public function assertHeaderMissing(string $key) + { + $this->assertFalse($this->response->hasHeader($key), "'{$key}' should not be in the Response headers."); + } + + //-------------------------------------------------------------------- + // Cookies + //-------------------------------------------------------------------- + + /** + * Asserts that the response has the specified cookie. + * + * @param string|null $value + * + * @throws Exception + */ + public function assertCookie(string $key, $value = null, string $prefix = '') + { + $this->assertTrue($this->response->hasCookie($key, $value, $prefix), "No cookie found named '{$key}'."); + } + + /** + * Assert the Response does not have the specified cookie set. + */ + public function assertCookieMissing(string $key) + { + $this->assertFalse($this->response->hasCookie($key), "Cookie named '{$key}' should not be set."); + } + + /** + * Asserts that a cookie exists and has an expired time. + * + * @throws Exception + */ + public function assertCookieExpired(string $key, string $prefix = '') + { + $this->assertTrue($this->response->hasCookie($key, null, $prefix)); + $this->assertGreaterThan(time(), $this->response->getCookie($key, $prefix)->getExpiresTimestamp()); + } + + //-------------------------------------------------------------------- + // JSON + //-------------------------------------------------------------------- + + /** + * Returns the response's body as JSON + * + * @return false|mixed + */ + public function getJSON() + { + $response = $this->response->getJSON(); + + if ($response === null) { + return false; + } + + return $response; + } + + /** + * Test that the response contains a matching JSON fragment. + * + * @throws Exception + */ + public function assertJSONFragment(array $fragment, bool $strict = false) + { + $json = json_decode($this->getJSON(), true); + $this->assertIsArray($json, 'Response does not have valid json'); + $patched = array_replace_recursive($json, $fragment); + + if ($strict) { + $this->assertSame($json, $patched, 'Response does not contain a matching JSON fragment.'); + } else { + $this->assertThat($patched, new IsEqual($json), 'Response does not contain a matching JSON fragment.'); + } + } + + /** + * Asserts that the JSON exactly matches the passed in data. + * If the value being passed in is a string, it must be a json_encoded string. + * + * @param array|string $test + * + * @throws Exception + */ + public function assertJSONExact($test) + { + $json = $this->getJSON(); + + if (is_object($test)) { + $test = method_exists($test, 'toArray') ? $test->toArray() : (array) $test; + } + + if (is_array($test)) { + $test = Services::format()->getFormatter('application/json')->format($test); + } + + $this->assertJsonStringEqualsJsonString($test, $json, 'Response does not contain matching JSON.'); + } + + //-------------------------------------------------------------------- + // XML Methods + //-------------------------------------------------------------------- + + /** + * Returns the response' body as XML + * + * @return mixed|string + */ + public function getXML() + { + return $this->response->getXML(); + } + + //-------------------------------------------------------------------- + // DomParser + //-------------------------------------------------------------------- + + /** + * Assert that the desired text can be found in the result body. + * + * @throws Exception + */ + public function assertSee(?string $search = null, ?string $element = null) + { + $this->assertTrue($this->domParser->see($search, $element), "Do not see '{$search}' in response."); + } + + /** + * Asserts that we do not see the specified text. + * + * @throws Exception + */ + public function assertDontSee(?string $search = null, ?string $element = null) + { + $this->assertTrue($this->domParser->dontSee($search, $element), "I should not see '{$search}' in response."); + } + + /** + * Assert that we see an element selected via a CSS selector. + * + * @throws Exception + */ + public function assertSeeElement(string $search) + { + $this->assertTrue($this->domParser->seeElement($search), "Do not see element with selector '{$search} in response.'"); + } + + /** + * Assert that we do not see an element selected via a CSS selector. + * + * @throws Exception + */ + public function assertDontSeeElement(string $search) + { + $this->assertTrue($this->domParser->dontSeeElement($search), "I should not see an element with selector '{$search}' in response.'"); + } + + /** + * Assert that we see a link with the matching text and/or class. + * + * @throws Exception + */ + public function assertSeeLink(string $text, ?string $details = null) + { + $this->assertTrue($this->domParser->seeLink($text, $details), "Do no see anchor tag with the text {$text} in response."); + } + + /** + * Assert that we see an input with name/value. + * + * @throws Exception + */ + public function assertSeeInField(string $field, ?string $value = null) + { + $this->assertTrue($this->domParser->seeInField($field, $value), "Do no see input named {$field} with value {$value} in response."); + } + + /** + * Forward any unrecognized method calls to our DOMParser instance. + * + * @param string $function Method name + * @param mixed $params Any method parameters + * + * @return mixed + */ + public function __call($function, $params) + { + if (method_exists($this->domParser, $function)) { + return $this->domParser->{$function}(...$params); + } + } +} diff --git a/system/Test/bootstrap.php b/system/Test/bootstrap.php new file mode 100644 index 0000000..00a4341 --- /dev/null +++ b/system/Test/bootstrap.php @@ -0,0 +1,106 @@ + + * + * For the full copyright and license information, please view + * the LICENSE file that was distributed with this source code. + */ + +use CodeIgniter\Config\DotEnv; +use CodeIgniter\Router\RouteCollection; +use CodeIgniter\Services; +use Config\Autoload; +use Config\Modules; +use Config\Paths; + +error_reporting(E_ALL); +ini_set('display_errors', '1'); +ini_set('display_startup_errors', '1'); + +// Make sure it recognizes that we're testing. +$_SERVER['CI_ENVIRONMENT'] = 'testing'; +define('ENVIRONMENT', 'testing'); +defined('CI_DEBUG') || define('CI_DEBUG', true); + +// Often these constants are pre-defined, but query the current directory structure as a fallback +defined('HOMEPATH') || define('HOMEPATH', realpath(rtrim(getcwd(), '\\/ ')) . DIRECTORY_SEPARATOR); +$source = is_dir(HOMEPATH . 'app') + ? HOMEPATH + : (is_dir('vendor/codeigniter4/framework/') + ? 'vendor/codeigniter4/framework/' + : 'vendor/codeigniter4/codeigniter4/'); +defined('CONFIGPATH') || define('CONFIGPATH', realpath($source . 'app/Config') . DIRECTORY_SEPARATOR); +defined('PUBLICPATH') || define('PUBLICPATH', realpath($source . 'public') . DIRECTORY_SEPARATOR); +unset($source); + +// Load framework paths from their config file +require CONFIGPATH . 'Paths.php'; +$paths = new Paths(); + +// Define necessary framework path constants +defined('APPPATH') || define('APPPATH', realpath(rtrim($paths->appDirectory, '\\/ ')) . DIRECTORY_SEPARATOR); +defined('WRITEPATH') || define('WRITEPATH', realpath(rtrim($paths->writableDirectory, '\\/ ')) . DIRECTORY_SEPARATOR); +defined('SYSTEMPATH') || define('SYSTEMPATH', realpath(rtrim($paths->systemDirectory, '\\/')) . DIRECTORY_SEPARATOR); +defined('ROOTPATH') || define('ROOTPATH', realpath(APPPATH . '../') . DIRECTORY_SEPARATOR); +defined('CIPATH') || define('CIPATH', realpath(SYSTEMPATH . '../') . DIRECTORY_SEPARATOR); +defined('FCPATH') || define('FCPATH', realpath(PUBLICPATH) . DIRECTORY_SEPARATOR); +defined('TESTPATH') || define('TESTPATH', realpath(HOMEPATH . 'tests/') . DIRECTORY_SEPARATOR); +defined('SUPPORTPATH') || define('SUPPORTPATH', realpath(TESTPATH . '_support/') . DIRECTORY_SEPARATOR); +defined('COMPOSER_PATH') || define('COMPOSER_PATH', realpath(HOMEPATH . 'vendor/autoload.php')); +defined('VENDORPATH') || define('VENDORPATH', realpath(HOMEPATH . 'vendor') . DIRECTORY_SEPARATOR); + +// Load Common.php from App then System +if (file_exists(APPPATH . 'Common.php')) { + require_once APPPATH . 'Common.php'; +} + +require_once SYSTEMPATH . 'Common.php'; + +// Set environment values that would otherwise stop the framework from functioning during tests. +if (! isset($_SERVER['app.baseURL'])) { + $_SERVER['app.baseURL'] = 'http://example.com/'; +} + +// Load necessary components +require_once SYSTEMPATH . 'Config/AutoloadConfig.php'; +require_once APPPATH . 'Config/Autoload.php'; +require_once APPPATH . 'Config/Constants.php'; +require_once SYSTEMPATH . 'Modules/Modules.php'; +require_once APPPATH . 'Config/Modules.php'; + +require_once SYSTEMPATH . 'Autoloader/Autoloader.php'; +require_once SYSTEMPATH . 'Config/BaseService.php'; +require_once SYSTEMPATH . 'Config/Services.php'; +require_once APPPATH . 'Config/Services.php'; + +// Use Config\Services as CodeIgniter\Services +if (! class_exists('CodeIgniter\Services', false)) { + class_alias('Config\Services', 'CodeIgniter\Services'); +} + +// Initialize and register the loader with the SPL autoloader stack. +Services::autoloader()->initialize(new Autoload(), new Modules())->register(); + +// Now load Composer's if it's available +if (is_file(COMPOSER_PATH)) { + require_once COMPOSER_PATH; +} + +// Load environment settings from .env files into $_SERVER and $_ENV +require_once SYSTEMPATH . 'Config/DotEnv.php'; + +$env = new DotEnv(ROOTPATH); +$env->load(); + +// Always load the URL helper, it should be used in most of apps. +helper('url'); + +require_once APPPATH . 'Config/Routes.php'; + +/** + * @var RouteCollection $routes + */ +$routes->getRoutes('*'); diff --git a/system/ThirdParty/Escaper/Escaper.php b/system/ThirdParty/Escaper/Escaper.php new file mode 100644 index 0000000..ca0f1a9 --- /dev/null +++ b/system/ThirdParty/Escaper/Escaper.php @@ -0,0 +1,422 @@ + 'quot', // quotation mark + 38 => 'amp', // ampersand + 60 => 'lt', // less-than sign + 62 => 'gt', // greater-than sign + ]; + + /** + * Current encoding for escaping. If not UTF-8, we convert strings from this encoding + * pre-escaping and back to this encoding post-escaping. + * + * @var string + */ + protected $encoding = 'utf-8'; + + /** + * Holds the value of the special flags passed as second parameter to + * htmlspecialchars(). + * + * @var int + */ + protected $htmlSpecialCharsFlags; + + /** + * Static Matcher which escapes characters for HTML Attribute contexts + * + * @var callable + */ + protected $htmlAttrMatcher; + + /** + * Static Matcher which escapes characters for Javascript contexts + * + * @var callable + */ + protected $jsMatcher; + + /** + * Static Matcher which escapes characters for CSS Attribute contexts + * + * @var callable + */ + protected $cssMatcher; + + /** + * List of all encoding supported by this class + * + * @var array + */ + protected $supportedEncodings = [ + 'iso-8859-1', + 'iso8859-1', + 'iso-8859-5', + 'iso8859-5', + 'iso-8859-15', + 'iso8859-15', + 'utf-8', + 'cp866', + 'ibm866', + '866', + 'cp1251', + 'windows-1251', + 'win-1251', + '1251', + 'cp1252', + 'windows-1252', + '1252', + 'koi8-r', + 'koi8-ru', + 'koi8r', + 'big5', + '950', + 'gb2312', + '936', + 'big5-hkscs', + 'shift_jis', + 'sjis', + 'sjis-win', + 'cp932', + '932', + 'euc-jp', + 'eucjp', + 'eucjp-win', + 'macroman', + ]; + + /** + * Constructor: Single parameter allows setting of global encoding for use by + * the current object. + * + * @throws Exception\InvalidArgumentException + */ + public function __construct(?string $encoding = null) + { + if ($encoding !== null) { + if ($encoding === '') { + throw new Exception\InvalidArgumentException( + static::class . ' constructor parameter does not allow a blank value' + ); + } + + $encoding = strtolower($encoding); + if (! in_array($encoding, $this->supportedEncodings)) { + throw new Exception\InvalidArgumentException( + 'Value of \'' . $encoding . '\' passed to ' . static::class + . ' constructor parameter is invalid. Provide an encoding supported by htmlspecialchars()' + ); + } + + $this->encoding = $encoding; + } + + // We take advantage of ENT_SUBSTITUTE flag to correctly deal with invalid UTF-8 sequences. + $this->htmlSpecialCharsFlags = ENT_QUOTES | ENT_SUBSTITUTE; + + // set matcher callbacks + $this->htmlAttrMatcher = [$this, 'htmlAttrMatcher']; + $this->jsMatcher = [$this, 'jsMatcher']; + $this->cssMatcher = [$this, 'cssMatcher']; + } + + /** + * Return the encoding that all output/input is expected to be encoded in. + * + * @return string + */ + public function getEncoding() + { + return $this->encoding; + } + + /** + * Escape a string for the HTML Body context where there are very few characters + * of special meaning. Internally this will use htmlspecialchars(). + * + * @return string + */ + public function escapeHtml(string $string) + { + return htmlspecialchars($string, $this->htmlSpecialCharsFlags, $this->encoding); + } + + /** + * Escape a string for the HTML Attribute context. We use an extended set of characters + * to escape that are not covered by htmlspecialchars() to cover cases where an attribute + * might be unquoted or quoted illegally (e.g. backticks are valid quotes for IE). + * + * @return string + */ + public function escapeHtmlAttr(string $string) + { + $string = $this->toUtf8($string); + if ($string === '' || ctype_digit($string)) { + return $string; + } + + $result = preg_replace_callback('/[^a-z0-9,\.\-_]/iSu', $this->htmlAttrMatcher, $string); + return $this->fromUtf8($result); + } + + /** + * Escape a string for the Javascript context. This does not use json_encode(). An extended + * set of characters are escaped beyond ECMAScript's rules for Javascript literal string + * escaping in order to prevent misinterpretation of Javascript as HTML leading to the + * injection of special characters and entities. The escaping used should be tolerant + * of cases where HTML escaping was not applied on top of Javascript escaping correctly. + * Backslash escaping is not used as it still leaves the escaped character as-is and so + * is not useful in a HTML context. + * + * @return string + */ + public function escapeJs(string $string) + { + $string = $this->toUtf8($string); + if ($string === '' || ctype_digit($string)) { + return $string; + } + + $result = preg_replace_callback('/[^a-z0-9,\._]/iSu', $this->jsMatcher, $string); + return $this->fromUtf8($result); + } + + /** + * Escape a string for the URI or Parameter contexts. This should not be used to escape + * an entire URI - only a subcomponent being inserted. The function is a simple proxy + * to rawurlencode() which now implements RFC 3986 since PHP 5.3 completely. + * + * @return string + */ + public function escapeUrl(string $string) + { + return rawurlencode($string); + } + + /** + * Escape a string for the CSS context. CSS escaping can be applied to any string being + * inserted into CSS and escapes everything except alphanumerics. + * + * @return string + */ + public function escapeCss(string $string) + { + $string = $this->toUtf8($string); + if ($string === '' || ctype_digit($string)) { + return $string; + } + + $result = preg_replace_callback('/[^a-z0-9]/iSu', $this->cssMatcher, $string); + return $this->fromUtf8($result); + } + + /** + * Callback function for preg_replace_callback that applies HTML Attribute + * escaping to all matches. + * + * @param array $matches + * @return string + */ + protected function htmlAttrMatcher($matches) + { + $chr = $matches[0]; + $ord = ord($chr); + + /** + * The following replaces characters undefined in HTML with the + * hex entity for the Unicode replacement character. + */ + if ( + ($ord <= 0x1f && $chr !== "\t" && $chr !== "\n" && $chr !== "\r") + || ($ord >= 0x7f && $ord <= 0x9f) + ) { + return '�'; + } + + /** + * Check if the current character to escape has a name entity we should + * replace it with while grabbing the integer value of the character. + */ + if (strlen($chr) > 1) { + $chr = $this->convertEncoding($chr, 'UTF-32BE', 'UTF-8'); + } + + $hex = bin2hex($chr); + $ord = hexdec($hex); + if (isset(static::$htmlNamedEntityMap[$ord])) { + return '&' . static::$htmlNamedEntityMap[$ord] . ';'; + } + + /** + * Per OWASP recommendations, we'll use upper hex entities + * for any other characters where a named entity does not exist. + */ + if ($ord > 255) { + return sprintf('&#x%04X;', $ord); + } + return sprintf('&#x%02X;', $ord); + } + + /** + * Callback function for preg_replace_callback that applies Javascript + * escaping to all matches. + * + * @param array $matches + * @return string + */ + protected function jsMatcher($matches) + { + $chr = $matches[0]; + if (strlen($chr) === 1) { + return sprintf('\\x%02X', ord($chr)); + } + $chr = $this->convertEncoding($chr, 'UTF-16BE', 'UTF-8'); + $hex = strtoupper(bin2hex($chr)); + if (strlen($hex) <= 4) { + return sprintf('\\u%04s', $hex); + } + $highSurrogate = substr($hex, 0, 4); + $lowSurrogate = substr($hex, 4, 4); + return sprintf('\\u%04s\\u%04s', $highSurrogate, $lowSurrogate); + } + + /** + * Callback function for preg_replace_callback that applies CSS + * escaping to all matches. + * + * @param array $matches + * @return string + */ + protected function cssMatcher($matches) + { + $chr = $matches[0]; + if (strlen($chr) === 1) { + $ord = ord($chr); + } else { + $chr = $this->convertEncoding($chr, 'UTF-32BE', 'UTF-8'); + $ord = hexdec(bin2hex($chr)); + } + return sprintf('\\%X ', $ord); + } + + /** + * Converts a string to UTF-8 from the base encoding. The base encoding is set via this + * + * @param string $string + * @throws Exception\RuntimeException + * @return string + */ + protected function toUtf8($string) + { + if ($this->getEncoding() === 'utf-8') { + $result = $string; + } else { + $result = $this->convertEncoding($string, 'UTF-8', $this->getEncoding()); + } + + if (! $this->isUtf8($result)) { + throw new Exception\RuntimeException( + sprintf('String to be escaped was not valid UTF-8 or could not be converted: %s', $result) + ); + } + + return $result; + } + + /** + * Converts a string from UTF-8 to the base encoding. The base encoding is set via this + * + * @param string $string + * @return string + */ + protected function fromUtf8($string) + { + if ($this->getEncoding() === 'utf-8') { + return $string; + } + + return $this->convertEncoding($string, $this->getEncoding(), 'UTF-8'); + } + + /** + * Checks if a given string appears to be valid UTF-8 or not. + * + * @param string $string + * @return bool + */ + protected function isUtf8($string) + { + return $string === '' || preg_match('/^./su', $string); + } + + /** + * Encoding conversion helper which wraps iconv and mbstring where they exist or throws + * and exception where neither is available. + * + * @param string $string + * @param string $to + * @param array|string $from + * @throws Exception\RuntimeException + * @return string + */ + protected function convertEncoding($string, $to, $from) + { + if (function_exists('iconv')) { + $result = iconv($from, $to, $string); + } elseif (function_exists('mb_convert_encoding')) { + $result = mb_convert_encoding($string, $to, $from); + } else { + throw new Exception\RuntimeException( + static::class + . ' requires either the iconv or mbstring extension to be installed' + . ' when escaping for non UTF-8 strings.' + ); + } + + if ($result === false) { + return ''; // return non-fatal blank string on encoding errors from users + } + return $result; + } +} diff --git a/system/ThirdParty/Escaper/Exception/ExceptionInterface.php b/system/ThirdParty/Escaper/Exception/ExceptionInterface.php new file mode 100644 index 0000000..87edfd2 --- /dev/null +++ b/system/ThirdParty/Escaper/Exception/ExceptionInterface.php @@ -0,0 +1,9 @@ + true, + T_COMMENT => true, + T_DOC_COMMENT => true, + T_INLINE_HTML => true, + T_OPEN_TAG => true, + T_OPEN_TAG_WITH_ECHO => true, + T_WHITESPACE => true, + ]; + + /** + * Things we need to do specially for operator tokens: + * - Refuse to strip spaces around them + * - Wrap the access path in parentheses if there + * are any of these in the final short parameter. + */ + private static $operator = [ + T_AND_EQUAL => true, + T_BOOLEAN_AND => true, + T_BOOLEAN_OR => true, + T_ARRAY_CAST => true, + T_BOOL_CAST => true, + T_CLASS => true, + T_CLONE => true, + T_CONCAT_EQUAL => true, + T_DEC => true, + T_DIV_EQUAL => true, + T_DOUBLE_CAST => true, + T_FUNCTION => true, + T_INC => true, + T_INCLUDE => true, + T_INCLUDE_ONCE => true, + T_INSTANCEOF => true, + T_INT_CAST => true, + T_IS_EQUAL => true, + T_IS_GREATER_OR_EQUAL => true, + T_IS_IDENTICAL => true, + T_IS_NOT_EQUAL => true, + T_IS_NOT_IDENTICAL => true, + T_IS_SMALLER_OR_EQUAL => true, + T_LOGICAL_AND => true, + T_LOGICAL_OR => true, + T_LOGICAL_XOR => true, + T_MINUS_EQUAL => true, + T_MOD_EQUAL => true, + T_MUL_EQUAL => true, + T_NEW => true, + T_OBJECT_CAST => true, + T_OR_EQUAL => true, + T_PLUS_EQUAL => true, + T_REQUIRE => true, + T_REQUIRE_ONCE => true, + T_SL => true, + T_SL_EQUAL => true, + T_SR => true, + T_SR_EQUAL => true, + T_STRING_CAST => true, + T_UNSET_CAST => true, + T_XOR_EQUAL => true, + T_POW => true, + T_POW_EQUAL => true, + T_DOUBLE_ARROW => true, + '!' => true, + '%' => true, + '&' => true, + '*' => true, + '+' => true, + '-' => true, + '.' => true, + '/' => true, + ':' => true, + '<' => true, + '=' => true, + '>' => true, + '?' => true, + '^' => true, + '|' => true, + '~' => true, + ]; + + private static $strip = [ + '(' => true, + ')' => true, + '[' => true, + ']' => true, + '{' => true, + '}' => true, + T_OBJECT_OPERATOR => true, + T_DOUBLE_COLON => true, + T_NS_SEPARATOR => true, + ]; + + private static $classcalls = [ + T_DOUBLE_COLON => true, + T_OBJECT_OPERATOR => true, + ]; + + private static $namespace = [ + T_STRING => true, + ]; + + public static function getFunctionCalls($source, $line, $function) + { + static $up = [ + '(' => true, + '[' => true, + '{' => true, + T_CURLY_OPEN => true, + T_DOLLAR_OPEN_CURLY_BRACES => true, + ]; + static $down = [ + ')' => true, + ']' => true, + '}' => true, + ]; + static $modifiers = [ + '!' => true, + '@' => true, + '~' => true, + '+' => true, + '-' => true, + ]; + static $identifier = [ + T_DOUBLE_COLON => true, + T_STRING => true, + T_NS_SEPARATOR => true, + ]; + + if (KINT_PHP70) { + self::$operator[T_SPACESHIP] = true; + } + + if (KINT_PHP74) { + self::$operator[T_COALESCE_EQUAL] = true; + } + + if (KINT_PHP80) { + $up[T_ATTRIBUTE] = true; + self::$operator[T_MATCH] = true; + self::$strip[T_NULLSAFE_OBJECT_OPERATOR] = true; + self::$classcalls[T_NULLSAFE_OBJECT_OPERATOR] = true; + self::$namespace[T_NAME_FULLY_QUALIFIED] = true; + self::$namespace[T_NAME_QUALIFIED] = true; + self::$namespace[T_NAME_RELATIVE] = true; + $identifier[T_NAME_FULLY_QUALIFIED] = true; + $identifier[T_NAME_QUALIFIED] = true; + $identifier[T_NAME_RELATIVE] = true; + } + + $tokens = \token_get_all($source); + $cursor = 1; + $function_calls = []; + // Performance optimization preventing backwards loops + $prev_tokens = [null, null, null]; + + if (\is_array($function)) { + $class = \explode('\\', $function[0]); + $class = \strtolower(\end($class)); + $function = \strtolower($function[1]); + } else { + $class = null; + $function = \strtolower($function); + } + + // Loop through tokens + foreach ($tokens as $index => $token) { + if (!\is_array($token)) { + continue; + } + + // Count newlines for line number instead of using $token[2] + // since certain situations (String tokens after whitespace) may + // not have the correct line number unless you do this manually + $cursor += \substr_count($token[1], "\n"); + if ($cursor > $line) { + break; + } + + // Store the last real tokens for later + if (isset(self::$ignore[$token[0]])) { + continue; + } + + $prev_tokens = [$prev_tokens[1], $prev_tokens[2], $token]; + + // Check if it's the right type to be the function we're looking for + if (!isset(self::$namespace[$token[0]])) { + continue; + } + + $ns = \explode('\\', \strtolower($token[1])); + + if (\end($ns) !== $function) { + continue; + } + + // Check if it's a function call + $nextReal = self::realTokenIndex($tokens, $index); + if (!isset($nextReal, $tokens[$nextReal]) || '(' !== $tokens[$nextReal]) { + continue; + } + + // Check if it matches the signature + if (null === $class) { + if ($prev_tokens[1] && isset(self::$classcalls[$prev_tokens[1][0]])) { + continue; + } + } else { + if (!$prev_tokens[1] || T_DOUBLE_COLON !== $prev_tokens[1][0]) { + continue; + } + + if (!$prev_tokens[0] || !isset(self::$namespace[$prev_tokens[0][0]])) { + continue; + } + + /** @var array{int, string, int} $prev_tokens[0] */ + // All self::$namespace tokens are T_ constants + $ns = \explode('\\', \strtolower($prev_tokens[0][1])); + + if (\end($ns) !== $class) { + continue; + } + } + + $inner_cursor = $cursor; + $depth = 1; // The depth respective to the function call + $offset = $nextReal + 1; // The start of the function call + $instring = false; // Whether we're in a string or not + $realtokens = false; // Whether the current scope contains anything meaningful or not + $paramrealtokens = false; // Whether the current parameter contains anything meaningful + $params = []; // All our collected parameters + $shortparam = []; // The short version of the parameter + $param_start = $offset; // The distance to the start of the parameter + + // Loop through the following tokens until the function call ends + while (isset($tokens[$offset])) { + $token = $tokens[$offset]; + + // Ensure that the $inner_cursor is correct and + // that $token is either a T_ constant or a string + if (\is_array($token)) { + $inner_cursor += \substr_count($token[1], "\n"); + } + + if (!isset(self::$ignore[$token[0]]) && !isset($down[$token[0]])) { + $paramrealtokens = $realtokens = true; + } + + // If it's a token that makes us to up a level, increase the depth + if (isset($up[$token[0]])) { + if (1 === $depth) { + $shortparam[] = $token; + $realtokens = false; + } + + ++$depth; + } elseif (isset($down[$token[0]])) { + --$depth; + + // If this brings us down to the parameter level, and we've had + // real tokens since going up, fill the $shortparam with an ellipsis + if (1 === $depth) { + if ($realtokens) { + $shortparam[] = '...'; + } + $shortparam[] = $token; + } + } elseif ('"' === $token[0]) { + // Strings use the same symbol for up and down, but we can + // only ever be inside one string, so just use a bool for that + if ($instring) { + --$depth; + if (1 === $depth) { + $shortparam[] = '...'; + } + } else { + ++$depth; + } + + $instring = !$instring; + + $shortparam[] = '"'; + } elseif (1 === $depth) { + if (',' === $token[0]) { + $params[] = [ + 'full' => \array_slice($tokens, $param_start, $offset - $param_start), + 'short' => $shortparam, + ]; + $shortparam = []; + $paramrealtokens = false; + $param_start = $offset + 1; + } elseif (T_CONSTANT_ENCAPSED_STRING === $token[0] && \strlen($token[1]) > 2) { + $shortparam[] = $token[1][0].'...'.$token[1][0]; + } else { + $shortparam[] = $token; + } + } + + // Depth has dropped to 0 (So we've hit the closing paren) + if ($depth <= 0) { + if ($paramrealtokens) { + $params[] = [ + 'full' => \array_slice($tokens, $param_start, $offset - $param_start), + 'short' => $shortparam, + ]; + } + + break; + } + + ++$offset; + } + + // If we're not passed (or at) the line at the end + // of the function call, we're too early so skip it + if ($inner_cursor < $line) { + continue; + } + + // Format the final output parameters + foreach ($params as &$param) { + $name = self::tokensFormatted($param['short']); + $expression = false; + foreach ($name as $token) { + if (self::tokenIsOperator($token)) { + $expression = true; + break; + } + } + + $param = [ + 'name' => self::tokensToString($name), + 'path' => self::tokensToString(self::tokensTrim($param['full'])), + 'expression' => $expression, + ]; + } + + // Get the modifiers + --$index; + + while (isset($tokens[$index])) { + if (!isset(self::$ignore[$tokens[$index][0]]) && !isset($identifier[$tokens[$index][0]])) { + break; + } + + --$index; + } + + $mods = []; + + while (isset($tokens[$index])) { + if (isset(self::$ignore[$tokens[$index][0]])) { + --$index; + continue; + } + + if (isset($modifiers[$tokens[$index][0]])) { + $mods[] = $tokens[$index]; + --$index; + continue; + } + + break; + } + + $function_calls[] = [ + 'parameters' => $params, + 'modifiers' => $mods, + ]; + } + + return $function_calls; + } + + private static function realTokenIndex(array $tokens, $index) + { + ++$index; + + while (isset($tokens[$index])) { + if (!isset(self::$ignore[$tokens[$index][0]])) { + return $index; + } + + ++$index; + } + + return null; + } + + /** + * We need a separate method to check if tokens are operators because we + * occasionally add "..." to short parameter versions. If we simply check + * for `$token[0]` then "..." will incorrectly match the "." operator. + * + * @param array|string $token The token to check + * + * @return bool + */ + private static function tokenIsOperator($token) + { + return '...' !== $token && isset(self::$operator[$token[0]]); + } + + private static function tokensToString(array $tokens) + { + $out = ''; + + foreach ($tokens as $token) { + if (\is_string($token)) { + $out .= $token; + } elseif (\is_array($token)) { + $out .= $token[1]; + } + } + + return $out; + } + + private static function tokensTrim(array $tokens) + { + foreach ($tokens as $index => $token) { + if (isset(self::$ignore[$token[0]])) { + unset($tokens[$index]); + } else { + break; + } + } + + $tokens = \array_reverse($tokens); + + foreach ($tokens as $index => $token) { + if (isset(self::$ignore[$token[0]])) { + unset($tokens[$index]); + } else { + break; + } + } + + return \array_reverse($tokens); + } + + private static function tokensFormatted(array $tokens) + { + $space = false; + $attribute = false; + + $tokens = self::tokensTrim($tokens); + + $output = []; + $last = null; + + foreach ($tokens as $index => $token) { + if (isset(self::$ignore[$token[0]])) { + if ($space) { + continue; + } + + $next = $tokens[self::realTokenIndex($tokens, $index)]; + + /** @var array|string $last */ + if ($attribute && ']' === $last[0]) { + $attribute = false; + } elseif (isset(self::$strip[$last[0]]) && !self::tokenIsOperator($next)) { + continue; + } + + if (isset(self::$strip[$next[0]]) && $last && !self::tokenIsOperator($last)) { + continue; + } + + $token = ' '; + $space = true; + } else { + if (KINT_PHP80 && $last && T_ATTRIBUTE == $last[0]) { + $attribute = true; + } + + $space = false; + $last = $token; + } + + $output[] = $token; + } + + return $output; + } +} diff --git a/system/ThirdParty/Kint/Kint.php b/system/ThirdParty/Kint/Kint.php new file mode 100644 index 0000000..f11ed49 --- /dev/null +++ b/system/ThirdParty/Kint/Kint.php @@ -0,0 +1,728 @@ + '', + * app_path() => '', + * config_path() => '', + * database_path() => '', + * public_path() => '', + * resource_path() => '', + * storage_path() => '', + * ]; + * + * Defaults to [$_SERVER['DOCUMENT_ROOT'] => ''] + */ + public static $app_root_dirs = []; + + /** + * @var int depth limit for array/object traversal. 0 for no limit + */ + public static $depth_limit = 7; + + /** + * @var bool expand all trees by default for rich view + */ + public static $expanded = false; + + /** + * @var bool enable detection when Kint is command line. + * + * Formats output with whitespace only; does not HTML-escape it + */ + public static $cli_detection = true; + + /** + * @var array Kint aliases. Add debug functions in Kint wrappers here to fix modifiers and backtraces + */ + public static $aliases = [ + ['Kint\\Kint', 'dump'], + ['Kint\\Kint', 'trace'], + ['Kint\\Kint', 'dumpArray'], + ]; + + /** + * @var array Array of modes to renderer class names + */ + public static $renderers = [ + self::MODE_RICH => 'Kint\\Renderer\\RichRenderer', + self::MODE_PLAIN => 'Kint\\Renderer\\PlainRenderer', + self::MODE_TEXT => 'Kint\\Renderer\\TextRenderer', + self::MODE_CLI => 'Kint\\Renderer\\CliRenderer', + ]; + + public static $plugins = [ + 'Kint\\Parser\\ArrayLimitPlugin', + 'Kint\\Parser\\ArrayObjectPlugin', + 'Kint\\Parser\\Base64Plugin', + 'Kint\\Parser\\BlacklistPlugin', + 'Kint\\Parser\\ClassMethodsPlugin', + 'Kint\\Parser\\ClassStaticsPlugin', + 'Kint\\Parser\\ClosurePlugin', + 'Kint\\Parser\\ColorPlugin', + 'Kint\\Parser\\DateTimePlugin', + 'Kint\\Parser\\FsPathPlugin', + 'Kint\\Parser\\IteratorPlugin', + 'Kint\\Parser\\JsonPlugin', + 'Kint\\Parser\\MicrotimePlugin', + 'Kint\\Parser\\SimpleXMLElementPlugin', + 'Kint\\Parser\\SplFileInfoPlugin', + 'Kint\\Parser\\SplObjectStoragePlugin', + 'Kint\\Parser\\StreamPlugin', + 'Kint\\Parser\\TablePlugin', + 'Kint\\Parser\\ThrowablePlugin', + 'Kint\\Parser\\TimestampPlugin', + 'Kint\\Parser\\TracePlugin', + 'Kint\\Parser\\XmlPlugin', + ]; + + protected static $plugin_pool = []; + + protected $parser; + protected $renderer; + + public function __construct(Parser $p, Renderer $r) + { + $this->parser = $p; + $this->renderer = $r; + } + + public function setParser(Parser $p) + { + $this->parser = $p; + } + + public function getParser() + { + return $this->parser; + } + + public function setRenderer(Renderer $r) + { + $this->renderer = $r; + } + + public function getRenderer() + { + return $this->renderer; + } + + public function setStatesFromStatics(array $statics) + { + $this->renderer->setStatics($statics); + + $this->parser->setDepthLimit(isset($statics['depth_limit']) ? $statics['depth_limit'] : 0); + $this->parser->clearPlugins(); + + if (!isset($statics['plugins'])) { + return; + } + + $plugins = []; + + foreach ($statics['plugins'] as $plugin) { + if ($plugin instanceof Plugin) { + $plugins[] = $plugin; + } elseif (\is_string($plugin) && \is_subclass_of($plugin, Plugin::class)) { + if (!isset(static::$plugin_pool[$plugin])) { + /** @psalm-suppress UnsafeInstantiation */ + $p = new $plugin(); + static::$plugin_pool[$plugin] = $p; + } + $plugins[] = static::$plugin_pool[$plugin]; + } + } + + $plugins = $this->renderer->filterParserPlugins($plugins); + + foreach ($plugins as $plugin) { + $this->parser->addPlugin($plugin); + } + } + + public function setStatesFromCallInfo(array $info) + { + $this->renderer->setCallInfo($info); + + if (isset($info['modifiers']) && \is_array($info['modifiers']) && \in_array('+', $info['modifiers'], true)) { + $this->parser->setDepthLimit(0); + } + + $this->parser->setCallerClass(isset($info['caller']['class']) ? $info['caller']['class'] : null); + } + + /** + * Renders a list of vars including the pre and post renders. + * + * @param array $vars Data to dump + * @param array $base Base Zval\Value objects + * + * @return string + */ + public function dumpAll(array $vars, array $base) + { + if (\array_keys($vars) !== \array_keys($base)) { + throw new InvalidArgumentException('Kint::dumpAll requires arrays of identical size and keys as arguments'); + } + + $output = $this->renderer->preRender(); + + if ([] === $vars) { + $output .= $this->renderer->renderNothing(); + } + + foreach ($vars as $key => $arg) { + if (!$base[$key] instanceof Value) { + throw new InvalidArgumentException('Kint::dumpAll requires all elements of the second argument to be Value instances'); + } + $output .= $this->dumpVar($arg, $base[$key]); + } + + $output .= $this->renderer->postRender(); + + return $output; + } + + /** + * Dumps and renders a var. + * + * @param mixed $var Data to dump + * @param Value $base Base object + * + * @return string + */ + public function dumpVar(&$var, Value $base) + { + return $this->renderer->render( + $this->parser->parse($var, $base) + ); + } + + /** + * Gets all static settings at once. + * + * @return array Current static settings + */ + public static function getStatics() + { + return [ + 'aliases' => static::$aliases, + 'app_root_dirs' => static::$app_root_dirs, + 'cli_detection' => static::$cli_detection, + 'depth_limit' => static::$depth_limit, + 'display_called_from' => static::$display_called_from, + 'enabled_mode' => static::$enabled_mode, + 'expanded' => static::$expanded, + 'file_link_format' => static::$file_link_format, + 'mode_default' => static::$mode_default, + 'mode_default_cli' => static::$mode_default_cli, + 'plugins' => static::$plugins, + 'renderers' => static::$renderers, + 'return' => static::$return, + ]; + } + + /** + * Creates a Kint instances based on static settings. + * + * Also calls setStatesFromStatics for you + * + * @param array $statics array of statics as returned by getStatics + * + * @return null|\Kint\Kint + */ + public static function createFromStatics(array $statics) + { + $mode = false; + + if (isset($statics['enabled_mode'])) { + $mode = $statics['enabled_mode']; + + if (true === $mode && isset($statics['mode_default'])) { + $mode = $statics['mode_default']; + + if (PHP_SAPI === 'cli' && !empty($statics['cli_detection']) && isset($statics['mode_default_cli'])) { + $mode = $statics['mode_default_cli']; + } + } + } + + if (false === $mode) { + return null; + } + + if (!isset($statics['renderers'][$mode])) { + $renderer = new TextRenderer(); + } else { + /** @var Renderer */ + $renderer = new $statics['renderers'][$mode](); + } + + /** @psalm-suppress UnsafeInstantiation */ + return new static(new Parser(), $renderer); + } + + /** + * Creates base objects given parameter info. + * + * @param array $params Parameters as returned from getCallInfo + * @param int $argc Number of arguments the helper was called with + * + * @return Value[] Base objects for the arguments + */ + public static function getBasesFromParamInfo(array $params, $argc) + { + static $blacklist = [ + 'null', + 'true', + 'false', + 'array(...)', + 'array()', + '[...]', + '[]', + '(...)', + '()', + '"..."', + 'b"..."', + "'...'", + "b'...'", + ]; + + $params = \array_values($params); + $bases = []; + + for ($i = 0; $i < $argc; ++$i) { + if (isset($params[$i])) { + $param = $params[$i]; + } else { + $param = null; + } + + if (!isset($param['name']) || \is_numeric($param['name'])) { + $name = null; + } elseif (\in_array(\strtolower($param['name']), $blacklist, true)) { + $name = null; + } else { + $name = $param['name']; + } + + if (isset($param['path'])) { + $access_path = $param['path']; + + if (!empty($param['expression'])) { + $access_path = '('.$access_path.')'; + } + } else { + $access_path = '$'.$i; + } + + $bases[] = Value::blank($name, $access_path); + } + + return $bases; + } + + /** + * Gets call info from the backtrace, alias, and argument count. + * + * Aliases must be normalized beforehand (Utils::normalizeAliases) + * + * @param array $aliases Call aliases as found in Kint::$aliases + * @param array[] $trace Backtrace + * @param int $argc Number of arguments + * + * @return array{params:null|array, modifiers:array, callee:null|array, caller:null|array, trace:array[]} Call info + */ + public static function getCallInfo(array $aliases, array $trace, $argc) + { + $found = false; + $callee = null; + $caller = null; + $miniTrace = []; + + foreach ($trace as $index => $frame) { + if (Utils::traceFrameIsListed($frame, $aliases)) { + $found = true; + $miniTrace = []; + } + + if (!Utils::traceFrameIsListed($frame, ['spl_autoload_call'])) { + $miniTrace[] = $frame; + } + } + + if ($found) { + $callee = \reset($miniTrace) ?: null; + $caller = \next($miniTrace) ?: null; + } + + foreach ($miniTrace as $index => $frame) { + if ((0 === $index && $callee === $frame) || isset($frame['file'], $frame['line'])) { + unset($frame['object'], $frame['args']); + $miniTrace[$index] = $frame; + } else { + unset($miniTrace[$index]); + } + } + + $miniTrace = \array_values($miniTrace); + + $call = static::getSingleCall($callee ?: [], $argc); + + $ret = [ + 'params' => null, + 'modifiers' => [], + 'callee' => $callee, + 'caller' => $caller, + 'trace' => $miniTrace, + ]; + + if ($call) { + $ret['params'] = $call['parameters']; + $ret['modifiers'] = $call['modifiers']; + } + + return $ret; + } + + /** + * Dumps a backtrace. + * + * Functionally equivalent to Kint::dump(1) or Kint::dump(debug_backtrace(true)) + * + * @return int|string + */ + public static function trace() + { + if (false === static::$enabled_mode) { + return 0; + } + + Utils::normalizeAliases(static::$aliases); + + $call_info = static::getCallInfo(static::$aliases, \debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS), \func_num_args()); + + $statics = static::getStatics(); + + if (\in_array('~', $call_info['modifiers'], true)) { + $statics['enabled_mode'] = static::MODE_TEXT; + } + + $kintstance = static::createFromStatics($statics); + if (!$kintstance) { + // Should never happen + return 0; // @codeCoverageIgnore + } + + if (\in_array('-', $call_info['modifiers'], true)) { + while (\ob_get_level()) { + \ob_end_clean(); + } + } + + $kintstance->setStatesFromStatics($statics); + $kintstance->setStatesFromCallInfo($call_info); + + $trimmed_trace = []; + $trace = \debug_backtrace(); + + foreach ($trace as $frame) { + if (Utils::traceFrameIsListed($frame, static::$aliases)) { + $trimmed_trace = []; + } + + $trimmed_trace[] = $frame; + } + + \array_shift($trimmed_trace); + + $output = $kintstance->dumpAll( + [$trimmed_trace], + [Value::blank('Kint\\Kint::trace()', 'debug_backtrace()')] + ); + + if (static::$return || \in_array('@', $call_info['modifiers'], true)) { + return $output; + } + + echo $output; + + if (\in_array('-', $call_info['modifiers'], true)) { + \flush(); // @codeCoverageIgnore + } + + return 0; + } + + /** + * Dumps some data. + * + * Functionally equivalent to Kint::dump(1) or Kint::dump(debug_backtrace()) + * + * @return int|string + */ + public static function dump() + { + if (false === static::$enabled_mode) { + return 0; + } + + Utils::normalizeAliases(static::$aliases); + + $args = \func_get_args(); + + $call_info = static::getCallInfo(static::$aliases, \debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS), \count($args)); + + $statics = static::getStatics(); + + if (\in_array('~', $call_info['modifiers'], true)) { + $statics['enabled_mode'] = static::MODE_TEXT; + } + + $kintstance = static::createFromStatics($statics); + if (!$kintstance) { + // Should never happen + return 0; // @codeCoverageIgnore + } + + if (\in_array('-', $call_info['modifiers'], true)) { + while (\ob_get_level()) { + \ob_end_clean(); + } + } + + $kintstance->setStatesFromStatics($statics); + $kintstance->setStatesFromCallInfo($call_info); + + $bases = static::getBasesFromParamInfo( + isset($call_info['params']) ? $call_info['params'] : [], + \count($args) + ); + $output = $kintstance->dumpAll($args, $bases); + + if (static::$return || \in_array('@', $call_info['modifiers'], true)) { + return $output; + } + + echo $output; + + if (\in_array('-', $call_info['modifiers'], true)) { + \flush(); // @codeCoverageIgnore + } + + return 0; + } + + /** + * generic path display callback, can be configured in app_root_dirs; purpose is + * to show relevant path info and hide as much of the path as possible. + * + * @param string $file + * + * @return string + */ + public static function shortenPath($file) + { + $file = \array_values(\array_filter(\explode('/', \str_replace('\\', '/', $file)), 'strlen')); + + $longest_match = 0; + $match = '/'; + + foreach (static::$app_root_dirs as $path => $alias) { + if (empty($path)) { + continue; + } + + $path = \array_values(\array_filter(\explode('/', \str_replace('\\', '/', $path)), 'strlen')); + + if (\array_slice($file, 0, \count($path)) === $path && \count($path) > $longest_match) { + $longest_match = \count($path); + $match = $alias; + } + } + + if ($longest_match) { + $file = \array_merge([$match], \array_slice($file, $longest_match)); + + return \implode('/', $file); + } + + // fallback to find common path with Kint dir + $kint = \array_values(\array_filter(\explode('/', \str_replace('\\', '/', KINT_DIR)), 'strlen')); + + foreach ($file as $i => $part) { + if (!isset($kint[$i]) || $kint[$i] !== $part) { + return ($i ? '.../' : '/').\implode('/', \array_slice($file, $i)); + } + } + + return '/'.\implode('/', $file); + } + + public static function getIdeLink($file, $line) + { + return \str_replace(['%f', '%l'], [$file, $line], static::$file_link_format); + } + + /** + * Returns specific function call info from a stack trace frame, or null if no match could be found. + * + * @param array $frame The stack trace frame in question + * @param int $argc The amount of arguments received + * + * @return null|array{parameters:array, modifiers:array} params and modifiers, or null if a specific call could not be determined + */ + protected static function getSingleCall(array $frame, $argc) + { + if (!isset($frame['file'], $frame['line'], $frame['function']) || !\is_readable($frame['file'])) { + return null; + } + + if (empty($frame['class'])) { + $callfunc = $frame['function']; + } else { + $callfunc = [$frame['class'], $frame['function']]; + } + + $calls = CallFinder::getFunctionCalls( + \file_get_contents($frame['file']), + $frame['line'], + $callfunc + ); + + $return = null; + + foreach ($calls as $call) { + $is_unpack = false; + + // Handle argument unpacking as a last resort + foreach ($call['parameters'] as $i => &$param) { + if (0 === \strpos($param['name'], '...')) { + if ($i < $argc && $i === \count($call['parameters']) - 1) { + for ($j = 1; $j + $i < $argc; ++$j) { + $call['parameters'][] = [ + 'name' => 'array_values('.\substr($param['name'], 3).')['.$j.']', + 'path' => 'array_values('.\substr($param['path'], 3).')['.$j.']', + 'expression' => false, + ]; + } + + $param['name'] = 'reset('.\substr($param['name'], 3).')'; + $param['path'] = 'reset('.\substr($param['path'], 3).')'; + $param['expression'] = false; + } else { + $call['parameters'] = \array_slice($call['parameters'], 0, $i); + } + + $is_unpack = true; + break; + } + + if ($i >= $argc) { + continue 2; + } + } + + if ($is_unpack || \count($call['parameters']) === $argc) { + if (null === $return) { + $return = $call; + } else { + // If we have multiple calls on the same line with the same amount of arguments, + // we can't be sure which it is so just return null and let them figure it out + return null; + } + } + } + + return $return; + } +} diff --git a/system/ThirdParty/Kint/LICENSE b/system/ThirdParty/Kint/LICENSE new file mode 100644 index 0000000..01718d4 --- /dev/null +++ b/system/ThirdParty/Kint/LICENSE @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright (c) 2013 Jonathan Vollebregt (jnvsor@gmail.com), Rokas Å leinius (raveren@gmail.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/system/ThirdParty/Kint/Parser/ArrayLimitPlugin.php b/system/ThirdParty/Kint/Parser/ArrayLimitPlugin.php new file mode 100644 index 0000000..4fa94c6 --- /dev/null +++ b/system/ThirdParty/Kint/Parser/ArrayLimitPlugin.php @@ -0,0 +1,142 @@ += self::$trigger) { + throw new InvalidArgumentException('ArrayLimitPlugin::$limit can not be lower than ArrayLimitPlugin::$trigger'); + } + + $depth = $this->parser->getDepthLimit(); + + if (!$depth) { + return; + } + + if ($o->depth >= $depth - 1) { + return; + } + + if (\count($var) < self::$trigger) { + return; + } + + if (self::$numeric_only && Utils::isAssoc($var)) { + return; + } + + $base = clone $o; + $base->depth = $depth - 1; + $obj = $this->parser->parse($var, $base); + + if (!$obj instanceof Value || 'array' != $obj->type) { + return; // @codeCoverageIgnore + } + + $obj->depth = $o->depth; + $i = 0; + + foreach ($obj->value->contents as $child) { + // We only bother setting the correct depth for the first child, + // any deeper children should be cancelled by the depth limit + $child->depth = $o->depth + 1; + $this->recalcDepthLimit($child); + } + + $var2 = \array_slice($var, 0, self::$limit, true); + $base = clone $o; + $slice = $this->parser->parse($var2, $base); + + \array_splice($obj->value->contents, 0, self::$limit, $slice->value->contents); + + $o = $obj; + + $this->parser->haltParse(); + } + + protected function recalcDepthLimit(Value $o) + { + $hintkey = \array_search('depth_limit', $o->hints, true); + if (false !== $hintkey) { + $o->hints[$hintkey] = 'array_limit'; + } + + $reps = $o->getRepresentations(); + if ($o->value) { + $reps[] = $o->value; + } + + foreach ($reps as $rep) { + if ($rep->contents instanceof Value) { + $this->recalcDepthLimit($rep->contents); + } elseif (\is_array($rep->contents)) { + foreach ($rep->contents as $child) { + if ($child instanceof Value) { + $this->recalcDepthLimit($child); + } + } + } + } + } +} diff --git a/system/ThirdParty/Kint/Parser/ArrayObjectPlugin.php b/system/ThirdParty/Kint/Parser/ArrayObjectPlugin.php new file mode 100644 index 0000000..f32b4fa --- /dev/null +++ b/system/ThirdParty/Kint/Parser/ArrayObjectPlugin.php @@ -0,0 +1,63 @@ +getFlags(); + + if (ArrayObject::STD_PROP_LIST === $flags) { + return; + } + + $var->setFlags(ArrayObject::STD_PROP_LIST); + + $o = $this->parser->parse($var, $o); + + $var->setFlags($flags); + + $this->parser->haltParse(); + } +} diff --git a/system/ThirdParty/Kint/Parser/Base64Plugin.php b/system/ThirdParty/Kint/Parser/Base64Plugin.php new file mode 100644 index 0000000..5208d7d --- /dev/null +++ b/system/ThirdParty/Kint/Parser/Base64Plugin.php @@ -0,0 +1,94 @@ +depth = $o->depth + 1; + $base_obj->name = 'base64_decode('.$o->name.')'; + + if ($o->access_path) { + $base_obj->access_path = 'base64_decode('.$o->access_path.')'; + } + + $r = new Representation('Base64'); + $r->contents = $this->parser->parse($data, $base_obj); + + if (\strlen($var) > self::$min_length_soft) { + $o->addRepresentation($r, 0); + } else { + $o->addRepresentation($r); + } + } +} diff --git a/system/ThirdParty/Kint/Parser/BinaryPlugin.php b/system/ThirdParty/Kint/Parser/BinaryPlugin.php new file mode 100644 index 0000000..9a6b117 --- /dev/null +++ b/system/ThirdParty/Kint/Parser/BinaryPlugin.php @@ -0,0 +1,49 @@ +encoding, ['ASCII', 'UTF-8'], true)) { + $o->value->hints[] = 'binary'; + } + } +} diff --git a/system/ThirdParty/Kint/Parser/BlacklistPlugin.php b/system/ThirdParty/Kint/Parser/BlacklistPlugin.php new file mode 100644 index 0000000..9c472d4 --- /dev/null +++ b/system/ThirdParty/Kint/Parser/BlacklistPlugin.php @@ -0,0 +1,91 @@ +blacklistValue($var, $o); + } + } + + if ($o->depth <= 0) { + return; + } + + foreach (self::$shallow_blacklist as $class) { + if ($var instanceof $class) { + return $this->blacklistValue($var, $o); + } + } + } + + protected function blacklistValue(&$var, Value &$o) + { + $object = new InstanceValue(); + $object->transplant($o); + $object->classname = \get_class($var); + $object->spl_object_hash = \spl_object_hash($var); + $object->clearRepresentations(); + $object->value = null; + $object->size = null; + $object->hints[] = 'blacklist'; + + $o = $object; + + $this->parser->haltParse(); + } +} diff --git a/system/ThirdParty/Kint/Parser/ClassMethodsPlugin.php b/system/ThirdParty/Kint/Parser/ClassMethodsPlugin.php new file mode 100644 index 0000000..152e59d --- /dev/null +++ b/system/ThirdParty/Kint/Parser/ClassMethodsPlugin.php @@ -0,0 +1,113 @@ +getMethods() as $method) { + $methods[] = new MethodValue($method); + } + + \usort($methods, ['Kint\\Parser\\ClassMethodsPlugin', 'sort']); + + self::$cache[$class] = $methods; + } + + if (!empty(self::$cache[$class])) { + $rep = new Representation('Available methods', 'methods'); + + // Can't cache access paths + foreach (self::$cache[$class] as $m) { + $method = clone $m; + $method->depth = $o->depth + 1; + + if (!$this->parser->childHasPath($o, $method)) { + $method->access_path = null; + } else { + $method->setAccessPathFrom($o); + } + + if ($method->owner_class !== $class && $ds = $method->getRepresentation('docstring')) { + $ds = clone $ds; + $ds->class = $method->owner_class; + $method->replaceRepresentation($ds); + } + + $rep->contents[] = $method; + } + + $o->addRepresentation($rep); + } + } + + private static function sort(MethodValue $a, MethodValue $b) + { + $sort = ((int) $a->static) - ((int) $b->static); + if ($sort) { + return $sort; + } + + $sort = Value::sortByAccess($a, $b); + if ($sort) { + return $sort; + } + + $sort = InstanceValue::sortByHierarchy($a->owner_class, $b->owner_class); + if ($sort) { + return $sort; + } + + return $a->startline - $b->startline; + } +} diff --git a/system/ThirdParty/Kint/Parser/ClassStaticsPlugin.php b/system/ThirdParty/Kint/Parser/ClassStaticsPlugin.php new file mode 100644 index 0000000..89601af --- /dev/null +++ b/system/ThirdParty/Kint/Parser/ClassStaticsPlugin.php @@ -0,0 +1,128 @@ +getConstants() as $name => $val) { + $const = Value::blank($name, '\\'.$class.'::'.$name); + $const->const = true; + $const->depth = $o->depth + 1; + $const->owner_class = $class; + $const->operator = Value::OPERATOR_STATIC; + $const = $this->parser->parse($val, $const); + + $consts[] = $const; + } + + self::$cache[$class] = $consts; + } + + $statics = new Representation('Static class properties', 'statics'); + $statics->contents = self::$cache[$class]; + + foreach ($reflection->getProperties(ReflectionProperty::IS_STATIC) as $static) { + $prop = new Value(); + $prop->name = '$'.$static->getName(); + $prop->depth = $o->depth + 1; + $prop->static = true; + $prop->operator = Value::OPERATOR_STATIC; + $prop->owner_class = $static->getDeclaringClass()->name; + + $prop->access = Value::ACCESS_PUBLIC; + if ($static->isProtected()) { + $prop->access = Value::ACCESS_PROTECTED; + } elseif ($static->isPrivate()) { + $prop->access = Value::ACCESS_PRIVATE; + } + + if ($this->parser->childHasPath($o, $prop)) { + $prop->access_path = '\\'.$prop->owner_class.'::'.$prop->name; + } + + $static->setAccessible(true); + + if (KINT_PHP74 && !$static->isInitialized()) { + $prop->type = 'uninitialized'; + $statics->contents[] = $prop; + } else { + $static = $static->getValue(); + $statics->contents[] = $this->parser->parse($static, $prop); + } + } + + if (empty($statics->contents)) { + return; + } + + \usort($statics->contents, ['Kint\\Parser\\ClassStaticsPlugin', 'sort']); + + $o->addRepresentation($statics); + } + + private static function sort(Value $a, Value $b) + { + $sort = ((int) $a->const) - ((int) $b->const); + if ($sort) { + return $sort; + } + + $sort = Value::sortByAccess($a, $b); + if ($sort) { + return $sort; + } + + return InstanceValue::sortByHierarchy($a->owner_class, $b->owner_class); + } +} diff --git a/system/ThirdParty/Kint/Parser/ClosurePlugin.php b/system/ThirdParty/Kint/Parser/ClosurePlugin.php new file mode 100644 index 0000000..f4a68f5 --- /dev/null +++ b/system/ThirdParty/Kint/Parser/ClosurePlugin.php @@ -0,0 +1,94 @@ +transplant($o); + $o = $object; + $object->removeRepresentation('properties'); + + $closure = new ReflectionFunction($var); + + $o->filename = $closure->getFileName(); + $o->startline = $closure->getStartLine(); + + foreach ($closure->getParameters() as $param) { + $o->parameters[] = new ParameterValue($param); + } + + $p = new Representation('Parameters'); + $p->contents = &$o->parameters; + $o->addRepresentation($p, 0); + + $statics = []; + + if ($v = $closure->getClosureThis()) { + $statics = ['this' => $v]; + } + + if (\count($statics = $statics + $closure->getStaticVariables())) { + $statics_parsed = []; + + foreach ($statics as $name => &$static) { + $obj = Value::blank('$'.$name); + $obj->depth = $o->depth + 1; + $statics_parsed[$name] = $this->parser->parse($static, $obj); + if (null === $statics_parsed[$name]->value) { + $statics_parsed[$name]->access_path = null; + } + } + + $r = new Representation('Uses'); + $r->contents = $statics_parsed; + $o->addRepresentation($r, 0); + } + } +} diff --git a/system/ThirdParty/Kint/Parser/ColorPlugin.php b/system/ThirdParty/Kint/Parser/ColorPlugin.php new file mode 100644 index 0000000..a00b338 --- /dev/null +++ b/system/ThirdParty/Kint/Parser/ColorPlugin.php @@ -0,0 +1,63 @@ + 32) { + return; + } + + $trimmed = \strtolower(\trim($var)); + + if (!isset(ColorRepresentation::$color_map[$trimmed]) && !\preg_match('/^(?:(?:rgb|hsl)[^\\)]{6,}\\)|#[0-9a-fA-F]{3,8})$/', $trimmed)) { + return; + } + + $rep = new ColorRepresentation($var); + + if ($rep->variant) { + $o->removeRepresentation($o->value); + $o->addRepresentation($rep, 0); + $o->hints[] = 'color'; + } + } +} diff --git a/system/ThirdParty/Kint/Parser/DOMDocumentPlugin.php b/system/ThirdParty/Kint/Parser/DOMDocumentPlugin.php new file mode 100644 index 0000000..5332982 --- /dev/null +++ b/system/ThirdParty/Kint/Parser/DOMDocumentPlugin.php @@ -0,0 +1,337 @@ + 'DOMNode', + 'firstChild' => 'DOMNode', + 'lastChild' => 'DOMNode', + 'previousSibling' => 'DOMNode', + 'nextSibling' => 'DOMNode', + 'ownerDocument' => 'DOMDocument', + ]; + + /** + * Show all properties and methods. + * + * @var bool + */ + public static $verbose = false; + + public function getTypes() + { + return ['object']; + } + + public function getTriggers() + { + return Parser::TRIGGER_SUCCESS; + } + + public function parse(&$var, Value &$o, $trigger) + { + if (!$o instanceof InstanceValue) { + return; + } + + if ($var instanceof DOMNamedNodeMap || $var instanceof DOMNodeList) { + return $this->parseList($var, $o, $trigger); + } + + if ($var instanceof DOMNode) { + return $this->parseNode($var, $o); + } + } + + protected function parseList(&$var, InstanceValue &$o, $trigger) + { + // Recursion should never happen, should always be stopped at the parent + // DOMNode. Depth limit on the other hand we're going to skip since + // that would show an empty iterator and rather useless. Let the depth + // limit hit the children (DOMNodeList only has DOMNode as children) + if ($trigger & Parser::TRIGGER_RECURSION) { + return; + } + + $o->size = $var->length; + if (0 === $o->size) { + $o->replaceRepresentation(new Representation('Iterator')); + $o->size = null; + + return; + } + + // Depth limit + // Make empty iterator representation since we need it in DOMNode to point out depth limits + if ($this->parser->getDepthLimit() && $o->depth + 1 >= $this->parser->getDepthLimit()) { + $b = new Value(); + $b->name = $o->classname.' Iterator Contents'; + $b->access_path = 'iterator_to_array('.$o->access_path.')'; + $b->depth = $o->depth + 1; + $b->hints[] = 'depth_limit'; + + $r = new Representation('Iterator'); + $r->contents = [$b]; + $o->replaceRepresentation($r, 0); + + return; + } + + $r = new Representation('Iterator'); + $o->replaceRepresentation($r, 0); + + foreach ($var as $key => $item) { + $base_obj = new Value(); + $base_obj->depth = $o->depth + 1; + $base_obj->name = $item->nodeName; + + if ($o->access_path) { + if ($var instanceof DOMNamedNodeMap) { + // We can't use getNamedItem() for attributes without a + // namespace because it will pick the first matching + // attribute of *any* namespace. + // + // Contrary to the PHP docs, getNamedItemNS takes null + // as a namespace argument for an unnamespaced item. + $base_obj->access_path = $o->access_path.'->getNamedItemNS('; + $base_obj->access_path .= \var_export($item->namespaceURI, true); + $base_obj->access_path .= ', '; + $base_obj->access_path .= \var_export($item->name, true); + $base_obj->access_path .= ')'; + } elseif ($var instanceof DOMNodeList) { + $base_obj->access_path = $o->access_path.'->item('.\var_export($key, true).')'; + } + } + + $r->contents[] = $this->parser->parse($item, $base_obj); + } + } + + protected function parseNode(&$var, InstanceValue &$o) + { + // Fill the properties + // They can't be enumerated through reflection or casting, + // so we have to trust the docs and try them one at a time + $known_properties = [ + 'nodeValue', + 'childNodes', + 'attributes', + ]; + + if (self::$verbose) { + $known_properties = [ + 'nodeName', + 'nodeValue', + 'nodeType', + 'parentNode', + 'childNodes', + 'firstChild', + 'lastChild', + 'previousSibling', + 'nextSibling', + 'attributes', + 'ownerDocument', + 'namespaceURI', + 'prefix', + 'localName', + 'baseURI', + 'textContent', + ]; + } + + $childNodes = null; + $attributes = null; + + $rep = $o->value; + + foreach ($known_properties as $prop) { + $prop_obj = $this->parseProperty($o, $prop, $var); + $rep->contents[] = $prop_obj; + + if ('childNodes' === $prop) { + $childNodes = $prop_obj->getRepresentation('iterator'); + } elseif ('attributes' === $prop) { + $attributes = $prop_obj->getRepresentation('iterator'); + } + } + + if (!self::$verbose) { + $o->removeRepresentation('methods'); + $o->removeRepresentation('properties'); + } + + // Attributes and comments and text nodes don't + // need children or attributes of their own + if (\in_array($o->classname, ['DOMAttr', 'DOMText', 'DOMComment'], true)) { + $o = self::textualNodeToString($o); + + return; + } + + // Set the attributes + if ($attributes) { + $a = new Representation('Attributes'); + foreach ($attributes->contents as $attribute) { + $a->contents[] = $attribute; + } + $o->addRepresentation($a, 0); + } + + // Set the children + if ($childNodes) { + $c = new Representation('Children'); + + if (1 === \count($childNodes->contents) && ($node = \reset($childNodes->contents)) && \in_array('depth_limit', $node->hints, true)) { + $n = new InstanceValue(); + $n->transplant($node); + $n->name = 'childNodes'; + $n->classname = 'DOMNodeList'; + $c->contents = [$n]; + } else { + foreach ($childNodes->contents as $node) { + // Remove text nodes if theyre empty + if ($node instanceof BlobValue && '#text' === $node->name && (\ctype_space($node->value->contents) || '' === $node->value->contents)) { + continue; + } + + $c->contents[] = $node; + } + } + + $o->addRepresentation($c, 0); + } + + if ($childNodes) { + $o->size = \count($childNodes->contents); + } + + if (!$o->size) { + $o->size = null; + } + } + + protected function parseProperty(InstanceValue $o, $prop, &$var) + { + // Duplicating (And slightly optimizing) the Parser::parseObject() code here + $base_obj = new Value(); + $base_obj->depth = $o->depth + 1; + $base_obj->owner_class = $o->classname; + $base_obj->name = $prop; + $base_obj->operator = Value::OPERATOR_OBJECT; + $base_obj->access = Value::ACCESS_PUBLIC; + + if (null !== $o->access_path) { + $base_obj->access_path = $o->access_path; + + if (\preg_match('/^[A-Za-z0-9_]+$/', $base_obj->name)) { + $base_obj->access_path .= '->'.$base_obj->name; + } else { + $base_obj->access_path .= '->{'.\var_export($base_obj->name, true).'}'; + } + } + + if (!isset($var->{$prop})) { + $base_obj->type = 'null'; + } elseif (isset(self::$blacklist[$prop])) { + $b = new InstanceValue(); + $b->transplant($base_obj); + $base_obj = $b; + + $base_obj->hints[] = 'blacklist'; + $base_obj->classname = self::$blacklist[$prop]; + } elseif ('attributes' === $prop) { + // Attributes are strings. If we're too deep set the + // depth limit to enable parsing them, but no deeper. + if ($this->parser->getDepthLimit() && $this->parser->getDepthLimit() - 2 < $base_obj->depth) { + $base_obj->depth = $this->parser->getDepthLimit() - 2; + } + $base_obj = $this->parser->parse($var->{$prop}, $base_obj); + } else { + $base_obj = $this->parser->parse($var->{$prop}, $base_obj); + } + + return $base_obj; + } + + protected static function textualNodeToString(InstanceValue $o) + { + if (empty($o->value) || empty($o->value->contents) || empty($o->classname)) { + return; + } + + if (!\in_array($o->classname, ['DOMText', 'DOMAttr', 'DOMComment'], true)) { + return; + } + + foreach ($o->value->contents as $property) { + if ('nodeValue' === $property->name) { + $ret = clone $property; + $ret->name = $o->name; + + return $ret; + } + } + } +} diff --git a/system/ThirdParty/Kint/Parser/DateTimePlugin.php b/system/ThirdParty/Kint/Parser/DateTimePlugin.php new file mode 100644 index 0000000..1c546fd --- /dev/null +++ b/system/ThirdParty/Kint/Parser/DateTimePlugin.php @@ -0,0 +1,55 @@ +transplant($o); + + $o = $object; + } +} diff --git a/system/ThirdParty/Kint/Parser/FsPathPlugin.php b/system/ThirdParty/Kint/Parser/FsPathPlugin.php new file mode 100644 index 0000000..79ed328 --- /dev/null +++ b/system/ThirdParty/Kint/Parser/FsPathPlugin.php @@ -0,0 +1,72 @@ + 2048) { + return; + } + + if (!\preg_match('/[\\/\\'.DIRECTORY_SEPARATOR.']/', $var)) { + return; + } + + if (\preg_match('/[?<>"*|]/', $var)) { + return; + } + + if (!@\file_exists($var)) { + return; + } + + if (\in_array($var, self::$blacklist, true)) { + return; + } + + $r = new SplFileInfoRepresentation(new SplFileInfo($var)); + $r->hints[] = 'fspath'; + $o->addRepresentation($r, 0); + } +} diff --git a/system/ThirdParty/Kint/Parser/IteratorPlugin.php b/system/ThirdParty/Kint/Parser/IteratorPlugin.php new file mode 100644 index 0000000..8aa1c34 --- /dev/null +++ b/system/ThirdParty/Kint/Parser/IteratorPlugin.php @@ -0,0 +1,105 @@ +name = $class.' Iterator Contents'; + $b->access_path = 'iterator_to_array('.$o->access_path.', true)'; + $b->depth = $o->depth + 1; + $b->hints[] = 'blacklist'; + + $r = new Representation('Iterator'); + $r->contents = [$b]; + + $o->addRepresentation($r); + + return; + } + } + + $data = \iterator_to_array($var); + + $base_obj = new Value(); + $base_obj->depth = $o->depth; + + if ($o->access_path) { + $base_obj->access_path = 'iterator_to_array('.$o->access_path.')'; + } + + $r = new Representation('Iterator'); + $r->contents = $this->parser->parse($data, $base_obj); + $r->contents = $r->contents->value->contents; + + $primary = $o->getRepresentations(); + $primary = \reset($primary); + if ($primary && $primary === $o->value && [] === $primary->contents) { + $o->addRepresentation($r, 0); + } else { + $o->addRepresentation($r); + } + } +} diff --git a/system/ThirdParty/Kint/Parser/JsonPlugin.php b/system/ThirdParty/Kint/Parser/JsonPlugin.php new file mode 100644 index 0000000..a105b8f --- /dev/null +++ b/system/ThirdParty/Kint/Parser/JsonPlugin.php @@ -0,0 +1,73 @@ +depth = $o->depth; + + if ($o->access_path) { + $base_obj->access_path = 'json_decode('.$o->access_path.', true)'; + } + + $r = new Representation('Json'); + $r->contents = $this->parser->parse($json, $base_obj); + + if (!\in_array('depth_limit', $r->contents->hints, true)) { + $r->contents = $r->contents->value->contents; + } + + $o->addRepresentation($r, 0); + } +} diff --git a/system/ThirdParty/Kint/Parser/MicrotimePlugin.php b/system/ThirdParty/Kint/Parser/MicrotimePlugin.php new file mode 100644 index 0000000..782c11f --- /dev/null +++ b/system/ThirdParty/Kint/Parser/MicrotimePlugin.php @@ -0,0 +1,105 @@ +depth) { + return; + } + + if (\is_string($var)) { + if ('microtime()' !== $o->name || !\preg_match('/^0\\.[0-9]{8} [0-9]{10}$/', $var)) { + return; + } + + $usec = (int) \substr($var, 2, 6); + $sec = (int) \substr($var, 11, 10); + } else { + if ('microtime(...)' !== $o->name) { + return; + } + + $sec = \floor($var); + $usec = $var - $sec; + $usec = \floor($usec * 1000000); + } + + $time = $sec + ($usec / 1000000); + + if (null !== self::$last) { + $last_time = self::$last[0] + (self::$last[1] / 1000000); + $lap = $time - $last_time; + ++self::$times; + } else { + $lap = null; + self::$start = $time; + } + + self::$last = [$sec, $usec]; + + if (null !== $lap) { + $total = $time - self::$start; + $r = new MicrotimeRepresentation($sec, $usec, self::$group, $lap, $total, self::$times); + } else { + $r = new MicrotimeRepresentation($sec, $usec, self::$group); + } + $r->contents = $var; + $r->implicit_label = true; + + $o->removeRepresentation($o->value); + $o->addRepresentation($r); + $o->hints[] = 'microtime'; + } + + public static function clean() + { + self::$last = null; + self::$start = null; + self::$times = 0; + ++self::$group; + } +} diff --git a/system/ThirdParty/Kint/Parser/MysqliPlugin.php b/system/ThirdParty/Kint/Parser/MysqliPlugin.php new file mode 100644 index 0000000..4c95d79 --- /dev/null +++ b/system/ThirdParty/Kint/Parser/MysqliPlugin.php @@ -0,0 +1,189 @@ + true, + 'connect_errno' => true, + 'connect_error' => true, + ]; + + // These are readable on empty mysqli objects, but not on failed connections + protected $empty_readable = [ + 'client_info' => true, + 'errno' => true, + 'error' => true, + ]; + + // These are only readable on connected mysqli objects + protected $connected_readable = [ + 'affected_rows' => true, + 'error_list' => true, + 'field_count' => true, + 'host_info' => true, + 'info' => true, + 'insert_id' => true, + 'server_info' => true, + 'server_version' => true, + 'sqlstate' => true, + 'protocol_version' => true, + 'thread_id' => true, + 'warning_count' => true, + ]; + + public function getTypes() + { + return ['object']; + } + + public function getTriggers() + { + return Parser::TRIGGER_COMPLETE; + } + + public function parse(&$var, Value &$o, $trigger) + { + if (!$var instanceof Mysqli) { + return; + } + + try { + $connected = \is_string(@$var->sqlstate); + } catch (Throwable $t) { + $connected = false; + } + + try { + $empty = !$connected && \is_string(@$var->client_info); + } catch (Throwable $t) { // @codeCoverageIgnore + // Only possible in PHP 8.0. Before 8.0 there's no exception, + // after 8.1 there are no failed connection objects + $empty = false; // @codeCoverageIgnore + } + + foreach ($o->value->contents as $key => $obj) { + if (isset($this->connected_readable[$obj->name])) { + if (!$connected) { + continue; + } + } elseif (isset($this->empty_readable[$obj->name])) { + // No failed connections after PHP 8.1 + if (!$connected && !$empty) { // @codeCoverageIgnore + continue; // @codeCoverageIgnore + } + } elseif (!isset($this->always_readable[$obj->name])) { + continue; + } + + if ('null' !== $obj->type) { + continue; + } + + // @codeCoverageIgnoreStart + // All of this is irellevant after 8.1, + // we have separate logic for that below + + $param = $var->{$obj->name}; + + if (null === $param) { + continue; + } + + $base = Value::blank($obj->name, $obj->access_path); + + $base->depth = $obj->depth; + $base->owner_class = $obj->owner_class; + $base->operator = $obj->operator; + $base->access = $obj->access; + $base->reference = $obj->reference; + + $o->value->contents[$key] = $this->parser->parse($param, $base); + + // @codeCoverageIgnoreEnd + } + + // PHP81 returns an empty array when casting a Mysqli instance + if (KINT_PHP81) { + $r = new ReflectionClass(Mysqli::class); + + $basepropvalues = []; + + foreach ($r->getProperties() as $prop) { + if ($prop->isStatic()) { + continue; // @codeCoverageIgnore + } + + $pname = $prop->getName(); + $param = null; + + if (isset($this->connected_readable[$pname])) { + if ($connected) { + $param = $var->{$pname}; + } + } else { + $param = $var->{$pname}; + } + + $child = new Value(); + $child->depth = $o->depth + 1; + $child->owner_class = Mysqli::class; + $child->operator = Value::OPERATOR_OBJECT; + $child->name = $pname; + + if ($prop->isPublic()) { + $child->access = Value::ACCESS_PUBLIC; + } elseif ($prop->isProtected()) { // @codeCoverageIgnore + $child->access = Value::ACCESS_PROTECTED; // @codeCoverageIgnore + } elseif ($prop->isPrivate()) { // @codeCoverageIgnore + $child->access = Value::ACCESS_PRIVATE; // @codeCoverageIgnore + } + + // We only do base Mysqli properties so we don't need to worry about complex names + if ($this->parser->childHasPath($o, $child)) { + $child->access_path .= $o->access_path.'->'.$child->name; + } + + $basepropvalues[] = $this->parser->parse($param, $child); + } + + $o->value->contents = \array_merge($basepropvalues, $o->value->contents); + } + } +} diff --git a/system/ThirdParty/Kint/Parser/Parser.php b/system/ThirdParty/Kint/Parser/Parser.php new file mode 100644 index 0000000..d658b09 --- /dev/null +++ b/system/ThirdParty/Kint/Parser/Parser.php @@ -0,0 +1,623 @@ +marker = \uniqid("kint\0", true); + + $this->depth_limit = $depth_limit; + $this->caller_class = $caller; + } + + /** + * Set the caller class. + * + * @param null|string $caller Caller class name + */ + public function setCallerClass($caller = null) + { + $this->noRecurseCall(); + + $this->caller_class = $caller; + } + + public function getCallerClass() + { + return $this->caller_class; + } + + /** + * Set the depth limit. + * + * @param int $depth_limit Maximum depth to parse data + */ + public function setDepthLimit($depth_limit = 0) + { + $this->noRecurseCall(); + + $this->depth_limit = $depth_limit; + } + + public function getDepthLimit() + { + return $this->depth_limit; + } + + /** + * Parses a variable into a Kint object structure. + * + * @param mixed $var The input variable + * @param Value $o The base object + * + * @return Value + */ + public function parse(&$var, Value $o) + { + $o->type = \strtolower(\gettype($var)); + + if (!$this->applyPlugins($var, $o, self::TRIGGER_BEGIN)) { + return $o; + } + + switch ($o->type) { + case 'array': + return $this->parseArray($var, $o); + case 'boolean': + case 'double': + case 'integer': + case 'null': + return $this->parseGeneric($var, $o); + case 'object': + return $this->parseObject($var, $o); + case 'resource': + return $this->parseResource($var, $o); + case 'string': + return $this->parseString($var, $o); + case 'unknown type': + case 'resource (closed)': + default: + return $this->parseResourceClosed($var, $o); + } + } + + public function addPlugin(Plugin $p) + { + if (!$types = $p->getTypes()) { + return false; + } + + if (!$triggers = $p->getTriggers()) { + return false; + } + + $p->setParser($this); + + foreach ($types as $type) { + if (!isset($this->plugins[$type])) { + $this->plugins[$type] = [ + self::TRIGGER_BEGIN => [], + self::TRIGGER_SUCCESS => [], + self::TRIGGER_RECURSION => [], + self::TRIGGER_DEPTH_LIMIT => [], + ]; + } + + foreach ($this->plugins[$type] as $trigger => &$pool) { + if ($triggers & $trigger) { + $pool[] = $p; + } + } + } + + return true; + } + + public function clearPlugins() + { + $this->plugins = []; + } + + public function haltParse() + { + $this->parse_break = true; + } + + public function childHasPath(InstanceValue $parent, Value $child) + { + if ('object' === $parent->type && (null !== $parent->access_path || $child->static || $child->const)) { + if (Value::ACCESS_PUBLIC === $child->access) { + return true; + } + + if (Value::ACCESS_PRIVATE === $child->access && $this->caller_class) { + if ($this->caller_class === $child->owner_class) { + return true; + } + } elseif (Value::ACCESS_PROTECTED === $child->access && $this->caller_class) { + if ($this->caller_class === $child->owner_class) { + return true; + } + + if (\is_subclass_of($this->caller_class, $child->owner_class)) { + return true; + } + + if (\is_subclass_of($child->owner_class, $this->caller_class)) { + return true; + } + } + } + + return false; + } + + /** + * Returns an array without the recursion marker in it. + * + * DO NOT pass an array that has had it's marker removed back + * into the parser, it will result in an extra recursion + * + * @param array $array Array potentially containing a recursion marker + * + * @return array Array with recursion marker removed + */ + public function getCleanArray(array $array) + { + unset($array[$this->marker]); + + return $array; + } + + protected function noRecurseCall() + { + $bt = \debug_backtrace(DEBUG_BACKTRACE_PROVIDE_OBJECT | DEBUG_BACKTRACE_IGNORE_ARGS); + + $caller_frame = [ + 'function' => __FUNCTION__, + ]; + + while (isset($bt[0]['object']) && $bt[0]['object'] === $this) { + $caller_frame = \array_shift($bt); + } + + foreach ($bt as $frame) { + if (isset($frame['object']) && $frame['object'] === $this) { + throw new DomainException(__CLASS__.'::'.$caller_frame['function'].' cannot be called from inside a parse'); + } + } + } + + private function parseGeneric(&$var, Value $o) + { + $rep = new Representation('Contents'); + $rep->contents = $var; + $rep->implicit_label = true; + $o->addRepresentation($rep); + $o->value = $rep; + + $this->applyPlugins($var, $o, self::TRIGGER_SUCCESS); + + return $o; + } + + /** + * Parses a string into a Kint BlobValue structure. + * + * @param string $var The input variable + * @param Value $o The base object + * + * @return Value + */ + private function parseString(&$var, Value $o) + { + $string = new BlobValue(); + $string->transplant($o); + $string->encoding = BlobValue::detectEncoding($var); + $string->size = \strlen($var); + + $rep = new Representation('Contents'); + $rep->contents = $var; + $rep->implicit_label = true; + + $string->addRepresentation($rep); + $string->value = $rep; + + $this->applyPlugins($var, $string, self::TRIGGER_SUCCESS); + + return $string; + } + + /** + * Parses an array into a Kint object structure. + * + * @param array $var The input variable + * @param Value $o The base object + * + * @return Value + */ + private function parseArray(array &$var, Value $o) + { + $array = new Value(); + $array->transplant($o); + $array->size = \count($var); + + if (isset($var[$this->marker])) { + --$array->size; + $array->hints[] = 'recursion'; + + $this->applyPlugins($var, $array, self::TRIGGER_RECURSION); + + return $array; + } + + $rep = new Representation('Contents'); + $rep->implicit_label = true; + $array->addRepresentation($rep); + $array->value = $rep; + + if (!$array->size) { + $this->applyPlugins($var, $array, self::TRIGGER_SUCCESS); + + return $array; + } + + if ($this->depth_limit && $o->depth >= $this->depth_limit) { + $array->hints[] = 'depth_limit'; + + $this->applyPlugins($var, $array, self::TRIGGER_DEPTH_LIMIT); + + return $array; + } + + $copy = \array_values($var); + + // It's really really hard to access numeric string keys in arrays, + // and it's really really hard to access integer properties in + // objects, so we just use array_values and index by counter to get + // at it reliably for reference testing. This also affects access + // paths since it's pretty much impossible to access these things + // without complicated stuff you should never need to do. + $i = 0; + + // Set the marker for recursion + $var[$this->marker] = $array->depth; + + $refmarker = new stdClass(); + + foreach ($var as $key => &$val) { + if ($key === $this->marker) { + continue; + } + + $child = new Value(); + $child->name = $key; + $child->depth = $array->depth + 1; + $child->access = Value::ACCESS_NONE; + $child->operator = Value::OPERATOR_ARRAY; + + if (null !== $array->access_path) { + if (\is_string($key) && (string) (int) $key === $key) { + $child->access_path = 'array_values('.$array->access_path.')['.$i.']'; // @codeCoverageIgnore + } else { + $child->access_path = $array->access_path.'['.\var_export($key, true).']'; + } + } + + $stash = $val; + $copy[$i] = $refmarker; + if ($val === $refmarker) { + $child->reference = true; + $val = $stash; + } + + $rep->contents[] = $this->parse($val, $child); + ++$i; + } + + $this->applyPlugins($var, $array, self::TRIGGER_SUCCESS); + unset($var[$this->marker]); + + return $array; + } + + /** + * Parses an object into a Kint InstanceValue structure. + * + * @param object $var The input variable + * @param Value $o The base object + * + * @return Value + */ + private function parseObject(&$var, Value $o) + { + $hash = \spl_object_hash($var); + $values = (array) $var; + + $object = new InstanceValue(); + $object->transplant($o); + $object->classname = \get_class($var); + $object->spl_object_hash = $hash; + $object->size = \count($values); + + if (isset($this->object_hashes[$hash])) { + $object->hints[] = 'recursion'; + + $this->applyPlugins($var, $object, self::TRIGGER_RECURSION); + + return $object; + } + + $this->object_hashes[$hash] = $object; + + if ($this->depth_limit && $o->depth >= $this->depth_limit) { + $object->hints[] = 'depth_limit'; + + $this->applyPlugins($var, $object, self::TRIGGER_DEPTH_LIMIT); + unset($this->object_hashes[$hash]); + + return $object; + } + + $reflector = new ReflectionObject($var); + + if ($reflector->isUserDefined()) { + $object->filename = $reflector->getFileName(); + $object->startline = $reflector->getStartLine(); + } + + $rep = new Representation('Properties'); + + if (KINT_PHP74) { + $rprops = $reflector->getProperties(); + + foreach ($rprops as $rprop) { + if ($rprop->isStatic()) { + continue; + } + + $rprop->setAccessible(true); + if ($rprop->isInitialized($var)) { + continue; + } + + $undefined = null; + + $child = new Value(); + $child->type = 'undefined'; + $child->depth = $object->depth + 1; + $child->owner_class = $rprop->getDeclaringClass()->getName(); + $child->operator = Value::OPERATOR_OBJECT; + $child->name = $rprop->getName(); + + if ($rprop->isPublic()) { + $child->access = Value::ACCESS_PUBLIC; + } elseif ($rprop->isProtected()) { + $child->access = Value::ACCESS_PROTECTED; + } elseif ($rprop->isPrivate()) { + $child->access = Value::ACCESS_PRIVATE; + } + + // Can't dynamically add undefined properties, so no need to use var_export + if ($this->childHasPath($object, $child)) { + $child->access_path .= $object->access_path.'->'.$child->name; + } + + if ($this->applyPlugins($undefined, $child, self::TRIGGER_BEGIN)) { + $this->applyPlugins($undefined, $child, self::TRIGGER_SUCCESS); + } + $rep->contents[] = $child; + } + } + + $copy = \array_values($values); + $refmarker = new stdClass(); + $i = 0; + + // Reflection will not show parent classes private properties, and if a + // property was unset it will happly trigger a notice looking for it. + foreach ($values as $key => &$val) { + // Casting object to array: + // private properties show in the form "\0$owner_class_name\0$property_name"; + // protected properties show in the form "\0*\0$property_name"; + // public properties show in the form "$property_name"; + // http://www.php.net/manual/en/language.types.array.php#language.types.array.casting + + $child = new Value(); + $child->depth = $object->depth + 1; + $child->owner_class = $object->classname; + $child->operator = Value::OPERATOR_OBJECT; + $child->access = Value::ACCESS_PUBLIC; + + $split_key = \explode("\0", $key, 3); + + if (3 === \count($split_key) && '' === $split_key[0]) { + $child->name = $split_key[2]; + if ('*' === $split_key[1]) { + $child->access = Value::ACCESS_PROTECTED; + } else { + $child->access = Value::ACCESS_PRIVATE; + $child->owner_class = $split_key[1]; + } + } elseif (KINT_PHP72) { + $child->name = (string) $key; + } else { + $child->name = $key; // @codeCoverageIgnore + } + + if ($this->childHasPath($object, $child)) { + $child->access_path = $object->access_path; + + if (!KINT_PHP72 && \is_int($child->name)) { + $child->access_path = 'array_values((array) '.$child->access_path.')['.$i.']'; // @codeCoverageIgnore + } elseif (\preg_match('/^[a-zA-Z_\\x7f-\\xff][a-zA-Z0-9_\\x7f-\\xff]*$/', $child->name)) { + $child->access_path .= '->'.$child->name; + } else { + $child->access_path .= '->{'.\var_export((string) $child->name, true).'}'; + } + } + + $stash = $val; + $copy[$i] = $refmarker; + if ($val === $refmarker) { + $child->reference = true; + $val = $stash; + } + + $rep->contents[] = $this->parse($val, $child); + ++$i; + } + + $object->addRepresentation($rep); + $object->value = $rep; + $this->applyPlugins($var, $object, self::TRIGGER_SUCCESS); + unset($this->object_hashes[$hash]); + + return $object; + } + + /** + * Parses a resource into a Kint ResourceValue structure. + * + * @param resource $var The input variable + * @param Value $o The base object + * + * @return Value + */ + private function parseResource(&$var, Value $o) + { + $resource = new ResourceValue(); + $resource->transplant($o); + $resource->resource_type = \get_resource_type($var); + + $this->applyPlugins($var, $resource, self::TRIGGER_SUCCESS); + + return $resource; + } + + /** + * Parses a closed resource into a Kint object structure. + * + * @param mixed $var The input variable + * @param Value $o The base object + * + * @return Value + */ + private function parseResourceClosed(&$var, Value $o) + { + $o->type = 'resource (closed)'; + $this->applyPlugins($var, $o, self::TRIGGER_SUCCESS); + + return $o; + } + + /** + * Applies plugins for an object type. + * + * @param mixed $var variable + * @param Value $o Kint object parsed so far + * @param int $trigger The trigger to check for the plugins + * + * @return bool Continue parsing + */ + private function applyPlugins(&$var, Value &$o, $trigger) + { + $break_stash = $this->parse_break; + + /** @var bool Psalm bug workaround */ + $this->parse_break = false; + + $plugins = []; + + if (isset($this->plugins[$o->type][$trigger])) { + $plugins = $this->plugins[$o->type][$trigger]; + } + + foreach ($plugins as $plugin) { + try { + $plugin->parse($var, $o, $trigger); + } catch (Exception $e) { + \trigger_error( + 'An exception ('.\get_class($e).') was thrown in '.$e->getFile().' on line '.$e->getLine().' while executing Kint Parser Plugin "'.\get_class($plugin).'". Error message: '.$e->getMessage(), + E_USER_WARNING + ); + } + + if ($this->parse_break) { + $this->parse_break = $break_stash; + + return false; + } + } + + $this->parse_break = $break_stash; + + return true; + } +} diff --git a/system/ThirdParty/Kint/Parser/Plugin.php b/system/ThirdParty/Kint/Parser/Plugin.php new file mode 100644 index 0000000..981d2aa --- /dev/null +++ b/system/ThirdParty/Kint/Parser/Plugin.php @@ -0,0 +1,55 @@ +parser = $p; + } + + /** + * An array of types (As returned by gettype) for all data this plugin can operate on. + * + * @return array List of types + */ + public function getTypes() + { + return []; + } + + public function getTriggers() + { + return Parser::TRIGGER_NONE; + } + + abstract public function parse(&$var, Value &$o, $trigger); +} diff --git a/system/ThirdParty/Kint/Parser/ProxyPlugin.php b/system/ThirdParty/Kint/Parser/ProxyPlugin.php new file mode 100644 index 0000000..116f388 --- /dev/null +++ b/system/ThirdParty/Kint/Parser/ProxyPlugin.php @@ -0,0 +1,66 @@ +types = $types; + $this->triggers = $triggers; + $this->callback = $callback; + } + + public function getTypes() + { + return $this->types; + } + + public function getTriggers() + { + return $this->triggers; + } + + public function parse(&$var, Value &$o, $trigger) + { + return \call_user_func_array($this->callback, [&$var, &$o, $trigger, $this->parser]); + } +} diff --git a/system/ThirdParty/Kint/Parser/SerializePlugin.php b/system/ThirdParty/Kint/Parser/SerializePlugin.php new file mode 100644 index 0000000..5924483 --- /dev/null +++ b/system/ThirdParty/Kint/Parser/SerializePlugin.php @@ -0,0 +1,108 @@ + Unserialization can result in code being loaded and executed due to + * > object instantiation and autoloading, and a malicious user may be able + * > to exploit this. + * + * The natural way to stop that from happening is to just refuse to unserialize + * stuff by default. Which is what we're doing for anything that's not scalar. + * + * @var bool + */ + public static $safe_mode = true; + public static $options = [true]; + + public function getTypes() + { + return ['string']; + } + + public function getTriggers() + { + return Parser::TRIGGER_SUCCESS; + } + + public function parse(&$var, Value &$o, $trigger) + { + $trimmed = \rtrim($var); + + if ('N;' !== $trimmed && !\preg_match('/^(?:[COabis]:\\d+[:;]|d:\\d+(?:\\.\\d+);)/', $trimmed)) { + return; + } + + if (!self::$safe_mode || !\in_array($trimmed[0], ['C', 'O', 'a'], true)) { + // Second parameter only supported on PHP 7 + if (KINT_PHP70) { + // Suppress warnings on unserializeable variable + $data = @\unserialize($trimmed, self::$options); + } else { + $data = @\unserialize($trimmed); + } + + if (false === $data && 'b:0;' !== \substr($trimmed, 0, 4)) { + return; + } + } + + $base_obj = new Value(); + $base_obj->depth = $o->depth + 1; + $base_obj->name = 'unserialize('.$o->name.')'; + + if ($o->access_path) { + $base_obj->access_path = 'unserialize('.$o->access_path; + if (!KINT_PHP70 || self::$options === [true]) { + $base_obj->access_path .= ')'; + } elseif (self::$options === [false]) { + $base_obj->access_path .= ', false)'; + } else { + $base_obj->access_path .= ', Serialize::$options)'; + } + } + + $r = new Representation('Serialized'); + + if (isset($data)) { + $r->contents = $this->parser->parse($data, $base_obj); + } else { + $base_obj->hints[] = 'blacklist'; + $r->contents = $base_obj; + } + + $o->addRepresentation($r, 0); + } +} diff --git a/system/ThirdParty/Kint/Parser/SimpleXMLElementPlugin.php b/system/ThirdParty/Kint/Parser/SimpleXMLElementPlugin.php new file mode 100644 index 0000000..9e44e53 --- /dev/null +++ b/system/ThirdParty/Kint/Parser/SimpleXMLElementPlugin.php @@ -0,0 +1,217 @@ +removeRepresentation('properties'); + $o->removeRepresentation('iterator'); + $o->removeRepresentation('methods'); + } + + // An invalid SimpleXMLElement can gum up the works with + // warnings if we call stuff children/attributes on it. + if (!$var) { + $o->size = null; + + return; + } + + $x = new SimpleXMLElementValue(); + $x->transplant($o); + + $namespaces = \array_merge([null], $var->getDocNamespaces()); + + // Attributes + $a = new Representation('Attributes'); + + $base_obj = new Value(); + $base_obj->depth = $x->depth; + + if ($x->access_path) { + $base_obj->access_path = '(string) '.$x->access_path; + } + + // Attributes are strings. If we're too deep set the + // depth limit to enable parsing them, but no deeper. + if ($this->parser->getDepthLimit() && $this->parser->getDepthLimit() - 2 < $base_obj->depth) { + $base_obj->depth = $this->parser->getDepthLimit() - 2; + } + + $attribs = []; + + foreach ($namespaces as $nsAlias => $nsUrl) { + if ($nsAttribs = $var->attributes($nsUrl)) { + $cleanAttribs = []; + foreach ($nsAttribs as $name => $attrib) { + $cleanAttribs[(string) $name] = $attrib; + } + + if (null === $nsUrl) { + $obj = clone $base_obj; + if ($obj->access_path) { + $obj->access_path .= '->attributes()'; + } + + $a->contents = $this->parser->parse($cleanAttribs, $obj)->value->contents; + } else { + $obj = clone $base_obj; + if ($obj->access_path) { + $obj->access_path .= '->attributes('.\var_export($nsAlias, true).', true)'; + } + + $cleanAttribs = $this->parser->parse($cleanAttribs, $obj)->value->contents; + + foreach ($cleanAttribs as $attribute) { + $attribute->name = $nsAlias.':'.$attribute->name; + $a->contents[] = $attribute; + } + } + } + } + + $x->addRepresentation($a, 0); + + // Children + $c = new Representation('Children'); + + foreach ($namespaces as $nsAlias => $nsUrl) { + // This is doubling items because of the root namespace + // and the implicit namespace on its children. + $thisNs = $var->getNamespaces(); + if (isset($thisNs['']) && $thisNs[''] === $nsUrl) { + continue; + } + + if ($nsChildren = $var->children($nsUrl)) { + $nsap = []; + foreach ($nsChildren as $name => $child) { + $obj = new Value(); + $obj->depth = $x->depth + 1; + $obj->name = (string) $name; + if ($x->access_path) { + if (null === $nsUrl) { + $obj->access_path = $x->access_path.'->children()->'; + } else { + $obj->access_path = $x->access_path.'->children('.\var_export($nsAlias, true).', true)->'; + } + + if (\preg_match('/^[a-zA-Z_\\x7f-\\xff][a-zA-Z0-9_\\x7f-\\xff]+$/', (string) $name)) { + $obj->access_path .= (string) $name; + } else { + $obj->access_path .= '{'.\var_export((string) $name, true).'}'; + } + + if (isset($nsap[$obj->access_path])) { + ++$nsap[$obj->access_path]; + $obj->access_path .= '['.$nsap[$obj->access_path].']'; + } else { + $nsap[$obj->access_path] = 0; + } + } + + $value = $this->parser->parse($child, $obj); + + if ($value->access_path && 'string' === $value->type) { + $value->access_path = '(string) '.$value->access_path; + } + + $c->contents[] = $value; + } + } + } + + $x->size = \count($c->contents); + + if ($x->size) { + $x->addRepresentation($c, 0); + } else { + $x->size = null; + + if (\strlen((string) $var)) { + $base_obj = new BlobValue(); + $base_obj->depth = $x->depth + 1; + $base_obj->name = $x->name; + if ($x->access_path) { + $base_obj->access_path = '(string) '.$x->access_path; + } + + $value = (string) $var; + + $s = $this->parser->parse($value, $base_obj); + $srep = $s->getRepresentation('contents'); + $svalrep = $s->value && 'contents' == $s->value->getName() ? $s : null; + + if ($srep || $svalrep) { + $x->setIsStringValue(true); + $x->value = $srep ?: $svalrep; + + if ($srep) { + $x->replaceRepresentation($x->value, 0); + } + } + + $reps = \array_reverse($s->getRepresentations()); + + foreach ($reps as $rep) { + $x->addRepresentation($rep, 0); + } + } + } + + $o = $x; + } +} diff --git a/system/ThirdParty/Kint/Parser/SplFileInfoPlugin.php b/system/ThirdParty/Kint/Parser/SplFileInfoPlugin.php new file mode 100644 index 0000000..ada3e1f --- /dev/null +++ b/system/ThirdParty/Kint/Parser/SplFileInfoPlugin.php @@ -0,0 +1,55 @@ +addRepresentation($r, 0); + $o->size = $r->getSize(); + } +} diff --git a/system/ThirdParty/Kint/Parser/SplObjectStoragePlugin.php b/system/ThirdParty/Kint/Parser/SplObjectStoragePlugin.php new file mode 100644 index 0000000..359774d --- /dev/null +++ b/system/ThirdParty/Kint/Parser/SplObjectStoragePlugin.php @@ -0,0 +1,54 @@ +getRepresentation('iterator'))) { + return; + } + + $r = $o->getRepresentation('iterator'); + if ($r) { + $o->size = !\is_array($r->contents) ? null : \count($r->contents); + } + } +} diff --git a/system/ThirdParty/Kint/Parser/StreamPlugin.php b/system/ThirdParty/Kint/Parser/StreamPlugin.php new file mode 100644 index 0000000..76608d9 --- /dev/null +++ b/system/ThirdParty/Kint/Parser/StreamPlugin.php @@ -0,0 +1,81 @@ +resource_type) { + return; + } + + // Doublecheck that the resource is open before we get the metadata + if (!\is_resource($var)) { + return; + } + + $meta = \stream_get_meta_data($var); + + $rep = new Representation('Stream'); + $rep->implicit_label = true; + + $base_obj = new Value(); + $base_obj->depth = $o->depth; + + if ($o->access_path) { + $base_obj->access_path = 'stream_get_meta_data('.$o->access_path.')'; + } + + $rep->contents = $this->parser->parse($meta, $base_obj); + + if (!\in_array('depth_limit', $rep->contents->hints, true)) { + $rep->contents = $rep->contents->value->contents; + } + + $o->addRepresentation($rep, 0); + $o->value = $rep; + + $stream = new StreamValue($meta); + $stream->transplant($o); + $o = $stream; + } +} diff --git a/system/ThirdParty/Kint/Parser/TablePlugin.php b/system/ThirdParty/Kint/Parser/TablePlugin.php new file mode 100644 index 0000000..c6ca6e2 --- /dev/null +++ b/system/ThirdParty/Kint/Parser/TablePlugin.php @@ -0,0 +1,87 @@ +value->contents)) { + return; + } + + $array = $this->parser->getCleanArray($var); + + if (\count($array) < 2) { + return; + } + + // Ensure this is an array of arrays and that all child arrays have the + // same keys. We don't care about their children - if there's another + // "table" inside we'll just make another one down the value tab + $keys = null; + foreach ($array as $elem) { + if (!\is_array($elem) || \count($elem) < 2) { + return; + } + + if (null === $keys) { + $keys = \array_keys($elem); + } elseif (\array_keys($elem) !== $keys) { + return; + } + } + + // Ensure none of the child arrays are recursion or depth limit. We + // don't care if their children are since they are the table cells + foreach ($o->value->contents as $childarray) { + if (empty($childarray->value->contents)) { + return; + } + } + + // Objects by reference for the win! We can do a copy-paste of the value + // representation contents and just slap a new hint on there and hey + // presto we have our table representation with no extra memory used! + $table = new Representation('Table'); + $table->contents = $o->value->contents; + $table->hints[] = 'table'; + $o->addRepresentation($table, 0); + } +} diff --git a/system/ThirdParty/Kint/Parser/ThrowablePlugin.php b/system/ThirdParty/Kint/Parser/ThrowablePlugin.php new file mode 100644 index 0000000..ea343e9 --- /dev/null +++ b/system/ThirdParty/Kint/Parser/ThrowablePlugin.php @@ -0,0 +1,60 @@ +transplant($o); + $r = new SourceRepresentation($var->getFile(), $var->getLine()); + $r->showfilename = true; + $throw->addRepresentation($r, 0); + + $o = $throw; + } +} diff --git a/system/ThirdParty/Kint/Parser/TimestampPlugin.php b/system/ThirdParty/Kint/Parser/TimestampPlugin.php new file mode 100644 index 0000000..fa8d743 --- /dev/null +++ b/system/ThirdParty/Kint/Parser/TimestampPlugin.php @@ -0,0 +1,71 @@ +value->label = 'Timestamp'; + $o->value->hints[] = 'timestamp'; + } + } +} diff --git a/system/ThirdParty/Kint/Parser/ToStringPlugin.php b/system/ThirdParty/Kint/Parser/ToStringPlugin.php new file mode 100644 index 0000000..d13cb29 --- /dev/null +++ b/system/ThirdParty/Kint/Parser/ToStringPlugin.php @@ -0,0 +1,67 @@ +hasMethod('__toString')) { + return; + } + + foreach (self::$blacklist as $class) { + if ($var instanceof $class) { + return; + } + } + + $r = new Representation('toString'); + $r->contents = (string) $var; + + $o->addRepresentation($r); + } +} diff --git a/system/ThirdParty/Kint/Parser/TracePlugin.php b/system/ThirdParty/Kint/Parser/TracePlugin.php new file mode 100644 index 0000000..ccdcade --- /dev/null +++ b/system/ThirdParty/Kint/Parser/TracePlugin.php @@ -0,0 +1,120 @@ +value) { + return; + } + + /** @var array[] $trace Psalm workaround */ + $trace = $this->parser->getCleanArray($var); + + if (\count($trace) !== \count($o->value->contents) || !Utils::isTrace($trace)) { + return; + } + + $traceobj = new TraceValue(); + $traceobj->transplant($o); + $rep = $traceobj->value; + + $old_trace = $rep->contents; + + Utils::normalizeAliases(self::$blacklist); + $path_blacklist = self::normalizePaths(self::$path_blacklist); + + $rep->contents = []; + + foreach ($old_trace as $frame) { + $index = $frame->name; + + if (!isset($trace[$index]['function'])) { + // Something's very very wrong here, but it's probably a plugin's fault + continue; + } + + if (Utils::traceFrameIsListed($trace[$index], self::$blacklist)) { + continue; + } + + if (isset($trace[$index]['file'])) { + $realfile = \realpath($trace[$index]['file']); + foreach ($path_blacklist as $path) { + if (0 === \strpos($realfile, $path)) { + continue 2; + } + } + } + + $rep->contents[$index] = new TraceFrameValue($frame, $trace[$index]); + } + + \ksort($rep->contents); + $rep->contents = \array_values($rep->contents); + + $traceobj->clearRepresentations(); + $traceobj->addRepresentation($rep); + $traceobj->size = \count($rep->contents); + $o = $traceobj; + } + + protected static function normalizePaths(array $paths) + { + $normalized = []; + + foreach ($paths as $path) { + $realpath = \realpath($path); + if (\is_dir($realpath)) { + $realpath .= DIRECTORY_SEPARATOR; + } + + $normalized[] = $realpath; + } + + return $normalized; + } +} diff --git a/system/ThirdParty/Kint/Parser/XmlPlugin.php b/system/ThirdParty/Kint/Parser/XmlPlugin.php new file mode 100644 index 0000000..a4fa2b0 --- /dev/null +++ b/system/ThirdParty/Kint/Parser/XmlPlugin.php @@ -0,0 +1,157 @@ +access_path); + + if (empty($xml)) { + return; + } + + list($xml, $access_path, $name) = $xml; + + $base_obj = new Value(); + $base_obj->depth = $o->depth + 1; + $base_obj->name = $name; + $base_obj->access_path = $access_path; + + $r = new Representation('XML'); + $r->contents = $this->parser->parse($xml, $base_obj); + + $o->addRepresentation($r, 0); + } + + protected static function xmlToSimpleXML($var, $parent_path) + { + try { + $errors = \libxml_use_internal_errors(true); + $xml = \simplexml_load_string($var); + \libxml_use_internal_errors($errors); + } catch (Exception $e) { + if (isset($errors)) { + \libxml_use_internal_errors($errors); + } + + return; + } + + if (false === $xml) { + return; + } + + if (null === $parent_path) { + $access_path = null; + } else { + $access_path = 'simplexml_load_string('.$parent_path.')'; + } + + $name = $xml->getName(); + + return [$xml, $access_path, $name]; + } + + /** + * Get the DOMDocument info. + * + * The documentation of DOMDocument::loadXML() states that while you can + * call it statically, it will give an E_STRICT warning. On my system it + * actually gives an E_DEPRECATED warning, but it works so we'll just add + * an error-silencing '@' to the access path. + * + * If it errors loading then we wouldn't have gotten this far in the first place. + * + * @param string $var The XML string + * @param null|string $parent_path The path to the parent, in this case the XML string + * + * @return null|array The root element DOMNode, the access path, and the root element name + */ + protected static function xmlToDOMDocument($var, $parent_path) + { + // There's no way to check validity in DOMDocument without making errors. For shame! + if (!self::xmlToSimpleXML($var, $parent_path)) { + return null; + } + + $xml = new DOMDocument(); + $xml->loadXML($var); + + if ($xml->childNodes->count() > 1) { + $xml = $xml->childNodes; + $access_path = 'childNodes'; + } else { + $xml = $xml->firstChild; + $access_path = 'firstChild'; + } + + if (null === $parent_path) { + $access_path = null; + } else { + $access_path = '(function($s){$x = new \\DomDocument(); $x->loadXML($s); return $x;})('.$parent_path.')->'.$access_path; + } + + $name = isset($xml->nodeName) ? $xml->nodeName : null; + + return [$xml, $access_path, $name]; + } +} diff --git a/system/ThirdParty/Kint/Renderer/CliRenderer.php b/system/ThirdParty/Kint/Renderer/CliRenderer.php new file mode 100644 index 0000000..12b18d0 --- /dev/null +++ b/system/ThirdParty/Kint/Renderer/CliRenderer.php @@ -0,0 +1,183 @@ +windows_output = true; + } else { + $stream = self::$windows_stream; + + if (!$stream && \defined('STDOUT')) { + $stream = STDOUT; + } + + if (!$stream) { + $this->windows_output = true; + } else { + $this->windows_output = !\sapi_windows_vt100_support($stream); + } + } + } + + if (!self::$terminal_width) { + if (!KINT_WIN && self::$detect_width) { + try { + self::$terminal_width = \exec('tput cols'); + } catch (Exception $e) { + self::$terminal_width = self::$default_width; + } catch (Throwable $t) { + self::$terminal_width = self::$default_width; + } + } + + if (self::$terminal_width < self::$min_terminal_width) { + self::$terminal_width = self::$default_width; + } + } + + $this->colors = $this->windows_output ? false : self::$cli_colors; + + $this->header_width = self::$terminal_width; + } + + public function colorValue($string) + { + if (!$this->colors) { + return $string; + } + + return "\x1b[32m".\str_replace("\n", "\x1b[0m\n\x1b[32m", $string)."\x1b[0m"; + } + + public function colorType($string) + { + if (!$this->colors) { + return $string; + } + + return "\x1b[35;1m".\str_replace("\n", "\x1b[0m\n\x1b[35;1m", $string)."\x1b[0m"; + } + + public function colorTitle($string) + { + if (!$this->colors) { + return $string; + } + + return "\x1b[36m".\str_replace("\n", "\x1b[0m\n\x1b[36m", $string)."\x1b[0m"; + } + + public function renderTitle(Value $o) + { + if ($this->windows_output) { + return $this->utf8ToWindows(parent::renderTitle($o)); + } + + return parent::renderTitle($o); + } + + public function preRender() + { + return PHP_EOL; + } + + public function postRender() + { + if ($this->windows_output) { + return $this->utf8ToWindows(parent::postRender()); + } + + return parent::postRender(); + } + + public function escape($string, $encoding = false) + { + return \str_replace("\x1b", '\\x1b', $string); + } + + protected function utf8ToWindows($string) + { + return \str_replace( + ['ā”Œ', '═', '┐', '│', 'ā””', '─', 'ā”˜'], + [' ', '=', ' ', '|', ' ', '-', ' '], + $string + ); + } +} diff --git a/system/ThirdParty/Kint/Renderer/PlainRenderer.php b/system/ThirdParty/Kint/Renderer/PlainRenderer.php new file mode 100644 index 0000000..4b8102a --- /dev/null +++ b/system/ThirdParty/Kint/Renderer/PlainRenderer.php @@ -0,0 +1,237 @@ + [ + ['Kint\\Renderer\\PlainRenderer', 'renderJs'], + ['Kint\\Renderer\\Text\\MicrotimePlugin', 'renderJs'], + ], + 'style' => [ + ['Kint\\Renderer\\PlainRenderer', 'renderCss'], + ], + 'raw' => [], + ]; + + /** + * Path to the CSS file to load by default. + * + * @var string + */ + public static $theme = 'plain.css'; + + /** + * Output htmlentities instead of utf8. + * + * @var bool + */ + public static $disable_utf8 = false; + + public static $needs_pre_render = true; + + public static $always_pre_render = false; + + protected $force_pre_render = false; + protected $pre_render; + + public function __construct() + { + parent::__construct(); + + $this->pre_render = self::$needs_pre_render; + + if (self::$always_pre_render) { + $this->setPreRender(true); + } + } + + public function setCallInfo(array $info) + { + parent::setCallInfo($info); + + if (\in_array('@', $this->call_info['modifiers'], true)) { + $this->setPreRender(true); + } + } + + public function setStatics(array $statics) + { + parent::setStatics($statics); + + if (!empty($statics['return'])) { + $this->setPreRender(true); + } + } + + public function setPreRender($pre_render) + { + $this->pre_render = $pre_render; + $this->force_pre_render = true; + } + + public function getPreRender() + { + return $this->pre_render; + } + + public function colorValue($string) + { + return ''.$string.''; + } + + public function colorType($string) + { + return ''.$string.''; + } + + public function colorTitle($string) + { + return ''.$string.''; + } + + public function renderTitle(Value $o) + { + if (self::$disable_utf8) { + return $this->utf8ToHtmlentity(parent::renderTitle($o)); + } + + return parent::renderTitle($o); + } + + public function preRender() + { + $output = ''; + + if ($this->pre_render) { + foreach (self::$pre_render_sources as $type => $values) { + $contents = ''; + foreach ($values as $v) { + $contents .= \call_user_func($v, $this); + } + + if (!\strlen($contents)) { + continue; + } + + switch ($type) { + case 'script': + $output .= ''; + break; + case 'style': + $output .= ''; + break; + default: + $output .= $contents; + } + } + + // Don't pre-render on every dump + if (!$this->force_pre_render) { + self::$needs_pre_render = false; + } + } + + return $output.'
'; + } + + public function postRender() + { + if (self::$disable_utf8) { + return $this->utf8ToHtmlentity(parent::postRender()).'
'; + } + + return parent::postRender().'
'; + } + + public function ideLink($file, $line) + { + $path = $this->escape(Kint::shortenPath($file)).':'.$line; + $ideLink = Kint::getIdeLink($file, $line); + + if (!$ideLink) { + return $path; + } + + $class = ''; + + if (\preg_match('/https?:\\/\\//i', $ideLink)) { + $class = 'class="kint-ide-link" '; + } + + return ''.$path.''; + } + + public function escape($string, $encoding = false) + { + if (false === $encoding) { + $encoding = BlobValue::detectEncoding($string); + } + + $original_encoding = $encoding; + + if (false === $encoding || 'ASCII' === $encoding) { + $encoding = 'UTF-8'; + } + + $string = \htmlspecialchars($string, ENT_NOQUOTES, $encoding); + + // this call converts all non-ASCII characters into numeirc htmlentities + if (\function_exists('mb_encode_numericentity') && 'ASCII' !== $original_encoding) { + $string = \mb_encode_numericentity($string, [0x80, 0xFFFF, 0, 0xFFFF], $encoding); + } + + return $string; + } + + protected function utf8ToHtmlentity($string) + { + return \str_replace( + ['ā”Œ', '═', '┐', '│', 'ā””', '─', 'ā”˜'], + ['┌', '═', '┐', '│', '└', '─', '┘'], + $string + ); + } + + protected static function renderJs() + { + return \file_get_contents(KINT_DIR.'/resources/compiled/shared.js').\file_get_contents(KINT_DIR.'/resources/compiled/plain.js'); + } + + protected static function renderCss() + { + if (\file_exists(KINT_DIR.'/resources/compiled/'.self::$theme)) { + return \file_get_contents(KINT_DIR.'/resources/compiled/'.self::$theme); + } + + return \file_get_contents(self::$theme); + } +} diff --git a/system/ThirdParty/Kint/Renderer/Renderer.php b/system/ThirdParty/Kint/Renderer/Renderer.php new file mode 100644 index 0000000..0ed7ce0 --- /dev/null +++ b/system/ThirdParty/Kint/Renderer/Renderer.php @@ -0,0 +1,185 @@ +call_info = [ + 'params' => $info['params'], + 'modifiers' => $info['modifiers'], + 'callee' => $info['callee'], + 'caller' => $info['caller'], + 'trace' => $info['trace'], + ]; + } + + public function getCallInfo() + { + return $this->call_info; + } + + public function setStatics(array $statics) + { + $this->statics = $statics; + $this->setShowTrace(!empty($statics['display_called_from'])); + } + + public function getStatics() + { + return $this->statics; + } + + public function setShowTrace($show_trace) + { + $this->show_trace = $show_trace; + } + + public function getShowTrace() + { + return $this->show_trace; + } + + /** + * Returns the first compatible plugin available. + * + * @param array $plugins Array of hints to class strings + * @param array $hints Array of object hints + * + * @return array Array of hints to class strings filtered and sorted by object hints + */ + public function matchPlugins(array $plugins, array $hints) + { + $out = []; + + foreach ($hints as $key) { + if (isset($plugins[$key])) { + $out[$key] = $plugins[$key]; + } + } + + return $out; + } + + public function filterParserPlugins(array $plugins) + { + return $plugins; + } + + public function preRender() + { + return ''; + } + + public function postRender() + { + return ''; + } + + public static function sortPropertiesFull(Value $a, Value $b) + { + $sort = Value::sortByAccess($a, $b); + if ($sort) { + return $sort; + } + + $sort = Value::sortByName($a, $b); + if ($sort) { + return $sort; + } + + return InstanceValue::sortByHierarchy($a->owner_class, $b->owner_class); + } + + /** + * Sorts an array of Value. + * + * @param Value[] $contents Object properties to sort + * @param int $sort + * + * @return Value[] + */ + public static function sortProperties(array $contents, $sort) + { + switch ($sort) { + case self::SORT_VISIBILITY: + // Containers to quickly stable sort by type + $containers = [ + Value::ACCESS_PUBLIC => [], + Value::ACCESS_PROTECTED => [], + Value::ACCESS_PRIVATE => [], + Value::ACCESS_NONE => [], + ]; + + foreach ($contents as $item) { + $containers[$item->access][] = $item; + } + + return \call_user_func_array('array_merge', $containers); + case self::SORT_FULL: + \usort($contents, ['Kint\\Renderer\\Renderer', 'sortPropertiesFull']); + // no break + default: + return $contents; + } + } +} diff --git a/system/ThirdParty/Kint/Renderer/Rich/ArrayLimitPlugin.php b/system/ThirdParty/Kint/Renderer/Rich/ArrayLimitPlugin.php new file mode 100644 index 0000000..e6ebe56 --- /dev/null +++ b/system/ThirdParty/Kint/Renderer/Rich/ArrayLimitPlugin.php @@ -0,0 +1,36 @@ +'.$this->renderLockedHeader($o, 'Array Limit').''; + } +} diff --git a/system/ThirdParty/Kint/Renderer/Rich/BinaryPlugin.php b/system/ThirdParty/Kint/Renderer/Rich/BinaryPlugin.php new file mode 100644 index 0000000..b12690a --- /dev/null +++ b/system/ThirdParty/Kint/Renderer/Rich/BinaryPlugin.php @@ -0,0 +1,56 @@ +'; + + /** @var string[] Psalm bug workaround */ + $lines = \str_split($r->contents, self::$line_length); + + foreach ($lines as $index => $line) { + $out .= \sprintf('%08X', $index * self::$line_length).":\t"; + + /** @var string[] Psalm bug workaround */ + $chunks = \str_split(\str_pad(\bin2hex($line), 2 * self::$line_length, ' '), self::$chunk_length); + + $out .= \implode(' ', $chunks); + $out .= "\t".\preg_replace('/[^\\x20-\\x7E]/', '.', $line)."\n"; + } + + $out .= ''; + + return $out; + } +} diff --git a/system/ThirdParty/Kint/Renderer/Rich/BlacklistPlugin.php b/system/ThirdParty/Kint/Renderer/Rich/BlacklistPlugin.php new file mode 100644 index 0000000..ed7f4ec --- /dev/null +++ b/system/ThirdParty/Kint/Renderer/Rich/BlacklistPlugin.php @@ -0,0 +1,36 @@ +'.$this->renderLockedHeader($o, 'Blacklisted').''; + } +} diff --git a/system/ThirdParty/Kint/Renderer/Rich/CallablePlugin.php b/system/ThirdParty/Kint/Renderer/Rich/CallablePlugin.php new file mode 100644 index 0000000..b28b56a --- /dev/null +++ b/system/ThirdParty/Kint/Renderer/Rich/CallablePlugin.php @@ -0,0 +1,174 @@ +renderMethod($o); + } + + if ($o instanceof ClosureValue) { + return $this->renderClosure($o); + } + + return $this->renderCallable($o); + } + + protected function renderClosure(ClosureValue $o) + { + $children = $this->renderer->renderChildren($o); + + $header = ''; + + if (null !== ($s = $o->getModifiers())) { + $header .= ''.$s.' '; + } + + if (null !== ($s = $o->getName())) { + $header .= ''.$this->renderer->escape($s).'('.$this->renderer->escape($o->getParams()).')'; + } + + if (null !== ($s = $o->getValueShort())) { + if (RichRenderer::$strlen_max) { + $s = Utils::truncateString($s, RichRenderer::$strlen_max); + } + $header .= ' '.$this->renderer->escape($s); + } + + return '
'.$this->renderer->renderHeaderWrapper($o, (bool) \strlen($children), $header).$children.'
'; + } + + protected function renderCallable(Value $o) + { + $children = $this->renderer->renderChildren($o); + + $header = ''; + + if (null !== ($s = $o->getModifiers())) { + $header .= ''.$s.' '; + } + + if (null !== ($s = $o->getName())) { + $header .= ''.$this->renderer->escape($s).''; + } + + if (null !== ($s = $o->getValueShort())) { + if (RichRenderer::$strlen_max) { + $s = Utils::truncateString($s, RichRenderer::$strlen_max); + } + $header .= ' '.$this->renderer->escape($s); + } + + return '
'.$this->renderer->renderHeaderWrapper($o, (bool) \strlen($children), $header).$children.'
'; + } + + protected function renderMethod(MethodValue $o) + { + if (!empty(self::$method_cache[$o->owner_class][$o->name])) { + $children = self::$method_cache[$o->owner_class][$o->name]['children']; + + $header = $this->renderer->renderHeaderWrapper( + $o, + (bool) \strlen($children), + self::$method_cache[$o->owner_class][$o->name]['header'] + ); + + return '
'.$header.$children.'
'; + } + + $children = $this->renderer->renderChildren($o); + + $header = ''; + + if (null !== ($s = $o->getModifiers()) || $o->return_reference) { + $header .= ''.$s; + + if ($o->return_reference) { + if ($s) { + $header .= ' '; + } + $header .= $this->renderer->escape('&'); + } + + $header .= ' '; + } + + if (null !== ($s = $o->getName())) { + $function = $this->renderer->escape($s).'('.$this->renderer->escape($o->getParams()).')'; + + if (null !== ($url = $o->getPhpDocUrl())) { + $function = ''.$function.''; + } + + $header .= ''.$function.''; + } + + if (!empty($o->returntype)) { + $header .= ': '; + + if ($o->return_reference) { + $header .= $this->renderer->escape('&'); + } + + $header .= $this->renderer->escape($o->returntype).''; + } elseif ($o->docstring) { + if (\preg_match('/@return\\s+(.*)\\r?\\n/m', $o->docstring, $matches)) { + if (\trim($matches[1])) { + $header .= ': '.$this->renderer->escape(\trim($matches[1])).''; + } + } + } + + if (null !== ($s = $o->getValueShort())) { + if (RichRenderer::$strlen_max) { + $s = Utils::truncateString($s, RichRenderer::$strlen_max); + } + $header .= ' '.$this->renderer->escape($s); + } + + if (\strlen($o->owner_class) && \strlen($o->name)) { + self::$method_cache[$o->owner_class][$o->name] = [ + 'header' => $header, + 'children' => $children, + ]; + } + + $header = $this->renderer->renderHeaderWrapper($o, (bool) \strlen($children), $header); + + return '
'.$header.$children.'
'; + } +} diff --git a/system/ThirdParty/Kint/Renderer/Rich/ClosurePlugin.php b/system/ThirdParty/Kint/Renderer/Rich/ClosurePlugin.php new file mode 100644 index 0000000..44813e3 --- /dev/null +++ b/system/ThirdParty/Kint/Renderer/Rich/ClosurePlugin.php @@ -0,0 +1,59 @@ +renderer->renderChildren($o); + + if (!($o instanceof ClosureValue)) { + $header = $this->renderer->renderHeader($o); + } else { + $header = ''; + + if (null !== ($s = $o->getModifiers())) { + $header .= ''.$s.' '; + } + + if (null !== ($s = $o->getName())) { + $header .= ''.$this->renderer->escape($s).'('.$this->renderer->escape($o->getParams()).') '; + } + + $header .= 'Closure '; + $header .= $this->renderer->escape(Kint::shortenPath($o->filename)).':'.(int) $o->startline; + } + + $header = $this->renderer->renderHeaderWrapper($o, (bool) \strlen($children), $header); + + return '
'.$header.$children.'
'; + } +} diff --git a/system/ThirdParty/Kint/Renderer/Rich/ColorPlugin.php b/system/ThirdParty/Kint/Renderer/Rich/ColorPlugin.php new file mode 100644 index 0000000..ebd02cb --- /dev/null +++ b/system/ThirdParty/Kint/Renderer/Rich/ColorPlugin.php @@ -0,0 +1,100 @@ +getRepresentation('color'); + + if (!$r instanceof ColorRepresentation) { + return; + } + + $children = $this->renderer->renderChildren($o); + + $header = $this->renderer->renderHeader($o); + $header .= '
'; + + $header = $this->renderer->renderHeaderWrapper($o, (bool) \strlen($children), $header); + + return '
'.$header.$children.'
'; + } + + public function renderTab(Representation $r) + { + if (!$r instanceof ColorRepresentation) { + return; + } + + $out = ''; + + if ($color = $r->getColor(ColorRepresentation::COLOR_NAME)) { + $out .= ''.$color."\n"; + } + if ($color = $r->getColor(ColorRepresentation::COLOR_HEX_3)) { + $out .= ''.$color."\n"; + } + if ($color = $r->getColor(ColorRepresentation::COLOR_HEX_6)) { + $out .= ''.$color."\n"; + } + + if ($r->hasAlpha()) { + if ($color = $r->getColor(ColorRepresentation::COLOR_HEX_4)) { + $out .= ''.$color."\n"; + } + if ($color = $r->getColor(ColorRepresentation::COLOR_HEX_8)) { + $out .= ''.$color."\n"; + } + if ($color = $r->getColor(ColorRepresentation::COLOR_RGBA)) { + $out .= ''.$color."\n"; + } + if ($color = $r->getColor(ColorRepresentation::COLOR_HSLA)) { + $out .= ''.$color."\n"; + } + } else { + if ($color = $r->getColor(ColorRepresentation::COLOR_RGB)) { + $out .= ''.$color."\n"; + } + if ($color = $r->getColor(ColorRepresentation::COLOR_HSL)) { + $out .= ''.$color."\n"; + } + } + + if (!\strlen($out)) { + return; + } + + return '
'.$out.'
'; + } +} diff --git a/system/ThirdParty/Kint/Renderer/Rich/DepthLimitPlugin.php b/system/ThirdParty/Kint/Renderer/Rich/DepthLimitPlugin.php new file mode 100644 index 0000000..69808c7 --- /dev/null +++ b/system/ThirdParty/Kint/Renderer/Rich/DepthLimitPlugin.php @@ -0,0 +1,36 @@ +'.$this->renderLockedHeader($o, 'Depth Limit').''; + } +} diff --git a/system/ThirdParty/Kint/Renderer/Rich/DocstringPlugin.php b/system/ThirdParty/Kint/Renderer/Rich/DocstringPlugin.php new file mode 100644 index 0000000..cb53a74 --- /dev/null +++ b/system/ThirdParty/Kint/Renderer/Rich/DocstringPlugin.php @@ -0,0 +1,70 @@ +contents) as $line) { + $docstring[] = \trim($line); + } + + $docstring = \implode("\n", $docstring); + + $location = []; + + if ($r->class) { + $location[] = 'Inherited from '.$this->renderer->escape($r->class); + } + if ($r->file && $r->line) { + $location[] = 'Defined in '.$this->renderer->escape(Kint::shortenPath($r->file)).':'.((int) $r->line); + } + + $location = \implode("\n", $location); + + if ($location) { + if (\strlen($docstring)) { + $docstring .= "\n\n"; + } + + $location = ''.$location.''; + } elseif (0 === \strlen($docstring)) { + return ''; + } + + return '
'.$this->renderer->escape($docstring).$location.'
'; + } +} diff --git a/system/ThirdParty/Kint/Renderer/Rich/MicrotimePlugin.php b/system/ThirdParty/Kint/Renderer/Rich/MicrotimePlugin.php new file mode 100644 index 0000000..3d06b52 --- /dev/null +++ b/system/ThirdParty/Kint/Renderer/Rich/MicrotimePlugin.php @@ -0,0 +1,68 @@ +getDateTime()->format('Y-m-d H:i:s.u'); + if (null !== $r->lap) { + $out .= '
SINCE LAST CALL: '.\round($r->lap, 4).'s.'; + } + if (null !== $r->total) { + $out .= '
SINCE START: '.\round($r->total, 4).'s.'; + } + if (null !== $r->avg) { + $out .= '
AVERAGE DURATION: '.\round($r->avg, 4).'s.'; + } + + $bytes = Utils::getHumanReadableBytes($r->mem); + $out .= '
MEMORY USAGE: '.$r->mem.' bytes ('.\round($bytes['value'], 3).' '.$bytes['unit'].')'; + $bytes = Utils::getHumanReadableBytes($r->mem_real); + $out .= ' (real '.\round($bytes['value'], 3).' '.$bytes['unit'].')'; + + $bytes = Utils::getHumanReadableBytes($r->mem_peak); + $out .= '
PEAK MEMORY USAGE: '.$r->mem_peak.' bytes ('.\round($bytes['value'], 3).' '.$bytes['unit'].')'; + $bytes = Utils::getHumanReadableBytes($r->mem_peak_real); + $out .= ' (real '.\round($bytes['value'], 3).' '.$bytes['unit'].')'; + + return '
'.$out.'
'; + } + + public static function renderJs() + { + return \file_get_contents(KINT_DIR.'/resources/compiled/microtime.js'); + } +} diff --git a/system/ThirdParty/Kint/Renderer/Rich/Plugin.php b/system/ThirdParty/Kint/Renderer/Rich/Plugin.php new file mode 100644 index 0000000..58e22cb --- /dev/null +++ b/system/ThirdParty/Kint/Renderer/Rich/Plugin.php @@ -0,0 +1,89 @@ +renderer = $r; + } + + /** + * Renders a locked header. + * + * @param string $content + */ + public function renderLockedHeader(Value $o, $content) + { + $header = '
'; + + if (RichRenderer::$access_paths && $o->depth > 0 && $ap = $o->getAccessPath()) { + $header .= ''; + } + + $header .= ''; + + if (null !== ($s = $o->getModifiers())) { + $header .= ''.$s.' '; + } + + if (null !== ($s = $o->getName())) { + $header .= ''.$this->renderer->escape($s).' '; + + if ($s = $o->getOperator()) { + $header .= $this->renderer->escape($s, 'ASCII').' '; + } + } + + if (null !== ($s = $o->getType())) { + $s = $this->renderer->escape($s); + + if ($o->reference) { + $s = '&'.$s; + } + + $header .= ''.$s.' '; + } + + if (null !== ($s = $o->getSize())) { + $header .= '('.$this->renderer->escape($s).') '; + } + + $header .= $content; + + if (!empty($ap)) { + $header .= '
'.$this->renderer->escape($ap).'
'; + } + + return $header.'
'; + } +} diff --git a/system/ThirdParty/Kint/Renderer/Rich/PluginInterface.php b/system/ThirdParty/Kint/Renderer/Rich/PluginInterface.php new file mode 100644 index 0000000..79828e7 --- /dev/null +++ b/system/ThirdParty/Kint/Renderer/Rich/PluginInterface.php @@ -0,0 +1,33 @@ +'.$this->renderLockedHeader($o, 'Recursion').''; + } +} diff --git a/system/ThirdParty/Kint/Renderer/Rich/SimpleXMLElementPlugin.php b/system/ThirdParty/Kint/Renderer/Rich/SimpleXMLElementPlugin.php new file mode 100644 index 0000000..718cd67 --- /dev/null +++ b/system/ThirdParty/Kint/Renderer/Rich/SimpleXMLElementPlugin.php @@ -0,0 +1,77 @@ +renderer->renderChildren($o); + + $header = ''; + + if (null !== ($s = $o->getModifiers())) { + $header .= ''.$s.' '; + } + + if (null !== ($s = $o->getName())) { + $header .= ''.$this->renderer->escape($s).' '; + + if ($s = $o->getOperator()) { + $header .= $this->renderer->escape($s, 'ASCII').' '; + } + } + + if (null !== ($s = $o->getType())) { + $s = $this->renderer->escape($s); + + if ($o->reference) { + $s = '&'.$s; + } + + $header .= ''.$this->renderer->escape($s).' '; + } + + if (null !== ($s = $o->getSize())) { + $header .= '('.$this->renderer->escape($s).') '; + } + + if (null !== ($s = $o->getValueShort())) { + if (RichRenderer::$strlen_max) { + $s = Utils::truncateString($s, RichRenderer::$strlen_max); + } + $header .= $this->renderer->escape($s); + } + + $header = $this->renderer->renderHeaderWrapper($o, (bool) \strlen($children), $header); + + return '
'.$header.$children.'
'; + } +} diff --git a/system/ThirdParty/Kint/Renderer/Rich/SourcePlugin.php b/system/ThirdParty/Kint/Renderer/Rich/SourcePlugin.php new file mode 100644 index 0000000..4be024b --- /dev/null +++ b/system/ThirdParty/Kint/Renderer/Rich/SourcePlugin.php @@ -0,0 +1,79 @@ +source)) { + return; + } + + $source = $r->source; + + // Trim empty lines from the start and end of the source + foreach ($source as $linenum => $line) { + if (\strlen(\trim($line)) || $linenum === $r->line) { + break; + } + + unset($source[$linenum]); + } + + foreach (\array_reverse($source, true) as $linenum => $line) { + if (\strlen(\trim($line)) || $linenum === $r->line) { + break; + } + + unset($source[$linenum]); + } + + $output = ''; + + foreach ($source as $linenum => $line) { + if ($linenum === $r->line) { + $output .= '
'.$this->renderer->escape($line)."\n".'
'; + } else { + $output .= '
'.$this->renderer->escape($line)."\n".'
'; + } + } + + if ($output) { + \reset($source); + + $data = ''; + if ($r->showfilename) { + $data = ' data-kint-filename="'.$this->renderer->escape($r->filename).'"'; + } + + return '
'.$output.'
'; + } + } +} diff --git a/system/ThirdParty/Kint/Renderer/Rich/TabPluginInterface.php b/system/ThirdParty/Kint/Renderer/Rich/TabPluginInterface.php new file mode 100644 index 0000000..779e13a --- /dev/null +++ b/system/ThirdParty/Kint/Renderer/Rich/TabPluginInterface.php @@ -0,0 +1,36 @@ +'; + + $firstrow = \reset($r->contents); + + foreach ($firstrow->value->contents as $field) { + $out .= ''; + } + + $out .= ''; + + foreach ($r->contents as $row) { + $out .= ''; + + foreach ($row->value->contents as $field) { + $out .= 'getType())) { + $type = $this->renderer->escape($s); + + if ($field->reference) { + $ref = '&'; + $type = $ref.$type; + } + + if (null !== ($s = $field->getSize())) { + $size .= ' ('.$this->renderer->escape($s).')'; + } + } + + if ($type) { + $out .= ' title="'.$type.$size.'"'; + } + + $out .= '>'; + + switch ($field->type) { + case 'boolean': + $out .= $field->value->contents ? ''.$ref.'true' : ''.$ref.'false'; + break; + case 'integer': + case 'double': + $out .= (string) $field->value->contents; + break; + case 'null': + $out .= ''.$ref.'null'; + break; + case 'string': + if ($field->encoding) { + $val = $field->value->contents; + if (RichRenderer::$strlen_max && self::$respect_str_length) { + $val = Utils::truncateString($val, RichRenderer::$strlen_max); + } + + $out .= $this->renderer->escape($val); + } else { + $out .= ''.$type.''; + } + break; + case 'array': + $out .= ''.$ref.'array'.$size; + break; + case 'object': + $out .= ''.$ref.$this->renderer->escape($field->classname).''.$size; + break; + case 'resource': + $out .= ''.$ref.'resource'; + break; + default: + $out .= ''.$ref.'unknown'; + break; + } + + if (\in_array('blacklist', $field->hints, true)) { + $out .= ' Blacklisted'; + } elseif (\in_array('recursion', $field->hints, true)) { + $out .= ' Recursion'; + } elseif (\in_array('depth_limit', $field->hints, true)) { + $out .= ' Depth Limit'; + } + + $out .= ''; + } + + $out .= ''; + } + + $out .= '
'.$this->renderer->escape($field->name).'
'; + $out .= $this->renderer->escape($row->name); + $out .= '
'; + + return $out; + } +} diff --git a/system/ThirdParty/Kint/Renderer/Rich/TimestampPlugin.php b/system/ThirdParty/Kint/Renderer/Rich/TimestampPlugin.php new file mode 100644 index 0000000..f0c58e6 --- /dev/null +++ b/system/ThirdParty/Kint/Renderer/Rich/TimestampPlugin.php @@ -0,0 +1,42 @@ +contents); + + if ($dt) { + return '
'.$dt->setTimeZone(new DateTimeZone('UTC'))->format('Y-m-d H:i:s T').'
'; + } + } +} diff --git a/system/ThirdParty/Kint/Renderer/Rich/TraceFramePlugin.php b/system/ThirdParty/Kint/Renderer/Rich/TraceFramePlugin.php new file mode 100644 index 0000000..ea7048b --- /dev/null +++ b/system/ThirdParty/Kint/Renderer/Rich/TraceFramePlugin.php @@ -0,0 +1,68 @@ +trace['file']) && !empty($o->trace['line'])) { + $header = ''.$this->renderer->ideLink($o->trace['file'], (int) $o->trace['line']).' '; + } else { + $header = 'PHP internal call '; + } + + if ($o->trace['class']) { + $header .= $this->renderer->escape($o->trace['class'].$o->trace['type']); + } + + if (\is_string($o->trace['function'])) { + $function = $this->renderer->escape($o->trace['function'].'()'); + } else { + $function = $this->renderer->escape( + $o->trace['function']->getName().'('.$o->trace['function']->getParams().')' + ); + + if (null !== ($url = $o->trace['function']->getPhpDocUrl())) { + $function = ''.$function.''; + } + } + + $header .= ''.$function.''; + + $children = $this->renderer->renderChildren($o); + $header = $this->renderer->renderHeaderWrapper($o, (bool) \strlen($children), $header); + + return '
'.$header.$children.'
'; + } +} diff --git a/system/ThirdParty/Kint/Renderer/Rich/ValuePluginInterface.php b/system/ThirdParty/Kint/Renderer/Rich/ValuePluginInterface.php new file mode 100644 index 0000000..8f750ed --- /dev/null +++ b/system/ThirdParty/Kint/Renderer/Rich/ValuePluginInterface.php @@ -0,0 +1,36 @@ + 'Kint\\Renderer\\Rich\\ArrayLimitPlugin', + 'blacklist' => 'Kint\\Renderer\\Rich\\BlacklistPlugin', + 'callable' => 'Kint\\Renderer\\Rich\\CallablePlugin', + 'closure' => 'Kint\\Renderer\\Rich\\ClosurePlugin', + 'color' => 'Kint\\Renderer\\Rich\\ColorPlugin', + 'depth_limit' => 'Kint\\Renderer\\Rich\\DepthLimitPlugin', + 'recursion' => 'Kint\\Renderer\\Rich\\RecursionPlugin', + 'simplexml_element' => 'Kint\\Renderer\\Rich\\SimpleXMLElementPlugin', + 'trace_frame' => 'Kint\\Renderer\\Rich\\TraceFramePlugin', + ]; + + /** + * RichRenderer tab plugins should implement Kint\Renderer\Rich\TabPluginInterface. + */ + public static $tab_plugins = [ + 'binary' => 'Kint\\Renderer\\Rich\\BinaryPlugin', + 'color' => 'Kint\\Renderer\\Rich\\ColorPlugin', + 'docstring' => 'Kint\\Renderer\\Rich\\DocstringPlugin', + 'microtime' => 'Kint\\Renderer\\Rich\\MicrotimePlugin', + 'source' => 'Kint\\Renderer\\Rich\\SourcePlugin', + 'table' => 'Kint\\Renderer\\Rich\\TablePlugin', + 'timestamp' => 'Kint\\Renderer\\Rich\\TimestampPlugin', + ]; + + public static $pre_render_sources = [ + 'script' => [ + ['Kint\\Renderer\\RichRenderer', 'renderJs'], + ['Kint\\Renderer\\Rich\\MicrotimePlugin', 'renderJs'], + ], + 'style' => [ + ['Kint\\Renderer\\RichRenderer', 'renderCss'], + ], + 'raw' => [], + ]; + + /** + * Whether or not to render access paths. + * + * Access paths can become incredibly heavy with very deep and wide + * structures. Given mostly public variables it will typically make + * up one quarter of the output HTML size. + * + * If this is an unacceptably large amount and your browser is groaning + * under the weight of the access paths - your first order of buisiness + * should be to get a new browser. Failing that, use this to turn them off. + * + * @var bool + */ + public static $access_paths = true; + + /** + * The maximum length of a string before it is truncated. + * + * Falsey to disable + * + * @var int + */ + public static $strlen_max = 80; + + /** + * Path to the CSS file to load by default. + * + * @var string + */ + public static $theme = 'original.css'; + + /** + * Assume types and sizes don't need to be escaped. + * + * Turn this off if you use anything but ascii in your class names, + * but it'll cause a slowdown of around 10% + * + * @var bool + */ + public static $escape_types = false; + + /** + * Move all dumps to a folder at the bottom of the body. + * + * @var bool + */ + public static $folder = false; + + /** + * Sort mode for object properties. + * + * @var int + */ + public static $sort = self::SORT_NONE; + + public static $needs_pre_render = true; + public static $needs_folder_render = true; + + public static $always_pre_render = false; + + public static $js_nonce = null; + public static $css_nonce = null; + + protected $plugin_objs = []; + protected $expand = false; + protected $force_pre_render = false; + protected $pre_render; + protected $use_folder; + + public function __construct() + { + $this->pre_render = self::$needs_pre_render; + $this->use_folder = self::$folder; + + if (self::$always_pre_render) { + $this->setForcePreRender(); + } + } + + public function setCallInfo(array $info) + { + parent::setCallInfo($info); + + if (\in_array('!', $this->call_info['modifiers'], true)) { + $this->setExpand(true); + $this->use_folder = false; + } + + if (\in_array('@', $this->call_info['modifiers'], true)) { + $this->setForcePreRender(); + } + } + + public function setStatics(array $statics) + { + parent::setStatics($statics); + + if (!empty($statics['expanded'])) { + $this->setExpand(true); + } + + if (!empty($statics['return'])) { + $this->setForcePreRender(); + } + } + + public function setExpand($expand) + { + $this->expand = $expand; + } + + public function getExpand() + { + return $this->expand; + } + + public function setForcePreRender() + { + $this->force_pre_render = true; + $this->pre_render = true; + } + + public function setPreRender($pre_render) + { + $this->pre_render = $pre_render; + } + + public function getPreRender() + { + return $this->pre_render; + } + + public function setUseFolder($use_folder) + { + $this->use_folder = $use_folder; + } + + public function getUseFolder() + { + return $this->use_folder; + } + + public function render(Value $o) + { + if ($plugin = $this->getPlugin(self::$value_plugins, $o->hints)) { + $output = $plugin->renderValue($o); + if (null !== $output && \strlen($output)) { + return $output; + } + } + + $children = $this->renderChildren($o); + $header = $this->renderHeaderWrapper($o, (bool) \strlen($children), $this->renderHeader($o)); + + return '
'.$header.$children.'
'; + } + + public function renderNothing() + { + return '
No argument
'; + } + + public function renderHeaderWrapper(Value $o, $has_children, $contents) + { + $out = 'expand) { + $out .= ' kint-show'; + } + + $out .= '"'; + } + + $out .= '>'; + + if (self::$access_paths && $o->depth > 0 && $ap = $o->getAccessPath()) { + $out .= ''; + } + + if ($has_children) { + $out .= ''; + + if (0 === $o->depth) { + $out .= ''; + $out .= ''; + } + + $out .= ''; + } + + $out .= $contents; + + if (!empty($ap)) { + $out .= '
'.$this->escape($ap).'
'; + } + + return $out.''; + } + + public function renderHeader(Value $o) + { + $output = ''; + + if (null !== ($s = $o->getModifiers())) { + $output .= ''.$s.' '; + } + + if (null !== ($s = $o->getName())) { + $output .= ''.$this->escape($s).' '; + + if ($s = $o->getOperator()) { + $output .= $this->escape($s, 'ASCII').' '; + } + } + + if (null !== ($s = $o->getType())) { + if (self::$escape_types) { + $s = $this->escape($s); + } + + if ($o->reference) { + $s = '&'.$s; + } + + $output .= ''.$s.' '; + } + + if (null !== ($s = $o->getSize())) { + if (self::$escape_types) { + $s = $this->escape($s); + } + $output .= '('.$s.') '; + } + + if (null !== ($s = $o->getValueShort())) { + $s = \preg_replace('/\\s+/', ' ', $s); + + if (self::$strlen_max) { + $s = Utils::truncateString($s, self::$strlen_max); + } + + $output .= $this->escape($s); + } + + return \trim($output); + } + + public function renderChildren(Value $o) + { + $contents = []; + $tabs = []; + + foreach ($o->getRepresentations() as $rep) { + $result = $this->renderTab($o, $rep); + if (\strlen($result)) { + $contents[] = $result; + $tabs[] = $rep; + } + } + + if (empty($tabs)) { + return ''; + } + + $output = '
'; + + if (1 === \count($tabs) && $tabs[0]->labelIsImplicit()) { + $output .= \reset($contents); + } else { + $output .= '
    '; + + foreach ($tabs as $i => $tab) { + if (0 === $i) { + $output .= '
  • '; + } else { + $output .= '
  • '; + } + + $output .= $this->escape($tab->getLabel()).'
  • '; + } + + $output .= '
    '; + + foreach ($contents as $i => $tab) { + if (0 === $i) { + $output .= '
  • '; + } else { + $output .= '
  • '; + } + + $output .= $tab.'
  • '; + } + + $output .= '
'; + } + + return $output.'
'; + } + + public function preRender() + { + $output = ''; + + if ($this->pre_render) { + foreach (self::$pre_render_sources as $type => $values) { + $contents = ''; + foreach ($values as $v) { + $contents .= \call_user_func($v, $this); + } + + if (!\strlen($contents)) { + continue; + } + + switch ($type) { + case 'script': + $output .= '